[
  {
    "path": ".gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n*.ActionTemplatePackage\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"External/Colorful\"]\n\tpath = External/Colorful\n\turl = https://github.com/Lakr233/Colorful\n[submodule \"External/AuxiliaryExecute\"]\n\tpath = External/AuxiliaryExecute\n\turl = https://github.com/Lakr233/AuxiliaryExecute\n[submodule \"External/SymbolPicker\"]\n\tpath = External/SymbolPicker\n\turl = https://github.com/xnth97/SymbolPicker\n[submodule \"External/KeychainAccess\"]\n\tpath = External/KeychainAccess\n\turl = https://github.com/kishikawakatsumi/KeychainAccess\n"
  },
  {
    "path": ".root",
    "content": ""
  },
  {
    "path": "App/Action/Action/Action.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "App/Action/Action/Application/Action.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "App/Action/Action/Application/ActionApp.swift",
    "content": "//\n//  ActionApp.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\n@main\nstruct ActionApp: App {\n    static let bootTime: Date = .init()\n\n    @AppStorage(\"wiki.qaq.agreeToLicense\")\n    static var agreeToLicense: Bool = false\n\n    static let documentDirectory: URL = {\n        let availableDirectories = FileManager\n            .default\n            .urls(for: .documentDirectory, in: .userDomainMask)\n\n        #if DEBUG\n            return availableDirectories[0]\n                .appendingPathComponent(\"ActionBee.Debug\")\n        #else\n            return availableDirectories[0]\n                .appendingPathComponent(\"ActionBee\")\n        #endif\n    }()\n\n    init() {\n        _ = ActionApp.bootTime\n        applicationSetup()\n    }\n\n    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate\n\n    var body: some Scene {\n        WindowGroup {\n            MainView()\n        }\n        .windowToolbarStyle(.unifiedCompact)\n        .commands { SidebarCommands() }\n        .commands { CommandGroup(replacing: CommandGroupPlacement.newItem) {} }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\nimport SwiftUI\n\nclass AppDelegate: NSObject, NSApplicationDelegate {\n    func switchDockIconMode() {\n        let windowCount = NSApp\n            .windows\n            .filter { self.filteringSpecialWindow($0) }\n            .count\n        if !StatusBarManager.shared.hasWindowOpened,\n           windowCount == 0,\n           !Menubar.shared.popover.isShown\n        {\n            NSApp.setActivationPolicy(.accessory)\n        } else {\n            NSApp.setActivationPolicy(.regular)\n        }\n    }\n\n    private func filteringSpecialWindow(_ window: NSWindow) -> Bool {\n        let list = [\"NSStatusBarWindow\", \"_NSPopoverWindow\"]\n        for item in list {\n            guard let clz = NSClassFromString(item) else { continue }\n            if window.isKind(of: clz.self) { return false }\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/AppSetup.swift",
    "content": "//\n//  ApplicationSetup.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\n\nextension ActionApp {\n    static let appBundleIdentifier: String = Bundle\n        .main\n        .bundleIdentifier ?? \"wiki.qaq.unknown\"\n\n    static let appVersion: String =\n        Bundle\n            .main\n            .infoDictionary?[\"CFBundleShortVersionString\"] as? String\n            ?? \"unknown\"\n\n    func applicationSetup() {\n        assert(Thread.isMainThread)\n        assert(getuid() != 0)\n\n        print(\n            \"\"\"\n            \\(ActionApp.appBundleIdentifier) - \\(ActionApp.appVersion)\n            Location:\n                [*] \\(Bundle.main.bundleURL.path)\n                [*] \\(Self.documentDirectory.path)\n            Environment: uid \\(getuid()) gid \\(getgid())\n            \"\"\"\n        )\n\n        disableDebuggerIfNeeded()\n\n        _ = AXUIElementCreateSystemWide()\n        _ = Executor.shared\n        _ = PasteboardManager.shared\n        _ = StatusBarManager.shared\n\n        let timer = Timer(timeInterval: 0.5, repeats: true) { _ in\n            appDelegate.switchDockIconMode()\n        }\n        RunLoop.current.add(timer, forMode: .common)\n\n        #if DEBUG\n            let debuggerTimer = Timer(timeInterval: 1, repeats: true) { _ in\n                _ = 0\n            }\n            RunLoop.current.add(debuggerTimer, forMode: .common)\n        #endif\n    }\n\n    private func disableDebuggerIfNeeded() {\n        #if !DEBUG\n            do {\n                typealias ptrace = @convention(c) (_ request: Int, _ pid: Int, _ addr: Int, _ data: Int) -> AnyObject\n                let open = dlopen(\"/usr/lib/system/libsystem_kernel.dylib\", RTLD_NOW)\n                if unsafeBitCast(open, to: Int.self) > 0x1024 {\n                    let result = dlsym(open, \"ptrace\")\n                    if let result = result {\n                        let target = unsafeBitCast(result, to: ptrace.self)\n                        _ = target(0x1F, 0, 0, 0)\n                    }\n                }\n            }\n        #endif\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"color\" : {\n        \"color-space\" : \"srgb\",\n        \"components\" : {\n          \"alpha\" : \"1.000\",\n          \"blue\" : \"0.227\",\n          \"green\" : \"0.533\",\n          \"red\" : \"0.910\"\n        }\n      },\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"color\" : {\n        \"color-space\" : \"srgb\",\n        \"components\" : {\n          \"alpha\" : \"1.000\",\n          \"blue\" : \"0.455\",\n          \"green\" : \"0.659\",\n          \"red\" : \"0.910\"\n        }\n      },\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"icon_16x16.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_16x16@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_32x32.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_32x32@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_128x128.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_128x128@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_256x256.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_256x256@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_512x512.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"filename\" : \"icon_512x512@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/Assets.xcassets/Avatar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Avatar.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "App/Action/Action/Application/License.txt",
    "content": "MIT License\n\nCopyright (c) 2022 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n==========\n\nAuxiliaryExecute\nMIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n==========\n\nColorful\nMIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n==========\n\nKeychainAccess\nThe MIT License (MIT)\n\nCopyright (c) 2014 kishikawa katsumi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n==========\n\nSymbolPicker\nMIT License\n\nCopyright (c) 2022 Yubo Qin & Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n==========\n\nUpdated: 2022-08-30\n"
  },
  {
    "path": "App/Action/Action/Application/en.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  Action\n\n  Created by 维安雨轩 on 2022/08/19.\n  \n*/\n"
  },
  {
    "path": "App/Action/Action/Application/zh-Hans.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  Action\n\n  Created by 维安雨轩 on 2022/08/19.\n  \n*/\n\n//ModuleManageView.swift\n\n\"Create an action by click plus button on toolbar to process your pasteboard event. Format text, clean up links, speak when copy from special app, send to your device, etc etc. Choose an language you are familiar with to get start.\" = \"通过点击工具栏上的加号按钮创建一个自动化来处理你的剪贴板事件。\\n如格式化文本、清理链接或从设定应用中复制时，发送至你的设备等。\\n现在快选择一种你熟悉的语言来开始吧。\";\n\"Add Action\" = \"添加自动化模块\";\n\"Import Action\" = \"导入自动化模块\";\n\"Module\" = \"模块\";\n\"You are about to import an Action Module which is untrusted with no signature. Importing malicious modules can pose unknown risks and there is no sandbox nor container dealing with it.\" = \"你正在导入一个没有签名的不受信任的自动化模块。导入恶意模块可能会带来未知风险，在运行这个模块时并不会通过沙盒或容器来处理它。\";\n\"Trust And Import\" = \"信任并导入\";\n\"Cancel\" = \"取消\";\n\"Failed to import this module\" = \"导入模块失败\";\n\n\n//  ModuleImportView.swift\n\n\"You are about to import an untrusted module\" = \"您正在导入一个不受信任的模块\";\n\"Importing malicious module may damage your system, you are in charge to review this module.\" = \"导入恶意模块可能会损坏你的系统，您需要负责审查这个模块。\";\n\"Trust & Import\" = \"信任并导入\";\n\"OK\" = \"成功\";\n\n\n//  ModuleElementView.swift\n\n\"Error\" = \"出错了\";\n\n\n//  ModuleCreateView.swift\n\n\"Create Action\" = \"创建自动化模块\";\n\"Module Name\" = \"模块名称\";\n\"Language\" = \"语言\";\n\"Next\" = \"继续\";\n\n\n//  ModuleEditView.swift\n\n\"Edit Action\" = \"编辑自动化模块\";\n\"Save\" = \"保存\";\n\"Compiling Source\" = \"正在编译模块...\";\n\"Compile Finished\" = \"编译完成\";\n\"Broken Module\" = \"损坏的模块\";\n\"Delete\" = \"删除\";\n\"Close\" = \"关闭\";\n\"Enabled\" = \"启用\";\n\"Name\" = \"名称\";\n\"Timeout: \" = \"超时:\";\n\"Enable In App\" = \"在应用程序中启用\";\n\"Enabled for All Apps\" = \"为所有应用程序启用\";\n\"This pasteboard action will only run if copying from these apps\" = \"此自动化只有在从这些应用程序复制时才会运行\";\n\"Coding\" = \"编辑\";\n\"Edit Code\" = \"编辑代码\";\n\"Show in Finder\" = \"在 Finder 中显示\";\n\"Export\" = \"导出\";\n\"Module Template: %@\" = \"模板: %@\";\n\"Unknown\" = \"未知\";\n\"No Build Hint\" = \"没有构建提示\";\n\"You should recompile, click save, this module each time you edit it\" = \"在每次编辑该模块时，点击保存将会重新编译。\";\n\"Unable to compile this action: %@\" = \"无法编译这个自动化模块: %@\";\n\"Are you sure you want to delete this module? This operation can not be undone.\" = \"您确定要删除这个模块吗？\\n确定后将无法撤销。\";\n\"Select Application\" = \"选择应用程序\";\n\"Failed to load this module\" = \"加载此模块失败\";\n\"Module Export - %@\" = \"导出模块 - %@\";\n\"Unnamed\" = \"未命名\";\n\n\n//  ContentView.swift\n\n\"Toggle Sidebar\" = \"切换侧边栏\";\n\n\n//  SidebarView.swift\n\n\"App\" = \"应用\";\n\"Welcome\" = \"欢迎\";\n\"Action\" = \"自动化\";\n\"Module\" = \"模块\";\n\"History\" = \"历史\";\n\"Misc\" = \"其他\";\n\"Setting\" = \"设置\";\n\"Diagnostic\" = \"诊断\";\n\n\n//  WelcomeView.swift\n\n\"Welcome to Action Bee\" = \"欢迎使用 Action Bee\";\n\"A programmable pasteboard action trigger.\" = \"一个可编程的剪贴板触发器\";\n\n\n//  HistoryView.swift\n\n\"No History Was Found\" = \"暂无历史记录\";\n\"Clear History\" = \"清除历史记录\";\n\"Are you sure you want to delete all history records? This operation can not be undone.\" = \"你确定要删除所有历史记录吗？\\n确定后将无法撤销。\";\n\"Pasteboard Event\" = \"剪贴板事件\";\n\"Length: %lld Action Candidates: %lld\" = \"剪贴长度: %lld 共执行模块: %lld\";\n\"Deleted Action\" = \"被删除的动作\";\n\"  Post Action: %@\" = \"  动作: %@\";\n\"  Content: %@\" = \"  内容: %@\";\n\n//  SettingView.swift\n\n\"Pasteboard Deduplicate\" = \"阻拦重复执行\";\n\"Pasteboard content matches previous will not generate event if on\" = \"如剪贴板的内容与之前的相匹配，开启后，将不会执行事件。\";\n\"Silent Mode\" = \"静默模式\";\n\"Do not show popover after action triggered\" = \"动作触发后不弹出窗口\";\n\"Toast Mode\" = \"Toast 模式\";\n\"Use toast instead of popover on menubar\" = \"在屏幕上显示简易提示框而不是弹出式菜单\";\n\"Reduced UI Effects\" = \"减少 UI 视觉效果\";\n\"Turning off visual effects does not affect app's core functionality\" = \"关闭视觉效果并不会影响应用程序的核心功能\";\n\"Application\" = \"应用\";\n\"Get Source Code\" = \"获取源代码\";\n\"License\" = \"许可证\";\n\n\n//  MenubarView.swift\n\n\"ActionBee is ready to accept pasteboard events.\" = \"ActionBee 已准备好处理剪贴板事件。\";\n\n\n//  LicenseView.swift\n\n\"Software License\" = \"软件许可证\";\n\"I understand and agree to this license.\" = \"我理解并同意此许可。\";\n\"Done\" = \"同意\";\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionManager+Artifact.swift",
    "content": "//\n//  ActionManager+Artifact.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\nprivate let artifactPathExtension = \"ActionBeeArtifact\"\n\nextension ActionManager {\n    struct ModuleArtifact: Codable {\n        let id: Action.ID\n        let signature: String\n\n        init?(id: Action.ID, copyingArtifactAt atUrl: URL) {\n            self.id = id\n            let targetDir = Self.obtainArtifactUrlForAction(withId: id)\n            do {\n                try? FileManager.default.removeItem(at: targetDir)\n                var isDir = ObjCBool(false)\n                guard FileManager.default.fileExists(atPath: atUrl.path, isDirectory: &isDir) else {\n                    return nil\n                }\n                if isDir.boolValue {\n                    try FileManager.default.copyItem(at: atUrl, to: targetDir)\n                } else {\n                    try FileManager.default.createDirectory(at: targetDir, withIntermediateDirectories: true)\n                    let name = atUrl.lastPathComponent\n                    let target = targetDir.appendingPathComponent(name)\n                    try FileManager.default.copyItem(at: atUrl, to: target)\n                }\n                signature = try Self.generatePackageSignature(at: targetDir)\n            } catch {\n                print(\"[E] \\(error.localizedDescription)\")\n                return nil\n            }\n        }\n\n        static func deletingDotFiles(at atUrl: URL) throws {\n            let enumerator = FileManager.default.enumerator(atPath: atUrl.path)\n            while let subPath = enumerator?.nextObject() as? String {\n                let url = atUrl.appendingPathComponent(subPath)\n                var shouldClean = false\n                if subPath == \".DS_Store\" { shouldClean = true }\n                if subPath.hasPrefix(\"._\") { shouldClean = true }\n                if shouldClean {\n                    print(\"[*] deleting dot files inside artifact \\(url.path)\")\n                    try FileManager.default.removeItem(at: url)\n                }\n            }\n        }\n\n        static func generatePackageSignature(at atUrl: URL) throws -> String {\n            try deletingDotFiles(at: atUrl)\n            var signatureDic = [String: String]()\n            let enumerator = FileManager.default.enumerator(atPath: atUrl.path)\n            while let subPath = enumerator?.nextObject() as? String {\n                let path = atUrl.appendingPathComponent(subPath)\n                var isDir = ObjCBool(false)\n                guard FileManager\n                    .default\n                    .fileExists(atPath: path.path, isDirectory: &isDir)\n                else {\n                    throw GenericActionError.brokenResources\n                }\n                let data = try Data(contentsOf: path)\n                let hash = data.sha256()\n                signatureDic[subPath] = hash\n            }\n            var hasher = String()\n            let valueArray = signatureDic.sorted { $0.key < $1.key }\n            for (key, value) in valueArray {\n                hasher += key\n                hasher += value\n                hasher += \"\\n\"\n            }\n            guard let signature = hasher.data(using: .utf8)?.sha256() else {\n                throw GenericActionError.unknown\n            }\n            return signature\n        }\n\n        static func obtainArtifactUrlForAction(withId: Action.ID) -> URL {\n            ActionManager.shared\n                .actionArtifactBaseUrl\n                .appendingPathComponent(withId.uuidString)\n                .appendingPathExtension(artifactPathExtension)\n        }\n\n        func obtainArtifactUrl() -> URL {\n            Self.obtainArtifactUrlForAction(withId: id)\n        }\n\n        func validateSignature() -> Bool {\n            do {\n                let testSignature = try Self.generatePackageSignature(at: obtainArtifactUrl())\n                return signature == testSignature\n            } catch {\n                print(\"[E] \\(error.localizedDescription)\")\n                return false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionManager+Event.swift",
    "content": "//\n//  ActionManager+Event.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Cocoa\nimport Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\nextension ActionManager {\n    struct ActionRecipeData: Codable {\n        let postAction: PostAction\n        let postContent: String\n        let continueQueue: Bool\n\n        enum PostAction: String, Codable {\n            case overwrite\n            case speak\n            case none\n\n            func humanReadableDescription() -> String {\n                switch self {\n                case .overwrite: return \"Overwrite Pasteboard\"\n                case .speak: return \"Speak Message\"\n                case .none: return \"None\"\n                }\n            }\n        }\n\n        init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n            self.postAction = postAction\n            self.postContent = postContent\n            self.continueQueue = continueQueue\n        }\n\n        func compileBase64() -> String? {\n            (try? encoder.encode(self))?.base64EncodedString()\n        }\n\n        static func retrieve(withData data: Data) -> Self? {\n            try? decoder.decode(Self.self, from: data)\n        }\n    }\n\n    func handle(pasteboardEvent event: PasteboardManager.PEvent) {\n        assert(!Thread.isMainThread)\n        var actionCandidates: [Action] = []\n        DispatchQueue.withMainAndWait {\n            actionCandidates = self.actions\n        }\n        actionCandidates = actionCandidates\n            .filter { enabledActions.contains($0.id) }\n            .filter { !initialingAciton.contains($0.id) }\n            .filter {\n                if $0.enabledAppList.isEmpty {\n                    return true\n                }\n                guard let appBundleIdentifier = event.app?.bundleIdentifier else {\n                    return false\n                }\n                return $0.enabledAppList.contains(appBundleIdentifier)\n            }\n            .sorted { a, b in\n                guard a.priority == b.priority else {\n                    return a.priority < b.priority\n                }\n                return a.name < b.name\n            }\n        guard !actionCandidates.isEmpty else {\n            print(\"[-] no action candidate found, ignoring pasteboard event\")\n            return\n        }\n        print(\"[*] pasteboard event resolved \\(actionCandidates.count) candidates\")\n\n        DispatchQueue.withMainAndWait {\n            self.actionRunning = true\n            self.actionRunningHint = \"Resolved \\(actionCandidates.count) Action Candidates\"\n            Menubar.shared.switchTitle(status: .running)\n        }\n\n        var successAction: [HistoryElement.SuccessRecord] = []\n        var failedAction: [HistoryElement.FailureRecord] = []\n        var shouldShowResultWindow = false\n\n        defer {\n            let history = HistoryElement(\n                event: event,\n                actionCandidates: actionCandidates.map(\\.id),\n                succeedAction: successAction,\n                failedAction: failedAction\n            )\n            DispatchQueue.withMainAndWait {\n                self.histories.append(history)\n                self.actionRunning = false\n                self.actionRunningHint = \"\"\n                Menubar.shared.switchTitle(status: .ready)\n\n                if shouldShowResultWindow, !Config.shared.silentMode {\n                    if Config.shared.toastMode {\n                        var image = \"checkmark.circle.fill\"\n                        if !failedAction.isEmpty {\n                            image = \"checkmark.circle.trianglebadge.exclamationmark\"\n                        }\n                        Toast.post(systemIcon: image, message: \"ActionBee Completed\")\n                    } else {\n                        Menubar.shared.showPopover()\n                    }\n                }\n            }\n        }\n\n        for action in actionCandidates {\n            DispatchQueue.withMainAndWait {\n                self.actionRunningHint = \"Executing Action - \\(action.name)\"\n            }\n            let recipe = action.template\n                .obtainTemplateDetails()\n                .executeModule(\n                    id: action.id,\n                    withPasteboardEvent: event\n                ) { print($0) }\n            switch recipe {\n            case let .success(recipe):\n                successAction.append(.init(\n                    action: action.id,\n                    recipeAction: recipe.postAction.humanReadableDescription(),\n                    recipeContent: recipe.postContent\n                ))\n                resolvePostAction(recipe)\n                if recipe.postAction != .none { shouldShowResultWindow = true }\n                guard recipe.continueQueue else { return }\n            case let .failure(failure):\n                shouldShowResultWindow = true\n                failedAction.append(.init(action: action.id, errorHint: failure.message))\n                print(\"[E] error executing aciton: \\(failure.message)\")\n                continue\n            }\n        }\n    }\n\n    func resolvePostAction(_ object: ActionRecipeData) {\n        assert(!Thread.isMainThread)\n        switch object.postAction {\n        case .none: break\n        case .speak:\n            DispatchQueue.global().async {\n                Executor.shared.speak(object.postContent)\n            }\n        case .overwrite:\n            NSPasteboard.general.prepareForNewContents()\n            NSPasteboard.general.setString(object.postContent, forType: .string)\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionManager+History.swift",
    "content": "//\n//  ActionManager+History.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\nextension ActionManager {\n    struct HistoryElement: Codable, Identifiable, Hashable, Equatable {\n        var id: UUID = .init()\n\n        let date: Date\n\n        let event: PasteboardManager.PEvent\n        let actionCandidates: [Action.ID]\n\n        struct SuccessRecord: Codable, Identifiable, Hashable, Equatable {\n            var id: UUID = .init()\n            let action: Action.ID\n            let recipeAction: String\n            let recipeContent: String\n        }\n\n        let succeedAction: [SuccessRecord]\n\n        struct FailureRecord: Codable, Identifiable, Hashable, Equatable {\n            var id: UUID = .init()\n            let action: Action.ID\n            let errorHint: String\n        }\n\n        let failedAction: [FailureRecord]\n\n        init(\n            id: UUID = .init(),\n            date: Date = .init(),\n            event: PasteboardManager.PEvent,\n            actionCandidates: [ActionManager.Action.ID] = [],\n            succeedAction: [ActionManager.HistoryElement.SuccessRecord] = [],\n            failedAction: [ActionManager.HistoryElement.FailureRecord] = []\n        ) {\n            self.id = id\n            self.date = date\n            self.event = event\n            self.actionCandidates = actionCandidates\n            self.succeedAction = succeedAction\n            self.failedAction = failedAction\n        }\n\n        func search(with key: String) -> Bool {\n            if event.app?.name.lowercased().contains(key) ?? false { return true }\n            if event.app?.bundleIdentifier.lowercased().contains(key) ?? false { return true }\n            if event.content.lowercased().contains(key) { return true }\n            if date.formatted(date: .complete, time: .complete).lowercased().contains(key) {\n                return true\n            }\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionManager+Module.swift",
    "content": "//\n//  ActionManager+Module.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\n/*\n\n Action will be compiled into ActionManifest.plist\n into project root dir\n\n so the project dir looks like: eg swift\n .\n ├── .build\n │   └── cli                        <- binary\n ├── App.xcworkspace\n └── compile.sh                     <- emit binary, called each time when compile\n\n // user editable\n\n ├── Source\n │   ├── Package.swift\n │   └── Sources\n │       └── Source\n │           └── Source.swift       <- user code\n\n // program granted\n\n ├── .ActionManifest.plist          <- exported definition of this action\n\n */\n\nextension ActionManager {\n    struct Action: Codable, Equatable, Hashable, Identifiable {\n        var id: UUID\n        var name: String\n        var icon: String\n        var priority: Int // lower first-er P0~\n        var timeout: Int\n\n        var template: ActionManager.ModuleTemplateIdentifier\n\n        // will only run if copy from these apps\n        var enabledAppList: [String] = []\n\n        // keep for future usage\n        var attachment: [String: String]\n\n        init(\n            id: UUID = .init(),\n            name: String,\n            icon: String = \"text.append\",\n            priority: Int = 100,\n            timeout: Int = 5,\n            template: ActionManager.ModuleTemplateIdentifier,\n            enabledAppList: [String] = [],\n            attachment: [String: String] = [:]\n        ) {\n            self.id = id\n            self.name = name\n            self.icon = icon\n            self.priority = priority\n            self.timeout = timeout\n            self.template = template\n            self.enabledAppList = enabledAppList\n            self.attachment = attachment\n        }\n    }\n\n    func updateActionModuleManifest(onActionId: Action.ID? = nil) {\n        if let id = onActionId {\n            guard let action = self[id] else {\n                return\n            }\n            try? compileManifestAndSave(forAction: action)\n        }\n        for action in actions {\n            try? compileManifestAndSave(forAction: action)\n        }\n    }\n\n    func compileManifestAndSave(forAction action: Action) throws {\n        let actionModuleDir = actionModuleBaseUrl\n            .appendingPathComponent(action.id.uuidString)\n        let manifestUrl = actionModuleDir\n            .appendingPathComponent(actionManifestFileName)\n            .appendingPathExtension(actionManifestExtension)\n        guard FileManager.default.fileExists(atPath: actionModuleBaseUrl.path) else {\n            return\n        }\n        let data = try actionManifestEncoder.encode(action)\n        try data.write(to: manifestUrl, options: .atomic)\n    }\n\n    func deleteModule(withId id: Action.ID) {\n        print(\"[*] deleting module \\(id)\")\n        let moduleUrl = actionModuleBaseUrl\n            .appendingPathComponent(id.uuidString)\n        try? FileManager.default.removeItem(at: moduleUrl)\n        actions = actions.filter { $0.id != id }\n        enabledActions = enabledActions.filter { $0 != id }\n        invalidateArtifactCache(forAction: id)\n    }\n\n    func issueCompile(forAction actionId: Action.ID, output: @escaping (String) -> Void) -> Result<Void, GenericActionError> {\n        assert(!Thread.isMainThread)\n        guard let action = self[actionId] else {\n            return .failure(.brokenResources)\n        }\n        let result = action.template\n            .obtainTemplateDetails()\n            .compileModule(id: actionId, output: output)\n        return result\n    }\n\n    func registerArtifact(forAction actionId: Action.ID, artifact: URL) {\n        print(\"[*] copying artifact at path \\(artifact.path) for action \\(actionId)\")\n        try? FileManager.default.createDirectory(\n            at: ActionManager.shared.actionArtifactBaseUrl,\n            withIntermediateDirectories: true\n        )\n        guard let object = ModuleArtifact(id: actionId, copyingArtifactAt: artifact) else {\n            return\n        }\n        print(\"[*] registering artifact \\(actionId) with signature \\(object.signature)\")\n        guard Thread.isMainThread else {\n            DispatchQueue.withMainAndWait {\n                self.artifacts[object.id] = object\n            }\n            return\n        }\n        artifacts[object.id] = object\n    }\n\n    func invalidateArtifactCache(forAction actionId: Action.ID) {\n        print(\"[*] invalidating artifact cache for \\(actionId)\")\n        if let value = artifacts[actionId] {\n            try? FileManager.default.removeItem(at: value.obtainArtifactUrl())\n        }\n        if Thread.isMainThread {\n            artifacts.removeValue(forKey: actionId)\n        } else {\n            DispatchQueue.withMainAndWait {\n                self.artifacts.removeValue(forKey: actionId)\n            }\n        }\n    }\n\n    func importModule(at: URL) -> Result<Action.ID, Error> {\n        print(\"[*] importing module at \\(at.path)\")\n        let manifest = at\n            .appendingPathComponent(actionManifestFileName)\n            .appendingPathExtension(actionManifestExtension)\n        do {\n            let data = try Data(contentsOf: manifest)\n            let action = try actionManifestDecoder.decode(Action.self, from: data)\n            let target = actionModuleBaseUrl\n                .appendingPathComponent(action.id.uuidString)\n            print(\"[*] manifest returns id \\(action.id)\")\n            try? FileManager.default.removeItem(at: target)\n            try FileManager.default.copyItem(at: at, to: target)\n            invalidateArtifactCache(forAction: action.id)\n            DispatchQueue.withMainAndWait {\n                self[action.id] = action\n                self.enabledActions.append(action.id)\n            }\n            updateActionModuleManifest(onActionId: action.id)\n            return .success(action.id)\n        } catch {\n            return .failure(error)\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionManager.swift",
    "content": "//\n//  ActionManager.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport Combine\nimport Foundation\n\nfinal class ActionManager: ObservableObject {\n    static let shared = ActionManager()\n\n    private init() {\n        #if DEBUG\n            for item in ModuleTemplateIdentifier.allCases {\n                _ = item.obtainTemplateDetails().getTemplateBundleURL()\n            }\n        #endif\n\n        var buildAction: [Action.ID: Action] = [:]\n        for action in actionsStore {\n            buildAction[action.id] = action\n        }\n\n        // now clean the items inside the dir if not exists in plist\n        do {\n            let actionIds = buildAction.keys.map(\\.uuidString)\n            let list = (\n                try? FileManager\n                    .default\n                    .contentsOfDirectory(atPath: actionModuleBaseUrl.path)\n            ) ?? []\n            var deleteList = [String]()\n            deleteList += list.filter { !actionIds.contains($0) }\n            deleteList += actionIds.filter { !list.contains($0) }\n            for element in deleteList {\n                let url = actionModuleBaseUrl.appendingPathComponent(element)\n                try? FileManager.default.removeItem(at: url)\n                if let id = UUID(uuidString: element) {\n                    buildAction.removeValue(forKey: id)\n                }\n                print(\"[-] removing unregistered action module file at path \\(url.path)\")\n            }\n        }\n\n        actions = buildAction.values\n            .sorted { $0.name < $1.name }\n        updateActionModuleManifest()\n\n        enabledActions = Array(Set(enabledActionsStore))\n\n        for action in actions {\n            print(\"[+] loading module \\(action.name) - \\(action.id.uuidString)\")\n        }\n\n        artifacts = artifactsStore\n        for artifact in artifacts {\n            let found = actions.contains { $0.id == artifact.key }\n            if found {\n                print(\"[+] loading artifact \\(artifact.key.uuidString)\")\n                DispatchQueue.global().async {\n                    guard artifact.value.validateSignature() else {\n                        print(\"[E] artifact signature mismatch!\")\n                        self.invalidateArtifactCache(forAction: artifact.key)\n                        return\n                    }\n                }\n            } else {\n                DispatchQueue.global().async {\n                    self.invalidateArtifactCache(forAction: artifact.key)\n                }\n            }\n        }\n\n        histories = historiesStore\n            .sorted { $0.date < $1.date }\n    }\n\n    var actionModuleBaseUrl: URL {\n        let ret = ActionApp\n            .documentDirectory\n            .appendingPathComponent(\"ActionModules\")\n        try? FileManager.default.createDirectory(\n            at: ret,\n            withIntermediateDirectories: true\n        )\n        return ret\n    }\n\n    var actionArtifactBaseUrl: URL {\n        let ret = ActionApp\n            .documentDirectory\n            .appendingPathComponent(\"ActionArtifact\")\n        try? FileManager.default.createDirectory(\n            at: ret,\n            withIntermediateDirectories: true\n        )\n        return ret\n    }\n\n    let actionManifestFileName = \".ActionManifest\"\n    let actionManifestExtension = \"plist\"\n    let actionManifestEncoder = PropertyListEncoder()\n    let actionManifestDecoder = PropertyListDecoder()\n\n    @EncryptedCodableDefaultsWrapper(key: \"wiki.qaq.ActionManager.actionsStoreKey\", defaultValue: [Action]())\n    private var actionsStore\n\n    @Published var actions: [Action] = [] {\n        didSet { DispatchQueue.global().async { self.actionsStore = self.actions } }\n    }\n\n    @Published var initialingAciton: Set<Action.ID> = []\n\n    subscript(actionId: UUID) -> Action? {\n        get {\n            actions.first { $0.id == actionId }\n        }\n        set {\n            assert(Thread.isMainThread)\n            guard let newValue = newValue else {\n                deleteModule(withId: actionId)\n                return\n            }\n            let idx = actions.firstIndex { $0.id == newValue.id }\n            if let idx = idx {\n                actions[idx] = newValue\n            } else {\n                actions = (\n                    actions + [newValue]\n                )\n                .sorted { $0.name < $1.name }\n            }\n        }\n    }\n\n    @EncryptedCodableDefaultsWrapper(key: \"wiki.qaq.ActionManager.enabledActions\", defaultValue: [])\n    private var enabledActionsStore: [Action.ID]\n\n    @Published var enabledActions = [Action.ID]() {\n        didSet { DispatchQueue.global().async { self.enabledActionsStore = self.enabledActions } }\n    }\n\n    @EncryptedCodableDefaultsWrapper(key: \"wiki.qaq.ActionManager.artifactsStore\", defaultValue: [Action.ID: ModuleArtifact]())\n    private var artifactsStore\n\n    @Published var artifacts: [Action.ID: ModuleArtifact] = [:] {\n        didSet { DispatchQueue.global().async { self.artifactsStore = self.artifacts } }\n    }\n\n    @EncryptedCodableDefaultsWrapper(key: \"wiki.qaq.ActionManager.historiesStore\", defaultValue: [HistoryElement]())\n    private var historiesStore\n\n    @Published var histories: [HistoryElement] = [] {\n        didSet {\n            let historyLimit = 500\n            guard histories.count < historyLimit else {\n                DispatchQueue.main.async {\n                    self.histories.removeFirst(self.histories.count - historyLimit)\n                }\n                return\n            }\n            DispatchQueue.global().async { self.historiesStore = self.histories }\n        }\n    }\n\n    @Published var actionRunning = false\n    @Published var actionRunningHint = \"\"\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionModuleTemplates/ActionManager+Template.swift",
    "content": "//\n//  ActionManager+ModuleTemplate.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport Cocoa\nimport Foundation\n\nprotocol ModuleTemplate {\n    func getLanguage() -> String\n    func getTemplateBundleName() -> String\n    func getBuildHint() -> String\n\n    func getTemplateBundleURL() -> URL\n\n    func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError>\n    func compileModule(\n        id: ActionManager.Action.ID,\n        output: @escaping (String) -> Void\n    ) -> Result<Void, ActionManager.GenericActionError>\n    func executeModule(\n        id: ActionManager.Action.ID,\n        withPasteboardEvent event: PasteboardManager.PEvent,\n        output: @escaping (String) -> Void\n    ) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError>\n}\n\nextension ModuleTemplate {\n    func getTemplateBundleURL() -> URL {\n        Bundle.main.url(\n            forResource: getTemplateBundleName(),\n            withExtension: \"ActionTemplatePackage\",\n            subdirectory: \"ActionTemplates\"\n        )!\n    }\n}\n\nextension ActionManager {\n    enum GenericActionError: Error {\n        case permissionDenied\n        case compilerError\n        case brokenResources\n        case designatedEditorMissing\n        case unauthorizedModificationDetected\n        case invalidResponse\n        case unknown\n\n        var message: String {\n            switch self {\n            case .permissionDenied: return \"Permission denied for requires resources.\"\n            case .compilerError: return \"Compiler returned an error, check your source.\"\n            case .brokenResources: return \"Resources for this module was not found.\"\n            case .designatedEditorMissing: return \"The designated editor app for this module was not found, please edit it in Finder yourself.\"\n            case .unauthorizedModificationDetected: return \"The requires resource was modified by unauthorized event.\"\n            case .invalidResponse: return \"Invalid respond.\"\n            case .unknown: return \"Unknown error occurred.\"\n            }\n        }\n    }\n\n    enum ModuleTemplateIdentifier: String, Codable, CaseIterable, Hashable, Equatable {\n        case executable\n        case executableSwift\n\n        case swift\n        case node\n        case python\n\n        func obtainTemplateDetails() -> ModuleTemplate {\n            switch self {\n            case .executable: return ModuleTemplateExecutable()\n            case .executableSwift: return ModuleTemplateExecutableSwift()\n            case .swift: return ModuleTemplateSwift()\n            case .node: return ModuleTemplateNode()\n            case .python: return ModuleTemplatePython()\n            }\n        }\n    }\n\n    func createAction(withName name: String, withModuleTemplate template: ModuleTemplateIdentifier) -> UUID? {\n        let actionUUID = UUID()\n        let templateBundleUrl = template\n            .obtainTemplateDetails()\n            .getTemplateBundleURL()\n        let extractTarget = actionModuleBaseUrl\n            .appendingPathComponent(actionUUID.uuidString)\n\n        let action = Action(id: actionUUID, name: name, template: template)\n\n        print(\"[*] creating module at \\(extractTarget.path)\")\n\n        do {\n            try FileManager.default.createDirectory(at: extractTarget, withIntermediateDirectories: true)\n            try Executor.shared.unarchiveTar(at: templateBundleUrl, toDest: extractTarget)\n            try compileManifestAndSave(forAction: action)\n        } catch {\n            return nil\n        }\n\n        DispatchQueue.withMainAndWait {\n            self.actions = (\n                self.actions + [action]\n            )\n            .sorted { $0.name < $1.name }\n            self.enabledActions.append(action.id)\n        }\n\n        return actionUUID\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Executable.swift",
    "content": "//\n//  Template+Executable.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport AuxiliaryExecute\nimport Cocoa\nimport Foundation\n\nextension ActionManager {\n    class ModuleTemplateExecutable: ModuleTemplate {\n        func getLanguage() -> String { \"Binary Executable\" }\n        func getTemplateBundleName() -> String { \"Executable\" }\n        func getBuildHint() -> String { \"Compile your binary, name it ActionBeeModule.exec, and put it here.\" }\n\n        struct ArgumentData: Codable {\n            let focusAppID: String?\n            let focusAppName: String?\n            let pasteboardContent: String\n\n            init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n                self.focusAppID = focusAppID\n                self.focusAppName = focusAppName\n                self.pasteboardContent = pasteboardContent\n            }\n\n            func compileBase64() -> String? {\n                (try? JSONEncoder().encode(self))?.base64EncodedString()\n            }\n        }\n\n        func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {\n            guard let action = ActionManager.shared[id] else {\n                return .failure(GenericActionError.brokenResources)\n            }\n            let target = ActionManager.shared.actionModuleBaseUrl\n                .appendingPathComponent(action.id.uuidString)\n            guard FileManager.default.fileExists(atPath: target.path) else {\n                return .failure(GenericActionError.brokenResources)\n            }\n            guard NSWorkspace.shared.open(target) else {\n                return .failure(GenericActionError.designatedEditorMissing)\n            }\n            return .success\n        }\n\n        func compileModule(id: ActionManager.Action.ID, output _: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {\n            assert(!Thread.isMainThread)\n\n            guard let action = ActionManager.shared[id] else {\n                return .failure(.brokenResources)\n            }\n\n            let target = ActionManager.shared.actionModuleBaseUrl\n                .appendingPathComponent(action.id.uuidString)\n                .appendingPathComponent(\"ActionBeeModule.exec\")\n\n            guard FileManager.default.fileExists(atPath: target.path) else {\n                return .failure(.brokenResources)\n            }\n\n            guard FileManager.default.isExecutableFile(atPath: target.path) else {\n                return .failure(.permissionDenied)\n            }\n\n            ActionManager.shared.registerArtifact(forAction: action.id, artifact: target)\n            return .success\n        }\n\n        func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {\n            assert(!Thread.isMainThread)\n\n            guard let action = ActionManager.shared[id],\n                  let artifact = ActionManager.shared.artifacts[id]\n            else {\n                return .failure(.brokenResources)\n            }\n            guard artifact.validateSignature() else {\n                return .failure(.unauthorizedModificationDetected)\n            }\n\n            guard let argument = ArgumentData(\n                focusAppID: event.app?.bundleIdentifier,\n                focusAppName: event.app?.name,\n                pasteboardContent: event.content\n            )\n            .compileBase64()\n            else {\n                return .failure(.brokenResources)\n            }\n\n            print(\"[*] executing action \\(id.uuidString)\")\n\n            var resultData: ActionRecipeData?\n\n            let binary = artifact\n                .obtainArtifactUrl()\n                .appendingPathComponent(\"cli\")\n                .path\n\n            let recipe = AuxiliaryExecute.spawn(\n                command: binary,\n                environment: [\"Communicator_Message\": argument],\n                timeout: Double(action.timeout),\n                output: output\n            )\n\n            var lastLine = recipe.stderr\n                .trimmingCharacters(in: .whitespacesAndNewlines)\n                .components(separatedBy: \"\\n\")\n                .last?\n                .trimmingCharacters(in: .whitespaces)\n                ?? \"\"\n            let prefix = \"ActionBee-Result-Recipe://\"\n            if lastLine.hasPrefix(prefix) {\n                lastLine.removeFirst(prefix.count)\n            }\n            if let base64 = Data(base64Encoded: lastLine) {\n                resultData = ActionRecipeData.retrieve(withData: base64)\n            }\n\n            guard let result = resultData else {\n                return .failure(.invalidResponse)\n            }\n\n            return .success(result)\n        }\n    }\n\n    class ModuleTemplateExecutableSwift: ModuleTemplateExecutable {\n        override func getLanguage() -> String { \"Binary Executable - Swift\" }\n        override func getTemplateBundleName() -> String { \"ExecutableSwift\" }\n        override func getBuildHint() -> String { \"Compile your binary, name it ActionBeeModule.exec, and put it here.\" }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Node.swift",
    "content": "//\n//  Template+Node.swift\n//  Action\n//\n//  Created by Innei on 2022/8/21.\n//\n\nimport AuxiliaryExecute\nimport Foundation\n\nextension ActionManager {\n    class ModuleTemplateNode: ModuleTemplateExecutable {\n        override func getLanguage() -> String { \"Source - Node\" }\n        override func getTemplateBundleName() -> String { \"SourceNode\" }\n        override func getBuildHint() -> String { \"To build Node Module, node and it's tool is required. Install them yourself.\" }\n\n        override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {\n            let url = ActionManager.shared\n                .actionModuleBaseUrl\n                .appendingPathComponent(id.uuidString)\n\n            let recipe = AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", \"code \\(url.path)\"]\n            )\n\n            guard recipe.exitCode == 0 else {\n                return .failure(.designatedEditorMissing)\n            }\n\n            return .success\n        }\n\n        override func compileModule(id: ActionManager.Action.ID, output: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {\n            guard let action = ActionManager.shared[id] else {\n                return .failure(.brokenResources)\n            }\n\n            let temporaryDir = URL(fileURLWithPath: NSTemporaryDirectory())\n                .appendingPathComponent(UUID().uuidString)\n            try? FileManager.default.removeItem(at: temporaryDir)\n            defer {\n                try? FileManager.default.removeItem(at: temporaryDir)\n            }\n\n            do {\n                output(\"[*] starting compiler at \\(temporaryDir.path)\\n\")\n                let userSrc = ActionManager.shared\n                    .actionModuleBaseUrl\n                    .appendingPathComponent(action.id.uuidString)\n                let targetSrc = temporaryDir\n                output(\"[*] copying user source from \\(userSrc.path) to \\(targetSrc.path)\\n\")\n                try FileManager.default.copyItem(at: userSrc, to: targetSrc)\n                FileManager.default.createFile(\n                    atPath: temporaryDir.appendingPathComponent(\".action\").path,\n                    contents: nil\n                )\n            } catch {\n                output(\"[E] \\(error.localizedDescription)\")\n                return .failure(.permissionDenied)\n            }\n\n            output(\"[*] calling compiler script\\n\")\n            let compileScript = temporaryDir\n                .appendingPathComponent(\".supplement\")\n                .appendingPathComponent(\"compile.sh\")\n            let recipe = executeZshScript(atLocation: compileScript, output: output)\n            guard recipe.exitCode == 0 else {\n                return .failure(.compilerError)\n            }\n\n            let artifactLocation = temporaryDir\n                .appendingPathComponent(\"dist\")\n//                .appendingPathComponent(\"index.js\")\n\n            guard FileManager.default.fileExists(atPath: artifactLocation.path) else {\n                return .failure(.permissionDenied)\n            }\n\n            output(\"[*] compiled binary at \\(artifactLocation.path)\\n\")\n            ActionManager.shared.registerArtifact(forAction: action.id, artifact: artifactLocation)\n            return .success\n        }\n\n        override func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {\n            assert(!Thread.isMainThread)\n\n            guard let action = ActionManager.shared[id],\n                  let artifact = ActionManager.shared.artifacts[id]\n            else {\n                return .failure(.brokenResources)\n            }\n            guard artifact.validateSignature() else {\n                return .failure(.unauthorizedModificationDetected)\n            }\n\n            let script = artifact\n                .obtainArtifactUrl()\n                .appendingPathComponent(\"index.js\")\n\n            guard let argument = ArgumentData(\n                focusAppID: event.app?.bundleIdentifier,\n                focusAppName: event.app?.name,\n                pasteboardContent: event.content\n            )\n            .compileBase64()\n            else {\n                return .failure(.brokenResources)\n            }\n\n            print(\"[*] executing action \\(id.uuidString)\")\n\n            var resultData: ActionRecipeData?\n\n            let recipe = AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", \"node \\(script.path)\"],\n                environment: [\"Communicator_Message\": argument],\n                timeout: Double(action.timeout),\n                output: output\n            )\n\n            var lastLine = recipe.stderr\n                .trimmingCharacters(in: .whitespacesAndNewlines)\n                .components(separatedBy: \"\\n\")\n                .last?\n                .trimmingCharacters(in: .whitespaces)\n                ?? \"\"\n            let prefix = \"ActionBee-Result-Recipe://\"\n            if lastLine.hasPrefix(prefix) {\n                lastLine.removeFirst(prefix.count)\n            }\n            if let base64 = Data(base64Encoded: lastLine) {\n                resultData = ActionRecipeData.retrieve(withData: base64)\n            }\n\n            guard let result = resultData else {\n                return .failure(.invalidResponse)\n            }\n\n            return .success(result)\n        }\n\n        func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {\n            AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", atLocation.path],\n                output: output\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Python.swift",
    "content": "//\n//  Template+Python.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/30.\n//\n\nimport AuxiliaryExecute\nimport Foundation\n\nextension ActionManager {\n    class ModuleTemplatePython: ModuleTemplateExecutable {\n        override func getLanguage() -> String { \"Source - Python\" }\n        override func getTemplateBundleName() -> String { \"SourcePython\" }\n        override func getBuildHint() -> String { \"To build Python Module, python 3 and it's tool is required. Install them yourself.\" }\n\n        override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {\n            let url = ActionManager.shared\n                .actionModuleBaseUrl\n                .appendingPathComponent(id.uuidString)\n\n            let recipe = AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", \"code \\(url.path)\"]\n            )\n\n            guard recipe.exitCode == 0 else {\n                return .failure(.designatedEditorMissing)\n            }\n\n            return .success\n        }\n\n        override func compileModule(id: ActionManager.Action.ID, output _: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {\n            guard let action = ActionManager.shared[id] else {\n                return .failure(.brokenResources)\n            }\n            let actionUrl = ActionManager.shared\n                .actionModuleBaseUrl\n                .appendingPathComponent(action.id.uuidString)\n\n            ActionManager.shared.registerArtifact(forAction: action.id, artifact: actionUrl)\n            return .success\n        }\n\n        override func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {\n            assert(!Thread.isMainThread)\n\n            guard let action = ActionManager.shared[id],\n                  let artifact = ActionManager.shared.artifacts[id]\n            else {\n                return .failure(.brokenResources)\n            }\n            guard artifact.validateSignature() else {\n                return .failure(.unauthorizedModificationDetected)\n            }\n\n            let script = artifact\n                .obtainArtifactUrl()\n                .appendingPathComponent(\"main.py\")\n\n            guard let argument = ArgumentData(\n                focusAppID: event.app?.bundleIdentifier,\n                focusAppName: event.app?.name,\n                pasteboardContent: event.content\n            )\n            .compileBase64()\n            else {\n                return .failure(.brokenResources)\n            }\n\n            print(\"[*] executing action \\(id.uuidString)\")\n\n            var resultData: ActionRecipeData?\n\n            let recipe = AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", \"python3 \\(script.path)\"],\n                environment: [\"Communicator_Message\": argument],\n                timeout: Double(action.timeout),\n                output: output\n            )\n\n            var lastLine = recipe.stderr\n                .trimmingCharacters(in: .whitespacesAndNewlines)\n                .components(separatedBy: \"\\n\")\n                .last?\n                .trimmingCharacters(in: .whitespaces)\n                ?? \"\"\n            let prefix = \"ActionBee-Result-Recipe://\"\n            if lastLine.hasPrefix(prefix) {\n                lastLine.removeFirst(prefix.count)\n            }\n            if let base64 = Data(base64Encoded: lastLine) {\n                resultData = ActionRecipeData.retrieve(withData: base64)\n            }\n\n            guard let result = resultData else {\n                return .failure(.invalidResponse)\n            }\n\n            return .success(result)\n        }\n\n        func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {\n            AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", atLocation.path],\n                output: output\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Swift.swift",
    "content": "//\n//  ModuleTemplate+Swift.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport AuxiliaryExecute\nimport Cocoa\n\nextension ActionManager {\n    class ModuleTemplateSwift: ModuleTemplateExecutable {\n        override func getLanguage() -> String { \"Source - Swift\" }\n        override func getTemplateBundleName() -> String { \"SourceSwift\" }\n        override func getBuildHint() -> String { \"To build Swift Module, Xcode and it's tool xcode-build is required. Install Xcode yourself.\" }\n\n        override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {\n            guard let action = ActionManager.shared[id] else {\n                return .failure(GenericActionError.brokenResources)\n            }\n            let target = ActionManager.shared.actionModuleBaseUrl\n                .appendingPathComponent(action.id.uuidString)\n                .appendingPathComponent(\"App.xcworkspace\")\n            guard FileManager.default.fileExists(atPath: target.path) else {\n                return .failure(GenericActionError.brokenResources)\n            }\n            guard NSWorkspace.shared.open(target) else {\n                return .failure(GenericActionError.designatedEditorMissing)\n            }\n            return .success\n        }\n\n        override func compileModule(id: ActionManager.Action.ID, output: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {\n            assert(!Thread.isMainThread)\n\n            guard let action = ActionManager.shared[id] else {\n                return .failure(.brokenResources)\n            }\n\n            let temporaryDir = URL(fileURLWithPath: NSTemporaryDirectory())\n                .appendingPathComponent(UUID().uuidString)\n            try? FileManager.default.removeItem(at: temporaryDir)\n            defer {\n                try? FileManager.default.removeItem(at: temporaryDir)\n            }\n\n            do {\n                output(\"[*] starting compiler at \\(temporaryDir.path)\\n\")\n                try FileManager.default.createDirectory(at: temporaryDir, withIntermediateDirectories: true)\n                try Executor.shared.unarchiveTar(at: getTemplateBundleURL(), toDest: temporaryDir)\n                let validatedSourcePathComponents = \"Source\"\n                let userSrc = ActionManager.shared\n                    .actionModuleBaseUrl\n                    .appendingPathComponent(action.id.uuidString)\n                    .appendingPathComponent(validatedSourcePathComponents)\n                let targetSrc = temporaryDir\n                    .appendingPathComponent(validatedSourcePathComponents)\n                output(\"[*] copying user source from \\(userSrc.path) to \\(targetSrc.path)\\n\")\n                try FileManager.default.removeItem(at: targetSrc)\n                try FileManager.default.copyItem(at: userSrc, to: targetSrc)\n                FileManager.default.createFile(\n                    atPath: temporaryDir.appendingPathComponent(\".action\").path,\n                    contents: nil\n                )\n            } catch {\n                output(\"[E] \\(error.localizedDescription)\")\n                return .failure(.permissionDenied)\n            }\n\n            output(\"[*] calling compiler script\\n\")\n            let compileScript = temporaryDir\n                .appendingPathComponent(\".supplement\")\n                .appendingPathComponent(\"compile.sh\")\n            let recipe = executeZshScript(atLocation: compileScript, output: output)\n            guard recipe.exitCode == 0 else {\n                return .failure(.compilerError)\n            }\n\n            let binaryLocation = temporaryDir\n                .appendingPathComponent(\".build\")\n                .appendingPathComponent(\"cli\")\n            guard FileManager.default.fileExists(atPath: binaryLocation.path) else {\n                return .failure(.permissionDenied)\n            }\n\n            output(\"[*] compiled binary at \\(binaryLocation.path)\\n\")\n            ActionManager.shared.registerArtifact(forAction: action.id, artifact: binaryLocation)\n            return .success\n        }\n\n        func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {\n            AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", atLocation.path],\n                output: output\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Action/ActionTemplates/.templates",
    "content": ""
  },
  {
    "path": "App/Action/Action/Backend/Config/Config.swift",
    "content": "//\n//  Config.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport Combine\nimport Foundation\n\nclass Config: ObservableObject {\n    static let shared = Config()\n\n    private init() {\n        reducedEffects = reducedEffectsStore\n        pasteboardDeduplicate = pasteboardDeduplicateStore\n        silentMode = silentModeStore\n        toastMode = toastModeStore\n    }\n\n    @UserDefaultsWrapper(key: \"wiki.qaq.config.reducedEffects\", defaultValue: false)\n    private var reducedEffectsStore\n\n    @Published var reducedEffects: Bool = false {\n        didSet { reducedEffectsStore = reducedEffects }\n    }\n\n    @UserDefaultsWrapper(key: \"wiki.qaq.config.pasteboardDeduplicate\", defaultValue: true)\n    private var pasteboardDeduplicateStore\n\n    @Published var pasteboardDeduplicate: Bool = true {\n        didSet { pasteboardDeduplicateStore = pasteboardDeduplicate }\n    }\n\n    @UserDefaultsWrapper(key: \"wiki.qaq.config.silentMode\", defaultValue: false)\n    private var silentModeStore\n\n    @Published var silentMode: Bool = true {\n        didSet { silentModeStore = silentMode }\n    }\n\n    @UserDefaultsWrapper(key: \"wiki.qaq.config.toastMode\", defaultValue: false)\n    private var toastModeStore\n\n    @Published var toastMode: Bool = true {\n        didSet { toastModeStore = toastMode }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/Executor/Executor.swift",
    "content": "//\n//  Executor.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport AuxiliaryExecute\nimport Foundation\n\nfinal class Executor {\n    static let shared = Executor()\n\n    let executorDir = ActionApp\n        .documentDirectory\n        .appendingPathComponent(\"Executor\")\n\n    private init() {\n        let whoami = \"/usr/bin/whoami\"\n        let receipt = AuxiliaryExecute.spawn(command: whoami)\n        let username = receipt.stdout.trimmingCharacters(in: .whitespacesAndNewlines)\n        guard receipt.exitCode == 0, !username.isEmpty /* , username != \"root\" */ else {\n            fatalError(\"Malformed application permission\")\n        }\n        print(\"[*] whoami \\(username)\")\n\n        do {\n            let findEnv = AuxiliaryExecute.spawn(\n                command: \"/bin/zsh\",\n                args: [\"-c\", \"source ~/.zshrc 1>/dev/null 2>/dev/null && echo $PATH\"]\n            )\n            let env = findEnv.stdout.trimmingCharacters(in: .whitespacesAndNewlines)\n            print(\"[*] setting up env PATH value \\(findEnv.stdout)\")\n            let envPathBuilder = env.components(separatedBy: \":\")\n                .filter { FileManager.default.fileExists(atPath: $0) }\n            let origPathBuilder = (\n                ProcessInfo\n                    .processInfo\n                    .environment[\"PATH\"] ?? \"\"\n            )\n            .components(separatedBy: \":\")\n            .filter { FileManager.default.fileExists(atPath: $0) }\n            let newPath = Array(Set(envPathBuilder + origPathBuilder))\n                .joined(separator: \":\")\n\n            setenv(\"PATH\", newPath, 1)\n        }\n\n        try? FileManager.default.createDirectory(at: executorDir, withIntermediateDirectories: true)\n    }\n\n    enum ExecutorError: Error {\n        case unknown\n    }\n\n    func obtainXcodeCommandLineToolLocation() -> URL? {\n        let receipt = AuxiliaryExecute.spawn(\n            command: \"/usr/bin/xcode-select\",\n            args: [\"--print-path\"]\n        )\n        let path = receipt\n            .stdout\n            .trimmingCharacters(in: .whitespacesAndNewlines)\n\n        guard path != \"/\",\n              path.hasPrefix(\"/\"),\n              FileManager.default.fileExists(atPath: path)\n        else {\n            return nil\n        }\n        return URL(fileURLWithPath: path)\n    }\n\n    func unarchiveTar(at: URL, toDest: URL) throws {\n        let receipt = AuxiliaryExecute.spawn(\n            command: \"/usr/bin/tar\",\n            args: [\"-xf\", at.path, \"--directory\", toDest.path]\n        )\n        guard receipt.exitCode == 0 else {\n            throw ExecutorError.unknown\n        }\n    }\n\n    func speak(_ str: String) {\n        AuxiliaryExecute.spawn(\n            command: \"/usr/bin/say\",\n            args: [str]\n        )\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/PasteboardManager/PasteboardManager+Event.swift",
    "content": "//\n//  PasteboardManager+Event.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\nextension PasteboardManager {\n    struct PEvent: Codable, Equatable, Hashable {\n        let content: String\n        let app: AppInfo?\n\n        init(content: String, app: PasteboardManager.AppInfo?) {\n            self.content = content\n            self.app = app\n        }\n    }\n\n    struct AppInfo: Codable, Equatable, Hashable {\n        let name: String\n        let bundleIdentifier: String\n\n        init(name: String, bundleIdentifier: String) {\n            self.name = name\n            self.bundleIdentifier = bundleIdentifier\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/PasteboardManager/PasteboardManager.swift",
    "content": "//\n//  PasteboardManager.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\n\nfinal class PasteboardManager {\n    static let shared = PasteboardManager()\n\n    private init() {\n        print(\"[*] setting up Pasteboard Manager\")\n\n        Thread(\n            target: self,\n            selector: #selector(startMonitorThread),\n            object: nil\n        )\n        .start()\n    }\n\n    let systemPasteboard = NSPasteboard.general\n    private var monitorThread: Thread?\n    private var monitorRunLoop: RunLoop?\n\n    private var accessQueue = DispatchQueue(label: \"wiki.qaq.PasteboardManager.accessQueue\")\n    private var executeQueue = DispatchQueue(label: \"wiki.qaq.PasteboardManager.executeQueue\")\n    private var previousPasteboardChangeCount: Int?\n    private var previousPasteboardEvent: PEvent?\n\n    var eventBlockaded: Bool = false\n\n    @objc private func startMonitorThread() {\n        monitorThread = Thread.current\n        monitorRunLoop = RunLoop.current\n        defer {\n            self.monitorThread = nil\n            self.monitorRunLoop = nil\n        }\n        let timer = Timer(timeInterval: 0.25, repeats: true) { _ in\n            self.accessQueue.async { self.checkPasteboard() }\n        }\n        RunLoop.current.add(timer, forMode: .common)\n        CFRunLoopRun()\n    }\n\n    func clearLastEvent() {\n        print(\"[*] clearing previous pasteboard event\")\n        accessQueue.async {\n            self.previousPasteboardEvent = nil\n        }\n    }\n\n    func requestCheckPasteboard() {\n        accessQueue.async { self.checkPasteboard() }\n    }\n\n    private func checkPasteboard() {\n        guard systemPasteboard.changeCount != previousPasteboardChangeCount else {\n            return\n        }\n\n        let newChangeCount = systemPasteboard.changeCount\n        print(\"[*] NSPasteboard has changeCount \\(newChangeCount) previous at \\(previousPasteboardChangeCount ?? -1)\")\n        previousPasteboardChangeCount = newChangeCount\n        guard let copied = systemPasteboard.string(forType: .string) else {\n            print(\"[?] system pasteboard does not returns as string > ignoring\")\n            return\n        }\n\n        let app: AppInfo? = obtainRunningApplication()\n        let event = PEvent(content: copied, app: app)\n        print(\"[*] PasteboardEvent content len \\(copied.count) from \\(app?.name ?? \"nil\")\")\n\n        var shouldDispatchEvent = false\n        if let previousEvent = previousPasteboardEvent,\n           previousEvent != event || !Config.shared.pasteboardDeduplicate\n        {\n            shouldDispatchEvent = true\n        } else {\n            print(\"[*] event content did not change, ignore dispatch\")\n        }\n\n        previousPasteboardEvent = event\n\n        if shouldDispatchEvent { prepareWorkflow(forPasteboardEvent: event) }\n    }\n\n    private func obtainRunningApplication() -> AppInfo? {\n        if let axApp = obtainRunningApplicationUsingAXElement() {\n            return axApp\n        }\n\n        if let currentApplication = NSWorkspace.shared.menuBarOwningApplication,\n           let name = currentApplication.localizedName,\n           let bundleIdentifier = currentApplication.bundleIdentifier\n        {\n            return AppInfo(name: name, bundleIdentifier: bundleIdentifier)\n        }\n\n        if let currentApplication = NSWorkspace.shared.frontmostApplication,\n           let name = currentApplication.localizedName,\n           let bundleIdentifier = currentApplication.bundleIdentifier\n        {\n            return AppInfo(name: name, bundleIdentifier: bundleIdentifier)\n        }\n\n        return nil\n    }\n\n    private func obtainRunningApplicationUsingAXElement() -> AppInfo? {\n        let systemWideElement: AXUIElement = AXUIElementCreateSystemWide()\n        var focusedElement: AnyObject?\n        AXUIElementCopyAttributeValue(\n            systemWideElement,\n            kAXFocusedUIElementAttribute as CFString,\n            &focusedElement\n        )\n        guard let element = focusedElement else { return nil }\n        var pid: pid_t = 0\n        AXUIElementGetPid(element as! AXUIElement, &pid)\n        guard pid > 0 else { return nil }\n        let runningApp = NSRunningApplication(processIdentifier: pid)\n        if let name = runningApp?.localizedName,\n           let bundleIdentifier = runningApp?.bundleIdentifier\n        {\n            return AppInfo(name: name, bundleIdentifier: bundleIdentifier)\n        }\n        return nil\n    }\n\n    private func prepareWorkflow(forPasteboardEvent pasteboardEvent: PEvent) {\n        assert(!Thread.isMainThread)\n        guard !eventBlockaded else {\n            print(\"[*] this pasteboard has been blockaded due to other process exists\")\n            return\n        }\n        PasteboardManager.shared.eventBlockaded = true\n        defer {\n            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {\n                PasteboardManager.shared.eventBlockaded = false\n            }\n        }\n        print(\"[*] calling workflow manager to resolve event\")\n        print(\"    content length \\(pasteboardEvent.content.count)\")\n        print(\"    from \\(pasteboardEvent.app?.bundleIdentifier ?? \"unknown\") (\\(pasteboardEvent.app?.name ?? \"nope\"))\")\n        ActionManager.shared.handle(pasteboardEvent: pasteboardEvent)\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Backend/StatusBarManager/StatusBarManager.swift",
    "content": "//\n//  StatusBarManager.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\nfinal class StatusBarManager {\n    var hasWindowOpened: Bool = false\n\n    static let shared = StatusBarManager()\n\n    private init() {}\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/AES.swift",
    "content": "//\n//  AES.swift\n//  PTFoundation\n//\n//  Created by Lakr Aream on 12/15/20.\n//\n\nimport CommonCrypto\nimport Foundation\nimport KeychainAccess\n\nprivate var bundleId: String {\n    guard let id = Bundle.main.bundleIdentifier,\n          !id.isEmpty\n    else {\n        fatalError(\"AES Engine requires bundle identifier to work\")\n    }\n    return id\n}\n\nprivate let keychainServiceID = \"wiki.qaq.ActionBee.kcAccess\"\nprivate let keychainMainKeyID = \"wiki.qaq.ActionBee.keychainMainKeyID\"\nprivate let keychainLabel = \"ActionBee Main Crypto Key\"\nprivate let keychainComment = \"ActionBee requires this crypto key to access your encrypted data and sign sensitive information.\"\n\npublic struct AES {\n    private let key: Data\n    private let iv: Data\n\n    public static let shared: AES = {\n        #if DEBUG\n\n            var keyBuilder = \"\"\n            #if os(macOS)\n                let platformExpert = IOServiceGetMatchingService(\n                    kIOMainPortDefault,\n                    IOServiceMatching(\"IOPlatformExpertDevice\")\n                )\n                guard platformExpert > 0 else {\n                    fatalError()\n                }\n                guard let serialNumber = (\n                    IORegistryEntryCreateCFProperty(\n                        platformExpert,\n                        kIOPlatformSerialNumberKey as CFString,\n                        kCFAllocatorDefault,\n                        0\n                    )\n                    .takeUnretainedValue() as? String\n                )\n                else {\n                    fatalError()\n                }\n                IOObjectRelease(platformExpert)\n                keyBuilder = serialNumber\n            #else\n                keyBuilder = \"0xdeadbeef & 0xbadf00d & 0xdeadbeef & 0xbadf00d & 0xdeadbeef & 0xbadf00d\"\n            #endif\n\n            let key = keyBuilder + keyBuilder + keyBuilder\n            guard let aes = AES(key: key, iv: key) else {\n                fatalError(\"failed to initialize crypto engine\")\n            }\n            return aes\n        #else\n            let keychain = Keychain(service: keychainServiceID)\n            var retry = 3\n            var key: String?\n            repeat {\n                defer { retry -= 1 }\n                do {\n                    let main = try keychain.getString(keychainMainKeyID)\n                    if let main = main, main.count > 2 {\n                        key = main\n                        break\n                    } else {\n                        try keychain.remove(keychainMainKeyID)\n                        let new = UUID().uuidString\n                        key = new\n                        try keychain\n                            .label(keychainLabel)\n                            .comment(keychainComment)\n                            .set(new, key: keychainMainKeyID)\n                        break\n                    }\n                } catch {\n                    continue\n                }\n            } while retry > 0\n            guard let key = key else {\n                fatalError(\"failed to load crypto keys\")\n            }\n            guard let aes = AES(key: key, iv: key) else {\n                fatalError(\"failed to initialize crypto engine\")\n            }\n            return aes\n        #endif\n    }()\n\n    internal init?(key initKey: String, iv initIV: String) {\n        if initKey.count < kCCKeySizeAES128 || initIV.count < kCCBlockSizeAES128 {\n            return nil\n        }\n        var initKey = initKey\n        while initKey.count < 32 {\n            initKey += initKey\n        }\n        while initKey.count > 32 {\n            initKey.removeLast()\n        }\n        guard initKey.count == kCCKeySizeAES128 || initKey.count == kCCKeySizeAES256,\n              let keyData = initKey.data(using: .utf8)\n        else {\n            return nil\n        }\n\n        var initIV = initIV\n        while initIV.count < kCCBlockSizeAES128 {\n            initIV += initIV\n        }\n        while initIV.count > kCCBlockSizeAES128 {\n            initIV.removeLast()\n        }\n        guard initIV.count == kCCBlockSizeAES128, let ivData = initIV.data(using: .utf8) else {\n            return nil\n        }\n\n        key = keyData\n        iv = ivData\n    }\n\n    // MARK: - API\n\n    public func encrypt(data: Data) -> Data? {\n        crypt(data: data, option: CCOperation(kCCEncrypt))\n    }\n\n    public func decrypt(data: Data) -> Data? {\n        crypt(data: data, option: CCOperation(kCCDecrypt))\n    }\n\n    // MARK: - INTERNAL\n\n    private func crypt(data: Data?, option: CCOperation) -> Data? {\n        guard let data = data else { return nil }\n\n        let cryptLength = data.count + kCCBlockSizeAES128\n        var cryptData = Data(count: cryptLength)\n\n        let keyLength = key.count\n        let options = CCOptions(kCCOptionPKCS7Padding)\n\n        var bytesLength = Int(0)\n\n        let status = cryptData.withUnsafeMutableBytes { cryptBytes in\n            data.withUnsafeBytes { dataBytes in\n                iv.withUnsafeBytes { ivBytes in\n                    key.withUnsafeBytes { keyBytes in\n                        CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &bytesLength)\n                    }\n                }\n            }\n        }\n\n        guard UInt32(status) == UInt32(kCCSuccess) else {\n            assertionFailure()\n            return nil\n        }\n\n        cryptData.removeSubrange(bytesLength ..< cryptData.count)\n        return cryptData\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/Data.swift",
    "content": "//\n//  Data.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport CommonCrypto\nimport Foundation\n\nextension Data {\n    func sha256() -> String {\n        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))\n        withUnsafeBytes {\n            _ = CC_SHA256($0.baseAddress, CC_LONG(count), &digest)\n        }\n        let hexBytes = digest.map { String(format: \"%02hhx\", $0) }\n        let sha256Hex = hexBytes.joined()\n        return sha256Hex\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/DispatchQueue.swift",
    "content": "//\n//  DispatchQueue.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\nextension DispatchQueue {\n    static func withMainAndWait(block: @escaping () -> Void) {\n        assert(!Thread.isMainThread)\n\n        guard !Thread.isMainThread else {\n            block()\n            return\n        }\n\n        let sem = DispatchSemaphore(value: 0)\n        DispatchQueue.main.async {\n            block()\n            sem.signal()\n        }\n        sem.wait()\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/Notification.swift",
    "content": "//\n//  Notification.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\nextension Notification.Name {\n    static let editAction = Notification.Name(\"wiki.qaq.editAction\")\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/Result.swift",
    "content": "//\n//  Result.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\npublic extension Result where Success == Void {\n    static var success: Result { .success(()) }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/Throttle.swift",
    "content": "//  SwiftThrottle.swift\n//  Twitter @Lakr233\n//\n//  Created by Lakr Aream on 12/12/20.\n//\n\nimport Foundation\n\n/*\n\n This throttle is intended to prevent the program from crashing with\n too many requests or is used for saving computer resources.\n\n ** Swift Throttle is not designed for operations that require high time accuracy **\n\n */\n\n// MARK: - THROTTLE\n\npublic class Throttle {\n    // MARK: - PROPERTY\n\n    /// Setup with these values to control the throttle behave\n    /// - minimumDelay >= 0.5 second is suggested\n    public private(set) var minimumDelay: TimeInterval\n    public private(set) var workingQueue: DispatchQueue\n\n    /// lock when dispatch job to execution\n    private var executeLock = NSLock()\n\n    /// These value controls throttle behavior\n    public private(set) var lastExecute: Date?\n    public private(set) var lastRequestWasCanceled: Bool = false\n    public private(set) var scheduled: Bool = false\n\n    /// Lock when setting jobs, required by thread safe design\n    private var _assignmentLock = NSLock()\n    private var _assignment: (() -> Void)?\n    public private(set) var assignment: (() -> Void)? {\n        set {\n            _assignmentLock.lock()\n            defer { _assignmentLock.unlock() }\n            _assignment = newValue\n        }\n        get {\n            _assignmentLock.lock()\n            defer { _assignmentLock.unlock() }\n            return _assignment\n        }\n    }\n\n    // MARK: - INIT\n\n    /// Create a throttle\n    /// - Parameters:\n    ///   - minimumDelay: in second\n    ///   - queue: the queue that job will executed on, default to main\n    public init(minimumDelay delay: TimeInterval,\n                queue: DispatchQueue = DispatchQueue.main)\n    {\n        minimumDelay = delay\n        workingQueue = queue\n\n        #if DEBUG\n            if minimumDelay < 0.5 {\n                // we suggest minimumDelay to be at least 0.5 second\n                debugPrint(\"[SwiftThrottle] \"\n                    + \"minimumDelay(\\(minimumDelay) less then 0.5s will be inaccurate\"\n                    + \", last callback not guaranteed\")\n            }\n        #endif\n    }\n\n    // MARK: - API\n\n    /// Update property minimumDelay\n    /// - Parameter interval: in second\n    public func updateMinimumDelay(interval: Double) {\n        executeLock.lock()\n        minimumDelay = interval\n        executeLock.unlock()\n    }\n\n    /// Assign job to throttle\n    /// - Parameter job: call block\n    public func throttle(job: (() -> Void)?) {\n        realThrottle(job: job, useAssignment: false)\n    }\n\n    // MARK: - BACKEND\n\n    /// Check nothing but execute\n    /// - Parameter capturedJob: block to execute\n    private func releaseExec(capturedJob: @escaping (() -> Void)) {\n        lastExecute = Date()\n        workingQueue.async {\n            capturedJob()\n        }\n    }\n\n    /// Throttle is working here\n    /// - Parameters:\n    ///   - job: block that was required to execute\n    ///   - useAssignment: shall we overwrite assigned job?\n    private func realThrottle(job: (() -> Void)?, useAssignment: Bool) {\n        // lock down every thing when resigning job\n        executeLock.lock()\n        defer { self.executeLock.unlock() }\n\n        // if called from rescheduled job, cancel job overwrite\n        var capturedJobDecision: (() -> Void)?\n        if !useAssignment {\n            // resign job every time calling from user\n            assignment = job\n            capturedJobDecision = job\n        } else {\n            capturedJobDecision = assignment\n        }\n        guard let capturedJob = capturedJobDecision else { return }\n\n        // MARK: LOCK BEGIN\n\n        if let lastExec = lastExecute {\n            // executed before, value negative\n            let timeBetween = -lastExec.timeIntervalSinceNow\n\n            if timeBetween < minimumDelay {\n                // The throttle will be reprogrammed once for future execution\n                lastRequestWasCanceled = true\n                if !scheduled {\n                    scheduled = true\n                    let dispatchTime = Double(minimumDelay - timeBetween + 0.01)\n                    // Preventing trigger failures\n                    // This is where the inaccuracy comes from\n                    workingQueue.asyncAfter(deadline: .now() + dispatchTime) {\n                        self.realThrottle(job: nil, useAssignment: true)\n                        self.scheduled = false\n                    }\n                }\n            } else {\n                // Throttle release to execution\n                releaseExec(capturedJob: capturedJob)\n            }\n        }\n        else // never called before, release to execution\n        {\n            releaseExec(capturedJob: capturedJob)\n        }\n\n        // MARK: LOCK END\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/UserDefault.swift",
    "content": "//\n//  UserDefault.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\n#if DEBUG\n    private let keyPrefix = \"debug.\"\n#else\n    private let keyPrefix = \"\"\n#endif\n\n@propertyWrapper\nstruct UserDefaultsWrapper<Value> {\n    let key: String\n    let defaultValue: Value\n    var storage: UserDefaults = .standard\n\n    init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {\n        self.key = keyPrefix + key\n        self.defaultValue = defaultValue\n        self.storage = storage\n    }\n\n    var wrappedValue: Value {\n        get {\n            let value = storage.value(forKey: key) as? Value\n            return value ?? defaultValue\n        }\n        set {\n            storage.setValue(newValue, forKey: key)\n        }\n    }\n}\n\nextension UserDefaultsWrapper where Value: ExpressibleByNilLiteral {\n    init(key: String, storage: UserDefaults = .standard) {\n        self.init(key: key, defaultValue: nil, storage: storage)\n    }\n}\n\nprivate let documentEncoder = PropertyListEncoder()\nprivate let documentDecoder = PropertyListDecoder()\n\n@propertyWrapper\nstruct CodableDefaultsWrapper<Value: Codable> {\n    let key: String\n    let defaultValue: Value\n    var storage: UserDefaults = .standard\n\n    init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {\n        self.key = keyPrefix + key\n        self.defaultValue = defaultValue\n        self.storage = storage\n    }\n\n    var wrappedValue: Value {\n        get {\n            guard let data = storage.value(forKey: key) as? Data,\n                  let value = try? documentDecoder.decode(Value.self, from: data)\n            else {\n                return defaultValue\n            }\n            return value\n        }\n        set {\n            guard let data = try? documentEncoder.encode(newValue) else {\n                return\n            }\n            storage.setValue(data, forKey: key)\n        }\n    }\n}\n\n@propertyWrapper\nstruct EncryptedCodableDefaultsWrapper<Value: Codable> {\n    let key: String\n    let defaultValue: Value\n    var storage: UserDefaults = .standard\n\n    init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {\n        self.key = keyPrefix + key\n        self.defaultValue = defaultValue\n        self.storage = storage\n    }\n\n    var wrappedValue: Value {\n        get {\n            guard let data = storage.value(forKey: key) as? Data,\n                  let decrypted = AES.shared.decrypt(data: data),\n                  let value = try? documentDecoder.decode(Value.self, from: decrypted)\n            else {\n                return defaultValue\n            }\n            return value\n        }\n        set {\n            guard let data = try? documentEncoder.encode(newValue),\n                  let encrypt = AES.shared.encrypt(data: data)\n            else {\n                return\n            }\n            storage.setValue(encrypt, forKey: key)\n        }\n    }\n}\n\nextension EncryptedCodableDefaultsWrapper where Value: ExpressibleByNilLiteral {\n    init(key: String, storage: UserDefaults = .standard) {\n        self.init(key: key, defaultValue: nil, storage: storage)\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Extension/View.swift",
    "content": "//\n//  View.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\nextension View {\n    func usePreferredContentSize() -> some View {\n        frame(\n            minWidth: 400, idealWidth: 500, maxWidth: .infinity,\n            minHeight: 300, idealHeight: 350, maxHeight: .infinity,\n            alignment: .center\n        )\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/ActionModule/ModuleCreateView.swift",
    "content": "//\n//  ModuleCreateView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport SwiftUI\n\nstruct ModuleCreateSheet: View {\n    @Environment(\\.presentationMode) var presentationMode\n\n    @State var moduleName: String = \"Module - 0x\\(Int.random(in: 100_000 ... 999_999))\"\n    @State var selectedTemplate: ActionManager.ModuleTemplateIdentifier = .swift\n\n    @State var showProgress: Bool = false\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 6) {\n            if showProgress {\n                ProgressView()\n                    .frame(maxWidth: .infinity, maxHeight: .infinity)\n            } else {\n                Label(\"Create Action\", systemImage: \"doc.badge.gearshape.fill\")\n                    .font(.system(.headline, design: .rounded))\n                Divider()\n                TextField(\"Module Name\", text: $moduleName)\n                Picker(\"Language\", selection: $selectedTemplate) {\n                    ForEach(ActionManager.ModuleTemplateIdentifier.allCases, id: \\.self) { template in\n                        Text(template.obtainTemplateDetails().getLanguage())\n                    }\n                }\n                Divider()\n                HStack {\n                    Button(\"Cancel\") {\n                        presentationMode.wrappedValue.dismiss()\n                    }\n                    .keyboardShortcut(.cancelAction)\n                    Spacer()\n                    Button(\"Next\") {\n                        callCreate()\n                    }\n                    .buttonStyle(.borderedProminent)\n                    .keyboardShortcut(.defaultAction)\n                }\n            }\n        }\n        .padding()\n        .frame(width: 300, alignment: .center)\n    }\n\n    func callCreate() {\n        showProgress = true\n        DispatchQueue.global().async {\n            var actionId: UUID?\n            defer {\n                DispatchQueue.main.async {\n                    presentationMode.wrappedValue.dismiss()\n                }\n                DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {\n                    if let id = actionId {\n                        ActionManager.shared.initialingAciton.insert(id)\n                        NotificationCenter.default.post(name: .editAction, object: id)\n                    }\n                }\n            }\n            print(\"[*] \\(moduleName) \\(selectedTemplate)\")\n            actionId = ActionManager.shared.createAction(\n                withName: moduleName,\n                withModuleTemplate: selectedTemplate\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/ActionModule/ModuleEditView.swift",
    "content": "//\n//  ModuleEditView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\nimport SymbolPicker\n\nstruct ModuleEditView: View {\n    let id: UUID\n\n    @Environment(\\.presentationMode) var presentationMode\n\n    @State var editingAction: ActionManager.Action? = nil\n\n    @State var actionEnabled: Bool = true\n    @State var openSymbolPicker: Bool = false\n    @State var openCompileView: Bool = false\n    @State var hoverApplication: String? = nil\n\n    @State var compileLog: String = \"\"\n    @State var compilerFinished: Bool = false\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 8) {\n            if editingAction == nil {\n                brokenModule\n            } else {\n                HStack {\n                    Label(\"Edit Action\", systemImage: \"slider.horizontal.3\")\n                        .font(.system(.headline, design: .rounded))\n                    Spacer()\n                    Button {\n                        delete()\n                    } label: {\n                        Image(systemName: \"trash\")\n                            .font(.system(.headline, design: .rounded))\n                            .foregroundColor(.accentColor)\n                    }\n                    .buttonStyle(.plain)\n                }\n                Divider()\n                basicMetaBlock\n                enableForAppsBlock\n                editCodeBlock\n                Divider()\n                HStack {\n                    Button(\"Cancel\") {\n                        presentationMode.wrappedValue.dismiss()\n                    }\n                    .keyboardShortcut(.cancelAction)\n                    Spacer()\n                    Button(\"Save\") {\n                        finalizeEdit()\n                    }\n                    .buttonStyle(.borderedProminent)\n                    .keyboardShortcut(.defaultAction)\n                }\n            }\n        }\n        .onAppear {\n            editingAction = ActionManager.shared[id]\n            actionEnabled = ActionManager.shared.enabledActions.contains(id)\n        }\n        .opacity(openCompileView ? 0 : 1)\n        .overlay(compileOverlay)\n        .padding()\n        .frame(width: 500, alignment: .center)\n    }\n\n    var compileOverlay: some View {\n        VStack(alignment: .leading) {\n            if !compilerFinished { ProgressView().padding(.top, 20) }\n            Spacer().frame(height: 20)\n            Text(compilerFinished ? \"Compile Finished\" : \"Compiling Source\")\n                .font(.headline)\n            Spacer().frame(height: 6)\n            if !compilerFinished { RandomCodeTextView() }\n            Divider()\n            ScrollView(.vertical, showsIndicators: true) {\n                VStack(alignment: .leading, spacing: 4) {\n                    ForEach(Array(\n                        compileLog\n                            .components(separatedBy: \"\\n\")\n                            .reversed()\n                            .enumerated()\n                    ), id: \\.offset) { _, log in\n                        Text(log).textSelection(.enabled)\n                    }\n                    .font(.system(.footnote, design: .monospaced))\n                    .opacity(0.5)\n                }\n            }\n            Button(\"Cancel\") {\n                compileLog = \"\"\n                openCompileView = false\n            }\n            .opacity(compilerFinished ? 1 : 0)\n        }\n        .opacity(openCompileView ? 1 : 0)\n    }\n\n    var brokenModule: some View {\n        VStack {\n            Image(systemName: \"xmark.seal.fill\")\n                .font(.system(size: 36, weight: .semibold, design: .rounded))\n                .foregroundColor(.pink)\n                .frame(width: 80, height: 80)\n            Text(\"Broken Module\")\n                .font(.headline)\n            Divider()\n            HStack {\n                Button(\"Delete\") {\n                    ActionManager.shared.deleteModule(withId: id)\n                }\n                Button(\"Close\") {\n                    presentationMode.wrappedValue.dismiss()\n                }\n                .buttonStyle(.borderedProminent)\n            }\n        }\n        .padding()\n    }\n\n    var actionIcon: String {\n        guard let icon = editingAction?.icon,\n              !icon.isEmpty\n        else {\n            return \"text.append\"\n        }\n        return icon\n    }\n\n    var basicMetaBlock: some View {\n        Group {\n            Toggle(\"Enabled\", isOn: $actionEnabled)\n                .font(.system(.headline, design: .rounded))\n            HStack {\n                Button {\n                    openSymbolPicker = true\n                } label: {\n                    Image(systemName: actionIcon)\n                }\n                TextField(\"Name\", text: Binding<String>(\n                    get: {\n                        editingAction?.name ?? \"\"\n                    },\n                    set: { newValue in\n                        editingAction?.name = newValue\n                    }\n                ))\n                Text(\"Timeout: \")\n                TextField(\"Name\", text: Binding<String>(\n                    get: {\n                        String(editingAction?.timeout ?? 5)\n                    },\n                    set: { newValue in\n                        editingAction?.timeout = Int(newValue) ?? 5\n                    }\n                ))\n                .frame(width: 26)\n                Text(\"s\")\n            }\n            Text(\"ID: \\(editingAction?.id.uuidString ?? \"0x4422DEADBEEF\")\")\n                .textSelection(.enabled)\n                .font(.system(.footnote, design: .monospaced))\n        }\n        .sheet(isPresented: $openSymbolPicker) {\n            SymbolPicker(symbol: Binding<String>(\n                get: {\n                    actionIcon\n                },\n                set: { newValue in\n                    editingAction?.icon = newValue\n                }\n            ))\n        }\n    }\n\n    var enableForAppsBlock: some View {\n        Group {\n            HStack {\n                Text(\"Enable In App\")\n                    .font(.system(.headline, design: .rounded))\n                Spacer()\n                Button {\n                    addApp()\n                } label: {\n                    Image(systemName: \"plus\")\n                        .foregroundColor(.accentColor)\n                        .font(.system(.headline, design: .rounded))\n                }\n                .buttonStyle(.plain)\n            }\n            if let appList = editingAction?.enabledAppList,\n               !appList.isEmpty\n            {\n                ScrollView(.horizontal, showsIndicators: false) {\n                    HStack {\n                        ForEach(appList, id: \\.self) { appId in\n                            ApplicationView(appId: appId)\n                                .blur(radius: hoverApplication == appId ? 6 : 0)\n                                .overlay {\n                                    Button {\n                                        editingAction?.enabledAppList = editingAction?\n                                            .enabledAppList\n                                            .filter { $0 != appId }\n                                            ?? []\n                                    } label: {\n                                        Image(systemName: \"xmark\")\n                                            .foregroundColor(.white)\n                                            .font(.system(.headline, design: .rounded))\n                                            .frame(maxWidth: .infinity, maxHeight: .infinity)\n                                            .background(Color.black.opacity(0.5))\n                                            .cornerRadius(4)\n                                    }\n                                    .buttonStyle(.plain)\n                                    .opacity(hoverApplication == appId ? 1 : 0)\n                                }\n                                .animation(.interactiveSpring(), value: hoverApplication)\n                                .onHover { hover in\n                                    if hover {\n                                        hoverApplication = appId\n                                    } else {\n                                        hoverApplication = nil\n                                    }\n                                }\n                        }\n                    }\n                }\n                .frame(height: 26)\n            } else {\n                Button {\n                    addApp()\n                } label: {\n                    Label(\"Enabled for All Apps\", systemImage: \"app.badge.checkmark\")\n                        .font(.system(.subheadline, design: .rounded))\n                        .frame(height: 26)\n                        .frame(maxWidth: .infinity)\n                        .background(Color.accentColor.opacity(0.1))\n                        .cornerRadius(4)\n                }\n                .buttonStyle(.plain)\n            }\n            Text(\"This pasteboard action will only run if copying from these apps\")\n                .textSelection(.enabled)\n                .font(.system(.footnote))\n        }\n    }\n\n    var editCodeBlock: some View {\n        Group {\n            Text(\"Coding\")\n                .font(.system(.headline, design: .rounded))\n            HStack(spacing: 8) {\n                Button(\"Edit Code\") {\n                    editModule()\n                }\n                .buttonStyle(.borderedProminent)\n                Button(\"Show in Finder\") {\n                    showInFinder()\n                }\n                Button(\"Export\") {\n                    exportModule()\n                }\n            }\n            VStack(alignment: .leading, spacing: 2) {\n                Text(\"Module Template: \\(editingAction?.template.obtainTemplateDetails().getLanguage() ?? \"Unknown\")\")\n                Text(editingAction?.template.obtainTemplateDetails().getBuildHint() ?? \"No Build Hint\")\n                    .underline()\n                Text(\"You should recompile, click save, this module each time you edit it\")\n            }\n            .textSelection(.enabled)\n            .font(.system(.footnote))\n        }\n    }\n\n    func finalizeEdit() {\n        guard ActionManager.shared[id] != nil else {\n            presentationMode.wrappedValue.dismiss()\n            return\n        }\n        guard let action = editingAction else {\n            presentationMode.wrappedValue.dismiss()\n            return\n        }\n        ActionManager.shared.invalidateArtifactCache(forAction: id)\n        ActionManager.shared.enabledActions = ActionManager.shared\n            .enabledActions\n            .filter { $0 != id }\n        guard actionEnabled else {\n            presentationMode.wrappedValue.dismiss()\n            return\n        }\n        ActionManager.shared.enabledActions += [id]\n        ActionManager.shared.initialingAciton.remove(id)\n        compile { result in\n            switch result {\n            case .success:\n                ActionManager.shared[id] = action\n                presentationMode.wrappedValue.dismiss()\n            case let .failure(failure):\n                compilerFinished = true\n                let alert = NSAlert()\n                alert.alertStyle = .critical\n                alert.messageText = \"Unable to compile this action: \\(failure.message)\"\n                if let window = NSApp.keyWindow {\n                    alert.beginSheetModal(for: window)\n                } else {\n                    alert.runModal()\n                }\n            }\n        }\n    }\n\n    func delete() {\n        let alert = NSAlert()\n        alert.messageText = NSLocalizedString(\"Are you sure you want to delete this module? This operation can not be undone.\", comment: \"\")\n        alert.alertStyle = .critical\n        alert.addButton(withTitle: NSLocalizedString(\"Delete\", comment: \"\"))\n        alert.addButton(withTitle: NSLocalizedString(\"Cancel\", comment: \"\"))\n        guard let window = NSApp.keyWindow else {\n            return\n        }\n        alert.beginSheetModal(for: window) { resp in\n            guard resp == .alertFirstButtonReturn else {\n                return\n            }\n            presentationMode.wrappedValue.dismiss()\n            DispatchQueue.main.async {\n                ActionManager.shared[id] = nil\n            }\n        }\n    }\n\n    func addApp() {\n        let openPanel = NSOpenPanel()\n        openPanel.prompt = NSLocalizedString(\"Select Application\", comment: \"\")\n        openPanel.allowedContentTypes = [.application]\n        openPanel.allowsMultipleSelection = true\n        openPanel.canChooseDirectories = true\n        openPanel.treatsFilePackagesAsDirectories = true\n        openPanel.directoryURL = URL(fileURLWithPath: \"/Applications/\")\n        guard let window = NSApp.keyWindow else {\n            return\n        }\n        openPanel.beginSheetModal(for: window) { resp in\n            guard resp == .OK else {\n                return\n            }\n            var buildId: Set<String> = []\n            for id in editingAction?.enabledAppList ?? [] {\n                buildId.insert(id)\n            }\n            for url in openPanel.urls {\n                guard let bundle = Bundle(path: url.path),\n                      let id = bundle.bundleIdentifier\n                else {\n                    continue\n                }\n                buildId.insert(id)\n            }\n            editingAction?.enabledAppList = Array(buildId).sorted()\n        }\n    }\n\n    func showInFinder() {\n        let url = ActionManager\n            .shared\n            .actionModuleBaseUrl\n            .appendingPathComponent(editingAction?.id.uuidString ?? \"\")\n        guard NSWorkspace.shared.open(url) else {\n            let alert = NSAlert()\n            alert.alertStyle = .critical\n            alert.messageText = NSLocalizedString(\"Failed to load this module\", comment: \"\")\n            if let window = NSApp.keyWindow {\n                alert.beginSheetModal(for: window)\n            }\n            return\n        }\n    }\n\n    func editModule() {\n        let result = editingAction?.template.obtainTemplateDetails()\n            .openDesignatedEditor(id: id)\n        if case let .failure(failure) = result {\n            let alert = NSAlert()\n            alert.alertStyle = .critical\n            alert.messageText = failure.message\n            if let window = NSApp.keyWindow {\n                alert.beginSheetModal(for: window)\n            }\n        }\n    }\n\n    func exportModule() {\n        let panel = NSSavePanel()\n        panel.nameFieldStringValue = \"Module Export - \\(editingAction?.name ?? \"Unnamed\")\"\n        guard let window = NSApp.keyWindow else {\n            return\n        }\n        panel.beginSheetModal(for: window) { resp in\n            guard resp == .OK,\n                  let url = panel.url\n            else {\n                return\n            }\n            ActionManager.shared.updateActionModuleManifest(onActionId: id)\n            try? FileManager.default.removeItem(at: url)\n            try? FileManager.default.copyItem(\n                at: ActionManager.shared.actionModuleBaseUrl.appendingPathComponent(id.uuidString),\n                to: url\n            )\n        }\n    }\n\n    func compile(completion: @escaping (Result<Void, ActionManager.GenericActionError>) -> Void = { _ in }) {\n        openCompileView = true\n        guard let action = editingAction else {\n            openCompileView = false\n            completion(.failure(.brokenResources))\n            return\n        }\n        DispatchQueue.global().async {\n            let result = ActionManager.shared.issueCompile(forAction: action.id) { str in\n                DispatchQueue.withMainAndWait {\n                    compileLog.append(str)\n                }\n            }\n            DispatchQueue.main.async {\n                completion(result)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/ActionModule/ModuleElementView.swift",
    "content": "//\n//  ModuleElementView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\n\nstruct ModuleElementView: View {\n    let id: UUID\n    let notificationPublisher = NotificationCenter\n        .default\n        .publisher(for: .editAction)\n        .receive(on: RunLoop.main)\n\n    @StateObject var actionManager = ActionManager.shared\n    @State var openEdit: Bool = false\n\n    var gradientColor: Gradient {\n        if actionManager.enabledActions.contains(id) {\n            if actionManager.artifacts[id] == nil {\n                return Gradient(colors: [.pink, .red])\n\n            } else {\n                return Gradient(colors: [.yellow, .orange])\n            }\n        } else {\n            return Gradient(colors: [.gray, .black.opacity(0.8)])\n        }\n    }\n\n    var body: some View {\n        Button {\n            openEdit = true\n        } label: {\n            LinearGradient(\n                gradient: gradientColor,\n                startPoint: .topTrailing,\n                endPoint: .bottomTrailing\n            )\n            .overlay { Color.orange.opacity(0.5) }\n            .overlay { content }\n            .cornerRadius(8)\n            .clipped()\n            .frame(width: 140, height: 80)\n        }\n        .overlay {\n            if actionManager.artifacts[id] == nil {\n                Image(systemName: \"xmark.octagon.fill\")\n                    .foregroundColor(.white)\n                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)\n                    .padding(4)\n            }\n        }\n        .buttonStyle(.plain)\n        .onHover { hover in\n            if hover {\n                NSCursor.pointingHand.push()\n            } else {\n                NSCursor.pop()\n            }\n        }\n        .onReceive(notificationPublisher) { notification in\n            guard let notificationId = notification.object as? UUID,\n                  notificationId == id\n            else {\n                return\n            }\n            openEdit = true\n        }\n        .sheet(isPresented: $openEdit) {\n            ModuleEditView(id: id)\n        }\n    }\n\n    var content: some View {\n        Group {\n            if let action = actionManager[id] {\n                VStack(spacing: 4) {\n                    Image(systemName: action.icon)\n                        .font(.system(.headline, design: .rounded))\n                        .foregroundColor(.white)\n                        .frame(maxWidth: .infinity, alignment: .leading)\n                    Spacer()\n                    Text(action.name)\n                        .font(.system(.headline, design: .rounded))\n                        .lineLimit(3)\n                        .foregroundColor(.white)\n                        .frame(maxWidth: .infinity, alignment: .leading)\n                }\n                .background(\n                    Image(systemName: action.icon)\n                        .font(.system(size: 48, weight: .semibold, design: .rounded))\n                        .foregroundColor(.white)\n                        .opacity(0.1)\n                        .offset(x: 50, y: 10)\n                )\n                .padding(8)\n            } else {\n                Text(\"Error\").font(.headline)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/ActionModule/ModuleImportView.swift",
    "content": "//\n//  ModuleImportView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/18.\n//\n\nimport SwiftUI\n\nstruct ModuleImportView: View {\n    let url: URL\n\n    @Environment(\\.presentationMode) var presentationMode\n\n    @State var openEdit: Bool = false\n    @State var editingAction: ActionManager.Action.ID? = nil\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 12) {\n            Image(systemName: \"exclamationmark.triangle.fill\")\n                .font(.system(size: 42, weight: .semibold, design: .rounded))\n                .foregroundColor(.pink)\n            Text(\"You are about to import an untrusted module\")\n                .font(.system(.headline))\n                .foregroundColor(.pink)\n            Text(\"Importing malicious module may damage your system, you are in charge to review this module.\")\n                .font(.system(.footnote))\n                .foregroundColor(.pink)\n            HStack {\n                Button(\"Trust & Import\") {\n                    startImport()\n                }\n                .keyboardShortcut(.defaultAction)\n                .tint(.pink)\n                .buttonStyle(.borderedProminent)\n                Button(\"Cancel\") {\n                    presentationMode.wrappedValue.dismiss()\n                }\n                .keyboardShortcut(.cancelAction)\n            }\n            Divider()\n            Text(url.path)\n                .underline()\n                .font(.system(.footnote, design: .monospaced))\n                .opacity(0.5)\n                .onHover { if $0 { NSCursor.pointingHand.push() } else { NSCursor.pop() }}\n                .onTapGesture { NSWorkspace.shared.open(url) }\n        }\n        .padding()\n        .sheet(isPresented: $openEdit) {\n            ModuleEditView(id: editingAction ?? .init())\n        }\n        .onChange(of: openEdit) { newValue in\n            if newValue == false, editingAction != nil {\n                presentationMode.wrappedValue.dismiss()\n            }\n        }\n        .frame(width: 400)\n    }\n\n    func startImport() {\n        DispatchQueue.global().async {\n            let result = ActionManager.shared.importModule(at: url)\n            DispatchQueue.main.async {\n                switch result {\n                case let .success(action):\n                    openEdit = true\n                    editingAction = action\n                case let .failure(failure):\n                    guard let window = NSApp.keyWindow else {\n                        presentationMode.wrappedValue.dismiss()\n                        return\n                    }\n                    let alert = NSAlert()\n                    alert.alertStyle = .critical\n                    alert.messageText = failure.localizedDescription\n                    alert.addButton(withTitle: \"OK\")\n                    alert.beginSheetModal(for: window) { _ in\n                        presentationMode.wrappedValue.dismiss()\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/ActionModule/ModuleManageView.swift",
    "content": "//\n//  ModuleManageView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/26.\n//\n\nimport SwiftUI\n\nstruct ModuleManageView: View {\n    @ObservedObject var actionManager = ActionManager.shared\n\n    @State var searchKey: String = \"\"\n    @State var openCreate: Bool = false\n\n    @State var importQueue: [URL]? = nil\n    @State var importingItem: URL? = nil\n\n    var actions: [ActionManager.Action] {\n        if searchKey.isEmpty {\n            return actionManager.actions\n        } else {\n            let key = searchKey.lowercased()\n            return actionManager\n                .actions\n                .filter { $0.name.lowercased().contains(key) }\n        }\n    }\n\n    var body: some View {\n        GeometryReader { r in\n            if actionManager.actions.isEmpty {\n                VStack(spacing: 12) {\n                    Image(systemName: \"arrow.up\")\n                        .font(.system(size: 26, weight: .regular, design: .rounded))\n                    Text(\"Create an action by click plus button on toolbar to process your pasteboard event. Format text, clean up links, speak when copy from special app, send to your device, etc etc. Choose an language you are familiar with to get start.\")\n                        .font(.system(.subheadline))\n                }\n                .padding()\n                .frame(maxWidth: .infinity, maxHeight: .infinity)\n            } else {\n                ScrollView {\n                    LazyVGrid(columns: [GridItem(.adaptive(minimum: 140, maximum: 140))], alignment: .leading, spacing: 8) {\n                        ForEach(actions, id: \\.hashValue) { action in\n                            ModuleElementView(id: action.id)\n                        }\n                    }\n                    .padding(10)\n                    .animation(.interactiveSpring(), value: r.size)\n                    .animation(.interactiveSpring(), value: searchKey)\n                }\n            }\n        }\n        .sheet(isPresented: $openCreate) { ModuleCreateSheet() }\n        .sheet(\n            isPresented: Binding<Bool>(\n                get: { importingItem != nil },\n                set: { opened in\n                    importingItem = nil\n                    if !opened {\n                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n                            if !(importQueue?.isEmpty ?? true) {\n                                importQueue?.removeFirst()\n                            }\n                            checkImportQueue()\n                        }\n                    }\n                }\n            )\n        ) {\n            ModuleImportView(url: importingItem ?? URL(fileURLWithPath: \"/bad/\"))\n        }\n        .searchable(text: $searchKey)\n        .toolbar {\n            ToolbarItem {\n                Button {\n                    openCreate = true\n                } label: {\n                    Label(\"Add Action\", systemImage: \"plus\")\n                }\n                .keyboardShortcut(\"n\", modifiers: .command)\n            }\n            ToolbarItem {\n                Button {\n                    importActions()\n                } label: {\n                    Label(\"Import Action\", systemImage: \"square.and.arrow.down\")\n                }\n            }\n        }\n        .navigationTitle(\"Module\")\n        .usePreferredContentSize()\n    }\n\n    func checkImportQueue() {\n        guard let newValue = importQueue else {\n            return\n        }\n        guard !newValue.isEmpty else {\n            importQueue = nil\n            importingItem = nil\n            return\n        }\n        importingItem = newValue.first\n    }\n\n    func importActions() {\n        let panel = NSOpenPanel()\n        panel.canChooseDirectories = true\n        panel.canChooseFiles = false\n        panel.resolvesAliases = true\n        panel.treatsFilePackagesAsDirectories = true\n        panel.allowsMultipleSelection = true\n        guard let window = NSApp.keyWindow else {\n            return\n        }\n        panel.beginSheetModal(for: window) { resp in\n            guard resp == .OK,\n                  !panel.urls.isEmpty\n            else {\n                return\n            }\n            self.importQueue = panel.urls\n            self.checkImportQueue()\n        }\n    }\n\n    func importModule(at: URL) {\n        assert(!Thread.isMainThread)\n        let sem = DispatchSemaphore(value: 0)\n        DispatchQueue.main.async {\n            guard let window = NSApp.keyWindow else {\n                sem.signal()\n                return\n            }\n            let alert = NSAlert()\n            alert.alertStyle = .critical\n            alert.messageText = \"You are about to import an Action Module which is untrusted with no signature. Importing malicious modules can pose unknown risks and there is no sandbox nor container dealing with it.\"\n            alert.informativeText = at.path\n            alert.addButton(withTitle: \"Trust And Import\")\n            alert.addButton(withTitle: \"Cancel\")\n            alert.beginSheetModal(for: window) { resp in\n                guard resp == .alertFirstButtonReturn else {\n                    sem.signal()\n                    return\n                }\n                DispatchQueue.global().async {\n                    let result = actionManager.importModule(at: at)\n                    if case let .failure(failure) = result {\n                        print(failure.localizedDescription)\n                        let sem2 = DispatchSemaphore(value: 0)\n                        DispatchQueue.main.async {\n                            let alert = NSAlert()\n                            alert.alertStyle = .critical\n                            alert.messageText = \"Failed to import this module\"\n                            alert.informativeText = failure.localizedDescription\n                            alert.beginSheetModal(for: window) { _ in sem2.signal() }\n                        }\n                        sem2.wait()\n                    }\n                    sem.signal()\n                }\n            }\n        }\n        sem.wait()\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Effect/RandomCodeTextView.swift",
    "content": "//\n//  RandomCodeTextView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct RandomCodeTextView: View {\n    @State var code = \"Made with love by @Lakr233 \"\n\n    let timer = Timer\n        .publish(every: 0.1, on: .main, in: .common)\n        .autoconnect()\n\n    var body: some View {\n        Text(code)\n            .font(.system(.footnote, design: .monospaced))\n            .lineLimit(1)\n            .onReceive(timer) { _ in\n                if code.count > 50 { code = \"\" }\n                for _ in 0 ... Int.random(in: 1 ... 3) {\n                    if let c = \"`1234567890-=qwertyuiop[]asdfghjkl;'\\\\zxcvbnm,./\".randomElement() {\n                        code += String(c)\n                    }\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/ApplicationView.swift",
    "content": "//\n//  ApplicationView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct ApplicationView: View {\n    let appId: String\n\n    var body: some View {\n        Group {\n            if let url = NSWorkspace\n                .shared\n                .urlForApplication(withBundleIdentifier: appId),\n                let bundle = Bundle(url: url)\n            {\n                HStack(spacing: 4) {\n                    Image(nsImage: NSWorkspace.shared.icon(forFile: url.path))\n                        .resizable()\n                        .antialiased(true)\n                        .frame(width: 24, height: 24)\n                        .cornerRadius(4)\n                        .clipped()\n                    VStack(alignment: .leading, spacing: 2) {\n                        Text(bundle.infoDictionary?[kCFBundleNameKey as String] as? String ?? \"Unknown Name\")\n                            .font(.system(size: 10, weight: .semibold, design: .rounded))\n                            .lineLimit(1)\n                        Text(appId)\n                            .font(.system(size: 6, weight: .semibold, design: .monospaced))\n                            .lineLimit(1)\n                    }\n                }\n            } else {\n                HStack(spacing: 4) {\n                    Image(systemName: \"questionmark.app.dashed\")\n                        .font(.system(size: 16, weight: .regular, design: .rounded))\n                    Text(appId)\n                        .font(.system(size: 10, weight: .semibold, design: .rounded))\n                }\n            }\n        }\n        .frame(height: 26)\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/DiagnosticLogView.swift",
    "content": "//\n//  DiagnosticLogView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\n\nclass Logger: ObservableObject {\n    fileprivate static let shared = Logger()\n\n    private let logCountLimitation = 4096\n\n    private init() {\n        logs.reserveCapacity(logCountLimitation + 1)\n    }\n\n    struct Log: Identifiable, Equatable {\n        var id: UUID = .init()\n        var message: String\n    }\n\n    @Published var logs: [Log] = []\n    private var logsLock = NSLock()\n\n    fileprivate func append(_ str: String) {\n        DispatchQueue.global().async { [self] in\n            logsLock.lock()\n            var read = logs\n            read.append(.init(message: str))\n            if read.count > logCountLimitation {\n                read.removeFirst(read.count - logCountLimitation)\n            }\n            DispatchQueue.withMainAndWait {\n                self.logs = read\n            }\n            logsLock.unlock()\n        }\n    }\n}\n\n// overwrite print function\nfunc print(_ str: String) {\n    let str = str.trimmingCharacters(in: .newlines)\n    Swift.print(str)\n    Logger.shared.append(str)\n}\n\nstruct DiagnosticLogView: View {\n    @StateObject var logger = Logger.shared\n\n    @State var highlight: Logger.Log.ID?\n    @State var searchKey: String = \"\"\n\n    var logs: [Logger.Log] {\n        if searchKey.count > 0 {\n            let key = searchKey.lowercased()\n            return logger\n                .logs\n                .filter { $0.message.lowercased().contains(key) }\n        } else {\n            return logger.logs\n        }\n    }\n\n    var body: some View {\n        ScrollView(.vertical, showsIndicators: true) {\n            ScrollViewReader { reader in\n                LazyVStack(alignment: .leading, spacing: 0) {\n                    ForEach(logs) { log in\n                        ScrollView(.horizontal, showsIndicators: false) {\n                            Text(log.message)\n                                .textSelection(.enabled)\n                        }\n                        .frame(maxWidth: .infinity)\n                        .padding(2)\n                        .background(\n                            RoundedRectangle(cornerRadius: 4)\n                                .foregroundColor(.accentColor)\n                                .opacity(highlight == log.id ? 0.1 : 0)\n                                .animation(.interactiveSpring(), value: highlight)\n                        )\n                        .tag(log.id)\n                        .onHover { hover in\n                            if hover {\n                                highlight = log.id\n                            } else {\n                                highlight = nil\n                            }\n                        }\n                    }\n                    .font(.system(size: 10, weight: .regular, design: .monospaced))\n                }\n                .padding(10)\n                .onChange(of: logger.logs) { newValue in\n                    guard let id = newValue.last?.id else {\n                        return\n                    }\n                    withAnimation(.interactiveSpring()) {\n                        reader.scrollTo(id)\n                    }\n                }\n            }\n        }\n        .searchable(text: $searchKey)\n        .toolbar {\n            ToolbarItem {\n                Button {\n                    let panel = NSSavePanel()\n                    panel.nameFieldStringValue = \"ActionBee Diagnostic \\(Int(Date().timeIntervalSince1970)).log\"\n                    guard let window = NSApp.keyWindow else {\n                        return\n                    }\n                    panel.beginSheetModal(for: window) { resp in\n                        guard resp == .OK, let url = panel.url else {\n                            return\n                        }\n                        let logs = logger.logs.map(\\.message).joined(separator: \"\\n\")\n                        try? logs.write(toFile: url.path, atomically: true, encoding: .utf8)\n                    }\n                } label: {\n                    Label(\"Share\", systemImage: \"square.and.arrow.up\")\n                }\n            }\n        }\n        .navigationTitle(\"Diagnostic\")\n        .usePreferredContentSize()\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/HistoryView.swift",
    "content": "//\n//  HistoryView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct HistoryView: View {\n    @StateObject var actionManager = ActionManager.shared\n\n    @State var searchKey = \"\"\n    @State var hoverId: ActionManager.HistoryElement.ID? = nil\n\n    var histories: [ActionManager.HistoryElement] {\n        if searchKey.isEmpty {\n            return actionManager.histories\n        }\n        let key = searchKey.lowercased()\n        return actionManager\n            .histories\n            .filter { $0.search(with: key) }\n    }\n\n    var body: some View {\n        Group {\n            if histories.isEmpty {\n                VStack(spacing: 12) {\n                    Image(systemName: \"rectangle.dashed.badge.record\")\n                        .font(.system(size: 26, weight: .regular, design: .rounded))\n                    Text(\"No History Was Found\")\n                        .font(.system(.footnote))\n                }\n                .padding()\n                .frame(maxWidth: .infinity, maxHeight: .infinity)\n            } else {\n                ScrollView {\n                    LazyVStack(spacing: 2) {\n                        ForEach(histories.reversed()) { record in\n                            HStack(alignment: .top, spacing: 6) {\n                                Text(\"> \")\n                                    .font(.system(.subheadline, design: .rounded))\n                                Divider()\n                                HistoryRecordView(record: record)\n                            }\n                            .frame(maxWidth: .infinity)\n                            .padding(2)\n                            .background(Color.accentColor.opacity(record.id == hoverId ? 0.1 : 0))\n                            .cornerRadius(8)\n                            .onHover { hover in\n                                hoverId = hover ? record.id : nil\n                            }\n                        }\n                    }\n                    .padding(10)\n                }\n                .animation(.interactiveSpring(), value: hoverId)\n                .animation(.interactiveSpring(), value: searchKey)\n            }\n        }\n\n        .toolbar {\n            ToolbarItem {\n                Button { clearHistory() } label: {\n                    Label(\"Clear History\", systemImage: \"xmark.circle\")\n                }\n            }\n        }\n        .searchable(text: $searchKey)\n        .navigationTitle(\"History\")\n        .usePreferredContentSize()\n    }\n\n    func clearHistory() {\n        let alert = NSAlert()\n        alert.alertStyle = .critical\n        alert.messageText = NSLocalizedString(\"Are you sure you want to delete all history records? This operation can not be undone.\", comment: \"\")\n        alert.addButton(withTitle: NSLocalizedString(\"Delete\", comment: \"\"))\n        alert.addButton(withTitle: NSLocalizedString(\"Cancel\", comment: \"\"))\n        guard let window = NSApp.keyWindow else {\n            return\n        }\n        alert.beginSheetModal(for: window) { resp in\n            guard resp == .alertFirstButtonReturn else {\n                return\n            }\n            actionManager.histories = []\n        }\n    }\n}\n\nstruct HistoryRecordView: View {\n    let record: ActionManager.HistoryElement\n    var body: some View {\n        VStack(alignment: .leading, spacing: 4) {\n            Text(\"Pasteboard Event\")\n                .font(.system(.subheadline, design: .monospaced))\n                .bold()\n            Text(\"Length: \\(record.event.content.count) Action Candidates: \\(record.actionCandidates.count)\")\n            if !record.succeedAction.isEmpty {\n                Divider()\n                ForEach(record.succeedAction) { item in\n                    Text(\"+ [\\(ActionManager.shared[item.action]?.name ?? \"Deleted Action\")]\")\n                    Text(\"  Post Action: \\(item.recipeAction)\")\n                    ScrollView(.horizontal, showsIndicators: false) {\n                        Text(\"  Content: \\(item.recipeContent)\").lineLimit(1)\n                    }\n                }\n                .foregroundColor(.blue)\n            }\n            if !record.failedAction.isEmpty {\n                Divider()\n                ForEach(record.failedAction) { item in\n                    Text(\"- [\\(ActionManager.shared[item.action]?.name ?? \"Deleted Action\")]\")\n                    Text(\"  \\(item.errorHint)\")\n                }\n                .foregroundColor(.pink)\n            }\n            Divider()\n            Text(record.date.formatted(date: .complete, time: .complete))\n                .opacity(0.5)\n        }\n        .font(.system(.footnote, design: .monospaced))\n        .frame(maxWidth: .infinity, alignment: .leading)\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/LicenseView.swift",
    "content": "//\n//  LicenseView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport SwiftUI\n\nstruct LicenseView: View {\n    @State var agreed = false\n    @Environment(\\.presentationMode) var presentationMode\n\n    var licenseText: String {\n        guard let url = Bundle.main.url(forResource: \"License\", withExtension: \"txt\"),\n              let text = try? String(contentsOfFile: url.path)\n        else {\n            return \"This app's bundle is broken, do not use it.\"\n        }\n        return text\n    }\n\n    var body: some View {\n        VStack(alignment: .leading, spacing: 8) {\n            Label(\"Software License\", systemImage: \"flag.2.crossed\")\n                .font(.system(.headline, design: .rounded))\n            Divider()\n            ScrollView {\n                Text(licenseText)\n                    .font(.system(.subheadline, design: .rounded))\n            }\n            .frame(maxHeight: 250)\n            Divider()\n            HStack {\n                Toggle(\"I understand and agree to this license.\", isOn: $agreed)\n                Spacer()\n                Button(\"Done\") {\n                    ActionApp.agreeToLicense = agreed\n                    presentationMode.wrappedValue.dismiss()\n                }\n                .disabled(!agreed)\n                .buttonStyle(.borderedProminent)\n                .keyboardShortcut(.defaultAction)\n            }\n        }\n        .padding()\n        .task {\n            agreed = ActionApp.agreeToLicense\n        }\n        .onChange(of: agreed) { newValue in\n            if !newValue {\n                ActionApp.agreeToLicense = false\n            }\n        }\n        .frame(width: 450, alignment: .center)\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/MainView.swift",
    "content": "//\n//  ContentView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\nstruct MainView: View {\n    @State var openArgumentsSeet: Bool = false\n\n    var body: some View {\n        NavigationView {\n            SidebarView()\n            WelcomeView()\n        }\n        .navigationTitle(\"Action Bee\")\n        .toolbar {\n            ToolbarItem(placement: .navigation) {\n                Button {\n                    NSApp.keyWindow?.firstResponder?.tryToPerform(\n                        #selector(NSSplitViewController.toggleSidebar(_:)),\n                        with: nil\n                    )\n                } label: {\n                    Label(\"Toggle Sidebar\", systemImage: \"sidebar.leading\")\n                }\n            }\n        }\n        .sheet(isPresented: $openArgumentsSeet) {\n            LicenseView()\n        }\n        .task {\n            _ = Menubar.shared\n        }\n        .task {\n            checkRequirements()\n        }\n        .onChange(of: openArgumentsSeet) { newValue in\n            if !newValue { checkRequirements() }\n        }\n    }\n\n    func checkRequirements() {\n        guard ActionApp.agreeToLicense else {\n            openArgumentsSeet = true\n            return\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/SettingView.swift",
    "content": "//\n//  SettingView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport SwiftUI\n\nstruct SettingView: View {\n    @StateObject var config = Config.shared\n    @State var showLicense = false\n\n    var body: some View {\n        ScrollView {\n            VStack(alignment: .leading, spacing: 10) {\n                Section {\n                    Toggle(\"Pasteboard Deduplicate\", isOn: $config.pasteboardDeduplicate)\n                        .font(.subheadline)\n                    Text(\"Pasteboard content matches previous will not generate event if on\")\n                        .font(.footnote)\n                    Toggle(\"Silent Mode\", isOn: $config.silentMode)\n                        .font(.subheadline)\n                    Text(\"Do not show popover after action triggered\")\n                        .font(.footnote)\n                    Toggle(\"Toast Mode\", isOn: $config.toastMode)\n                        .font(.subheadline)\n                        .disabled(config.silentMode)\n                    Text(\"Use toast instead of popover on menubar\")\n                        .font(.footnote)\n                        .opacity(config.silentMode ? 0.25 : 1)\n                    Toggle(\"Reduced UI Effects\", isOn: $config.reducedEffects)\n                        .font(.subheadline)\n                    Text(\"Turning off visual effects does not affect app's core functionality\")\n                        .font(.footnote)\n                } header: {\n                    Text(\"Application\")\n                        .font(.system(.headline, design: .rounded))\n                } footer: {\n                    Divider()\n                }\n                Label(\"EOF\", systemImage: \"text.append\")\n                    .font(.system(.caption2, design: .rounded))\n            }\n            .padding(10)\n        }\n        .toolbar {\n            ToolbarItem {\n                Button {\n                    NSWorkspace.shared.open(URL(string: \"https://github.com/Lakr233/ActionBee\")!)\n                } label: {\n                    Label(\"Get Source Code\", systemImage: \"chevron.left.forwardslash.chevron.right\")\n                }\n            }\n            ToolbarItem {\n                Button {\n                    showLicense = true\n                } label: {\n                    Label(\"License\", systemImage: \"flag.2.crossed\")\n                }\n                .sheet(isPresented: $showLicense) {\n                    LicenseView()\n                }\n            }\n        }\n        .navigationTitle(\"Setting\")\n        .usePreferredContentSize()\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/SidebarView.swift",
    "content": "//\n//  SidebarView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\n#if DEBUG\n    private let stubNavigationTarget: some View = Text(\"Hello World\")\n        .usePreferredContentSize()\n#endif\n\nstruct SidebarView: View {\n    var body: some View {\n        List {\n            Section(\"App\") {\n                NavigationLink {\n                    WelcomeView()\n                } label: {\n                    Label(\"Welcome\", systemImage: \"sun.min.fill\")\n                }\n            }\n\n            Section(\"Action\") {\n                NavigationLink {\n                    ModuleManageView()\n                } label: {\n                    Label(\"Module\", systemImage: \"tray.full\")\n                }\n                NavigationLink {\n                    HistoryView()\n                } label: {\n                    Label(\"History\", systemImage: \"clock\")\n                }\n            }\n\n            Section(\"Misc\") {\n                NavigationLink {\n                    SettingView()\n                } label: {\n                    Label(\"Setting\", systemImage: \"gear\")\n                }\n                NavigationLink {\n                    DiagnosticLogView()\n                } label: {\n                    Label(\"Diagnostic\", systemImage: \"heart.text.square\")\n                }\n            }\n        }\n        .listStyle(SidebarListStyle())\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Generic/WelcomeView.swift",
    "content": "//\n//  WelcomeView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/7/25.\n//\n\nimport Colorful\nimport SwiftUI\n\nstruct WelcomeView: View {\n    @State var config = Config.shared\n\n    var version: String {\n        var ret = \"Version: \" +\n            (Bundle.main.infoDictionary?[\"CFBundleShortVersionString\"] as? String ?? \"Unknown\")\n            + \" Build: \" +\n            (Bundle.main.infoDictionary?[\"CFBundleVersion\"] as? String ?? \"Unknown\")\n        #if DEBUG\n            ret = \"👾 \\(ret) 👾\"\n        #endif\n        return ret\n    }\n\n    var body: some View {\n        ZStack {\n            if !config.reducedEffects {\n                ColorfulView(colors: [.accentColor], colorCount: 4)\n                    .ignoresSafeArea()\n            }\n            VStack(spacing: 4) {\n                Image(\"Avatar\")\n                    .antialiased(true)\n                    .resizable()\n                    .aspectRatio(contentMode: .fit)\n                    .frame(width: 128, height: 128)\n\n                Spacer().frame(height: 16)\n\n                Text(\"Welcome to Action Bee\")\n                    .font(.system(.headline, design: .rounded))\n                Text(\"A programmable pasteboard action trigger.\")\n                    .font(.system(.body, design: .rounded))\n\n                Spacer().frame(height: 24)\n            }\n\n            VStack {\n                Spacer()\n                Text(version)\n                    .font(.system(size: 12, weight: .semibold, design: .rounded))\n                    .opacity(0.5)\n            }\n        }\n        .padding()\n        .navigationTitle(\"Action Bee\")\n        .usePreferredContentSize()\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Menubar/Menubar.swift",
    "content": "//\n//  Menubar.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Cocoa\nimport SwiftUI\n\nclass Menubar: ObservableObject {\n    static let shared = Menubar()\n\n    var popover: NSPopover\n    var statusItem: NSStatusItem?\n    var eventMonitor: EventMonitor?\n\n    private init() {\n        let statusItem = NSStatusBar\n            .system\n            .statusItem(withLength: NSStatusItem.variableLength)\n        statusItem.button?.action = #selector(togglePopover(sender:))\n        self.statusItem = statusItem\n        let buildPopover = NSPopover()\n        popover = buildPopover\n        let view = MenubarView()\n        buildPopover.contentViewController = NSHostingController(rootView: view)\n        eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown], handler: mouseEventHandler)\n\n        statusItem.button?.title = \"🎉\"\n        statusItem.button?.target = self\n    }\n\n    func showPopover(_: AnyObject? = nil) {\n        if let statusBarButton = statusItem?.button {\n            popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: NSRectEdge.maxY)\n            eventMonitor?.start()\n        }\n    }\n\n    func hidePopover(_ sender: AnyObject? = nil) {\n        popover.performClose(sender)\n        eventMonitor?.stop()\n    }\n\n    func mouseEventHandler(_ event: NSEvent?) {\n        if popover.isShown, let event = event {\n            hidePopover(event)\n        }\n    }\n\n    @objc\n    func togglePopover(sender: AnyObject) {\n        if popover.isShown {\n            hidePopover(sender)\n        } else {\n            showPopover(sender)\n        }\n    }\n\n    enum TitleType: String {\n        case ready = \"🎉\"\n        case running = \"💨\"\n    }\n\n    private let titleThrottle = Throttle(minimumDelay: 0.5, queue: .main)\n    func switchTitle(status: TitleType) {\n        titleThrottle.throttle {\n            self.statusItem?.button?.title = status.rawValue\n        }\n    }\n}\n\nextension Menubar {\n    class EventMonitor {\n        private var monitor: Any?\n        private let mask: NSEvent.EventTypeMask\n        private let handler: (NSEvent?) -> Void\n\n        public init(mask: NSEvent.EventTypeMask, handler: @escaping (NSEvent?) -> Void) {\n            self.mask = mask\n            self.handler = handler\n        }\n\n        deinit {\n            stop()\n        }\n\n        public func start() {\n            monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler) as! NSObject\n        }\n\n        public func stop() {\n            if monitor != nil {\n                NSEvent.removeMonitor(monitor!)\n                monitor = nil\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Menubar/MenubarView.swift",
    "content": "//\n//  MenubarView.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/16.\n//\n\nimport Colorful\nimport SwiftUI\n\nstruct MenubarView: View {\n    @StateObject var menubar = Menubar.shared\n    @StateObject var actionManager = ActionManager.shared\n\n    var lastHistory: ActionManager.HistoryElement? {\n        if let last = actionManager.histories.last,\n           last.date > ActionApp.bootTime\n        {\n            return last\n        }\n        return nil\n    }\n\n    var body: some View {\n        ZStack {\n            if actionManager.actionRunning {\n                ZStack {\n                    VStack(spacing: 20) {\n                        ProgressView()\n                        Text(actionManager.actionRunningHint)\n                            .font(.system(.subheadline, design: .monospaced))\n                    }\n                }\n                .frame(width: 400, height: 200)\n            } else if let lastHistory = lastHistory {\n                VStack {\n                    Spacer().frame(height: 16)\n                    Image(\n                        systemName: lastHistory.failedAction.isEmpty\n                            ? \"checkmark.circle.fill\"\n                            : \"checkmark.circle.trianglebadge.exclamationmark\"\n                    )\n                    .foregroundColor(lastHistory.failedAction.isEmpty ? .green : .orange)\n                    .font(.system(size: 36, weight: .semibold, design: .rounded))\n                    Spacer().frame(height: 16)\n                    HistoryRecordView(record: lastHistory)\n                    Divider().hidden()\n                }\n                .padding()\n                .frame(width: 400)\n            } else {\n                VStack(alignment: .leading, spacing: 8) {\n                    Image(\"Avatar\")\n                        .antialiased(true)\n                        .resizable()\n                        .aspectRatio(contentMode: .fit)\n                        .frame(width: 50, height: 50)\n                    HStack {\n                        Image(systemName: \"circle.fill\")\n                            .font(.headline)\n                            .foregroundColor(.green)\n                        Text(\"ActionBee is ready to accept pasteboard events.\")\n                            .font(.headline)\n                    }\n\n                    RandomCodeTextView()\n                    Divider().hidden()\n                }\n                .padding()\n                .frame(width: 400, height: 200)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action/Interface/Toast/Toast.swift",
    "content": "//\n//  Toast.swift\n//  Action\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport Cocoa\nimport Foundation\nimport SwiftUI\n\nprivate class ToastWindow: NSWindow {\n    init(with screen: NSScreen) {\n        super.init(\n            contentRect: screen.frame,\n            styleMask: [.borderless, .fullSizeContentView],\n            backing: .buffered,\n            defer: false\n        )\n\n        isOpaque = false\n        alphaValue = 1\n\n        titleVisibility = .hidden\n        titlebarAppearsTransparent = true\n\n        backgroundColor = .clear\n\n        ignoresMouseEvents = true\n        isMovable = false\n        isMovableByWindowBackground = false\n\n        // .fullScreenAuxiliary .stationary .canJoinAllSpaces\n        collectionBehavior = NSWindow.CollectionBehavior(rawValue: 273)\n        styleMask = .borderless\n\n        // The standard ScreenSaverView class actually sets the window\n        // level to 2002, not the 1000 defined by NSScreenSaverWindowLevel\n        // and kCGScreenSaverWindowLevel\n        /// https://github.com/genekogan/ofxScreenGrab/blob/master/src/macGlutfix.m\n        level = NSWindow.Level(rawValue: 2005)\n\n        setFrameOrigin(screen.frame.origin)\n\n        makeKeyAndOrderFront(nil)\n        hasShadow = false\n    }\n}\n\nprivate class ToastWindowController: NSWindowController {\n    init(with screen: NSScreen, systemIcon: String, message: String) {\n        super.init(window: ToastWindow(with: screen))\n        contentViewController = NSHostingController(\n            rootView: ToastView(systemIcon: systemIcon, message: message)\n        )\n    }\n\n    @available(*, unavailable)\n    required init(coder _: NSCoder) {\n        fatalError()\n    }\n}\n\nstruct ToastView: View {\n    let systemIcon: String\n    let message: String\n\n    @State var opacity: Double = 1\n\n    var body: some View {\n        GeometryReader { _ in\n            HStack {\n                Spacer()\n                VStack {\n                    Spacer()\n                    Spacer()\n                    Spacer()\n                    Spacer()\n                    content\n                    Spacer()\n                }\n                Spacer()\n            }\n        }\n        .opacity(opacity)\n        .animation(.interactiveSpring(), value: opacity)\n        .onAppear {\n            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {\n                opacity = 0\n            }\n        }\n    }\n\n    var content: some View {\n        VStack(alignment: .center, spacing: 12) {\n            Image(systemName: systemIcon)\n                .font(.system(size: 36, weight: .bold, design: .rounded))\n            Text(message)\n                .font(.system(.headline, design: .rounded))\n        }\n        .padding()\n        .background(.regularMaterial)\n        .cornerRadius(8)\n    }\n}\n\nenum Toast {\n    static func post(systemIcon: String, message: String) {\n        guard let screen = NSScreen.main else {\n            return\n        }\n        let windowController = ToastWindowController(\n            with: screen,\n            systemIcon: systemIcon,\n            message: message\n        )\n        windowController.window?.setFrameOrigin(screen.frame.origin)\n        windowController.window?.setContentSize(screen.frame.size)\n        windowController.window?.makeKeyAndOrderFront(nil)\n        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {\n            windowController.window?.close()\n        }\n    }\n}\n"
  },
  {
    "path": "App/Action/Action.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t13C6C62128AF1BF0008ADA60 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C6C62328AF1BF0008ADA60 /* Localizable.strings */; };\n\t\t1F6BCF0628B219B400C2B417 /* Template+Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6BCF0528B219B400C2B417 /* Template+Node.swift */; };\n\t\t5001740128AA557100FF9B99 /* UserDefault.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5001740028AA557100FF9B99 /* UserDefault.swift */; };\n\t\t5001740528AA818500FF9B99 /* DiagnosticLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5001740428AA818500FF9B99 /* DiagnosticLogView.swift */; };\n\t\t5006F55E28A9663100C8ADBE /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5006F55D28A9663100C8ADBE /* Notification.swift */; };\n\t\t5006F56028A9683C00C8ADBE /* DispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */; };\n\t\t502D1F0A28A8F88D0022CCD3 /* ActionTemplates in Resources */ = {isa = PBXBuildFile; fileRef = 502D1F0928A8F88D0022CCD3 /* ActionTemplates */; };\n\t\t502E87A328AA954500CAB5E1 /* ModuleEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502E87A228AA954500CAB5E1 /* ModuleEditView.swift */; };\n\t\t502E87A528AA95BF00CAB5E1 /* ModuleElementView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */; };\n\t\t5030D80828ABDD72001A96B5 /* ActionManager+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80728ABDD72001A96B5 /* ActionManager+History.swift */; };\n\t\t5030D80A28ABE953001A96B5 /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80928ABE953001A96B5 /* HistoryView.swift */; };\n\t\t5030D80C28ABEF64001A96B5 /* ApplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80B28ABEF64001A96B5 /* ApplicationView.swift */; };\n\t\t5030D80E28ABFA82001A96B5 /* SettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80D28ABFA82001A96B5 /* SettingView.swift */; };\n\t\t5030D81028AC0045001A96B5 /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80F28AC0045001A96B5 /* LicenseView.swift */; };\n\t\t5030D81228AC01A7001A96B5 /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5030D81128AC01A7001A96B5 /* License.txt */; };\n\t\t5030D81628AC090A001A96B5 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D81528AC090A001A96B5 /* Config.swift */; };\n\t\t503976FA28AE143600588622 /* ModuleImportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503976F928AE143600588622 /* ModuleImportView.swift */; };\n\t\t5053CF85288F724E00A92822 /* Executor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF84288F724E00A92822 /* Executor.swift */; };\n\t\t5053CF87288F764000A92822 /* ModuleManageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF86288F764000A92822 /* ModuleManageView.swift */; };\n\t\t5053CF8A288F76E700A92822 /* PasteboardManager+Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */; };\n\t\t5053CF91288F776000A92822 /* ActionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF90288F776000A92822 /* ActionManager.swift */; };\n\t\t5053CF93288F788B00A92822 /* ActionManager+Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF92288F788B00A92822 /* ActionManager+Module.swift */; };\n\t\t5053CF9A288F9A5E00A92822 /* ModuleCreateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */; };\n\t\t5053CF9C288F9D8700A92822 /* SymbolPicker in Frameworks */ = {isa = PBXBuildFile; productRef = 5053CF9B288F9D8700A92822 /* SymbolPicker */; };\n\t\t505A10A828A95EC200D46DB3 /* ActionManager+Template.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */; };\n\t\t5067392628AB786A003A6A9C /* Template+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392528AB786A003A6A9C /* Template+Swift.swift */; };\n\t\t5067392B28AB7A51003A6A9C /* ActionManager+Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */; };\n\t\t5067392D28AB7D6C003A6A9C /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392C28AB7D6C003A6A9C /* Result.swift */; };\n\t\t5067393228AB8E55003A6A9C /* RandomCodeTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */; };\n\t\t5067393428ABA328003A6A9C /* ActionManager+Artifact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */; };\n\t\t5067393628ABA422003A6A9C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 5067393528ABA422003A6A9C /* KeychainAccess */; };\n\t\t5067393828ABA445003A6A9C /* AES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393728ABA445003A6A9C /* AES.swift */; };\n\t\t5067393C28ABA89D003A6A9C /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393B28ABA89D003A6A9C /* Data.swift */; };\n\t\t5067394128ABC9C3003A6A9C /* Menubar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067394028ABC9C3003A6A9C /* Menubar.swift */; };\n\t\t5067394328ABCB18003A6A9C /* MenubarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067394228ABCB18003A6A9C /* MenubarView.swift */; };\n\t\t507137EC288E934000C23E7F /* ActionApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507137EB288E934000C23E7F /* ActionApp.swift */; };\n\t\t507137EE288E934000C23E7F /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507137ED288E934000C23E7F /* MainView.swift */; };\n\t\t507137F0288E934100C23E7F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 507137EF288E934100C23E7F /* Assets.xcassets */; };\n\t\t507137FC288E935A00C23E7F /* AuxiliaryExecute in Frameworks */ = {isa = PBXBuildFile; productRef = 507137FB288E935A00C23E7F /* AuxiliaryExecute */; };\n\t\t507137FE288E935A00C23E7F /* Colorful in Frameworks */ = {isa = PBXBuildFile; productRef = 507137FD288E935A00C23E7F /* Colorful */; };\n\t\t50713803288E976600C23E7F /* AppSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713802288E976600C23E7F /* AppSetup.swift */; };\n\t\t50713808288E9C0C00C23E7F /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713807288E9C0C00C23E7F /* View.swift */; };\n\t\t5071380A288E9C8100C23E7F /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713809288E9C8100C23E7F /* WelcomeView.swift */; };\n\t\t5071380C288E9C8800C23E7F /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5071380B288E9C8800C23E7F /* SidebarView.swift */; };\n\t\t5071380E288E9D8A00C23E7F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5071380D288E9D8A00C23E7F /* AppDelegate.swift */; };\n\t\t50A7D7FE28ACCB4C004F0B34 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */; };\n\t\t50A7D80128ACCE23004F0B34 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D80028ACCE23004F0B34 /* Toast.swift */; };\n\t\t50A7D80328ACD14B004F0B34 /* Template+Executable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D80228ACD14B004F0B34 /* Template+Executable.swift */; };\n\t\t50BCF6AC288EE81000A97B4C /* PasteboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */; };\n\t\t50BCF6AE288F01EF00A97B4C /* StatusBarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */; };\n\t\t50E5204228BE04FC00C3228F /* Template+Python.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E5204128BE04FC00C3228F /* Template+Python.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t13C6C62228AF1BF0008ADA60 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t13C6C62428AF1DEB008ADA60 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/Localizable.strings\"; sourceTree = \"<group>\"; };\n\t\t1F6BCF0528B219B400C2B417 /* Template+Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Template+Node.swift\"; sourceTree = \"<group>\"; };\n\t\t5001740028AA557100FF9B99 /* UserDefault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefault.swift; sourceTree = \"<group>\"; };\n\t\t5001740428AA818500FF9B99 /* DiagnosticLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosticLogView.swift; sourceTree = \"<group>\"; };\n\t\t5006F55D28A9663100C8ADBE /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = \"<group>\"; };\n\t\t5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchQueue.swift; sourceTree = \"<group>\"; };\n\t\t502D1F0928A8F88D0022CCD3 /* ActionTemplates */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ActionTemplates; sourceTree = \"<group>\"; };\n\t\t502E87A228AA954500CAB5E1 /* ModuleEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleEditView.swift; sourceTree = \"<group>\"; };\n\t\t502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleElementView.swift; sourceTree = \"<group>\"; };\n\t\t5030D80728ABDD72001A96B5 /* ActionManager+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"ActionManager+History.swift\"; sourceTree = \"<group>\"; };\n\t\t5030D80928ABE953001A96B5 /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = \"<group>\"; };\n\t\t5030D80B28ABEF64001A96B5 /* ApplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationView.swift; sourceTree = \"<group>\"; };\n\t\t5030D80D28ABFA82001A96B5 /* SettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingView.swift; sourceTree = \"<group>\"; };\n\t\t5030D80F28AC0045001A96B5 /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = \"<group>\"; };\n\t\t5030D81128AC01A7001A96B5 /* License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = License.txt; sourceTree = \"<group>\"; };\n\t\t5030D81528AC090A001A96B5 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = \"<group>\"; };\n\t\t503976F928AE143600588622 /* ModuleImportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleImportView.swift; sourceTree = \"<group>\"; };\n\t\t5053CF84288F724E00A92822 /* Executor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Executor.swift; sourceTree = \"<group>\"; };\n\t\t5053CF86288F764000A92822 /* ModuleManageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleManageView.swift; sourceTree = \"<group>\"; };\n\t\t5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"PasteboardManager+Event.swift\"; sourceTree = \"<group>\"; };\n\t\t5053CF90288F776000A92822 /* ActionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionManager.swift; sourceTree = \"<group>\"; };\n\t\t5053CF92288F788B00A92822 /* ActionManager+Module.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"ActionManager+Module.swift\"; sourceTree = \"<group>\"; };\n\t\t5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleCreateView.swift; sourceTree = \"<group>\"; };\n\t\t505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"ActionManager+Template.swift\"; sourceTree = \"<group>\"; };\n\t\t5067392528AB786A003A6A9C /* Template+Swift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Template+Swift.swift\"; sourceTree = \"<group>\"; };\n\t\t5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"ActionManager+Event.swift\"; sourceTree = \"<group>\"; };\n\t\t5067392C28AB7D6C003A6A9C /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = \"<group>\"; };\n\t\t5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomCodeTextView.swift; sourceTree = \"<group>\"; };\n\t\t5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"ActionManager+Artifact.swift\"; sourceTree = \"<group>\"; };\n\t\t5067393728ABA445003A6A9C /* AES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AES.swift; sourceTree = \"<group>\"; };\n\t\t5067393B28ABA89D003A6A9C /* Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = \"<group>\"; };\n\t\t5067394028ABC9C3003A6A9C /* Menubar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menubar.swift; sourceTree = \"<group>\"; };\n\t\t5067394228ABCB18003A6A9C /* MenubarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarView.swift; sourceTree = \"<group>\"; };\n\t\t507137E8288E934000C23E7F /* Action.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Action.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t507137EB288E934000C23E7F /* ActionApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionApp.swift; sourceTree = \"<group>\"; };\n\t\t507137ED288E934000C23E7F /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = \"<group>\"; };\n\t\t507137EF288E934100C23E7F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t507137F4288E934100C23E7F /* Action.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Action.entitlements; sourceTree = \"<group>\"; };\n\t\t50713802288E976600C23E7F /* AppSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSetup.swift; sourceTree = \"<group>\"; };\n\t\t50713807288E9C0C00C23E7F /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = \"<group>\"; };\n\t\t50713809288E9C8100C23E7F /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = \"<group>\"; };\n\t\t5071380B288E9C8800C23E7F /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = \"<group>\"; };\n\t\t5071380D288E9D8A00C23E7F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Throttle.swift; sourceTree = \"<group>\"; };\n\t\t50A7D80028ACCE23004F0B34 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = \"<group>\"; };\n\t\t50A7D80228ACD14B004F0B34 /* Template+Executable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Template+Executable.swift\"; sourceTree = \"<group>\"; };\n\t\t50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardManager.swift; sourceTree = \"<group>\"; };\n\t\t50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarManager.swift; sourceTree = \"<group>\"; };\n\t\t50E5204128BE04FC00C3228F /* Template+Python.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Template+Python.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t507137E5288E934000C23E7F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t507137FE288E935A00C23E7F /* Colorful in Frameworks */,\n\t\t\t\t507137FC288E935A00C23E7F /* AuxiliaryExecute in Frameworks */,\n\t\t\t\t5053CF9C288F9D8700A92822 /* SymbolPicker in Frameworks */,\n\t\t\t\t5067393628ABA422003A6A9C /* KeychainAccess in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t502E87A628AA95DF00CAB5E1 /* ActionModule */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5053CF86288F764000A92822 /* ModuleManageView.swift */,\n\t\t\t\t503976F928AE143600588622 /* ModuleImportView.swift */,\n\t\t\t\t502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */,\n\t\t\t\t5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */,\n\t\t\t\t502E87A228AA954500CAB5E1 /* ModuleEditView.swift */,\n\t\t\t);\n\t\t\tpath = ActionModule;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t502E87A728AA95E800CAB5E1 /* Generic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t507137ED288E934000C23E7F /* MainView.swift */,\n\t\t\t\t5071380B288E9C8800C23E7F /* SidebarView.swift */,\n\t\t\t\t50713809288E9C8100C23E7F /* WelcomeView.swift */,\n\t\t\t\t5030D80928ABE953001A96B5 /* HistoryView.swift */,\n\t\t\t\t5030D80D28ABFA82001A96B5 /* SettingView.swift */,\n\t\t\t\t5001740428AA818500FF9B99 /* DiagnosticLogView.swift */,\n\t\t\t\t5030D80F28AC0045001A96B5 /* LicenseView.swift */,\n\t\t\t\t5030D80B28ABEF64001A96B5 /* ApplicationView.swift */,\n\t\t\t);\n\t\t\tpath = Generic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5030D81428AC08FC001A96B5 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5030D81528AC090A001A96B5 /* Config.swift */,\n\t\t\t);\n\t\t\tpath = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5053CF88288F76CC00A92822 /* PasteboardManager */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */,\n\t\t\t\t5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */,\n\t\t\t);\n\t\t\tpath = PasteboardManager;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5053CF8B288F770B00A92822 /* StatusBarManager */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */,\n\t\t\t);\n\t\t\tpath = StatusBarManager;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5053CF8C288F771500A92822 /* Executor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5053CF84288F724E00A92822 /* Executor.swift */,\n\t\t\t);\n\t\t\tpath = Executor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5053CF8D288F771C00A92822 /* Action */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5053CF90288F776000A92822 /* ActionManager.swift */,\n\t\t\t\t5030D80728ABDD72001A96B5 /* ActionManager+History.swift */,\n\t\t\t\t5053CF92288F788B00A92822 /* ActionManager+Module.swift */,\n\t\t\t\t5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */,\n\t\t\t\t5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */,\n\t\t\t\t5067392728AB78CD003A6A9C /* ActionModuleTemplates */,\n\t\t\t\t502D1F0928A8F88D0022CCD3 /* ActionTemplates */,\n\t\t\t);\n\t\t\tpath = Action;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5067392728AB78CD003A6A9C /* ActionModuleTemplates */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */,\n\t\t\t\t50A7D80228ACD14B004F0B34 /* Template+Executable.swift */,\n\t\t\t\t5067392528AB786A003A6A9C /* Template+Swift.swift */,\n\t\t\t\t1F6BCF0528B219B400C2B417 /* Template+Node.swift */,\n\t\t\t\t50E5204128BE04FC00C3228F /* Template+Python.swift */,\n\t\t\t);\n\t\t\tpath = ActionModuleTemplates;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5067393028AB8E42003A6A9C /* Effect */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */,\n\t\t\t);\n\t\t\tpath = Effect;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5067393F28ABC9B1003A6A9C /* Menubar */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5067394028ABC9C3003A6A9C /* Menubar.swift */,\n\t\t\t\t5067394228ABCB18003A6A9C /* MenubarView.swift */,\n\t\t\t);\n\t\t\tpath = Menubar;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t507137DF288E934000C23E7F = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t507137EA288E934000C23E7F /* Action */,\n\t\t\t\t507137E9288E934000C23E7F /* Products */,\n\t\t\t\t507137FA288E935A00C23E7F /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t507137E9288E934000C23E7F /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t507137E8288E934000C23E7F /* Action.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t507137EA288E934000C23E7F /* Action */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50713801288E975200C23E7F /* Application */,\n\t\t\t\t50BCF6AA288EE7F900A97B4C /* Backend */,\n\t\t\t\t50713805288E9B5200C23E7F /* Interface */,\n\t\t\t\t50713806288E9C0100C23E7F /* Extension */,\n\t\t\t);\n\t\t\tpath = Action;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t507137FA288E935A00C23E7F /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50713801288E975200C23E7F /* Application */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13C6C62328AF1BF0008ADA60 /* Localizable.strings */,\n\t\t\t\t507137EB288E934000C23E7F /* ActionApp.swift */,\n\t\t\t\t507137F4288E934100C23E7F /* Action.entitlements */,\n\t\t\t\t507137EF288E934100C23E7F /* Assets.xcassets */,\n\t\t\t\t5030D81128AC01A7001A96B5 /* License.txt */,\n\t\t\t\t50713802288E976600C23E7F /* AppSetup.swift */,\n\t\t\t\t5071380D288E9D8A00C23E7F /* AppDelegate.swift */,\n\t\t\t);\n\t\t\tpath = Application;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50713805288E9B5200C23E7F /* Interface */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t502E87A628AA95DF00CAB5E1 /* ActionModule */,\n\t\t\t\t5067393028AB8E42003A6A9C /* Effect */,\n\t\t\t\t502E87A728AA95E800CAB5E1 /* Generic */,\n\t\t\t\t5067393F28ABC9B1003A6A9C /* Menubar */,\n\t\t\t\t50A7D7FF28ACCE18004F0B34 /* Toast */,\n\t\t\t);\n\t\t\tpath = Interface;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50713806288E9C0100C23E7F /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5067393728ABA445003A6A9C /* AES.swift */,\n\t\t\t\t5067393B28ABA89D003A6A9C /* Data.swift */,\n\t\t\t\t5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */,\n\t\t\t\t5006F55D28A9663100C8ADBE /* Notification.swift */,\n\t\t\t\t5067392C28AB7D6C003A6A9C /* Result.swift */,\n\t\t\t\t5001740028AA557100FF9B99 /* UserDefault.swift */,\n\t\t\t\t50713807288E9C0C00C23E7F /* View.swift */,\n\t\t\t\t50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50A7D7FF28ACCE18004F0B34 /* Toast */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50A7D80028ACCE23004F0B34 /* Toast.swift */,\n\t\t\t);\n\t\t\tpath = Toast;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50BCF6AA288EE7F900A97B4C /* Backend */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5053CF8D288F771C00A92822 /* Action */,\n\t\t\t\t5030D81428AC08FC001A96B5 /* Config */,\n\t\t\t\t5053CF8C288F771500A92822 /* Executor */,\n\t\t\t\t5053CF88288F76CC00A92822 /* PasteboardManager */,\n\t\t\t\t5053CF8B288F770B00A92822 /* StatusBarManager */,\n\t\t\t);\n\t\t\tpath = Backend;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t507137E7288E934000C23E7F /* Action */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 507137F7288E934100C23E7F /* Build configuration list for PBXNativeTarget \"Action\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t507137FF288E93A600C23E7F /* Swift Format */,\n\t\t\t\t502D1F0B28A8FA910022CCD3 /* Update Action Templates */,\n\t\t\t\t5030D81328AC022A001A96B5 /* Scan License */,\n\t\t\t\t507137E4288E934000C23E7F /* Sources */,\n\t\t\t\t507137E5288E934000C23E7F /* Frameworks */,\n\t\t\t\t507137E6288E934000C23E7F /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Action;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t507137FB288E935A00C23E7F /* AuxiliaryExecute */,\n\t\t\t\t507137FD288E935A00C23E7F /* Colorful */,\n\t\t\t\t5053CF9B288F9D8700A92822 /* SymbolPicker */,\n\t\t\t\t5067393528ABA422003A6A9C /* KeychainAccess */,\n\t\t\t);\n\t\t\tproductName = Action;\n\t\t\tproductReference = 507137E8288E934000C23E7F /* Action.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t507137E0288E934000C23E7F /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t507137E7288E934000C23E7F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 507137E3288E934000C23E7F /* Build configuration list for PBXProject \"Action\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t\t\"zh-Hans\",\n\t\t\t);\n\t\t\tmainGroup = 507137DF288E934000C23E7F;\n\t\t\tproductRefGroup = 507137E9288E934000C23E7F /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t507137E7288E934000C23E7F /* Action */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t507137E6288E934000C23E7F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t502D1F0A28A8F88D0022CCD3 /* ActionTemplates in Resources */,\n\t\t\t\t13C6C62128AF1BF0008ADA60 /* Localizable.strings in Resources */,\n\t\t\t\t507137F0288E934100C23E7F /* Assets.xcassets in Resources */,\n\t\t\t\t5030D81228AC01A7001A96B5 /* License.txt in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t502D1F0B28A8FA910022CCD3 /* Update Action Templates */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Update Action Templates\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"$SOURCE_ROOT/../../Resources/Scripts/PackTemplates.sh\\n\";\n\t\t};\n\t\t5030D81328AC022A001A96B5 /* Scan License */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Scan License\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"$SOURCE_ROOT/../../Resources/Scripts/UpdateLicenses.sh\\n\";\n\t\t};\n\t\t507137FF288E93A600C23E7F /* Swift Format */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Swift Format\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"cd $SOURCE_ROOT\\npwd\\n\\nif ! command -v \\\"swiftformat\\\" &> /dev/null\\nthen\\n    echo \\\"swiftformat could not be found, skipping\\\"\\n    exit 0\\nfi\\n\\nswiftformat . --swiftversion 5.6\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t507137E4288E934000C23E7F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50E5204228BE04FC00C3228F /* Template+Python.swift in Sources */,\n\t\t\t\t50BCF6AE288F01EF00A97B4C /* StatusBarManager.swift in Sources */,\n\t\t\t\t503976FA28AE143600588622 /* ModuleImportView.swift in Sources */,\n\t\t\t\t5067393C28ABA89D003A6A9C /* Data.swift in Sources */,\n\t\t\t\t5030D81028AC0045001A96B5 /* LicenseView.swift in Sources */,\n\t\t\t\t50A7D80328ACD14B004F0B34 /* Template+Executable.swift in Sources */,\n\t\t\t\t5053CF8A288F76E700A92822 /* PasteboardManager+Event.swift in Sources */,\n\t\t\t\t5006F56028A9683C00C8ADBE /* DispatchQueue.swift in Sources */,\n\t\t\t\t5030D80E28ABFA82001A96B5 /* SettingView.swift in Sources */,\n\t\t\t\t5001740528AA818500FF9B99 /* DiagnosticLogView.swift in Sources */,\n\t\t\t\t5071380A288E9C8100C23E7F /* WelcomeView.swift in Sources */,\n\t\t\t\t5030D80A28ABE953001A96B5 /* HistoryView.swift in Sources */,\n\t\t\t\t5030D80828ABDD72001A96B5 /* ActionManager+History.swift in Sources */,\n\t\t\t\t502E87A328AA954500CAB5E1 /* ModuleEditView.swift in Sources */,\n\t\t\t\t5067392628AB786A003A6A9C /* Template+Swift.swift in Sources */,\n\t\t\t\t50713808288E9C0C00C23E7F /* View.swift in Sources */,\n\t\t\t\t507137EE288E934000C23E7F /* MainView.swift in Sources */,\n\t\t\t\t5001740128AA557100FF9B99 /* UserDefault.swift in Sources */,\n\t\t\t\t50A7D80128ACCE23004F0B34 /* Toast.swift in Sources */,\n\t\t\t\t50A7D7FE28ACCB4C004F0B34 /* Throttle.swift in Sources */,\n\t\t\t\t5067393828ABA445003A6A9C /* AES.swift in Sources */,\n\t\t\t\t50713803288E976600C23E7F /* AppSetup.swift in Sources */,\n\t\t\t\t5071380E288E9D8A00C23E7F /* AppDelegate.swift in Sources */,\n\t\t\t\t5053CF85288F724E00A92822 /* Executor.swift in Sources */,\n\t\t\t\t5067392D28AB7D6C003A6A9C /* Result.swift in Sources */,\n\t\t\t\t5067394128ABC9C3003A6A9C /* Menubar.swift in Sources */,\n\t\t\t\t5053CF91288F776000A92822 /* ActionManager.swift in Sources */,\n\t\t\t\t5053CF93288F788B00A92822 /* ActionManager+Module.swift in Sources */,\n\t\t\t\t5030D80C28ABEF64001A96B5 /* ApplicationView.swift in Sources */,\n\t\t\t\t5067392B28AB7A51003A6A9C /* ActionManager+Event.swift in Sources */,\n\t\t\t\t507137EC288E934000C23E7F /* ActionApp.swift in Sources */,\n\t\t\t\t5067394328ABCB18003A6A9C /* MenubarView.swift in Sources */,\n\t\t\t\t5006F55E28A9663100C8ADBE /* Notification.swift in Sources */,\n\t\t\t\t5067393228AB8E55003A6A9C /* RandomCodeTextView.swift in Sources */,\n\t\t\t\t5071380C288E9C8800C23E7F /* SidebarView.swift in Sources */,\n\t\t\t\t5030D81628AC090A001A96B5 /* Config.swift in Sources */,\n\t\t\t\t5067393428ABA328003A6A9C /* ActionManager+Artifact.swift in Sources */,\n\t\t\t\t50BCF6AC288EE81000A97B4C /* PasteboardManager.swift in Sources */,\n\t\t\t\t5053CF87288F764000A92822 /* ModuleManageView.swift in Sources */,\n\t\t\t\t502E87A528AA95BF00CAB5E1 /* ModuleElementView.swift in Sources */,\n\t\t\t\t5053CF9A288F9A5E00A92822 /* ModuleCreateView.swift in Sources */,\n\t\t\t\t505A10A828A95EC200D46DB3 /* ActionManager+Template.swift in Sources */,\n\t\t\t\t1F6BCF0628B219B400C2B417 /* Template+Node.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t13C6C62328AF1BF0008ADA60 /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13C6C62228AF1BF0008ADA60 /* en */,\n\t\t\t\t13C6C62428AF1DEB008ADA60 /* zh-Hans */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t507137F5288E934100C23E7F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t507137F6288E934100C23E7F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t507137F8288E934100C23E7F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Action/Action.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 4;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\";\n\t\t\t\tDEVELOPMENT_TEAM = M4Z5DVY94F;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Action Bee\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.productivity\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2022 Lakr Aream. All Rights Reserved.\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMARKETING_VERSION = 1.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.Action;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t507137F9288E934100C23E7F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Action/Action.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 4;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\";\n\t\t\t\tDEVELOPMENT_TEAM = M4Z5DVY94F;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Action Bee\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.productivity\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2022 Lakr Aream. All Rights Reserved.\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMARKETING_VERSION = 1.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.Action;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t507137E3288E934000C23E7F /* Build configuration list for PBXProject \"Action\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t507137F5288E934100C23E7F /* Debug */,\n\t\t\t\t507137F6288E934100C23E7F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t507137F7288E934100C23E7F /* Build configuration list for PBXNativeTarget \"Action\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t507137F8288E934100C23E7F /* Debug */,\n\t\t\t\t507137F9288E934100C23E7F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t5053CF9B288F9D8700A92822 /* SymbolPicker */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SymbolPicker;\n\t\t};\n\t\t5067393528ABA422003A6A9C /* KeychainAccess */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = KeychainAccess;\n\t\t};\n\t\t507137FB288E935A00C23E7F /* AuxiliaryExecute */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = AuxiliaryExecute;\n\t\t};\n\t\t507137FD288E935A00C23E7F /* Colorful */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Colorful;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 507137E0288E934000C23E7F /* Project object */;\n}\n"
  },
  {
    "path": "App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:App/Action/Action.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:External/AuxiliaryExecute\">\n   </FileRef>\n   <FileRef\n      location = \"group:External/Colorful\">\n   </FileRef>\n   <FileRef\n      location = \"group:External/KeychainAccess\">\n   </FileRef>\n   <FileRef\n      location = \"group:External/SymbolPicker\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/AuxiliaryExecute/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n"
  },
  {
    "path": "External/AuxiliaryExecute/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "External/AuxiliaryExecute/Package.swift",
    "content": "// swift-tools-version:5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"AuxiliaryExecute\",\n    products: [\n        .library(\n            name: \"AuxiliaryExecute\",\n            targets: [\"AuxiliaryExecute\"]\n        ),\n    ],\n    targets: [\n        .target(\n            name: \"AuxiliaryExecute\",\n            dependencies: []\n        ),\n        .testTarget(\n            name: \"AuxiliaryExecuteTests\",\n            dependencies: [\"AuxiliaryExecute\"]\n        ),\n    ]\n)\n"
  },
  {
    "path": "External/AuxiliaryExecute/README.md",
    "content": "# AuxiliaryExecute\n\nA Swift wrapper for system shell over posix_spawn with search path and env support.\n\n## Usage\n\n```\nimport AuxiliaryExecute\n\nAuxiliaryExecute.local.bash(command: \"echo nya\")\n```\n\n## Customization & Defaults\n\nThe source for this package is well explained in details along with comments. Feel free looking for them.\n\n```\n// automatically search for binary within env PATH\nlet result = AuxiliaryExecute.local.shell(\n    command: \"bash\",\n    args: [\"-c\", \"echo $mua\"],\n    environment: [\"mua\": \"nya\"],\n    timeout: 0\n) { stdout in\n    print(stdout)\n} stderrBlock: { stderr in\n    print(stderr)\n}\n\n// or call with binary's full path\nfunc spawn(\n    command: String,\n    args: [String] = [],\n    environment: [String: String] = [:],\n    timeout: Double = 0,\n    stdoutBlock: ((String) -> Void)? = nil,\n    stderrBlock: ((String) -> Void)? = nil\n)\n\n// for customize option for shell\nfunc appendSearchPath(with value: String)\nfunc updateExtraSearchPath(with block: (inout [String]) -> Void)\nfunc updateOverwriteTable(with block: (inout [String: String?]) -> Void)\n```\n\n## License\n\nAuxiliaryExecute is licensed under [MIT](./LICENSE).\n\n---\n\nCopyright © 2021 Lakr Aream. All Rights Reserved.\n"
  },
  {
    "path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Async.swift",
    "content": "//\n//  AuxiliaryExecute+Spawn.swift\n//  AuxiliaryExecute\n//\n//  Created by Cyandev on 2022/1/10.\n//\n\n#if swift(>=5.5)\n\n    import Foundation\n\n    @available(iOS 15.0, macOS 12.0.0, *)\n    public extension AuxiliaryExecute {\n        /// async/await function for spawn using withCheckedContinuation\n        /// - Parameters:\n        ///   - command: full path of the binary file. eg: \"/bin/cat\"\n        ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n        ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n        ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n        ///   - stdout: a block call from pipeControlQueue in background when buffer from stdout available for read\n        ///   - stderr: a block call from pipeControlQueue in background when buffer from stderr available for read\n        /// - Returns: execution recipe, see it's definition for details\n        @discardableResult\n        static func spawnAsync(\n            command: String,\n            args: [String] = [],\n            environment: [String: String] = [:],\n            timeout: Double = 0,\n            stdoutBlock: ((String) -> Void)? = nil,\n            stderrBlock: ((String) -> Void)? = nil\n        ) async -> ExecuteRecipe {\n            await withCheckedContinuation { cont in\n                self.spawn(\n                    command: command,\n                    args: args,\n                    environment: environment,\n                    timeout: timeout,\n                    stdoutBlock: stdoutBlock,\n                    stderrBlock: stderrBlock\n                ) { recipe in\n                    cont.resume(returning: recipe)\n                }\n            }\n        }\n\n        /// async/await function for spawn using withCheckedContinuation\n        /// - Parameters:\n        ///   - command: full path of the binary file. eg: \"/bin/cat\"\n        ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n        ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n        ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n        ///   - output: a block call from pipeControlQueue in background when buffer from stdout or stderr available for read\n        /// - Returns: execution recipe, see it's definition for details\n        @discardableResult\n        static func spawnAsync(\n            command: String,\n            args: [String] = [],\n            environment: [String: String] = [:],\n            timeout: Double = 0,\n            output: ((String) -> Void)? = nil\n        ) async -> ExecuteRecipe {\n            let lock = NSLock()\n            return await spawnAsync(\n                command: command,\n                args: args,\n                environment: environment,\n                timeout: timeout,\n                stdoutBlock: { str in\n                    lock.lock()\n                    output?(str)\n                    lock.unlock()\n                }, stderrBlock: { str in\n                    lock.lock()\n                    output?(str)\n                    lock.unlock()\n                }\n            )\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Shell.swift",
    "content": "//\n//  AuxiliaryExecute+Shell.swift\n//  AuxiliaryExecute\n//\n//  Created by Lakr Aream on 2021/12/6.\n//\n\nimport Foundation\n\npublic extension AuxiliaryExecute {\n    /// Setup binary table, require lock\n    internal func setupBinaryTable() {\n        lock.lock()\n\n        let environmentPath = ProcessInfo\n            .processInfo\n            .environment[\"PATH\"]?\n            .components(separatedBy: \":\")\n            .compactMap { $0.trimmingCharacters(in: .whitespacesAndNewlines) }\n            ?? []\n\n        currentPath = environmentPath\n        binaryTable.removeAll()\n\n        // now, let's search inside your path and system path\n        for eachPath in environmentPath + extraSearchPath {\n            if let dirElements = try? FileManager\n                .default\n                .contentsOfDirectory(atPath: eachPath)\n            {\n                for node in dirElements {\n                    let itemLocation = URL(fileURLWithPath: eachPath)\n                        .appendingPathComponent(node)\n                    if !isBinaryValid(at: itemLocation) {\n                        continue\n                    }\n                    binaryTable[node] = itemLocation.path\n                }\n            }\n        }\n\n        lock.unlock()\n    }\n\n    /// append the search path, thread safe\n    /// - Parameter value: the path\n    func appendSearchPath(with value: String) {\n        lock.lock()\n        extraSearchPath.append(value)\n        lock.unlock()\n    }\n\n    /// update the customized search path, thread safe\n    /// - Parameter block: update inside this block\n    func updateExtraSearchPath(with block: (inout [String]) -> Void) {\n        lock.lock()\n        block(&extraSearchPath)\n        lock.unlock()\n    }\n\n    /// update the customized binary table, thread safe\n    /// - Parameter block: update inside this block\n    func updateOverwriteTable(with block: (inout [String: String?]) -> Void) {\n        lock.lock()\n        block(&overwriteTable)\n        lock.unlock()\n    }\n\n    /// return whether you telling us to not to find anything with this command in shell\n    /// - Parameter command: command name\n    /// - Returns: should skip search\n    internal func commandShouldNotExists(command: String) -> Bool {\n        lock.lock()\n        defer { lock.unlock() }\n        if overwriteTable.keys.contains(command) {\n            if let value = overwriteTable[command] {\n                // it is a String?? :)\n                return value == nil\n            } else {\n                // there must be something wrong\n                assertionFailure(\"broken memory found with overwriteTable\")\n                return false\n            }\n        }\n        return false\n    }\n\n    /// safely grab the full path for shell command\n    /// - Parameter command: command name\n    /// - Returns: full path if exists, otherwise nil\n    func binaryLocationFor(command: String) -> String? {\n        lock.lock()\n        defer { lock.unlock() }\n        // check if you overwritten the command first\n        if overwriteTable.keys.contains(command) {\n            if let value = overwriteTable[command] {\n                // it is a String?? :)\n                // you telling us to not find anything with this command\n                return value\n            } else {\n                // there must be something wrong\n                assertionFailure(\"broken memory found with overwriteTable\")\n                return nil\n            }\n        } else {\n            return binaryTable[command]\n        }\n    }\n\n    /// Indicate if a file has permission to execute, check's with permission\n    /// - Parameter at: file url\n    /// - Returns: able to execute or not\n    private func isBinaryValid(at: URL) -> Bool {\n        FileManager\n            .default\n            .isExecutableFile(atPath: at.path)\n    }\n\n    /// call a binary to execute\n    /// - Parameters:\n    ///   - command: the command's name, not full path. eg: bash\n    ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n    ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n    ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n    ///   - stdout: a block call from pipeControlQueue in background when buffer from stdout available for read\n    ///   - stderr: a block call from pipeControlQueue in background when buffer from stderr available for read\n    /// - Returns: execution recipe, see it's definition for details\n    @discardableResult\n    func shell(\n        command: String,\n        args: [String] = [],\n        environment: [String: String] = [:],\n        timeout: Double = 0,\n        stdoutBlock: ((String) -> Void)? = nil,\n        stderrBlock: ((String) -> Void)? = nil\n    ) -> ExecuteRecipe {\n        // the command with full file system path\n        var commandLocation: String?\n        if let location = binaryLocationFor(command: command) {\n            commandLocation = location\n        } else if !commandShouldNotExists(command: command) {\n            // before calling to setup, check if you telling us so\n            // if not so, search for the binary, for two reason:\n            // - table is not yet built\n            // - it may be added to the system after last setup\n            setupBinaryTable()\n        }\n        // if nil, look for the command once again, after another setup\n        if commandLocation == nil {\n            commandLocation = binaryLocationFor(command: command)\n        }\n        // make sure we find the command\n        guard let commandLocation = commandLocation else {\n            return ExecuteRecipe.failure(error: .commandNotFound)\n        }\n        // now, let's validate the command\n        guard isBinaryValid(at: URL(fileURLWithPath: commandLocation)) else {\n            return ExecuteRecipe.failure(error: .commandInvalid)\n        }\n        // finally let‘s call the spawn\n        let recipe = AuxiliaryExecute.spawn(\n            command: commandLocation,\n            args: args,\n            environment: environment,\n            timeout: timeout,\n            stdoutBlock: stdoutBlock,\n            stderrBlock: stderrBlock\n        )\n        return recipe\n    }\n\n    /// run script with bash, if bash available\n    /// - Parameters:\n    ///   - command: script to be passed to bash. eg: \"echo nya\"\n    ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n    ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n    ///   - stdout: a block call from pipeControlQueue in background when buffer from stdout available for read\n    ///   - stderr: a block call from pipeControlQueue in background when buffer from stderr available for read\n    /// - Returns: execution recipe, see it's definition for details\n    @discardableResult\n    func bash(\n        command: String,\n        environment: [String: String] = [:],\n        timeout: Double = 0,\n        stdoutBlock: ((String) -> Void)? = nil,\n        stderrBlock: ((String) -> Void)? = nil\n    ) -> ExecuteRecipe {\n        let result = shell(\n            command: \"bash\",\n            args: [\"-c\", command],\n            environment: environment,\n            timeout: timeout,\n            stdoutBlock: stdoutBlock,\n            stderrBlock: stderrBlock\n        )\n        return result\n    }\n}\n"
  },
  {
    "path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Spawn.swift",
    "content": "//\n//  AuxiliaryExecute+Spawn.swift\n//  AuxiliaryExecute\n//\n//  Created by Lakr Aream on 2021/12/6.\n//\n\nimport Foundation\n\npublic extension AuxiliaryExecute {\n    /// call posix spawn to begin execute\n    /// - Parameters:\n    ///   - command: full path of the binary file. eg: \"/bin/cat\"\n    ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n    ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n    ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n    ///   - output: a block call from pipeControlQueue in background when buffer from stdout or stderr available for read\n    /// - Returns: execution recipe, see it's definition for details\n    @discardableResult\n    static func spawn(\n        command: String,\n        args: [String] = [],\n        environment: [String: String] = [:],\n        timeout: Double = 0,\n        setPid: ((pid_t) -> Void)? = nil,\n        output: ((String) -> Void)? = nil\n    )\n        -> ExecuteRecipe\n    {\n        let outputLock = NSLock()\n        let result = spawn(\n            command: command,\n            args: args,\n            environment: environment,\n            timeout: timeout,\n            setPid: setPid\n        ) { str in\n            outputLock.lock()\n            output?(str)\n            outputLock.unlock()\n        } stderrBlock: { str in\n            outputLock.lock()\n            output?(str)\n            outputLock.unlock()\n        }\n        return result\n    }\n\n    /// call posix spawn to begin execute and block until the process exits\n    /// - Parameters:\n    ///   - command: full path of the binary file. eg: \"/bin/cat\"\n    ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n    ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n    ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n    ///   - stdout: a block call from pipeControlQueue in background when buffer from stdout available for read\n    ///   - stderr: a block call from pipeControlQueue in background when buffer from stderr available for read\n    /// - Returns: execution recipe, see it's definition for details\n    static func spawn(\n        command: String,\n        args: [String] = [],\n        environment: [String: String] = [:],\n        timeout: Double = 0,\n        setPid: ((pid_t) -> Void)? = nil,\n        stdoutBlock: ((String) -> Void)? = nil,\n        stderrBlock: ((String) -> Void)? = nil\n    ) -> ExecuteRecipe {\n        let sema = DispatchSemaphore(value: 0)\n        var recipe: ExecuteRecipe!\n        spawn(\n            command: command,\n            args: args,\n            environment: environment,\n            timeout: timeout,\n            setPid: setPid,\n            stdoutBlock: stdoutBlock,\n            stderrBlock: stderrBlock\n        ) {\n            recipe = $0\n            sema.signal()\n        }\n        sema.wait()\n        return recipe\n    }\n\n    /// call posix spawn to begin execute\n    /// - Parameters:\n    ///   - command: full path of the binary file. eg: \"/bin/cat\"\n    ///   - args: arg to pass to the binary, exclude argv[0] which is the path itself. eg: [\"nya\"]\n    ///   - environment: any environment to be appended/overwrite when calling posix spawn. eg: [\"mua\" : \"nya\"]\n    ///   - timeout: any wall timeout if lager than 0, in seconds. eg: 6\n    ///   - setPid: called sync when pid available\n    ///   - stdoutBlock: a block call from pipeControlQueue in background when buffer from stdout available for read\n    ///   - stderrBlock: a block call from pipeControlQueue in background when buffer from stderr available for read\n    ///   - completionBlock: a block called from processControlQueue or current queue when the process is finished or an error occurred\n    static func spawn(\n        command: String,\n        args: [String] = [],\n        environment: [String: String] = [:],\n        timeout: Double = 0,\n        setPid: ((pid_t) -> Void)? = nil,\n        stdoutBlock: ((String) -> Void)? = nil,\n        stderrBlock: ((String) -> Void)? = nil,\n        completionBlock: ((ExecuteRecipe) -> Void)? = nil\n    ) {\n        // MARK: PREPARE FILE PIPE -\n\n        var pipestdout: [Int32] = [0, 0]\n        var pipestderr: [Int32] = [0, 0]\n\n        let bufsiz = Int(exactly: BUFSIZ) ?? 65535\n\n        pipe(&pipestdout)\n        pipe(&pipestderr)\n\n        guard fcntl(pipestdout[0], F_SETFL, O_NONBLOCK) != -1 else {\n            let recipe = ExecuteRecipe.failure(error: .openFilePipeFailed)\n            completionBlock?(recipe)\n            return\n        }\n        guard fcntl(pipestderr[0], F_SETFL, O_NONBLOCK) != -1 else {\n            let recipe = ExecuteRecipe.failure(error: .openFilePipeFailed)\n            completionBlock?(recipe)\n            return\n        }\n\n        // MARK: PREPARE FILE ACTION -\n\n        var fileActions: posix_spawn_file_actions_t?\n        posix_spawn_file_actions_init(&fileActions)\n        posix_spawn_file_actions_addclose(&fileActions, pipestdout[0])\n        posix_spawn_file_actions_addclose(&fileActions, pipestderr[0])\n        posix_spawn_file_actions_adddup2(&fileActions, pipestdout[1], STDOUT_FILENO)\n        posix_spawn_file_actions_adddup2(&fileActions, pipestderr[1], STDERR_FILENO)\n        posix_spawn_file_actions_addclose(&fileActions, pipestdout[1])\n        posix_spawn_file_actions_addclose(&fileActions, pipestderr[1])\n\n        defer {\n            posix_spawn_file_actions_destroy(&fileActions)\n        }\n\n        // MARK: PREPARE ENV -\n\n        var realEnvironmentBuilder: [String] = []\n        // before building the environment, we need to read from the existing environment\n        do {\n            var envBuilder = [String: String]()\n            var currentEnv = environ\n            while let rawStr = currentEnv.pointee {\n                defer { currentEnv += 1 }\n                // get the env\n                let str = String(cString: rawStr)\n                guard let key = str.components(separatedBy: \"=\").first else {\n                    continue\n                }\n                if !(str.count >= \"\\(key)=\".count) {\n                    continue\n                }\n                // this is to aviod any problem with mua=nya=nya= that ending with =\n                let value = String(str.dropFirst(\"\\(key)=\".count))\n                envBuilder[key] = value\n            }\n            // now, let's overwrite the environment specified in parameters\n            for (key, value) in environment {\n                envBuilder[key] = value\n            }\n            // now, package those items\n            for (key, value) in envBuilder {\n                realEnvironmentBuilder.append(\"\\(key)=\\(value)\")\n            }\n        }\n        // making it a c shit\n        let realEnv: [UnsafeMutablePointer<CChar>?] = realEnvironmentBuilder.map { $0.withCString(strdup) }\n        defer { for case let env? in realEnv { free(env) } }\n\n        // MARK: PREPARE ARGS -\n\n        let args = [command] + args\n        let argv: [UnsafeMutablePointer<CChar>?] = args.map { $0.withCString(strdup) }\n        defer { for case let arg? in argv { free(arg) } }\n\n        // MARK: NOW POSIX_SPAWN -\n\n        var pid: pid_t = 0\n        let spawnStatus = posix_spawn(&pid, command, &fileActions, nil, argv + [nil], realEnv + [nil])\n        if spawnStatus != 0 {\n            let recipe = ExecuteRecipe.failure(error: .posixSpawnFailed)\n            completionBlock?(recipe)\n            return\n        }\n\n        setPid?(pid)\n\n        close(pipestdout[1])\n        close(pipestderr[1])\n\n        var stdoutStr = \"\"\n        var stderrStr = \"\"\n\n        // MARK: OUTPUT BRIDGE -\n\n        let stdoutSource = DispatchSource.makeReadSource(fileDescriptor: pipestdout[0], queue: pipeControlQueue)\n        let stderrSource = DispatchSource.makeReadSource(fileDescriptor: pipestderr[0], queue: pipeControlQueue)\n\n        let stdoutSem = DispatchSemaphore(value: 0)\n        let stderrSem = DispatchSemaphore(value: 0)\n\n        stdoutSource.setCancelHandler {\n            close(pipestdout[0])\n            stdoutSem.signal()\n        }\n        stderrSource.setCancelHandler {\n            close(pipestderr[0])\n            stderrSem.signal()\n        }\n\n        stdoutSource.setEventHandler {\n            let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufsiz)\n            defer { buffer.deallocate() }\n            let bytesRead = read(pipestdout[0], buffer, bufsiz)\n            guard bytesRead > 0 else {\n                if bytesRead == -1, errno == EAGAIN {\n                    return\n                }\n                stdoutSource.cancel()\n                return\n            }\n\n            let array = Array(UnsafeBufferPointer(start: buffer, count: bytesRead)) + [UInt8(0)]\n            array.withUnsafeBufferPointer { ptr in\n                let str = String(cString: unsafeBitCast(ptr.baseAddress, to: UnsafePointer<CChar>.self))\n                stdoutStr += str\n                stdoutBlock?(str)\n            }\n        }\n        stderrSource.setEventHandler {\n            let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufsiz)\n            defer { buffer.deallocate() }\n\n            let bytesRead = read(pipestderr[0], buffer, bufsiz)\n            guard bytesRead > 0 else {\n                if bytesRead == -1, errno == EAGAIN {\n                    return\n                }\n                stderrSource.cancel()\n                return\n            }\n\n            let array = Array(UnsafeBufferPointer(start: buffer, count: bytesRead)) + [UInt8(0)]\n            array.withUnsafeBufferPointer { ptr in\n                let str = String(cString: unsafeBitCast(ptr.baseAddress, to: UnsafePointer<CChar>.self))\n                stderrStr += str\n                stderrBlock?(str)\n            }\n        }\n\n        stdoutSource.resume()\n        stderrSource.resume()\n\n        // MARK: WAIT + TIMEOUT CONTROL -\n\n        let realTimeout = timeout > 0 ? timeout : maxTimeoutValue\n        let wallTimeout = DispatchTime.now() + (\n            TimeInterval(exactly: realTimeout) ?? maxTimeoutValue\n        )\n        var status: Int32 = 0\n        var wait: pid_t = 0\n        var isTimeout = false\n\n        let timerSource = DispatchSource.makeTimerSource(flags: [], queue: processControlQueue)\n        timerSource.setEventHandler {\n            isTimeout = true\n            kill(pid, SIGKILL)\n        }\n\n        let processSource = DispatchSource.makeProcessSource(identifier: pid, eventMask: .exit, queue: processControlQueue)\n        processSource.setEventHandler {\n            wait = waitpid(pid, &status, 0)\n\n            processSource.cancel()\n            timerSource.cancel()\n\n            stdoutSem.wait()\n            stderrSem.wait()\n\n            // by using exactly method, we won't crash it!\n            let recipe = ExecuteRecipe(\n                exitCode: Int(exactly: status) ?? -1,\n                pid: Int(exactly: pid) ?? -1,\n                wait: Int(exactly: wait) ?? -1,\n                error: isTimeout ? .timeout : nil,\n                stdout: stdoutStr,\n                stderr: stderrStr\n            )\n            completionBlock?(recipe)\n        }\n        processSource.resume()\n\n        // timeout control\n        timerSource.schedule(deadline: wallTimeout)\n        timerSource.resume()\n    }\n}\n"
  },
  {
    "path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute.swift",
    "content": "//\n//  AuxiliaryExecute.swift\n//  MyYearWithGit\n//\n//  Created by Lakr Aream on 2021/11/27.\n//\n\nimport Foundation\n\n/// Execute command or shell with posix, shared with AuxiliaryExecute.local\npublic class AuxiliaryExecute {\n    /// we do not recommend you to subclass this singleton\n    public static let local = AuxiliaryExecute()\n\n    // if binary not found when you call the shell api\n    // we will take some time to rebuild the bianry table each time\n    // -->>> this is a time-heavy-task\n    // so use binaryLocationFor(command:) to cache it if needed\n\n    // system path\n    internal var currentPath: [String] = []\n    // system binary table\n    internal var binaryTable: [String: String] = [:]\n\n    // for you to put your own search path\n    internal var extraSearchPath: [String] = []\n    // for you to set your own binary table and will be used firstly\n    // if you set nil here\n    // -> we will return nil even the binary found in system path\n    internal var overwriteTable: [String: String?] = [:]\n\n    // this value is used when providing 0 or negative timeout paramete\n    internal static let maxTimeoutValue: Double = 2_147_483_647\n\n    /// when reading from file pipe, must called from async queue\n    internal static let pipeControlQueue = DispatchQueue(\n        label: \"wiki.qaq.AuxiliaryExecute.pipeRead\",\n        attributes: .concurrent\n    )\n\n    /// when killing process or monitoring events from process, must called from async queue\n    /// we are making this queue serial queue so won't called at the same time when timeout\n    internal static let processControlQueue = DispatchQueue(\n        label: \"wiki.qaq.AuxiliaryExecute.processControl\",\n        attributes: []\n    )\n\n    /// used for setting binary table, avoid crash\n    internal let lock = NSLock()\n\n    /// nope!\n    private init() {\n        // no need to setup binary table\n        // we will make call to it when you call the shell api\n        // if you only use the spawn api\n        // we don't need to setup the hole table cause it‘s time-heavy-task\n    }\n\n    /// Execution Error, do the localization your self\n    public enum ExecuteError: Error, LocalizedError, Codable {\n        // not found in path\n        case commandNotFound\n        // invalid, may be missing, wrong permission or any other reason\n        case commandInvalid\n        // fcntl failed\n        case openFilePipeFailed\n        // posix failed\n        case posixSpawnFailed\n        // waitpid failed\n        case waitPidFailed\n        // timeout when execute\n        case timeout\n    }\n\n    /// Execution Recipe\n    public struct ExecuteRecipe: Codable {\n        // exit code, usually 0 - 255 by system\n        // -1 means something bad happened, set by us for convince\n        public let exitCode: Int\n        // process pid that was when it is alive\n        // -1 means spawn failed in some situation\n        public let pid: Int\n        // wait result for final waitpid inside block at\n        // processSource - eventMask.exit, usually is pid\n        // -1 for other cases\n        public let wait: Int\n        // any error from us, not the command it self\n        // DOES NOT MEAN THAT THE COMMAND DONE WELL\n        public let error: ExecuteError?\n        // stdout\n        public let stdout: String\n        // stderr\n        public let stderr: String\n\n        /// General initialization of recipe object\n        /// - Parameters:\n        ///   - exitCode: code when process exit\n        ///   - pid: pid when process alive\n        ///   - wait: wait result on waitpid\n        ///   - error: error if any\n        ///   - stdout: stdout\n        ///   - stderr: stderr\n        internal init(\n            exitCode: Int,\n            pid: Int,\n            wait: Int,\n            error: AuxiliaryExecute.ExecuteError?,\n            stdout: String,\n            stderr: String\n        ) {\n            self.exitCode = exitCode\n            self.pid = pid\n            self.wait = wait\n            self.error = error\n            self.stdout = stdout\n            self.stderr = stderr\n        }\n\n        /// Template for making failure recipe\n        /// - Parameters:\n        ///   - exitCode: default -1\n        ///   - pid: default -1\n        ///   - wait: default -1\n        ///   - error: error\n        ///   - stdout: default empty\n        ///   - stderr: default empty\n        internal static func failure(\n            exitCode: Int = -1,\n            pid: Int = -1,\n            wait: Int = -1,\n            error: AuxiliaryExecute.ExecuteError?,\n            stdout: String = \"\",\n            stderr: String = \"\"\n        ) -> ExecuteRecipe {\n            .init(\n                exitCode: exitCode,\n                pid: pid,\n                wait: wait,\n                error: error,\n                stdout: stdout,\n                stderr: stderr\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "External/AuxiliaryExecute/Tests/AuxiliaryExecuteTests/AuxiliaryExecuteTests.swift",
    "content": "@testable import AuxiliaryExecute\nimport XCTest\n\nfinal class AuxiliaryExecuteTests: XCTestCase {\n    func testMain() throws {\n        XCTAssertNotNil(Int(exactly: AuxiliaryExecute.maxTimeoutValue))\n        XCTAssertNotNil(Int32(exactly: AuxiliaryExecute.maxTimeoutValue))\n        XCTAssertNotNil(Double(exactly: AuxiliaryExecute.maxTimeoutValue))\n        XCTAssertNotNil(TimeInterval(exactly: AuxiliaryExecute.maxTimeoutValue))\n\n        do {\n            let result = AuxiliaryExecute.local.bash(command: \"printf \\\"\\nnya\\n\\\"\")\n            print(result)\n            XCTAssert(result.exitCode == 0)\n            XCTAssertNil(result.error)\n            XCTAssert(result.stdout == \"\\nnya\\n\")\n            XCTAssert(result.stderr == \"\")\n        }\n\n        do {\n            let result = AuxiliaryExecute.local.shell(\n                command: \"bash\",\n                args: [\"-c\", \"echo $mua\"],\n                environment: [\"mua\": \"nya\"],\n                timeout: 0\n            ) { stdout in\n                print(stdout)\n            } stderrBlock: { stderr in\n                print(stderr)\n            }\n\n            XCTAssert(result.exitCode == 0)\n            XCTAssertNil(result.error)\n            XCTAssert(result.stdout.trimmingCharacters(in: .whitespacesAndNewlines) == \"nya\")\n            XCTAssert(result.stderr == \"\")\n        }\n\n        do {\n            let result = AuxiliaryExecute.local.shell(\n                command: \"bash\",\n                args: [\"-c\", \"echo $mua\"],\n                environment: [\"mua\": \"nya=nya=\"],\n                timeout: 0\n            ) { stdout in\n                print(stdout)\n            } stderrBlock: { stderr in\n                print(stderr)\n            }\n\n            XCTAssert(result.exitCode == 0)\n            XCTAssertNil(result.error)\n            XCTAssert(result.stdout.trimmingCharacters(in: .whitespacesAndNewlines) == \"nya=nya=\")\n            XCTAssert(result.stderr == \"\")\n        }\n\n        do {\n            let result = AuxiliaryExecute.local.shell(\n                command: \"tail\",\n                args: [\"-f\", \"/dev/null\"],\n                timeout: 1\n            ) { stdout in\n                print(stdout)\n            } stderrBlock: { stderr in\n                print(stderr)\n            }\n\n            XCTAssert(result.exitCode == SIGKILL)\n            XCTAssert(result.error == .timeout)\n        }\n    }\n\n    @available(macOS 12.0.0, *)\n    func testAsync() async throws {\n        do {\n            let result = await AuxiliaryExecute.spawnAsync(\n                command: \"/usr/bin/uname\",\n                args: [\"-a\"],\n                timeout: 1\n            ) { stdout in\n                print(stdout)\n            } stderrBlock: { stderr in\n                print(stderr)\n            }\n\n            XCTAssertEqual(result.exitCode, 0)\n            XCTAssert(result.stdout.contains(\"Darwin Kernel\"))\n        }\n\n        do {\n            let result = await AuxiliaryExecute.spawnAsync(\n                command: \"/usr/bin/tail\",\n                args: [\"-f\", \"/dev/null\"],\n                timeout: 1\n            ) { stdout in\n                print(stdout)\n            } stderrBlock: { stderr in\n                print(stderr)\n            }\n\n            XCTAssertEqual(result.exitCode, Int(SIGKILL))\n            XCTAssertEqual(result.error, .timeout)\n        }\n    }\n}\n"
  },
  {
    "path": "External/Colorful/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata"
  },
  {
    "path": "External/Colorful/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "External/Colorful/Package.swift",
    "content": "// swift-tools-version:5.3\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Colorful\",\n    platforms: [\n        .iOS(.v13),\n        .tvOS(.v13),\n        .macOS(.v10_15),\n        .watchOS(.v6)\n    ],\n    products: [\n        .library(name: \"Colorful\", targets: [\"Colorful\"]),\n    ],\n    targets: [\n        .target(name: \"Colorful\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "External/Colorful/README.md",
    "content": "# Colorful\n\nA SwiftUI implementation of AppleCard's animated colorful blur background.\n\n## Preview\n\n![Preview](./Preview.png)\n\n## Usage\n\n```\nimport Colorful\n\nvar body: some View {\n    ColorfulView()\n}\n```\n\n## Customization & Defaults\n\n```\ninit(\n    animated: Bool = defaultAnimated,\n    animation: Animation = defaultAnimation,\n    blurRadius: CGFloat = defaultBlurRadius,\n    colors: [Color] = defaultColorList,\n    colorCount: Int = defaultColorCount\n)\n```\n\n## License\n\nColorful is licensed under [MIT](./LICENSE).\n\n---\n\nCopyright © 2021 Lakr Aream. All Rights Reserved."
  },
  {
    "path": "External/Colorful/Sources/Colorful/Colorful.swift",
    "content": "//\n//  Colorful.swift\n//\n//\n//  Created by Lakr Aream on 2021/9/19.\n//\n\nimport SwiftUI\n\nprivate let kDefaultSourceColorList = [#colorLiteral(red: 0.9586862922, green: 0.660125792, blue: 0.8447988033, alpha: 1), #colorLiteral(red: 0.8714533448, green: 0.723166883, blue: 0.9342088699, alpha: 1), #colorLiteral(red: 0.7458761334, green: 0.7851135731, blue: 0.9899476171, alpha: 1), #colorLiteral(red: 0.4398113191, green: 0.8953480721, blue: 0.9796616435, alpha: 1), #colorLiteral(red: 0.3484552801, green: 0.933657825, blue: 0.9058339596, alpha: 1), #colorLiteral(red: 0.5567936897, green: 0.9780793786, blue: 0.6893508434, alpha: 1)]\n\npublic extension ColorfulView {\n    static let defaultAnimated: Bool = true\n    static let defaultBlurRadius: CGFloat = 64\n    static let defaultColorCount: Int = 32\n\n    static let defaultAnimation: Animation = Animation\n        .interpolatingSpring(stiffness: 50, damping: 1)\n        .speed(0.05)\n\n    static let defaultColorList: [Color] = kDefaultSourceColorList\n        .map { Color($0) }\n\n    #if canImport(AppKit) && !targetEnvironment(macCatalyst)\n        static let defaultColorListNSColor: [NSColor] = kDefaultSourceColorList\n    #endif\n\n    #if canImport(UIKit)\n        static let defaultColorListUIColor: [UIColor] = kDefaultSourceColorList\n    #endif\n}\n"
  },
  {
    "path": "External/Colorful/Sources/Colorful/ColorfulView.swift",
    "content": "//\n//  ColorfulView.swift\n//  Colorful\n//\n//  Created by Lakr Aream on 2021/9/19.\n//\n\nimport SwiftUI\n\npublic struct ColorfulView: View {\n    // MARK: - PROPERTY\n\n    @State var randomization: [PointRandomization]\n    @State var size: CGSize = .init()\n\n    private let colorElements: [Color]\n    private let animated: Bool\n    private let animation: Animation\n    private let blurRadius: CGFloat\n\n    private let timer = Timer\n        .publish(every: 5, on: .main, in: .common)\n        .autoconnect()\n\n    // MARK: - INIT\n\n    public init(\n        animated: Bool = defaultAnimated,\n        animation: Animation = defaultAnimation,\n        blurRadius: CGFloat = defaultBlurRadius,\n        colors: [Color] = defaultColorList,\n        colorCount: Int = defaultColorCount\n    ) {\n        assert(colors.count > 0)\n        assert(colorCount > 0)\n        assert(blurRadius > 0)\n\n        self.animated = animated\n        self.animation = animation\n        self.blurRadius = blurRadius\n\n        var colorCompiler = [Color]()\n        while colorCompiler.count < colorCount {\n            colorCompiler.append(contentsOf: colors.shuffled())\n        }\n        if colorCompiler.count > colorCount {\n            colorCompiler.removeLast(colorCompiler.count - colorCount)\n        }\n        assert(colorCompiler.count == colorCount)\n        colorElements = colorCompiler\n\n        var builder = [PointRandomization]()\n        for _ in 0 ..< colorCount {\n            builder.append(.init())\n        }\n        _randomization = State(initialValue: builder)\n    }\n\n    #if canImport(AppKit) && !targetEnvironment(macCatalyst)\n        public init(\n            animated: Bool = defaultAnimated,\n            animation: Animation = defaultAnimation,\n            blurRadius: CGFloat = defaultBlurRadius,\n            nsColors: [NSColor],\n            colorCount: Int = defaultColorCount\n        ) {\n            self.init(\n                animated: animated,\n                animation: animation,\n                blurRadius: blurRadius,\n                colors: nsColors.map { Color($0) },\n                colorCount: colorCount\n            )\n        }\n    #endif\n\n    #if canImport(UIKit)\n        public init(\n            animated: Bool = defaultAnimated,\n            animation: Animation = defaultAnimation,\n            blurRadius: CGFloat = defaultBlurRadius,\n            uiColors: [UIColor],\n            colorCount: Int = defaultColorCount\n        ) {\n            self.init(\n                animated: animated,\n                animation: animation,\n                blurRadius: blurRadius,\n                colors: uiColors.map { Color($0) },\n                colorCount: colorCount\n            )\n        }\n    #endif\n\n    // MARK: - VIEW\n\n    public var body: some View {\n        GeometryReader { reader in\n            ZStack {\n                ForEach(obtainRangeAndUpdate(size: reader.size)) { configure in\n                    Circle()\n                        .foregroundColor(configure.color)\n                        .opacity(0.5)\n                        .frame(\n                            width: configure.diameter,\n                            height: configure.diameter\n                        )\n                        .offset(\n                            x: configure.offsetX,\n                            y: configure.offsetY\n                        )\n                }\n            }\n            .frame(width: reader.size.width,\n                   height: reader.size.height)\n        }\n        .clipped()\n        .blur(radius: blurRadius)\n        .onReceive(timer) { _ in\n            dispatchUpdate()\n        }\n        .onAppear {\n            randomizationStart()\n        }\n    }\n\n    // MARK: - FUNCTION\n\n    private func dispatchUpdate() {\n        if !animated { return }\n        withAnimation(animation) {\n            randomizationStart()\n        }\n    }\n\n    private func randomizationStart() {\n        var randomizationBuilder = [PointRandomization]()\n        for i in 0 ..< randomization.count {\n            let randomizationElement: PointRandomization = {\n                var builder = PointRandomization()\n                builder.randomizeIn(size: size)\n                builder.id = randomization[i].id\n                builder.color = colorElements[i]\n                return builder\n            }()\n            randomizationBuilder.append(randomizationElement)\n        }\n        randomization = randomizationBuilder\n    }\n\n    private func obtainRangeAndUpdate(size: CGSize) -> [PointRandomization] {\n        issueSizeUpdate(withValue: size)\n        return randomization\n    }\n\n    private func issueSizeUpdate(withValue size: CGSize) {\n        if self.size == size { return }\n        DispatchQueue.main.async {\n            self.size = size\n            self.dispatchUpdate()\n        }\n    }\n}\n"
  },
  {
    "path": "External/Colorful/Sources/Colorful/PointRandomization.swift",
    "content": "//\n//  PointRandomization.swift\n//  Colorful\n//\n//  Created by Lakr Aream on 2021/9/19.\n//\n\nimport SwiftUI\n\nextension ColorfulView {\n    struct PointRandomization: Equatable, Hashable, Identifiable {\n        var id = UUID()\n\n        var diameter: CGFloat = 0\n        var offsetX: CGFloat = 0\n        var offsetY: CGFloat = 0\n\n        var color: Color = .white.opacity(0)\n\n        mutating func randomizeIn(size: CGSize) {\n            let decision = (size.width + size.height) / 4\n            diameter = CGFloat.random(in: (decision * 0.25) ... (decision * 0.75))\n            offsetX = CGFloat.random(in: -(size.width / 2) ... +(size.width / 2))\n            offsetY = CGFloat.random(in: -(size.height / 2) ... +(size.height / 2))\n        }\n\n        func hash(into hasher: inout Hasher) {\n            hasher.combine(diameter)\n            hasher.combine(offsetX)\n            hasher.combine(offsetY)\n        }\n\n        static func == (lhs: PointRandomization, rhs: PointRandomization) -> Bool {\n            lhs.diameter == rhs.diameter &&\n                lhs.offsetX == rhs.offsetX &&\n                lhs.offsetY == rhs.offsetY\n        }\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/.gitignore",
    "content": "### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Swift.gitignore\n\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)\n*.xcscmblueprint\n*.xccheckout\n\n## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)\nbuild/\nDerivedData/\n*.moved-aside\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n# *.xcodeproj\n#\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n# .swiftpm\n\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n#\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build/\n\n# Accio dependency management\nDependencies/\n.accio/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n\n\n### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Global/macOS.gitignore\n\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\r\r\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n\n### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Ruby.gitignore\n\n*.gem\n*.rbc\n/.config\n/coverage/\n/InstalledFiles\n/pkg/\n/spec/reports/\n/spec/examples.txt\n/test/tmp/\n/test/version_tmp/\n/tmp/\n\n# Used by dotenv library to load environment variables.\n# .env\n\n# Ignore Byebug command history file.\n.byebug_history\n\n## Specific to RubyMotion:\n.dat*\n.repl_history\nbuild/\n*.bridgesupport\nbuild-iPhoneOS/\nbuild-iPhoneSimulator/\n\n## Specific to RubyMotion (use of CocoaPods):\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# vendor/Pods/\n\n## Documentation cache and generated files:\n/.yardoc/\n/_yardoc/\n/doc/\n/rdoc/\n\n## Environment normalization:\n/.bundle/\n/vendor/bundle\n/lib/bundler/man/\n\n# for a library or gem, you might want to ignore these files since the code is\n# intended to run in multiple environments; otherwise, check them in:\n# Gemfile.lock\n# .ruby-version\n# .ruby-gemset\n\n# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:\n.rvmrc\n\n# Used by RuboCop. Remote config files pulled in from inherit_from directive.\n# .rubocop-https?--*\n\n\n"
  },
  {
    "path": "External/KeychainAccess/.travis.yml",
    "content": "language: objective-c\ncache:\n  directories:\n  - Lib/vendor\ninstall:\n- \"(cd Lib && bundle install --path=vendor/bundle --binstubs=vendor/bin)\"\nbefore_script:\n- ./Lib/Scripts/decode_cert.sh || true\n- ./Lib/Scripts/add_key.sh || true\nscript:\n- \"(cd Lib && travis_retry bundle exec rake $ACTION)\"\nmatrix:\n  include:\n  - osx_image: xcode11\n    env: ACTION=build\n  - osx_image: xcode11\n    env: ACTION='build:carthage'\n  - osx_image: xcode11\n    env: ACTION='test:iphonesimulator'\n  - osx_image: xcode11\n    env: ACTION='test:appletvsimulator'\n  - osx_image: xcode11\n    env: ACTION='test:macosx'\n  # Mac Catalyst requires macOS Catalina. But no CI service supports running tests on Catalina yet.\n  # - osx_image: xcode11\n  #   script: xcodebuild test -workspace KeychainAccess.xcworkspace -scheme KeychainAccess -configuration Debug -enableCodeCoverage YES -derivedDataPath build -hideShellScriptEnvironment -destination 'platform=macOS,arch=x86_64,variant=Mac Catalyst' -only-testing:KeychainAccessTests-MacCatalyst SWIFT_VERSION=5.1 GCC_SYMBOLS_PRIVATE_EXTERN=NO\n\n  - osx_image: xcode10.3\n    env: ACTION=build\n  - osx_image: xcode10.3\n    env: ACTION='build:carthage'\n  - osx_image: xcode10.3\n    env: ACTION='test:iphonesimulator'\n  - osx_image: xcode10.3\n    env: ACTION='test:appletvsimulator'\n  - osx_image: xcode10.3\n    env: ACTION='test:macosx'\n\n  - osx_image: xcode10.2\n    env: ACTION=build\n  - osx_image: xcode10.2\n    env: ACTION='build:carthage'\n  - osx_image: xcode10.2\n    env: ACTION='test:iphonesimulator'\n  - osx_image: xcode10.2\n    env: ACTION='test:appletvsimulator'\n  - osx_image: xcode10.2\n    env: ACTION='test:macosx'\n\n  - osx_image: xcode10\n    env: ACTION=build\n  - osx_image: xcode10\n    env: ACTION='build:carthage'\n  - osx_image: xcode10\n    env: ACTION='test:iphonesimulator'\n  - osx_image: xcode10\n    env: ACTION='test:appletvsimulator'\n  - osx_image: xcode10\n    env: ACTION='test:macosx'\n\n  - osx_image: xcode9.4\n    env: ACTION=build\n  - osx_image: xcode9.4\n    env: ACTION='build:carthage'\n  - osx_image: xcode9.4\n    env: ACTION='test:iphonesimulator'\n  - osx_image: xcode9.4\n    env: ACTION='test:appletvsimulator'\n  - osx_image: xcode9.4\n    env: ACTION='test:macosx'\nenv:\n  global:\n  - LANG=en_US.UTF-8\n  - LC_ALL=en_US.UTF-8\n  - secure: KL59HA2XSRa215qVXXnFpx48Tb/k+vNfFAbzyc+0M4mXl1VhSJv3bkTslqDrX822t3iFDFYhXbJ6aUo7szSdcbnCXU7VIhNPRK5QM00eS1AI4V0UwDQZ06g2f4Dmt+cQxACg+0CB0OaPnUCA4rkQQKeBMAWa67Tp2hNgQHwsnio=\n  - secure: B8zXiyX1zEq6uWaCxap5iW1joQBoOjNjSUlcs1t+QKdaFCFtjOI8C1JCClzk7rTnGNDDrhahFlE8yskSNKoBsaW2UJ8TzPIkD4F2pkxTHkaFQl/GBsdbHdOUFL4h0/zGQ6wY1Qhw7C+8+3U+1c9QbnNw6jOQwXTF6gs/XTNzG9Y=\nbranches:\n  only:\n  - master\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/AccountsViewController.swift",
    "content": "//\n//  AccountsViewController.swift\n//  Example\n//\n//  Created by kishikawa katsumi on 2014/12/25.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport KeychainAccess\n\nclass AccountsViewController: UITableViewController {\n    var itemsGroupedByService: [String: [[String: Any]]]?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n\n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n\n        reloadData()\n        tableView.reloadData()\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n    }\n\n    // MARK:\n\n    override func numberOfSections(in tableView: UITableView) -> Int {\n        if itemsGroupedByService != nil {\n            let services = Array(itemsGroupedByService!.keys)\n            return services.count\n        }\n        return 0\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        let services = Array(itemsGroupedByService!.keys)\n        let service = services[section]\n\n        let items = Keychain(service: service).allItems()\n        return items.count\n    }\n\n    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {\n        let services = Array(itemsGroupedByService!.keys)\n        return services[section]\n    }\n\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"Cell\", for: indexPath)\n\n        let services = Array(itemsGroupedByService!.keys)\n        let service = services[indexPath.section]\n\n        let items = Keychain(service: service).allItems()\n        let item = items[indexPath.row]\n\n        cell.textLabel?.text = item[\"key\"] as? String\n        cell.detailTextLabel?.text = item[\"value\"] as? String\n\n        return cell\n    }\n\n    #if swift(>=4.2)\n    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {\n        let services = Array(itemsGroupedByService!.keys)\n        let service = services[indexPath.section]\n\n        let keychain = Keychain(service: service)\n        let items = keychain.allItems()\n\n        let item = items[indexPath.row]\n        let key = item[\"key\"] as! String\n\n        keychain[key] = nil\n\n        if items.count == 1 {\n            reloadData()\n            tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)\n        } else {\n            tableView.deleteRows(at: [indexPath], with: .automatic)\n        }\n    }\n    #else\n    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {\n        let services = Array(itemsGroupedByService!.keys)\n        let service = services[indexPath.section]\n\n        let keychain = Keychain(service: service)\n        let items = keychain.allItems()\n\n        let item = items[indexPath.row]\n        let key = item[\"key\"] as! String\n\n        keychain[key] = nil\n\n        if items.count == 1 {\n            reloadData()\n            tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)\n        } else {\n            tableView.deleteRows(at: [indexPath], with: .automatic)\n        }\n    }\n    #endif\n\n    // MARK:\n\n    func reloadData() {\n        let items = Keychain.allItems(.genericPassword)\n        itemsGroupedByService = groupBy(items) { item -> String in\n            if let service = item[\"service\"] as? String {\n                return service\n            }\n            return \"\"\n        }\n    }\n}\n\nprivate func groupBy<C: Collection, K: Hashable>(_ xs: C, key: (C.Iterator.Element) -> K) -> [K:[C.Iterator.Element]] {\n    var gs: [K:[C.Iterator.Element]] = [:]\n    for x in xs {\n        let k = key(x)\n        var ys = gs[k] ?? []\n        ys.append(x)\n        gs.updateValue(ys, forKey: k)\n    }\n    return gs\n}\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Example\n//\n//  Created by kishikawa katsumi on 2014/12/25.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n\n    #if swift(>=4.2)\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {\n        return true\n    }\n    #else\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {\n        return true\n    }\n    #endif\n}\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11198.2\" systemVersion=\"15G31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11161\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14868\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"Vxu-PH-fkp\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14824\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Keychain Access-->\n        <scene sceneID=\"P0Q-z6-lcc\">\n            <objects>\n                <tableViewController id=\"Jtp-Af-YIM\" customClass=\"AccountsViewController\" customModule=\"Example_iOS\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"10\" sectionFooterHeight=\"10\" id=\"3Yx-it-Kem\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" cocoaTouchSystemColor=\"groupTableViewBackgroundColor\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" reuseIdentifier=\"Cell\" textLabel=\"6jg-UI-oEw\" detailTextLabel=\"1ym-9d-Zvi\" style=\"IBUITableViewCellStyleValue1\" id=\"t8g-pm-LZL\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"55.5\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"t8g-pm-LZL\" id=\"LZV-Cj-dTd\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"6jg-UI-oEw\">\n                                            <rect key=\"frame\" x=\"20\" y=\"13\" width=\"31.5\" height=\"19.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                            <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Detail\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"1ym-9d-Zvi\">\n                                            <rect key=\"frame\" x=\"352.5\" y=\"13\" width=\"41.5\" height=\"19.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                            <color key=\"textColor\" red=\"0.55686274509803924\" green=\"0.55686274509803924\" blue=\"0.57647058823529407\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Jtp-Af-YIM\" id=\"4M4-v1-LUg\"/>\n                            <outlet property=\"delegate\" destination=\"Jtp-Af-YIM\" id=\"A0G-ls-f5i\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Keychain Access\" id=\"ETS-AE-f13\">\n                        <barButtonItem key=\"rightBarButtonItem\" systemItem=\"add\" id=\"Vlq-2u-IZC\">\n                            <connections>\n                                <segue destination=\"UPc-C5-mNA\" kind=\"presentation\" modalPresentationStyle=\"fullScreen\" id=\"M5v-yk-38B\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"0Wm-gm-SBT\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"231\" y=\"164\"/>\n        </scene>\n        <!--Input View Controller-->\n        <scene sceneID=\"W6S-gz-OFV\">\n            <objects>\n                <tableViewController id=\"Ci6-Xb-OHW\" customClass=\"InputViewController\" customModule=\"Example_iOS\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"10\" sectionFooterHeight=\"10\" id=\"Nsh-ip-0lp\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" cocoaTouchSystemColor=\"groupTableViewBackgroundColor\"/>\n                        <sections>\n                            <tableViewSection id=\"kcl-lq-NwO\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"7RU-rl-oP2\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"10\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"7RU-rl-oP2\" id=\"1P6-M9-7lh\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Username\" minimumFontSize=\"17\" clearButtonMode=\"whileEditing\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zyi-Id-S29\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"9\" width=\"391\" height=\"26.5\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedWithSender:\" destination=\"Ci6-Xb-OHW\" eventType=\"editingChanged\" id=\"aKf-aq-f3d\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"zyi-Id-S29\" secondAttribute=\"bottom\" constant=\"8.5\" id=\"8HW-xC-qCD\"/>\n                                                <constraint firstItem=\"zyi-Id-S29\" firstAttribute=\"leading\" secondItem=\"1P6-M9-7lh\" secondAttribute=\"leading\" constant=\"15\" id=\"SfW-kJ-QNR\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"zyi-Id-S29\" secondAttribute=\"trailing\" constant=\"8\" id=\"bLO-Bw-sya\"/>\n                                                <constraint firstItem=\"zyi-Id-S29\" firstAttribute=\"top\" secondItem=\"1P6-M9-7lh\" secondAttribute=\"top\" constant=\"9\" id=\"kQy-Un-xgj\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"WnJ-H0-TUL\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"54\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"WnJ-H0-TUL\" id=\"jtU-kW-you\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Password\" minimumFontSize=\"17\" clearButtonMode=\"whileEditing\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oDn-kk-0de\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"9\" width=\"391\" height=\"26.5\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\" secureTextEntry=\"YES\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedWithSender:\" destination=\"Ci6-Xb-OHW\" eventType=\"editingChanged\" id=\"OxY-ei-oaj\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"oDn-kk-0de\" secondAttribute=\"bottom\" constant=\"8.5\" id=\"H0O-q7-Oev\"/>\n                                                <constraint firstItem=\"oDn-kk-0de\" firstAttribute=\"leading\" secondItem=\"jtU-kW-you\" secondAttribute=\"leading\" constant=\"15\" id=\"ZM8-Hw-sHu\"/>\n                                                <constraint firstItem=\"oDn-kk-0de\" firstAttribute=\"top\" secondItem=\"jtU-kW-you\" secondAttribute=\"top\" constant=\"9\" id=\"ZPq-1v-AC0\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"oDn-kk-0de\" secondAttribute=\"trailing\" constant=\"8\" id=\"dQ7-qd-nhJ\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection id=\"Rub-6X-UyU\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"WR8-y3-rgh\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"118\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"WR8-y3-rgh\" id=\"607-H8-OGj\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Service\" minimumFontSize=\"17\" clearButtonMode=\"whileEditing\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bQG-QF-hkM\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"9\" width=\"391\" height=\"26.5\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedWithSender:\" destination=\"Ci6-Xb-OHW\" eventType=\"editingChanged\" id=\"enS-1b-yrF\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"bQG-QF-hkM\" firstAttribute=\"top\" secondItem=\"607-H8-OGj\" secondAttribute=\"top\" constant=\"9\" id=\"DQ0-kV-Lps\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"bQG-QF-hkM\" secondAttribute=\"bottom\" constant=\"8.5\" id=\"GaT-9h-fEV\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"bQG-QF-hkM\" secondAttribute=\"trailing\" constant=\"8\" id=\"Hyt-ex-iBJ\"/>\n                                                <constraint firstItem=\"bQG-QF-hkM\" firstAttribute=\"leading\" secondItem=\"607-H8-OGj\" secondAttribute=\"leading\" constant=\"15\" id=\"P5p-dR-6Av\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Ci6-Xb-OHW\" id=\"0NJ-cf-dSM\"/>\n                            <outlet property=\"delegate\" destination=\"Ci6-Xb-OHW\" id=\"qnF-hg-qI2\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" id=\"3Gf-V3-uxm\">\n                        <barButtonItem key=\"leftBarButtonItem\" systemItem=\"cancel\" id=\"wFd-wq-9G5\">\n                            <connections>\n                                <action selector=\"cancelActionWithSender:\" destination=\"Ci6-Xb-OHW\" id=\"2eJ-a8-IRd\"/>\n                            </connections>\n                        </barButtonItem>\n                        <barButtonItem key=\"rightBarButtonItem\" enabled=\"NO\" systemItem=\"save\" id=\"ueY-jZ-6ms\">\n                            <connections>\n                                <action selector=\"saveActionWithSender:\" destination=\"Ci6-Xb-OHW\" id=\"Oty-ij-QPW\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"cancelButton\" destination=\"wFd-wq-9G5\" id=\"n1X-zW-EDm\"/>\n                        <outlet property=\"passwordField\" destination=\"oDn-kk-0de\" id=\"QgI-b3-qHF\"/>\n                        <outlet property=\"saveButton\" destination=\"ueY-jZ-6ms\" id=\"dzq-xg-N4m\"/>\n                        <outlet property=\"serviceField\" destination=\"bQG-QF-hkM\" id=\"mjQ-AK-Z4Z\"/>\n                        <outlet property=\"usernameField\" destination=\"zyi-Id-S29\" id=\"Ws1-i5-KzY\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"t3l-SW-jHz\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"231\" y=\"897\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"Oh4-Vx-wYM\">\n            <objects>\n                <navigationController id=\"UPc-C5-mNA\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"Qkz-Dp-KoE\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"Ci6-Xb-OHW\" kind=\"relationship\" relationship=\"rootViewController\" id=\"JRp-AT-sQa\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"XeL-mf-rFl\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-589\" y=\"897\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"k0A-AE-7fY\">\n            <objects>\n                <navigationController id=\"Vxu-PH-fkp\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"NWb-ht-ElO\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"Jtp-Af-YIM\" kind=\"relationship\" relationship=\"rootViewController\" id=\"1GL-67-9eh\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dsG-PT-AyH\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-589\" y=\"164\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Example-iOS.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>$(AppIdentifierPrefix)com.kishikawakatsumi.Example-iOS</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/InputViewController.swift",
    "content": "//\n//  InputViewController.swift\n//  Example\n//\n//  Created by kishikawa katsumi on 2014/12/26.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport KeychainAccess\n\nclass InputViewController: UITableViewController {\n\n    @IBOutlet weak var saveButton: UIBarButtonItem!\n    @IBOutlet weak var cancelButton: UIBarButtonItem!\n\n    @IBOutlet weak var usernameField: UITextField!\n    @IBOutlet weak var passwordField: UITextField!\n    @IBOutlet weak var serviceField: UITextField!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        tableView.rowHeight = 44.0\n        tableView.estimatedRowHeight = 44.0\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n    }\n\n    // MARK:\n\n    @IBAction func cancelAction(sender: UIBarButtonItem) {\n        dismiss(animated: true, completion: nil)\n    }\n\n    @IBAction func saveAction(sender: UIBarButtonItem) {\n        let keychain: Keychain\n        if let service = serviceField.text, !service.isEmpty {\n            keychain = Keychain(service: service)\n        } else {\n            keychain = Keychain()\n        }\n        keychain[usernameField.text!] = passwordField.text\n\n        dismiss(animated: true, completion: nil)\n    }\n\n    @IBAction func editingChanged(sender: UITextField) {\n        switch (usernameField.text, passwordField.text) {\n        case let (username?, password?):\n            saveButton.isEnabled = !username.isEmpty && !password.isEmpty\n        case (_?, nil):\n            saveButton.isEnabled = false\n        case (nil, _?):\n            saveButton.isEnabled = false\n        case (nil, nil):\n            saveButton.isEnabled = false\n        }\n    }\n\n}\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEE951A51E1BE0070B77E /* AppDelegate.swift */; };\n\t\t14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE991A51E1BE0070B77E /* Main.storyboard */; };\n\t\t14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9C1A51E1BE0070B77E /* Images.xcassets */; };\n\t\t14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */; };\n\t\t14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB51A51E2690070B77E /* AccountsViewController.swift */; };\n\t\t14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB61A51E2690070B77E /* InputViewController.swift */; };\n\t\t14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; };\n\t\t14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 14A630151D3293C700809B3F;\n\t\t\tremoteInfo = TestHost;\n\t\t};\n\t\t14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 140F195C1A49D79400B0016A;\n\t\t\tremoteInfo = \"KeychainAccess-iOS\";\n\t\t};\n\t\t14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 140F19671A49D79500B0016A;\n\t\t\tremoteInfo = \"KeychainAccess-iOSTests\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t14DAEECA1A51E2D70070B77E /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t145652E11D898BB9006E8D0E /* Example-iOS.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = \"Example-iOS.entitlements\"; sourceTree = \"<group>\"; };\n\t\t14DAEE901A51E1BE0070B77E /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Example-iOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t14DAEE941A51E1BE0070B77E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t14DAEE951A51E1BE0070B77E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t14DAEE9A1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t14DAEE9C1A51E1BE0070B77E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t14DAEE9F1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t14DAEEB51A51E2690070B77E /* AccountsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsViewController.swift; sourceTree = \"<group>\"; };\n\t\t14DAEEB61A51E2690070B77E /* InputViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputViewController.swift; sourceTree = \"<group>\"; };\n\t\t14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = KeychainAccess.xcodeproj; path = ../../Lib/KeychainAccess.xcodeproj; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t14DAEE8D1A51E1BE0070B77E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t14DAEE871A51E1BE0070B77E = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE921A51E1BE0070B77E /* Example-iOS */,\n\t\t\t\t14DAEE911A51E1BE0070B77E /* Products */,\n\t\t\t\t14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14DAEE911A51E1BE0070B77E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE901A51E1BE0070B77E /* Example-iOS.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14DAEE921A51E1BE0070B77E /* Example-iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE951A51E1BE0070B77E /* AppDelegate.swift */,\n\t\t\t\t14DAEEB51A51E2690070B77E /* AccountsViewController.swift */,\n\t\t\t\t14DAEEB61A51E2690070B77E /* InputViewController.swift */,\n\t\t\t\t14DAEE991A51E1BE0070B77E /* Main.storyboard */,\n\t\t\t\t14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */,\n\t\t\t\t14DAEE9C1A51E1BE0070B77E /* Images.xcassets */,\n\t\t\t\t14DAEE931A51E1BE0070B77E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"Example-iOS\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14DAEE931A51E1BE0070B77E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE941A51E1BE0070B77E /* Info.plist */,\n\t\t\t\t145652E11D898BB9006E8D0E /* Example-iOS.entitlements */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14DAEEBA1A51E2A60070B77E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */,\n\t\t\t\t14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */,\n\t\t\t\t1470425E1D6FFA97005A4C6E /* TestHost.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t14DAEE8F1A51E1BE0070B77E /* Example-iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget \"Example-iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t14DAEE8C1A51E1BE0070B77E /* Sources */,\n\t\t\t\t14DAEE8D1A51E1BE0070B77E /* Frameworks */,\n\t\t\t\t14DAEE8E1A51E1BE0070B77E /* Resources */,\n\t\t\t\t14DAEECA1A51E2D70070B77E /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Example-iOS\";\n\t\t\tproductName = \"Example-iOS\";\n\t\t\tproductReference = 14DAEE901A51E1BE0070B77E /* Example-iOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t14DAEE881A51E1BE0070B77E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0700;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = \"kishikawa katsumi\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t14DAEE8F1A51E1BE0070B77E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tDevelopmentTeam = 27AEDK3C9F;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject \"Example-iOS\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 14DAEE871A51E1BE0070B77E;\n\t\t\tproductRefGroup = 14DAEE911A51E1BE0070B77E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 14DAEEBA1A51E2A60070B77E /* Products */;\n\t\t\t\t\tProjectRef = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t14DAEE8F1A51E1BE0070B77E /* Example-iOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t1470425E1D6FFA97005A4C6E /* TestHost.app */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.application;\n\t\t\tpath = TestHost.app;\n\t\t\tremoteRef = 1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.framework;\n\t\t\tpath = KeychainAccess.framework;\n\t\t\tremoteRef = 14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.cfbundle;\n\t\t\tpath = KeychainAccessTests.xctest;\n\t\t\tremoteRef = 14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t14DAEE8E1A51E1BE0070B77E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */,\n\t\t\t\t14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */,\n\t\t\t\t14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t14DAEE8C1A51E1BE0070B77E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */,\n\t\t\t\t14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */,\n\t\t\t\t14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t14DAEE991A51E1BE0070B77E /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE9A1A51E1BE0070B77E /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t14DAEE9F1A51E1BE0070B77E /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t14DAEEAD1A51E1BE0070B77E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Example-iOS/Example-iOS.entitlements\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14DAEEAE1A51E1BE0070B77E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"Example-iOS/Example-iOS.entitlements\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.1;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t14DAEEB01A51E1BE0070B77E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"Example-iOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14DAEEB11A51E1BE0070B77E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"Example-iOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject \"Example-iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14DAEEAD1A51E1BE0070B77E /* Debug */,\n\t\t\t\t14DAEEAE1A51E1BE0070B77E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget \"Example-iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14DAEEB01A51E1BE0070B77E /* Debug */,\n\t\t\t\t14DAEEB11A51E1BE0070B77E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 14DAEE881A51E1BE0070B77E /* Project object */;\n}\n"
  },
  {
    "path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14DAEE8F1A51E1BE0070B77E\"\n               BuildableName = \"Example-iOS.app\"\n               BlueprintName = \"Example-iOS\"\n               ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14DAEEA41A51E1BE0070B77E\"\n               BuildableName = \"Example-iOSTests.xctest\"\n               BlueprintName = \"Example-iOSTests\"\n               ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14DAEE8F1A51E1BE0070B77E\"\n            BuildableName = \"Example-iOS.app\"\n            BlueprintName = \"Example-iOS\"\n            ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14DAEEA41A51E1BE0070B77E\"\n               BuildableName = \"Example-iOSTests.xctest\"\n               BlueprintName = \"Example-iOSTests\"\n               ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14DAEE8F1A51E1BE0070B77E\"\n            BuildableName = \"Example-iOS.app\"\n            BlueprintName = \"Example-iOS\"\n            ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14DAEE8F1A51E1BE0070B77E\"\n            BuildableName = \"Example-iOS.app\"\n            BlueprintName = \"Example-iOS\"\n            ReferencedContainer = \"container:Example-iOS.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "External/KeychainAccess/KeychainAccess.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name             = 'KeychainAccess'\n  s.version          = '4.2.2'\n  s.summary          = 'KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.'\n  s.description      = <<-DESC\n                         KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.\n                         Makes using Keychain APIs exremely easy and much more palatable to use in Swift.\n\n                         Features\n                           - Simple interface\n                           - Support access group\n                           - Support accessibility\n                           - Support iCloud sharing\n                           - **Support TouchID and Keychain integration (iOS 8+)**\n                           - **Support Shared Web Credentials (iOS 8+)**\n                           - Works on both iOS & OS X\n                           - watchOS and tvOS are also supported\n                       DESC\n  s.homepage         = 'https://github.com/kishikawakatsumi/KeychainAccess'\n  s.screenshots      = 'https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/01.png'\n  s.license          = 'MIT'\n  s.author           = { 'kishikawa katsumi' => 'kishikawakatsumi@mac.com' }\n  s.source           = { :git => 'https://github.com/kishikawakatsumi/KeychainAccess.git', :tag => \"v#{s.version}\" }\n  s.social_media_url = 'https://twitter.com/k_katsumi'\n\n  s.requires_arc = true\n  s.source_files = 'Lib/KeychainAccess/*.swift'\n\n  s.swift_version = '5.1'\n\n  s.ios.deployment_target = '9.0'\n  s.osx.deployment_target = '10.9'\n  s.watchos.deployment_target = '3.0'\n  s.tvos.deployment_target = '9.0'\nend\n"
  },
  {
    "path": "External/KeychainAccess/KeychainAccess.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Lib/KeychainAccess.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Lib/TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Examples/Example-iOS/Example-iOS.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "External/KeychainAccess/KeychainAccess.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 kishikawa katsumi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Certificates/KeychainAccess_Tests.provisionprofile.enc",
    "content": "U2FsdGVkX18WxFfapSdab5VH8V0ALvJ1p4DGQkV6PkLcteNXpYJVZYP7ibe0xSo8\neEXjFyvV6Gx/O+FW90M40ejNOoG5qgTchrGR4mym4ECWHtaxijlIsr88FJrpBuYt\nRO3Pe9Ada/N2oqZjA9HSZ6v777VeCDuk/BAzcbPe9JbVISEyN7MiLMPC0A+6/cyx\ntabYCFt/8ROQv3Y4J9WA9De4sozTsynqnfpKHUXuEllN/2WaMLihqvUclXytu0g+\nuLi1e2Fl3Nb+apR3uztYfPNDHS6QvDXpUQKrtCchkt96nkgvpVqIkOaQHLcna+Jx\noJuYwSFgOMf71PIuyTS0roah9/PrQhQEEH9LPzmbxFNWpc6GiNPSET9X1aXrLgOp\nmZY9w9cpSmjP7odjE1VHAAJWYD8PExCOST17096wOgf1kQQaykE4ec23Xo3BLbtJ\nnjIi2Z3RVn7saH3IxvyTkgJIlUmAsmSCDbaHCyEZN2+g4SAWN8Ysd5hOPDW6r5Ft\nu75AsmvW1LRxMvvp3VQqHZ/9pv6erq5lnbMKWdAw5z1auCO6DGBUUMOwQqRRFvwT\nrKdKgGr1MNHoo1+zysY5RpRZzETqUZu2li46K3VO1aaTk6MIfpPeUpPQpFwWN3eE\nIVk5Bkjgm8yqWnPWquuw2bKavQZcJC9/e8ISPdpaqEoTV8ZFS7Qq16G6yWZSb6mP\nCg4GWpIaRg+nGidx/xxZ6vVHCqcyK80961RFaFXlNofU0nEN5f7npGw1MvKJMSu3\nTOpAeaDp1XHqlk36XtEvfe+rHP9RzUBlqFYUYAFqHOlKA9dYwb2rRes5PNjdXisi\nOvxV4uGW9fy39NQustpTa1pRYmG1tjIvp59EdAAvc1XoKCa58ZkNaPb6m9u1Y3KR\nLHTZk3nJhoLflmdMt1z/brf0KfCq9NROniAlemfe7oT8AipxSRqIVwx+22IBh1yp\n+aYJF0s1fThI3ViQMH3Jf+ybMVqP8co9BUVwh2GEZcOpwVBIW1Vtiz054Zi0ghxr\nDAyeB7OkpIqpWQKOQPH+GULZItK3GHLiEa/stwvABITggcbbXE+Ek4Qt4jk/2fzP\nmlIaDYn5cB7SHd6NGPZdPyQPAS9tz3LJF8Sc2IvlAjd7KTfX4+wCjUNz/vdktrdu\n6sHn6JoE0K5yip+bU1tp0xwTDhlDoTzJMGHl/PkVzhvte/RTBlNn0UPzH683qKM5\n34aefSH7TxdYhsFmF2to6d9jum9sYWDxT0Lyxc0apt8qIFDpQ/oukRg5FidUM9O1\nK4qr4mQ7Q8JxwIL+LekTLYjnSnMPuEdlkhetfN9lvXrwpTxAP8cpGND2usicXFVF\nt96NjO0rcT7pT0DZdcvyDj0yPrmusKSx2LPFtuniXp9XybGMFeCrkE3ITE1ui+ly\n5+txwDP3h237FpjWqCGez9JIqLRaJoHUX9paWQ1zwcqu//5TWnOEikjXENohIRhT\nybDfm8rOwHv0EOdGI3UiOuPt+YsV66SWHJGcpE2mBH3ZT04sk7k/SR9vy4PWgzqS\nLaP4kFP9/cJPZWa2O1WForq3zCk4x1ytc0Xd3ndnHaznSzsEdYjFfUkOEh7cjTJK\nbp9prZT6TzMxtwsVlBIAEbpjZT6Nrb5PkYnhqiOEk3UmTne/yyOC4WF5ZwQi3sw7\njh6ZcNt50YUAnIb6GOs469RLS+wC0XuP9sYLP8V0OdUv5sjrcicAF/wqZvq4qbOL\nfNyJeDK3Zctn7Xr9crNur0Koj8xNfubCRpOT315Ak+zuomljNS8YKr48mbup5iGK\njbDKe3H6f36Gm7ZIpHXJe2i7zB1ZrrRo9sseIxzqYYRbRjGXio2xQiZFwLcvjZdD\nJbQBFkVr6P9DdRYsCPW17QuN+Wqr678RWe+jwxze03/td2ilqnsrOHkFXk0r/TDy\nKeyEaQbE0Gw9Tck2MV/AeI5smtwwVkF21Vo7YjRTOImnItDDwxn4tNBxdZ9rrNUs\ntlr+jr1u3Gbhe4flXtOtzC5AchvrU3Mu++lLV3Bn60GjyqPlRGmNlyyPkJVbsGzu\nHnWqzTRsNW0FngylBUx+3pIJMxF68MRgyFaHAY0guHG489p0KoySeYn8CdsEQLbf\nIC3GQHx+r3cHLHkQhJlx9pcTF+qqxakN0YJd7eiYljJ9jS3w+MAyhExjVzYjAhVT\nAch/mVqdR7P37pUGU+GXN6fPMoZvYlNxIft2zpv2j8O3T5Z5xFXvP8mbgCrz1w0w\nPjpcOcG0T+uzbolUJ3fOHsLQp6YKfZJ1WKVqpBiLu2xmhzO9z0WqQtYJZ5L8lgq5\nbw6QFsKGvY6f08kLiHxHT+h7D8qQhe43yA7g6N2n3fVPxWU3KtYegY1SXO6UtIb8\n1yFy5KwoXZj1fQnb+O6XfNUtTkHoMwZFPxAGdSXzW6YqMGgeVbjrpYCpLR/4ljED\nvkj0NqNubyJa25UW5A/tVdMITlxeeyTaygrp882tCaP6/JnS65bBHvkzc2DSz9e7\n8gJ22sD2TctWqvGoFEux2i4kfflISINnqfkss7cyn6MaH+R37IqUR4mdJzPn5tw0\nMCk9R0mzp6NyR9xS1PO3QW3juNDeasXBKLcKPh4lU3/geJA2Po0FA9pr1lsAMFOB\nltLsvk3HWdcB4+iFz8u+WrIANtvlLFfruFiqHe8n5YbFt63jh4CBqC1eto1Tfm1q\nkDgIqwRi8ZXGhVya4PzDHpynfymr5KFNBsGUoahG5F3m5QLFXcOQLTHldtkx3zNP\ngV4I68Gtkuw2RIDnruM8YEdZt2zLK5qXM2/6EecCba9cFN1AKHAUhcI9BKu3xFcP\nf6FM7+m8evVBFA4PPbH8IxHMux4svMFmluN9FxQK/aLu7kN6LIS5OporCp/s1wTl\nLWtAf6EUSPPQLvDqGZTDFvl5x4Fn6cPN23Y6kpYGuMf6zPEak/8yQJ9X3D4lqXfP\nk+SC2pu/ybVN2TtTNV/8YcTIbE1xF8/m4agtJjg9OTzAJT9MkgszSTK6S+R3ioaG\nI0ucixUlQWrGXN1LFWhgkcB3lQSz4EiHchKnYBNIqPpYpJcTU6cXcI4ybGWoBlwj\n1RDEw42O5PyyicxXFXAtwDjaUk3GqW+h4Bb6ti9wWFxf6DzlnvyfqkCrqnAHJWtT\nZvbTkF1YPorVnKUY8hClRG0Fdv+wr8m5UrQgWEG548hwNqj0wvBkfeUqHPv9A6Eh\nsRtCtcTXNw+xRo8M4YLSN99gZFGCvIEbE2lPRF94X0RSXuQTMUbSw6M6N5rUBsKR\nApeN27CwmuXYXl+9bvZxViVRSbICjqc9UrevXuK7KEhcwkP9LIozCB8gdy5m0S3Z\nTmQqwCpl3q6NYc7ubMzf42rCD/l+LDyavmyW3PQHYJlzrDvqRim/FjdSlyGoLFIw\nrzsVCxFCA+KmJ5ZKO6mNhg1GTyBXvKHRWOb2FvOTDAQotut5qPj4N9x7j8FXdvOQ\nh6OR1dzFJKlMuu2rr6aL80yK3lRLFokzHXF9JvOVPkbwRr49I+LnKl7r31NUDaBF\n8eKC8sR0tMLjHBPipASfisPtl8AqSmUOd1IUDR7y6wRu4NxFgyLq/MlyoWR2Cvze\nYuCZjAJjxUSfrqKCUOy8jfe4tj3v1K2nAAjw8n+fa4Ciacq8L3fGD2zaKLphRUKy\nd98tKvwlOiVIMyPd/Oq7caWi+NqWuGdX8v2kf1quagKC63PD2w+/E7rNriD0mUba\nQO7AXLeV6ZN0LLv64lzKysKE3CrB03s0KFI7faWZ2iJKyqLwt5Xm4VBSNRkCaZfp\nEivbwxGzVa27nFnhNC79ggW3gSIf5aNhnFr55CgKXOThwIktMjoEz0wg8dt1x5jk\neNFzB8AA3eO83QUSEa+NJaRyIIu+L+h6MjdmTnGkBWR9fXIchzWvlIIlWnL6hbAr\nXdsq5Rj4uGCg+5xboClc0SybVs0FerAOME8gtLZsDkeMcZ4OKIu11LmTHoz4JU1G\n0p7bU+dZlGXIvzFQUhQv5W1EOmsXS62NcJ1cdAL3PUA9rNQd9j68d1WrG84Px3fe\n/b2H9VOYNfDA+AdDyjXsiGsBE5IGtxHuZxG5+3nEHQgfXb9R9WuG37SdiGMdaPLm\n7OJg2Zkm5OSbh/3NWtw2W+0IRV2c3UQuQRmupGdwBhssA/k+QGC83SiFfiKWtNpQ\n0qwxGVGLE3nGl4Sma6f06ygHzy4hOEF7GBUpqekKmIoP6+epjvceLnSiTjqHKhRq\nt6ALmpicZ28aYrS5z7j/HqLiv01XmH+T4R6vg5hnAb897GuNVv/NogURPng8MG7Z\n1YM32YRp+OwP0FEQY9ye9ZudYKuzp/gG1j6/SEF9nUVQnCpxRRz7T3BWe2El+j7y\nVujRIcRP2D5bb7IMzGoHE0K1vr5YOW799qjkeLNcDaRewzWDW3YB3KwZW4aPEXpX\nZs/M0DVLyPuIXyowtGm1mKOAFabcQhfMq5GpcSKWzGtTyGIGdBIhxUsy2QMKntZU\niNz5myLb1YammZccIxWH18nF8Kr9QF4OFChIi4/NGdfYi8yl1FPTdkajOT5q8rZd\npsPZFcb3Zy5taROYUSEFAAGKF7RdH1hNcBS7seHLDNaEwCDGZ6QDn8Pvgal3Vzss\nfiZouPaKCYY0qFhtRLHEOZ9yHhytP7BGV1n9rMP5tQkvOciHmF/U+tqdttl4LTAg\nPPfGr1POmW6hGMZGWGj+UbJ+TpIuJnDx9qppUe6fSqVDLKPlSeVSynPUnHj7Fv5u\nf3eCbhp6aTA9Erjd+P1x2KAwDymw1u0VyVNMt+Xpg03gooJvCVuRfxXyXPABJeuN\nZ2iF/fSUdygkp3fIU/BB0J9QseR/DZjswbDPgMmRBOmb/+uVgVQq7JaS7HsOeSNJ\nKz3PK24r8+X2SMPHgCPb+w1n0EPLVIp1vDtpPOXjiSqLDmqsTQFMnfl9ipy21ttP\nOoXPqoWtmgfyEdQnw2y6xfChnB2xu2OZ8PjXmiDTnOc3agJ7DdR0XxALHmIoJZ4H\npMb8DgfPQBiBQ3Tkdr98SmFoRXfUpO0v+3s0RP32BRrL8afd+fWWLr4OIuAFg2Gn\nX7mx8T6LYHEcJCxuv3ITj2uYiApVstpUOE438Zc8Dl5trxk/+mQsKSqQ3MhxDolK\nsOAFyMksPkE8orBqQAQ7IgIUDWTzHDdhDaDnTWW2uLHmX2E+Uq2wsHFFXBBh1e4G\nh9IQktWe+38lLfLYdjN8nBVyi5hSJoX/vCiD0uoRbx/FGdjwFEoVHa6+xDQ34utH\nP6k6XIh9+qixz/709oywsmBhGeKgkTWRfCFkD/OioieyNUIPgarThFfenXguVw1S\nLGArMsiWcPRU4ZjwEPxNyUQgsj3ZO5V+qJlzV+GHObs0QRALm2vbtRjUd7Wi2Pq4\ngZJRPacBMWHWM8eT7S4iwdJDut/pZr9jwcRQw2PtuMfdO7v7BzktEKqwew+Y6NEA\nUK+2Vs0Yh8DdEw3ygTM5AQrHuUTAeQDwzebMBiwTSH57om17/0q6FRESWyvvri6G\nUocMjzskU8pgmDd3g5DBTsrIY40sF68Jo/O0H65d3F7JTg6NGMYldM5xReP63wro\n9ZXim8yqDVgTdXahMphIuJyNSjiQco72MDNq81tvKzx4DTwmYvNdof4XCqcsyfVI\nb5/UZ9LWDL7BItO6/G+G0uRQRuJYke2fY3kdkdF78yCkaiaJUcsd4Q+yeSZKqdLV\nzSUtpMAAG0W56tpo8eeuHRrutMiVF24TWbhyK9MNmu4kDbO2ROl4TaExALgrtZSI\nRlcxmr+WjrdExoU+J6oFwJx2FW43HS/gn39uFklNlsUtvev8aFriglYk7yYpIqzf\n3nGLGA3B62c3qWuiW9repbZpJIuJgYhoWssj0nr1beTYORoGrRPhqhajsOcIIbX1\n79wbg4OJ8FMp1ecoM1jOA3HNY+XceJSUu64t66r3ik5uiWtY2QY8KPg3+Ep4PA3n\n3wia4ycqhc0VQ14O+d0HaSoTRbqDzWIx4yeXFjMhPh4UizzkS1o07juxQZ92kB12\nZJr/C2oDJXX6GqxbTevUuoY/fgbSNP1Kz7Nev9WMkCpqJNf3fZAfEP+7QxYP/yt0\neyCjbkqtIeZ83+NVpIee+7mbi++xe9T5EkpaCdEIUr8834SlB/bJWQEjjue4QAX9\n5QsqXfhVmdlJAHg8iqjQ1Sv7Cz3sJj3DdZshWeTk6oMCtWiJnJUHvzDaXC5RYiAE\nwe2zVYroFDm0rN5HApHf1fNKFayzgmmgsT4MRbaMQKdNR3drLq5UTfbUjEuXVl5T\nzn4sCi7fYpz+cuUCqbi91lNYY5py/hSrNl+9xIdIgPV0qwF5+OXomNcQDc4CION3\nAWs8vUcFPt52uH5F2IFO168CCgHrLGtNW2dnGt/Tmd4+GaErY1ZTlfv/qUZABPaN\nX64Ya2cfVztw0gZCHsqGDLkjI43S5QBBb9ehFse5NUJYR/dVQN5+ctstkEBAJoAj\nQ7QC7bKOidrNd2LGbQexs9Ko7ZKTd1N13HhfH3GqHfG0TdOd1EVig+Ox1zkLykRK\n6pZgQB04kbIFWMbJ3GWSZzXxazcJF4ceNRQvgVIaoJwhiygAxzONcDupzjQQaaEN\nl+7ups3js06UNVCBP9tyPqtV8c5MMMvvWwiAzkT/DgwwLrjQBvWji0kHTg0ebj+K\n8WPrrnGJs6SvbH8Rt9bKjkid94/Wpm0fPnUkK6MFCnAREEKNSryCu9EGtH+HICOD\nXBAU5RAXzpm/RNyFthU8LWJv/ZWewHCmInFDxODQ9TmwQqgA/bt+xvCZtqy1swU0\nPzpfg0Cm7pijkDY3Ro/y132O47plFEW1tfLkkWiURN2nRttca39wNJa7rBN16jdH\nEeAzH6HeYuXnX+84YiYnzWEiOIBMu7DHSgMCG+at0qoXQitrwcBYSaZNuJsDTMrX\ntF5jJraLd3rcOnFcYaXxi/7Pmt4y8bo2Z1vebJCVERhds/Cn54n9b5oH2jWleo2K\nREN1UUgwMT3Ab55AZtxt0HNwVPg8gPZpJKuYyEcHyQWxux3PccFBtggOEjWlKe25\n7tUcVlu9og9tsqb6TujceReBUmrTqmB07Ce2OBf32c+WEXs1N5EFOmqSoKQUarw1\nqK7zzugYxevAVO70tOWVq9x4i59zDVn/vbbA2uauq8Qetc5aavswbNmQRvO/7kcW\nVSH624oIDjvgEfwba+YJNPOFlq+NytMn4K/+lIB4vLnJgR2zz8qaEqniY59Cpguc\n25JdQbemxdxS2zCEZtPhqL2uOCMC0pXaO/fQx373rbXKS+YKJso9M6/dQXk3EYZM\ne4Vmo6paysjN2eM5hJBha+rNA3X+B6NvxUROx22ewhpBWSp8VuQuRZt6QJm4hMli\nDPnwyfQb0FuLnHja6v54Wj+MkUPX94Lg8IHyxnQOyO+dwxw/UKEfAzR8hs4l9ldp\nSGErlneKpL0rPK8l4ARZylsCHQzSATYuaSP/0V401Gp/Ph7iaSSagOvC6NHVoz+j\nn1qBYrFYdv4C7fYsz2LtoPf4oXIb7uc6J+3Zpg1hXMgx/CEpr1MuqXEAo4smVnEH\n7zJe7b2gnBhNoMiEl0HgWxypJM388B0SsZLi/JKjHMYKmeAe7X3y6FeVFTWd56Oz\nS+kaZjTx1BDa4Tv2ByaervxHR8W431hVwdJdQok/q6+hVX9SO6CD1eM8E4yVqqVj\nu17qg3OUyL+6UVInx0RcSo5jzqvVHbcfJOFBcIGpbD8HUhOYHjaehgxdKQkq1cQb\nCztU5v7k8M+at9PgGSMYaWchWd7LjdoCK8Y7HJ3heE2p/g737R3akmNuBg4H0vlW\nGuNCu456rUgOe4bAF03cEExwHf4I/BB2er3rs/ebd/9JBEKYiNvP1NEo2gethN+F\nJ2NclLQv4iTv+P21IkOFfKBPHajad3qHTTXa0ZuH/ZF1jTA6lyyl+gmre436YtHu\n/kKS5PP6X/Tm2aifKv+j7id0kjWUdR6CT5QHecks/W1NuHKkaTcUeH0IdG4Ruie/\nuUivxoAEhFx1E4O6Oc+3WRoUTr5tXRP9pqR7dItAUAwHByNtePCBNj3r6D7EzjcZ\nVAn2xGkUkkhLuP8CAfwSZpNNhXdi5w7+RegktC5LrFi5J/lTXPdW6zoE2M1+Tb6Y\nYVnR0f/jjQTe6qZJpjjmiXaU6gpuJDrNOcI0r/4Woy+PmJEpD4fEM6bl8BtCu6WD\nS4JCaA1DEDnou7CzhLTIZUn1PBcc5FPlRx0cxYTgcdXZ/8nFUKABTqDxSahESoim\nwz/RuIBGCyyqJyR1I+vn+EFYIr4NdUVfm4EDHGKRhtf5saSk7mCJe5JBCFFSkXDk\nHIo61bm9HfbGCCYZl4kxKJJJAHoSbWoZUt1sZqDT4QOEv09gtnEZUt/cYoDnaES/\nUm3lsrIAyDPIEK6ggZdKzPROGBzMBqNICa/9tzybEuyHHOqHXIfzkvjvAzpTxpMW\nxlocQIe32XqHWqCFr05XTrf7EQYh5FosYeS1HAS9VIp0B0FrnEGuv5LSCqzm0ytj\n6+jJAIBgIqQ8H5Um3O2PQPooyrDdms8XqG0BeODoiu7fFmg340CxWC4oN9pmpj75\nGQae8atNVFaxcDEP6Yfr3RK6gLQ/Y2Co8G5T32dpRw+gAQFp8i3ZRZ0knpD7JlKl\njor8XjeY7NdlMrmwDDLTMlrXqVPdYnWFK6tl/5tIcVIX1+r6elzcz9FAeHeLNnV5\nBaPirmQxRAP06nRUIs/SRuW8eU2nPCkYRTbykOCYhrtPW16qbukzXPFh5YhDMrhs\n43+2eAzcKzMdzRUxJr0aDEYGuOlBhqljrRMaD+l6DlLib1aNwXmh7njMuSc4miXm\n3StidS1H4gKaKVb16ZWtoz481Z2UQla3QPepi4Js3g5BAVddNlRoCSLNZOgnSt3F\neN/1nxd7Ox/UyKppDPMHjdrmXlv6Plri6BI1aFASXqt2v0b/ajN5VsX4N8EG20US\n9g1qd6a377y7/YEaZVp9WyXKFVqDr8/SrFuh3z6o/azv4y+w0sIFcBPtkUYmBVCn\nuv/aPSSrAA7Ca6w0GJS5VQR7hxJJvjzBBMm/9YfnddHrOPeic/LOOj62YyN/WDMt\nxTCDys0/yIczRZoD1Q/MNtCrGCEWRIX38DKrAUC1FYFwiykWJAXZEIOw52jr3QFo\nSc7eiKg1tvoP4bf4zuNFqDHngwImPyNcSW6KFlDwBjz2rz6xtBaZfEWIl8Dbglww\niYNbCXjsDoDfj/rZS6g1Zw3JES0J5ZIITs4jPV0oxZVdIggeTMb35LEUuplH5nk0\nEwXcKSoDLs5e+7XuFwXJaZ0wuhAwy56jmzXQGSz74Q0rydDOWIkhKK6gyv6y8bWY\ntkyIJ0qFGuM+kVRjl9mjo4hyl0PZvJQp4XDv9BzToMtoWOlbAOt+JMnwmxnrNWnG\nXQU3hRymBBiGFnGa+6JuYRV0FxDYz30YSWItGGr3nC9no6TIkR7Xnl4tVPvkQedA\n1MrpFReVmgSDOwOrcWOXgpMqmBGnD471L+y8X9O1LgoeFvll7d/LYAcnHm4SmSM/\n11ptgLgqdSlLkVGrGGescxdNGetfe8Vn4MVojfwBZdI+dTRZ3FvlhUing5FG84c1\nm+vBaC02RxifSRALm/kthtjbRN0790WPeQnjSPNEo8MAWlMYY+TPiVkFPkHytEei\nKps1DGw/FSJ0r3xBow3d++jeW9n4ZMHS5gW1s6/ACjeQpUire7oy3aufXHcfgjJG\nK52DJrCDBf1w5LqkGubZXXjwc4TxznXquDOi1oMcAlTMXh5yRfvWxm45b1YV/pWb\nvt0ffmM+CDc7umQ7EVmtU34D8tAISu4a/Vddu2KROST7mfoxNw++Uso8cwU0Jkjr\nBFOczostmNjiDbMORPNYVU1U9E4MyWUtIhyhGmoVuQT7/h/Fh/tZ+LxKSFhuO2p2\nn2BAkZoomC4MhY6lrVfmsbmcSmrfkrr5vTIvlleY60TneJUXQ768XeGft/5aFjqR\nlL+7wMUhiPtgU9y45uQgFtm0HNNlu9l9zR86NCIDskZrbtuhfoLj+CCIyeo2bz4Y\nm1nn1kcLs46WQmS7a7XSHQ==\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Certificates/developer_id_app.p12.enc",
    "content": "U2FsdGVkX1/4QHYY+F1WXNzik0JkRjHnbPBKxSmoGF9U1obIxXuwJFkrXbbl94H2\n5QXAAk9u4jNH0lT04yUqvEWhU3e3g2C5AxVPxvh0rCVRhePshHlEozF1Nj2MTkwD\nM2L2+nAMfTkkroY1BLV4fiqmRshuAaIRa+T5ODlK+52tcia7N0ViTWLVpvL05XeI\nSCpK1TMBm/2HSCiqF2ArGLohp3dHAQg6fIdWEEMthxhK27SYHZKD3EWzmlUyT5BN\nHYYZDrXTNQ748GeKDHt/OGWwzlQHJdH2MHquGyPKmFo3C1jgmEm30eKlfd6vGmXA\nFWYNFfkosnWvNTPV4pdlpKAjDdXE4RJudX0T/eyXhS4WpRFiyjxWZrnZcev6mr7b\nkYLmFctz6Bal5qGcSG8Uqj46ajwnDU/BcJnTNa3dA5DsLHJ/UhPbe3Nw1uEXU+BT\n3ryJIIIT1BtST69Ru+eyou8NDXMyD2fTqpgFnOtqyW+OcD4oZ2XOnSOLk6RCRvAu\nPKAIci0n49monjauZA0xvfeoYXASfyNlWNrT6WFqiG67jODauoK/dcz1CHFo160i\nE/ydXtdJxiWlyBuYsw3FegTqO1blFv5mMuPbh54EaouiaeihJzcHX7e2sJ6dS8Gg\nHhzdz8NMtez4pbG0aIo05k9HzUTmbx3S+H9Z2xMfXokTKJITudtmEHowriLaY3Ys\n/b1qK+1+ZkGyodYHkaC8ydDaNk338N8ZZbP0REfaw3aEtEIdT0oFXCS2TEg9OnrD\n+79mZ5/iNcog0ctQZYLTUodPp6aTxajYnBN7IvLlXxQimp0GXta3dhQtGn/Hym9n\nkAHQvLrSzJWjEJK0D6DfuQWGeTQDmFmvXIRxLQmaYgjT/41f21T6bMMpGnC66j3x\nWIJDCzzr73xcP9LCVfhT7KzCCqGGXkA6tjA08C61/r4k57Tzz4ili2ixzWaL42t+\nR2c6y+ZR5nlooGj24T4sgIn5ZlMtAOl9OSZBp1Wg5TtEblvlt2HAvugGBiwcJvv2\npBk+guo4TyaRa6dBaEcIOVs6EEg0V6l5/6wbM70fAB/mc+WAFy6dfgvT1Q0HfcH9\nidF6n2q8XqICGMSKyzmy/dNgagBYL1tjh5gcnktPZivWNzazq48kw7WdtZcv/mzI\nrbAs7Px0fmstvedOq0PxeZsBpD3e/lSC6RkUCZ51BLediVzUXbq1mAUxzcMXvX+d\nQX34QsfaVkVK2Ve2n4u3n9czn/dyqSsuXJHZkGuvCB/CHjYqkj0yH4dbAvX7JXFT\nF35rsnKqAfpkoBV18H7MR8dYqow8LaXIVJ8d4IZDTpJj6jKZjUZfaDPPZfhNOd9Y\nIRTNp/5h9ieGi2utFkDA+f9EseGDe7P1FZtEF/OSJwPfH32ky3g0pu0k3sKCNaIw\n0rjcyn6tC65DaptwgJ9rIih9DYSvXlIieIHpIX5uljLsVQR/3Crl+emPBKaDbJ1u\nFN4naeA3BPb0X5d/10IvSjJXMUi3/TwsmI7ty3Ipbx++4Ye6/7Uo5rsV0idl5U+p\nNwfGVKIIJSqITkyU5NyeQedy39FwSw87pXaoatlbf5qN7+AHfzQQVLHm8KJ/PoIo\na1C1i2mzLbHa4d1xFfSpjy3pgD9gZ7x12tN5e5INOHLfCh2SiGJXgIkBppPxX1h7\nqiBfE6oqOK3DGdpkhFzV8TPQRw6TSDtr5dCkuBL4sDlHPbWCgq6kn1FR8ETXOIAm\nZYwqva0P40bT9KCRk4+Ze1adhtq7u2S6cN154iYZDLu3njcq/PH1G4F1/TIuvXp6\n2AqqgQnxoIUD+UYkq+Ybx0Grd3T8CV8iaGc7SqERE9iSf8ZTFOdg7dkdTKb3V/PJ\nNbgKrPgFWU/t4Z+GR0zQtc4PgbxU8kWkj9sgUDLq3as00yaRdtA7ZOJoIrYcEyVR\neem6u9cmhxdkjvXuEJZ6K9xKmakHpVmlqa9/CBhf91VqBfY1X/7f0nkG8mKEPi5L\nksq3MDNII164xU5IftPT2wo+Dbo/4cIsrO9ph9gXYj+zWnYQYyXTgKoPl85cOVJr\niOXjfvsoA5FEQ5id7AzHkw6kdzyj9e2P29x+1nkK2mcFRlUWosizKXnLT8DymSnU\nhsZJ//B/tWR8EGG03XRm2ciTzkSqL1olLdkm0KwotHlPlBZnKX4rnfedpEvVThqd\nzH4XoBGzClifUF/6zIZzSUcBM6HbwBGGrmXRv0rwsHTeW5PVNAOx+sqjgkOTufe2\nZxwtN8J3GEGw+nssJkEOZUZQqMUpd4TEvu8CaAJQ4WTpSkB2oCptg9TSiNXQvZU0\nWCr4WrW43pYRtjHZvH9P+dsdof7n3IAgH6OLvRuzIe6Xivb1rkbF2V7MJCwB74fd\ndNMpqOHWRamtx+TaLeYkJprUFtKhN547E4iHyfwvFW2B1Rk2lharlO3WVYCdTb6/\nnrmq+vpnk5i0w7gQmUZy4vwEW9H5n/V4U6k8o5+/qgETlnDvk9fQTlnDJUhZFwIS\nk5icPmmfUbeOgFqcPTg7gcFNINbZuQb72ObOkOAwq/qXqDcqXoPmLVnKzEaY2S/X\nLPOlF0lAUuNpmvqFDs+Nmex7wgAZL77m+xUxWQWZrktGq/OhscfOEffz1MncJh4j\n3pwRFfle3imKNqbb9FfpBqJpOwbBticFS4ZpwDArIRVs5rtihnkh6z4JYbuE1ygh\n8zPfMtHaWWZ4WuL26maHU5O0y2DesrkBs6CUdamoFp36gPAYth1EQNhAN2GagxpJ\na3AQjZgFAPgtjfodvbd81HbbP3+5WIaw6RoC181ghJmU08OUiFrUunjH0O+ETwLE\ndHjo3FGQ6tPdj09yaVdQcgIdSmYX3kzpFodSO5GauZefRN/o5qMi4IPBXM/RkQBc\nPq+YkI4vuz3XxbVh/HJM7xr9nk0d6JPmjb0YRLhl/w3gkYYOtmMDNAjTOjh1WZ0B\nG+rqRa9r6V41w5aTikStx2HV65tJvu+aPZjOKPhqfO3hRt7eGh9Kah4XX6mvvBZg\nd+WazWTm22MLr7yLvR4so7NSdMMQaY9yiMaotu7NbX88MscAPal8S58kEE0IUZ7I\nfAgiNFlWOPIroT/zgOa+1tVmNbC9dEBhvOmR9pSFw8ndcKQ7MRMoC/VrOAVeqTPQ\ndEf+nCITzmEVR4aIliDOmtxHLG8ybjQ4/ZEhPJXI/aNSHyziCxG7uy/3jw16j5PK\nfEShyIk5cj1zJhysdZNuL3YWt03m3imW3dOFpDzQokyyG5xAgpyDC6S4aWgqqX0T\nm7zAYR2f25H71w9cuffElSO0TVnozXq8GfbNeNrnWiYyPKYu89hZ7oQPYdMh872I\n/jJIstawb7NesVosH/fyXZVJrgxg+Xtxk26Tu3o2lmJDAcu4fH5ZKb3+Vp0wUpw1\ndOLYNh/m6ZnDZ31X0ju3JUguN/xEFjtddU36VOky7CILESeFvHGjk5nzpiymrwcZ\nA8TXqnyXPQm2NrE7u2pJTvYxu6lif8s0a++8euD63wqif9ulpio6pspA4s3ONc9d\nyIQDASbu2Lik4cQrlwxjtATwFArm9e6EPJCf0VyZXislwc6+j7M2uRrWr8g87BMH\nIRqWJQ860BLGYbCJ5tZwuxfdm9dzxGEziu8+hJiV4XXU8gFwcvTXhiEeJEMHgIRr\ntaPAEFhcyD76bRlBvfK6pUdsWcHQ4DD8JLEO4UTcSQFM0noAgkPZadyXFo1wo227\nwByiJ6TZcZVmjOgUD2p+dKAiwgzjHT65Rcq6EmVYBylZOkYPIOIei7xlqiUjRNZW\nN8t56xyw8k401Y7P/BGJuaWMHMmZht4qQthFa5i8du16b3FT83GCHAYf+I8/SWKL\n1si2g54gk3GmXA5joSm3GPy9mcQOR4fj+rF5PotJhP1Fzb3d15huy5c6hkYt/Plp\ndYxW8yZbFX0jW8FOUamd13gidAm9P5ZAMGbuJHz8QKkkOGhb9VtIuUYpfcCfPWn/\ncAQweQLBMBqLVVuLKe2+Nx+ZNYrM8ce2zaAGWk3uF+YRDQbl2pl46wiqoA4AX/13\nZnPyHLGHetgQLHhmISODSxaXVl9AkhjRQaAxRL0YmhivzP6I2bo0Yc4pufV1RcJT\nzJ8PsS7tTbtm9VZtAZgw5dMTQnHbJQU8ZAwf9U4qYWWYdwqKq3q/OfKYcvlvH0ap\nsi/twgJMJERBW9G/a1djqTF8o5oKMDX3RcVd6qxvJ6Ks3ICkdw9CWHb+ZEPVN6Lj\nEHft4bWR7ieaZsy0kk3Cqz2qfjKy5sABdfyg/y37/M8YckkDKEAjArqEOgmXl2XB\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Certificates/iOS_Development.mobileprovision.enc",
    "content": "U2FsdGVkX19cf2MW5JJE/5KsHZyCu4ZjhPpcntHNbx65ZWlReP6R/XjwT/efUlKt\ne860B2eljMtgwCbf+BCXQ21i72LSY8z8J/dd3qqcwF+n2U53zvaN3S1QggZo47yF\ndScNiAt/gzjSPQQhxDhEz22FEpqAFH5XRwmsmT76SzDPM/M0bLwA9odyAftSMbVX\nOQKe1NDSZwEhoh10mEibELte08mYE3pzPhbN0oY4KEIVV6PT8Rq9+CrLQN3MDHzg\nLOXMK6vM1589p9A2C7+6j3a7V+kPOADnp2SoeRRsCpMO4pgEMMULGQU2Ezyv07N1\nY6L9fUy++pasPaTWtoXdIzssbVyYNIhby9LFw12z+ysdFX02kywEhcr0YEjRnmUU\nKrbbiSenQsUocnqWyt7nBFxjuDCCsFpsxKMX47TFlQdjyW8z8eMe7Fzaeo96tDL7\nfe8PTC3VMYuqHMCcpllzXfJPi+nb2IvxuNJptoLGFac1SOR3/QFKgvO4uXy4xiNq\nx7DnRXCUiV8A6Kong0zkaUa1GxPTKKZ6wdWMS4UgjpNL8Z4jMptVLXwBY/XYWaYW\nHFVKKDtyHRVvFazWX7L7b6D1XoeW3y1yIXvMvpr85b+KM4gEgPWFnkhIq8tBoq6a\nYSsDnWbAiQJgKa+cCzbPDZvs7zoosfAnTGFZb3bq7CuxZaYX9OD4xBWwNmyaqPbn\nHY0+vzAJMKyJ7TdIwT3MhWjcKJ0E5Ako3dkbFj+OjkVnga+fOe+t5HbrKLdrpkuz\numSMk2hw0uO0Ah9cLcNHNStLzh04HS7Bl4q3KQm0PwNBKbtS7STrCwzBjeJDWBzg\nUXPErtuQW4BxfKlMaLGx+1CdjSbM4YuVq3YBpE5SoU6SgCHUXziS0yFQiuW207cb\n0EiJH8g045jJCXRIywuJJciVEFXnAH1Vya80ti9ehfcVGamZp48CmVFggdW9RQtn\nlQ8DBhKAi5yRqCmR7+ZfkbQIz12hRJ8KD+TysJSbl/3ijoiLb15/8BjUh+OoKhJj\nxzDnebwVPZDRntwuIF3L/jX8n5W8V3N/3k4desFTGMvjxFVZMvwcmMUVJ8memlww\nO5C+HAjyJA6vp3hu+9goMzMZks4JjgpnzXfU8TzAhO5/1pL5cl20mqfoMs0iauZ4\nw8AlbKqITRae++D/DbzJGMmx9Fj2L95ev8x90Pz8oMywQaWBfVMAMcXUrUI2oZgh\nQiDcDfrdnzsybmeYFO3S7O9qbj+tzOzEheLBj92Pt58sPeRcLMULVjnR3jSyGxaj\n6PsFKfXCGTdTD9LRGF5syjUxROLjl/qSwVfTNVgSa+iMkA3Yo5o7KDZgW/3Ln/ef\nROj0as5Nwx3JtAyVPD0hOw6PHFPOG8e3zAEEiww8t/ngbQ1hKfuTh+dMIgXOuyoH\nssjiNN36ewfQyJAxKgbcS7gSdlckhJq6AEEVGP28pMdYuG69X0zKjU6LSULiz77/\nIG4O2GvDo4jxfrbYJK4k4WgWLwSh9g8zYMcYPR/1hpxFixyaHjEOaGF97IvjJ6Dd\nKtqEaREktYCvr/dBTVkygiJYqc7PfE+8Bo9I5Mqk88KTyeVoAdBh2f+yoDlfzf4K\nCUS3UDL6hAVYaLq0e6gpBpAceg+hB1U5zjqoq8WA6DfAq0B/ME4oY2iv/hXhUQRn\nlDfPV4TiddNtkoi0So3ndGv2ykioqcAgT6exABcnVB1lS1GTL8AFRNaB1JH2TwxO\n+CW1dh228m+64AoEamHDmhT/g/BqW2OW9NExOOESvipOwTUKyjTSzTVduRyD/ci/\nVXRdI3CTYmq+5warTJUsg879YO1Ob4kUxV7q+WF8YmxpvAioNwIJ5Uf20xYfCGnx\n9PQUPjDddxjOPiJ1B/sW0+diumuKRJXsW+MMhiGFP4khRzAvV359Obs+E0I2Y/M3\nemMAvLNFN5YO8iJ4KwgxXFkrn4vYtzfi82txMJKIdLb4Lwd6rjg9od5xmifzAoD3\nvfTgrfKN6uH5bt9I8b9XbvwvsxG5UUGXEc8psY143u+eFrYRXxv9hwYpTWqz3Z+1\nofqflQs/pu5O7OgDiM0DxU/mH54NKdV+u34k19o6pGPesnHGLv47NnTPbKP/wuoC\n4Oux7Id+y4+/S/4xjbjDlV7RQ4bEiC3Zbfga5id5Xc9Xfj65s04NNhaT3zRY4x5B\nve40nW/hBYKwlsqYl4ct+IiOrAcm9bleqPpHUJsbj/z08kevdOeu9P0mq1y2CyJv\nSzKdPDsN4aVkybcdGHLu+LWkhygEDhTTd+pEGmiLok4/0cpWESu9I7YEJnG89FfP\nhfbS7uFRX9pmOZWbjzH7qzCHzc04nE+cnu4mr6CEFxGa9r23Q0cDP2WR45Qh1tm0\ntUu0uEKbuPj0ElKjcxezKKS+4HxsABwFqqIAiVH4tR41YG46Xo2l6Hvg6bgl7/NY\nXBh7vy4sSYJEImR/BelBOTQYqbx6N2dd8e9myd5z8/pB8lmPEaQVeJuKCTXQBgBo\nl2gsbPlEWFUpuFG6Pjj3mc84fKbYJD3JSdZ6l77rQWdqILFDrV3fBC8VrZBF3pK5\nIgX2Nyb5NBeuDfvTAadj2dPqedkhI7oPgHPVAwnkeeDEoiuM1C++wMNw1CyJ6JNg\nygEVcajYPB9yL4f7dWnlWHTgAp4Q/Z6yhAgjWdRSCV3s7E5xIJ0nWFhRhHZwEsZm\nNImrxo7ATzRJLOiul2BbcmZw1CdMrVsPZuroKxo+9WwX5Q++6y7c4ao6abUlxlYM\nJaenXTgdnC2gpu9t9deY0X2rrQGx1etWzmYt3tqRT52OOR2FASqk08MaRU7fGqyC\ncN1v9PzelvPsjB8TEb5UuXMTMp+2CmT1IBkuPkgveaWo+5UMn2pIPxcaccA4TkK/\nGvgEnMl1E7tjKkkZDf0q1/jNrzM5ohjDQ3jmh+Rmzbk1k52h356atYBLAqvCDT70\nRo1Mi7uJPKr9x6g8qdUOaNNBVCkXMtXPHG+Udva9g38HGnVaoYg9bl/MwZuloEIr\ng6H0gPpUcDeX/fPRido39+BSqRj9HuZNzsDknugZYkhfEnvaIvD5IvlGg/wS5Cpk\nM8CYZEWXKoGB5iLb6Y3+v0+jszGo+dZvyycVx1NwNvhuq/BgDaG9gfr8FMNvCf0N\nma4juEJtBsm7A8XJL8Vkf0+ghurgOAhCijoeaNqwBlCc3M/ujKi95TnYfqMpsvh7\ns+tEZYyz+QPt5eYLbfcKGQYEXoZ9mlBMqaGn3wEDM2QWrR3Hgvvb/jDnQPam8ldo\nmZpZO9RQPYuEdpSQHc4jIbTcaljhPdDAjq86vkYee/pooAGQ0L47L/V9Jja1HOlw\nPW9dsYvhbyHGyUGqesD5+X+RMvjB1EnUv8fCdkm1kOUfdSxrTGwIdNdqTXli0zsp\nckxVoTMx/CsD5fqKL3tI9i9qsd76Zorf3VP85nq3DSosJStf1wDt8o/crcnhjnHH\nA5Kzfdj1QvScW9B3CjiupDHmxYZiaw2n3jW46SCSElG+NyNy/fvMjXqigVWeDl8C\nTW+cWqFkRtFg/axJdcB/zglPjeJxQclVKWlntKUHK5aGkCEBKWEDAu+8yGo2H71j\nSoeOp1UDXdAXQMP1PuGNEwsFqIhDWu7VaFMfZq/QJks919T+EMl3oSFhYOILI2j7\nGSEtuBtg87AROQ0ZBXQUshUB+c8Y/IUxDQsqmV/ZaJd3UqSj//VvIwQiXNODFCHj\nVe/4JGIdlGnFbxrGj3iOU9ID2wmd7CwasweTrQDLosB0zWzR/aSJphzIW2L2eRCV\n+rP0rSys6etkd4U2weZyw6L4525s/KdeIcF5yKdh3vAP3bTK2W0QA4ARxjht0U4c\nJt87jiBTZWG7z5WynzmBu0YWZg6Wyv/5CNs1qgSoJh1w9XarfEz8QQkCQEvCXgiM\n0y1Pyogg/mTf/UE+DSPk4eLxFhODVhj2Jyfj15W00A6SlUW0NG5RxxPYXDwCacM1\nkJX/0+5jj9okmwKhOuE0yX5sInMW3bi6XqrIro+qsak0ILa9pUPR+O9IvkIoa56j\nYx05qZin4qKwJD+25nFPq8yFyh0NkG0mlmcEgdzo5alDyV7fpZ4osKaDQdQGPbo0\neeNEU2fMjyd6+NLdeFAltwvRRtxVG9WruWIG3izWsSusK/FkpIgAc/sK7SBZzUSy\nbuLTBfYVb68rmxR8NzeVgsqLrQdwcCsBK7ONrHD/e8RkGzVNchbEnAvZHIpzIdl8\nabzag8hdjuc4S78+oJUnJlzaYsOnzuUuPso0H+jDL83iklX0EVBuj4rqmhh2NOkJ\nsTZr5XernTOu56UyJwI9ei0KXeWzRQg+zX16W93bxBqsw2aBI/HaEre5xUX3Ll25\nxUHX9OgM9c6M9CULvDKP9UB7qqwmKks6aHs/ZYfS4gRCsRSHUPZTV3yKiz0eX0IS\nmFiCbNmobcEsUj6z61MWdhmdcWV8lubikCqvzfUuZrviBR7v9zP8x9JtB44nBfMD\nc4wXCGqic7q5dBK13ecDxOOW2ZbqWWu/H3LaARvkxRxTdboBD5SfRBzG4etBNi1m\nz3QTc0MEwNyhtb/FCpew7T+DeA254OksUW7IEKuyPSYmjopErX9vH5bOY9wHZYQq\nZvfl7LUHAX79L0+lNxm4DQnuT1Yfec43BLxeIEOZEpS5EFpMVDO0ZpliKo7IyLJA\nApX6uQN1bGVpPsJWx3syqGVDfRD5rmca/KxwW92nol3ZSuZwdRs6bahWKToO3Mst\ns6l3YV7TsLjMtMjnbOZvipkKf1xVO7nwypVxzo2tnIXmTOTT7VbQthBqYl3Hdmoc\nLmPid1SbemezWRG1nTwa/Ynf3HCnLc0+dC4uWF+PWjeK0D/iGM3O/RsEhpzlg9q/\nfDP0sEJOakiEo4mAwsprWYP9ix/0moDISiCRdsKHGhneRJyOCpP4kfzuKpSuuLdn\nHQ9uoAUPUXdPmZr6NQWI26wuc5BipZeqb80u6OloLI+2gObqR/44DqAceO9VpNfg\n9WdS9hah6zS2ptwneuLHkPjmneXQtEDPvJon3+XRe5hcfXNq+lm9hWsYizPoQdpa\nvnm4c/7ycHKIlHHk65SpSgPESa3J5yLmeYKAcq+puoe6D5/a+nyYKznEN0pWlPAI\nah7ellNG97EnwYH/xN9s7Xa83yX9+Ncmag7RFS/paMhyPQRaVJqBERtsbW77nT18\nT10HA49GNFIhSgG+1UOmRlF4pp9Ty1ALKGmmH1Qq9BB7N9MNTdfL6ewkxImMbcCi\nunZvD2H8NRAqj1lNqIrATjK9HHPcX8seKV329+iatEr/TikjAdKvlk8+ie+8j4dC\n+candvPt46kskEPlq8lO/5LkkTDlWvbEFyZna8k3n8pWC7s3EW/hSlZrej5JzH5d\nqjBrIRYdmusHe4MbFBgGkTQV8BMNO3Moz4xJdx8jUamKbshlhU88c8BsJTteBeZy\n0G4Ik0DKQJAood3sRlEchOlDK6vKu+OSpw1j3uytEee+sCAj6npoEuGlWAA9AHWo\nzt1dG+lhh1RmFiq0pPCiAeV7gM8g02nEzstxlCSp3SKuJFo5ucpykPA7MaD1ttA9\nhe5h0PAURjjZbtWadsjfuXhjLZF4FnRwCIlAXpuiLXTpNaA3eFeGXasPewwxKdtN\nXlvL28tzDYFzflj3qW+9q1Cw/K8Bovs4YBGhTOzqeoHmCRopgQ2yVrGof3cU/lX7\nFomnnYfLGDO5jU9Y3Lic8dnDkm7TwDeAyN+Oy1q4A6eTvT2FDqG0LM3kYKcVCHOU\n7Vi+BMbA0uEN6oT4G+Ct8A0g2E+mNygzEt5L3/nVULc1FxFJwwfsaSdFxTu1Nx9n\njqbeQLZTwKlMDQNXf5XAfHWiHH+e4bCDTgRDeJvEwSsUBLsKVf7mZ9d6RqcHJZrY\nsrn1Hl0JE0ylvRhXOjizMFv4cZGHhuvi9I9QbxBrKXhojEC6dYk44jgRfMhvMiLY\nuLWNc5RQisEyRx2XJ4C6wbURDL/5HBOcvSZdg61zJEkiExsWXcWQkftZuqQqOaDr\nn2t34zcor52m3AJ671Y6l29iWX5ztqP09M3gBbutZHZsp4V1ShdrOeCvlB11ALe3\n/Uz8Z1LDchaFDhNmZkyf97ro6HPjrmtV9nbZJ3q1AG8/b53F2SwcrWuEe/dvCibd\n2BcmME+vPv0SFJsfHYqBkZYAoYLiQcKjhfYdUV0k1Px/bz94EyPLPqNfJ0FDEDVa\n2wXiS9JLaW2Z7pVJYU2uzkHzezXHNTqgqHxYWbpIHtcrf236ps2RijL5et5gspxl\niWGuU1AJZoM/pWuPIh+dFcLusDOou8HOYiVp6NaRu4s1X+nQXwAgSITJQCE2Sva0\ntUe5MDdcaye33Ok9OloMabYRnhAjbjTbgjX2bjBgw7nHqTp45Jog6+tLi7655G4Q\nHaWSpEJP0TIRMqKVARXRRgK0vfR8UTeuAi4AuDWJN+urxKsENd7bCO4hSLiC9csw\n8LO6sOspYmkuljvgfu4ZrJ+H28F+SAPmXF3phbnZ9GRGRJxcxxdyaAOZok9tC1mM\ngd2ZmqJkaDfT4le0wZG0RgwQie330H0tcje3ryz1foZWrqKOGdPzlZrObCjur6HO\nTtFsyVZZseJXUbIcrE1UXgQWmtEgf+UOLPCyKvP6qPA+QPOnaebdwod8L0hhLswA\n2A45t5usBzCwV4s5qOsK/4FtxArG1NjN/6ZXcKQoqAVwAjO4VxoIZ+vaXf6VYKxh\nQNNZPhbQMW2ecwigA3qB7V1yBspp6vO4IFoZJLyZKZYOkdto1dswllZZ/28R1fvy\nSFTGzAxRoaj9BG2yWv9s/TGf8fDCMiSGcISUGSiG0+bKZiwcax3oZSBlCPTq0YVa\naToYC7c/FhCSTKfWDDDoL1mqTssgAPufyM4SgarzPVj4iRetcPXsZPoMmlmOsRfL\nJJS7mXFhc8biEgjpfpG63ajNAhpu/x8jog85BSSDtzFUjSZ8kanIy0vWjQQFEPiG\nYSyF5VI6mjQCFkfY2HWl0tPDHdclGU0ngNyBeBihcvPnIhHkKeskL6LF3H4yxtL7\n/T1pIUjWrUjHubP9pkIpZgj8sSSz77c9YnfaGovPMnQBgmUg2x6BXl+MM21y/MUG\nIBjzAHOsvtfL4pHitBLU4uLXfdpOV1hgK+Tn0SgoqJgU37pDMtWaBX51GhadFCcz\nM95dW4XtzzRPo643c2f3Cb0Iecj5/LccF6ElO19b4YiCCUjS4REF18Bb5sqxttcZ\nOVx9wCTVjFIBgvu0elvUXepbZx8YXLoWIT5zzhvBGxP4LI6azFuX+EMJYkDboZ/Y\n0NC3FTd3DySV8bjKCxlp2khD9dNy1OnIAEL5iixtN3k6br2cDLPX4wjSTdv7rX9q\nEheYcRcUVvxhTZV50JEhj2g+FFzNi219oc3KkHkcDV/Wp+jrou1UEClq27khHzj8\nVfQSuOs7t4c7te4PefxkM8mhiXev4m4uYF0vQoehZEsN3IZNOTuGV0lv3T4AJW+V\nHbrC2YLodnhmRse/WtiTNk3XPhbDC8K5G4XWrVufDYtvtzDqxnmLBhZ76+6v9tgx\n6PjS9MBSaa+bc1ALzjS7V8CPfssnNAg7rW2/iALHfSHiQxw7kUnEYCaIIeDE0HLr\nbO5a6xRny/gRJlehJdEtAcnwG3+30g40bj17yqjYMTboCAdi8B+GK3no7CglO7bh\nhsQByBOaMfkgE/IWnft6l/qH3nBV7WRK28JLLZkBfH6nIsMopONlfTK5VSgs2cUW\nxAEBIlv97QV50A1GPWebFbR0ep6rXF7yHesmCGuRKQdXO8wQgfnFu9x6esgNtyoG\nwoAsZJBs/EPLyMhqjBxEHgrsYBcFriANk/7VqPFjuZU3wCrnyIWqifME5hUbr5OT\nl8iDEHxfpCqD56sI6i6almTfMiQGGUCza+fJ4EObncS/SRwiaEgA6sYmsVDzjc5y\n7X+AS0PztmCGIoiqV7nZaYXWE2WnMnpuLkB6JsfwXENTRCLMYRyXGKj/aMX4v01q\n92R9dRN3T+hl7/LLDJw/sNO5DcqdJhK0oKZY+KpUcuwra+syGnilAS17s8fiNup7\n7xH+m1/B3empaVF91oDUJCNVhkgRmj9Jkm0nt6TrrYBjApDp3Eow5nxQx+rYoaS5\nmfTiNTIW023yDaiWHUOS6+g90kTla0dmRmfrQf8/YAQxZ3gunMOV0StWbahvI8Lb\nAoA6wOFxOX+OXfq1hZ4DgMKWyG+IC4EPaXTe7Sm9wYJ0IiqNynoim1uwLsBx5Yny\nVKEBnH4rgvyLTZLDVFF620XLCgt/lwGrlXx5QOLQC2baQWQwqKnsy9WR6Oot+Gx5\nP2yr49Regl+mxFcY9nelaZEtz5jCQh+hI/MehqyCV28Z0TdSooleLmDO72R/9c4/\noKgS54Zf+hfgpa+GI7ll9Jy0GqI6A5c7mWmD/fazKyHkboMeNw3Gvg7N4VPFEJHS\nyCQn5sYy0wm4pTgtAq5mXpXEOgdqYILO/c+tObP7xjNYwJ1j8RktXOdClQbz/taL\nulP58NVfrE6Yz+B3st7N3qIxu+oucGb+TciFsUVmdy8KFgxpCYnScaXsjoExel95\nNG3TV67m8YuqO2slLAaOVPBsPLQzad0xWVri4d1XD8hnSKS/A9qBEamQ8o9VXXNT\n2wY7ZTYo/mF5SuEYbVUoAQamic3k0t5Ycw9iUiM2gcezXQ98U0wiH5cqFMse1EQc\nDjvfB2g+ZweWtn12z44vi9AxJ7u6qCFA5Wyb5SUz5KKAjbozWO74bH+VkLDwiFHY\nlckMWZIcMOGo4skaQmnafNsYF3wWos/Z/FFNpprfgr1iJKoD5orPoM/q8Yat7tRK\nIlbPHC6Z3/Y87RL+m5kNoytnNxJe5GLZU9arWwOGL9/PXDQfr0Ka+6rEmzKAXQG1\nBk6IsGDCpDgGF/JCA6rHUv5+OxWJFDg+c6j3x4XPU7Tn6w7aklDIdGC3DWdpXrBZ\nH6I0jFHJQYp/d3+lekauMPHqZvEj2oMkcEH8m2ItD5E5uG3vtVguzOIFvkjxgxRw\n/qKlWZRvs5nwbImg/1ahHdZ09JsFk0kHVYTEQbpooS4sOLT/M4peD/Hm8rfjncVf\nFtAhVqOonYTT9fMPqPJzQIS/Fd7jgjpt43qpE64ZTLjop3xEnzCnz827LGoXPigl\nY9bZOz/vkrMsxdNNnBfmoAv43Goja3ZkFCym38fxSIcj88fZGwijD4OXhGkCPM6J\n8RqXgx9ahz/RKBM77L9psRl2usHwkdKJkl6Yiia7JOU19w8/de8D4U+ruLkYuApG\nasw6ATMUTLtJFjpvCaRv/Pk8APteT0GvB0Zbj3MH+njAHMVDSqeS6I4usSfWyTqN\nISGeNq5cchJCZHx5AMGGWHro4lXqShdxN4qL0pQyOHgsY4eW7NSmLrzhNkEPglAA\n5Jkwn8LGluB37t5p6mtM2mbf2NCW2jwK025xt86PCzh+dtvu1QBk9q8Cg2k3Dl1E\nZFU1gjGchkMfa3kRF1OLPzfqEvVYB1NyebPqqJAkuTYFI5sQ4ohOPtWMR/j9ECtp\nsKk9MCdYXBnb+vKI7CCvNyzNl6Irsli8niHkdBg+GHT+6fpss0xLpuDx0OrhHHo4\nBonBzhGvQD1HL62BsukfIaa2mLsWMclnu3InTMNKFthii8T1fPrWn3YQ0ASDfmMX\ndC32VP37jSrDTuJqdTGrXfugNjeTadZExr0rR9/10aWw8DPb0wT/WRbepBS8QpI1\n+qQHg9vsEL5JrIuvy8p64N7CY636C3N8cqCO1ETtw8qihrWcpZJqD5Tx1X0972PQ\nCevzCOip6bEUgxDgJIoatzE9+YJm30u0TkTnDeb/O/fpkBGBWRo5MwGBCkB06CxN\n/wA05CmCnWpLEVXy5ORfg3JwNopwGBY0VNnopnr0UZ91bDiQ8aERBR1XJ7BPxDRV\n34dQMMiqdCEiG0RMK+DB7QsIXhfMqGKS8fUhkAd/oCT30rZAKsMzgNS9xLH4DCyc\nqm1RV55hY32q3JOcxwcTOwhv1olFqeFY0UtkQVf3V1A8RdQc/iRPfe833HhnzG4x\n6AAcl+qq9Y3649DUmGcl1WsTktiLcCfA0ho8JK2b2lG6QxyRkJAMmqBG3aK/7UOY\nPTjWFBnmXeAm7/4MDNpEVboh8cc2KocquLfSp1usTPTzSvK1QDCtHyoH15faF+X3\n3ZCsK27iL7VqqhlN+S1gdN6KuDydZpn9lNLd3O00OuIY9dy8SQcMXDYIyeFTRQ5R\npky3lRoNYff/YcM2Ma54eGj9BtR4kNkMEFUQm+DAhoZ/VUNNEXqRr9mlj447PCx5\njop+kijw4w22TJHxoXR8hDsDSb88KU5oLi5ijn0F7PqNnDeOw6QrBRNJBMFHCabY\nY1plEysVRJ1sU2yRaf7TZZv9z+npo53Gxp3IPBw+sf3Rj4Hwi5gcXgjyHjXlon32\nplrJ8ceSEziQqqcqo6bk76CCOWdObJxlpoiKQaYjndBofcEr5COrThKp5wmB6pr6\nDVSiwHnNUEdKrHBs6ERPK3H3Zb2JimI4VS/aWIUTcEgiB4jTzD8uTk9WBpqeAtX6\nTtUdqAmy+KCkLzYQv3i+LEbMpdc8QJzsn2Nwcccje3k5xASMxAK4Q6c2vXRGlMFb\njz9XOK6SfGWzEnir++QIEY+NjyWiZ2aP46bWgLxOpLxjldc1CcKjCxE+EJvCrxDG\ngCSrtq8zr6OIxrjY6Q09XGd0m2veSWzWAthJ90af5xxNrJuL5bHLMwg2B+UF1voT\nyAc+Q9NZyO0Q8AZW7RtuaqHwWyNrosUBW9pQRjxXl/4g25jn5qpxJnABaBLEfWLV\nwfiw2TgLojb5hb9y8ShBGRgBu0gXUOAyWXSDtvF9UmYnVomdNbENMf/HLhm2TjXr\n+9HtdS10g1mYsRE2LSMyjyzeGyGiOa+cJttIqbQpEsLD+JSPfT7TGNXT3WWhQNOS\niy3jewZ7ssUj9dTVSW3TEUmnz8BUfzCS/PaPlIOplZAMgLOw/eq2PJRleqbi6hFA\nXh/gCEop0k8ICWk4kQBdKFeaWiBkngWTAAxsTCfJRgnr2PskKIJETtWHwpLfYMgr\nNJa459/Zhz5h/iByIRm2PSI1fjMFw5cDiAZrzuGMebbdTnxzslwg5QCQAtQv6iab\nLzkXi960fJd7+G9gVlLyCacPDZ0/u+7zjS872peYye2FfOcpvHL7ulb8QtIsPMb2\nifyk/4picUNB0gV2K//1C0vRuzNjhzPNMrT41smdwXSMNQejR93R+YExwKB8tMzm\naMNJwor6nk9WPMswXaDC9mXVbPNe1ebMYKHQVEGWZWj3qgjMjUZHi4DpHY6ypZ/2\nuTzesmWaHp5pJon0OgfctkMmfm4pCTDYlcpu6IZ4ouA14guc+Z89wdX1CYASwjNF\nWWqPMQRpX5e/BnKSn1FI0TSDcY8bRtEvegBFRsmWMzrRj/hOpGYiT5R3dP1LfAws\nxPp3vy6WVoP1ql7VosUsGqRBkgJpoPSxISr2uIedzQquUGTQ5QvTS1UMGnJBzWa2\nLv6o6YZTN3gVCny5HJpw3kV60i18homYG9s9zJQgOJEkpxgn3/y6HgLIMYqt2BBE\nXcio+gQWsBuzxYz7pgQB2uGk2NWmk/FDL6neQRNCbopIzbIU4ersyWyjALt70drK\nj0PzCpnUT+TbvHONNaQeeytOxsmuFpHh4uaYNQP857StVCVgp0+AXxReJu1cSOq/\nGgkEkG0ztz7Lq7+2a89zCPu3Ih+UijBzn+XoDuzepIpwWWKJcTcgXThDJ8Xan9jw\nZLUI5NbihlNcdZOPF4Ree2QwD77BGnFqzXNpnuzjjoj7eyDCM6Zd/sfjk96YP5wP\nBZrB+jJJi47r1owiWXgGD3goNTDu0ZvXf6vuc2QyeyPHHJaA9T/7RAcgDw+mpiie\nxiCuLISm46AKeSy81+yv+v/F7KjPdToZLk4TgX0yVVejQBvks5sdtBGAB53DjQU0\n8HBbCskXIsN/ul1GtLHW8o6ztx1OmWjoAkdxyBHotvLpgYnqrNrdaD09djNg+ts/\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Certificates/ios_developer.p12.enc",
    "content": "U2FsdGVkX1/A9JqBXQY1nHIgQ22pp/7/eETLbgBOMJgqmSZP79CPn1brO+WrYJe4\n4UcW1ZYnJYyIz+tINiie2XGQqLExiFh9cgI/aJRvKt4Aq0B7VZ/wk1bVdvmbjojX\nU6zradMwdAhTPEzDz1lRhAcvIJgTLxDTCiJWxPakAEuDSbjUHhAqANmCKoPtOLlE\nzP04L6orkUn3ZFUvanr1UcTy47FOYCrOqFSkHr11RNN+akIN8pZrH6FJNRQYYMc+\nSNyswtwMT/m0GBPk7vN5qzuqhtrW8hpxFlAf/OWZK2zD88myR36K7eonZHddgTe8\nJHxPTbhx09P8FdqB5ZRnhAIeidSBvVosfs58G7Mdm1XVP71HTy43qC0IBaGbLJkN\nh2ngsZDHVLapX3Si0faHDxaM0OVHs7sD2r/eiB1mzXmV07WiT8AVPgskZkMgW0eI\nR+t0JnDkicR26IGQSJ5+rDwcwUIoSNZVB7EqcYOOT0HpDhUbEDM6C0iTGLEA237g\nECc71XVkIf7dxudnn8k0eDGw2+OHv+opi54MSks1KImo4HiWCeHT46RVyNemVCwT\n1iijESZv1PmKAbg8yLwQDLXKDIJyIHIuILiAsCsG1yNkCb6lE4wGKVSMpxMhE1hL\neW9dTLcl1tr/9JAIJFP1MYSZVy6JIBbz9IKGRO4ZmTimRCR8cyGSQNa0btg7hzkY\nC+4fFeUA/ZkkTeufIy/v7V9u6vsMuWU4hsdQTXzgrnougxLOVGQpbmf58nV/YHhl\n6JZ4n1EQnLFxFP/a1kEBfA6keG2dRjTSvm/HIemFI57KozuQonE7T4RXNY2vvjyh\nHrEjR7pI1JJe5SXRwPqCKuF/ZyqamQ70XfmiLNmNAS4GgeWYG2mCQcj7/lcJ5bUK\ntjMSC85vCGbTl0Bt7NGl6yDXzciRUeOX4q86SGTlrWmgk5y4+Z2DjDgscGblJYU4\n9QoDSNiqVvrF1NnSc9VwHCjytfXaB9+76yDCgkSBRbUhbykHZIzbOfNQ6R7EQlKP\nRZOr7Z5BqMqw//yF/wBEv1PMa0fhCvvyzrLmKGzfqljswNZtoLpHHjFvCVjSPdQD\nHcmWWPxDA6nfpP3c01pEZdAQYKE3tfpgqXjymS08x2MXwRLL5MCZerXGEOgtjB8G\nui31XiapDlEa6YCjVpO8567sEzBrsBeIadQGDA/LOE9xHrm4dHsL3TERclLp75nS\n8Tc7WY+rmePN8hXCODEsf5CV0z5VQJdX7hYhrAilEkjU0vwObdvObVgWz+Ti5Gvm\nT9LU7pLc0TkaqI+lcwMQ3VG8Dp3BZSxxHyihy53Ug6JS/gofkRgHxG3rB13z/nby\navswN81lLXvoAGTb0iVuLkVaKgxamNujLUVbXV+IhiyhqpqOXI2X9HYIMwi4Gjvp\nQ2Z/djJFoxXOiqSGVpngKa65eDATJ9OpurKrBcJ+s35KdXiiIzEbH8C5Z4Cdx1KB\nmpzJW/6KzZzNLe+h9NE82j2CNPFqT24Nq1k2tPXPtq1UX0E1RKFI9txxj6FREkg4\nLtIvflqiBt7mX5eROpHqqrvKDr87/P84rGoDaV1SZMYKRqCeq8FOtTnS9hIKqxJ9\nzkchIlCaM8S1Hkc1J+F/6ZXHet7rUE7fnO1FjXdEUWyUbsJPpVl6rTHkZaOtvfiD\nkXvkm7PoWX7NeLGDLFHa1Si6GPsYR2ww48jnKHpRuRp6llbcQ7TJz0ZSr2MdY5kv\nTxQm5XeONaBvn5cNBFHQ275K50/jO1M+IC6LL7IUBjvbdoBlLdBd09YQT5CDg3Qr\nkIQxqFFQDmDslDnl7OlwimM+A10PN2z0tBtNZud1n/ZbbL5H5eoZSkrRgrMDvzVV\nJAuJ6diyegT75ZKCi+vR37kpb0hx1gP3EkDyuuja+BaMBhSz7GqOmWsHuetSeVE/\nGPzrI8dKN+xrUerPniAiqmzbn7YfCiog+PMVgdacy02RdIYUL7jB6qQAvJhAB85b\nsfWPhgL2O1UiuS4WxtTtaStgsoai6jApBElkoCMDQJLIHaARMHjhpih2nffqGrm5\ndsu7RliE++6YFw3c6+saUaRuT65+FqL8S/NNxd3Mqq09UY8FhotVaTY1IcTCGx6y\nm25gJVSRssfus4YA6ySphabzwrUsfz12PoMvYEZvYSapHuhk3YlMZaXHS/QMfFy3\n7qiZ7+yWH+4+jicY9GsCuqm6jFUpEKK3B8ljlNqQCGltPt8FEWf6iv4XCuPc9EOS\nwQHWuRntuH2k8b9ikslk2rkBN4TG6SOcgVqGaz6cInKyPiWocrAzUnUBLeH4j+iz\nEOiFdz6xCqyQu0qK1NgeuBfw604dJtRMJSlv7RuPuJXLqcDzJG27YY7O1IUpM020\nP+gGG+49Tcm0Xjcg193E5A7BxMMo963WUjfnk9QetS61+7/QYOyxrOYv+D/WxC/Z\n0ej/diD836XsaZ5rczSL3kVMYcoiypeteBS9mFJQmLydJVKtPfZDYfoJDX7QvZ6o\nCArXjdZ/yM8SZ1g7AfqGyiCoSM+qqo2b1Kqnw6pnveL8lxHjLuUlOifqUUslw2ON\n30XmRo7wbAos1cKKQRcHaxiwx/PrVvuL1wQ2bJ5Jcp/RN1lJeMiV9VmzcloIJINN\n8n3K9gNlIK85wR/XyXpkRD+xfqJwyTKEadQ0IN0iFG1WwybVj2ydXJehgKCJymjI\nbZQy/8/DNgXIIXhOZpgDwdwe1rXI9VIRBXutwICcCxC/dwIModHF9TDr0h2UpoAH\nNA0wiTgCJsGNQdg0wQHGMhC07qvG59gDZ/QL5DZ/IZr1GChku51OkX/I+hLLeiIk\nqXlcbGfAF+tKVaJrCr1L4cvMfD/tfOKjkDJq+7BW7+gNM2LuNdRyY/J/8bLU8y99\n/lEcY4uTg1ZIfJEyT3c4gG5OSrqKEYtOxAMmYEsv6FYsmDCfVfu0HvCXXb3rrNSR\n9yKDs9jdQe/8IuEOq4X8jrR/4gSxE4VctCF+6WPg8UuM+ncveE3+bgG6Dw4H8/yK\n9p5YUB3kAHHbV6+68qPnDiS9oEYowiWfYZEUvc4vZzif/BXHbmJ0zs9U20O8UfBs\nZhevvTIUQyZC/gAs6nD5TnPfZATtmV1FPFHabi5UVMhmbyvCKZu4MC2ybYDj651/\nyrAqXehphsqD0aBSijqtEhLPtvF4BDC5HxU4y2fWIR3Waum/ZHy5biRWsoei5Qr9\n1uqX/zAoFGXC8UswmOE9hy1LhtIBz9vI7R7QgzZEKm+D1MHrcQMnFRo56LZsBOLA\n5hGzX3nU3hWjKWyEt/G+ISpSIxx5LnWE2HkEqNAhbo8ag+yonLhE5JT5EczLBuRd\nOZyxUriETWmSSxU36ymxwnt2L1Wo5n5XiaKUsBV6JCdt2KS9n3AQFjFX7Qutctop\nSiLdk9aniXGVQxmpt7gtxEgXyab//DVfgvk/4cVl89hlrYVxSj2Eaw3glcidnsmP\nrJUtUqMMAEu+Z6OfH98kMZQEmCsDvTWEKu6bu+U3UNGqsR/Ckxv6LyCUypDFXa+u\ng9s3r3pTQDHjRqUnHWJbEyzjOuHs9s1jH+kOGHbkz3o23ivc89dvkSUJHjiYzE8I\ng38NRfs6VfLqPtDGRm68WUsRd0w9dssS3iuIztNAV3zNnRN6EGEL//imrvwMC4Hj\nZyXgHLdEmlbkLknAQfb1dhXj1kdH0BOhu+OJ9RZdkq4YEmQw94Ga5gcJUT/B0JM0\n3+E05Y+FPDzTOikFVaR0AQP1ZvdVVoqLcfzAlYmJzw3tWq81HExdoyxwZuANPyyE\nJbILwU9sETfdm/OoL5w7DL11fS8OogLw4Nrr3sEIEuT+IjMd+nnSqDOTzPoInOjM\nFmuNVHoaT71rmHzFbJu+Ej6d2NdmO4SEehu+0J4pVNYRBrsY8DtSfeJ+webyiipF\n7DnVcCtne/OubjkucB1lwwQN3j5EWaGJuK7+/5nOeo98tj9NWMXkjapQJp3RDlXl\nx2q2+6O8uYBAAVgiBUwOBg77ID48Q9W8cml7FViv+RPXiPoEbkqFHIO0I4h4cfdV\noGUzQysWJIpXt4B+0bKDDgxaiqHI5rBVJOXEYzTFhZ1Ipa90vpgf6RESLsPGvoUJ\n1fytDK1ClE67cw0ft3fZrNPvYsFrbNy6pT6j5o76TxKPBsCmll+M4bnizXyv26Ac\nDz0gUN8ynXcUT/22CepTreJmvdOyps/EucbKYtMpPp9EMBZqLGd0OfDkuFIywHRF\nSUg5bE0UllyICI8/17MdCKDda5dzXdi3OeEwKQrdQUxp1Kzsbd7wBDqecVU60v2S\nkXZIucNjwiWu8CGSOOdmBQMQlTJZ/uk6UpqI+npSrckHWgSGjdJcOrtaLiBKeasR\nD6Td0LohKPzlI/bDhUD9YvaCaqEpTb+FQo9OapdH46eB8olJiZpoc38vyGLFuDnv\nAHC32vTV5r3ZB0lmgahT82mfoL6M9kOIHjgZKZxX56fjZCh0S7ahPsSBMUC5YtAn\nrKaIbSPYlBEg7sbGvxcWPnRAgKfUww2kWXXH/UbtGRguL51T0EaBSDzyB1M/qYpg\n4sqI8Cbr8RiTH7RrV0Fp56P7UzrsiVs115IdpGcZaaciu1IwKMx6w6E1sbZaKytc\niVCzVUl0UGUYmC5atrMBEf68Z74BFBDyl73fru5WafGxTXMBL10YMvDPbyDmjaKG\n2logR0ZbUtKztJuA00SJ7EaYn25RaiHzTTqT2CPGf7w1wobbxrEb0MDKSj+0srRq\nnPsdhLpbn2YF2lDqwNEfUsQY33B/FAoOaBaRMFXtIOWEEFp1Nw/EIW6/WK2vJJXV\nHoN/WrNNCCwWGxcJnzwwZjVaXUF6G/fo/TV7Q3VzVj9QE5s2DG3gUuGC1JROTqUw\nvgjf/owUNuxfOXXbO8GpFkyfG9qWuDSY9HcDOVvakUlP9BfSHWO6QsvomrQyZx8Q\nSVx4a92SCC4mNK3s2kzvN1bd2CJFguk7YaXFaivyqgpjMLHMBueRV0hA5YYrgoAu\nS5LaQ0htOjaCgQqD35cOr7GigerBJFc6yQ5FAmPg2VDleld1iLOr1D7bDwlN5cdK\nEIz3YM0bi8qYjkKqqDzy8MDb+7i18OKM21o+Mh7kxNl7tU+ULz8pCK4glD3AzGJv\nFJqiwVN0tmFHAXazOJwDYxyM5LHlSLcrWyyG7aE7281cZHHMfJe5bUwMNZd0bDtP\nBdNY/xv6g8QW2nJt7ER3pR04P1xDy0leC86ZQ9tUQPaU//Sf9PdYHniAVvNiTS8H\n5ol+FchTmfsfbnz5ck16jOVfIc8U+KOUShmCmgQ2oXPeVBRX0+mH39h9PSqDC+ny\nUaOj9gntyBWpEncmANw2jheuc0J+Z+vBHRJsENtWRZ/vVufoGIuJrpSWMHyPtZke\npxLmVl/hiI4douKJdHfg1SUQF5l9+o2wXs3RjQm5Aq+r5W58tINn6FortqKV1yHq\n44Z+42Vd1uUkJLUY+TufNmrp3xl9aT1rx3zKD75zoxOcRw4OQvYGoaoobyg4M5K5\nKN5j0vXyNp4KSGX+33L9macArpgWfM1S6A2iqenUoZjzSpm+7mwVM+9ABua19NRe\n1x/LTZDyC8M3aCDfi73Et0mHL7onFr+uAIdWk8bsAuPh6OcfXxDO1iBgHHyNu+XW\nOUnXn60MCxUvpjaOy7YiqJu+/RY1AyfAc0thqe9zrexJC/SIgAM7AjKnMkw0qASI\nbiQllknlrpnIJ3HFgDuNcKZqtGbseLfXRFoSganE2dN4tE+olpFH4OlAC61IMleb\nN4rznupMQHOPpX3+BQ56R3yVPZpIG4LJZLn4fw3+6b/LhKbU7hhf3CQnwbK4LDjR\np2G23H0KAP6jDUMZoi3+zF08q5HAdfyxhz2KgK/yUqf8yXAA+3e6fPbo6pzM+9gR\n3u/CZzBajx12Okn12/8cIVWy7j9zglsj11XmNgfffRXbF7iQHxKqYdDwk3Qlljaa\nTXeg4R+ricLE5EcSugD9g/Bhs6m86hnPvzm/YH4SXf5cmaMDbyLe3ra/KmU+Mtbo\nBSF1FGQ3GQUaSsm6VMx8tq4ODW/v6phhEt/kKeYvIPm3NbZcF1LwPEwd9B8PqZIn\njoOHunjFkv+AVWo0GOJYY7xXmHuot/GA7WirqgyM6rnsJR0p5R/1xlBaTpAbh9Tl\nBFTNnh/NdF62G76AUHI1DLJjcj036tfq4LQmLjw2/YMOsBWBOYrQP/UljwqXzONV\nvzjKe1/ks77bFKfGLzerVu0TofmGtzJUn7uD7MCtmSTUaqu9Mx98WDIT7I1nHeZb\n/CyPNZt40VN1ZPs7hDzjapHqJrmAPFcVi2NgSTRlwH+8XN4fiyXYwigvilsZtIcv\nT93QTNKwJU0Dk2I6fhakcC/pgqkio3nVBDjZrw3UgTETUrJFx9hMUDUPVY3VhW7l\nbDWoAaUZeRruJgtN+CfUewma1t41q9Bi1hLHn0XUhPM7Tyjhkoy3nqpODKvMVZwf\n5+qK9IzpjqzhWkqdwql3BykAzPtJUpQ3NoizESH8i7vj6PIfSHV748YvP3GgqnD/\n9Z6OMShRhD5wtwsFGC5NoQrsfNyLdJTIcDm2+hecJ6Ddpnw/GZp4P5f1DYCpmqDd\nhGFKxPU7bhMjmvdyB8qtamirnPtEbcU0LhSmFRLUY71f6YQanSWLlYGt8qZ3Q1KQ\n6GGURZANCp7quttPTZcCDs9AWRHtBjehHvCk4mLIosMzGVPCW1ofVuupMsOENEW7\niujRbRuGX8rzkvVkTDkLWBcZmtclHu7iwp49RUHocdKvRCj6DhkNmtr+9GXEGD4T\nuX2ErO4tw1e041Z5cZS1z5qDpvH957JkO/sFv1d+EyksiSDhpbBNHuAOJUsQYQ02\nBrFDLGIilDCOZ1QtaVOjj6SRqQPF9puy3rF6MTPiaFRGQyrBIYdIub44vI2t+I5F\nbGWt4vl6O4NoT9RaI2Ol0hHIPhn+FaEtrsrRc6Fy2XBSw5jhSr7aLvKBly6nOsQ1\npfUTQyNtEoywpJCBFdmlGfmvq7FE3PpX/6fdyewhLn2VChjR2PGUbEeIhM1pXeyV\nrqN1M1GsrQqaIAla8A8RGn5qQayTLwSCkvocEIm8YnRsE0lN0jG78sNhNfx2VbSv\npWQcpI0h3g6ZfjkWfesZpO5n1bDvtYpG8QmERKoX/r1AypjjXevoPILDvAuk7vra\nvW4VAJ696XepghDYVewE+gs+qBlwOT4b++mkaH5+RS5mGhTDZQwxBEvVyG/sVpS6\n+d4uCD8C+3tNIpuvpXcbpr1zV6lZj3wCixCQSHnMZJlcVJETnrNkuFfJ5LMIppL9\nQ5181YFXDN0rEIm3WqmP3IJeJhF9Dj7M0rHhlIJk6PvTi5bs72C0tRLCIiQqOcfi\nq/ojo6s/3g0rCBRm+/Fz8AxB6wbqxI6x+0Rw703WwTXU/vshqNl3iJljzhno1PWf\n2E1z78vYSt5rmAZ+5QAnFzerb/XziYHiQdUfPMY66TpyLIrziZGoW1QEENHT8RwV\nlrBdLbPkXcMRFcE6f1jedrWnRAuE6zq/0EgYXUxIk/+nnW/oul6RdbMBxviNAe8U\n1gii6ZHoaWoTxROoOQYB0P23Rjf8eJ3r5c2+nZmqsXLDwNeKdlX+uSsS6pLFh7DJ\nPWzD44AcMXIjv8Z4uB8pPVbpAbH9oda3GKPZcYQuJ4scScy3USAOYK77T4SY3Y8r\nYtTmTD02z3+FDzihUWEoZuWebOSSIgtw6cGMHXrew6oLun9MMeGeUsaJbF9Fm1dA\nyGQFHHJU/QRkEsI7UE+jf7st9+gvwoMpW1WNWonO/LWRidMZmtaXxLny/+Rn9jzf\n2IYajsbxieXjL3ab196D9HWJZhGUpNNaCD3rIBP/5gmiCb5PZVQTFm7XDN/evb90\nZBAgkKl+5VJoJpQLSOwNQ04D/WMSEkdfK9OmCNY/5ZrOq5YnOodwb0s0aSgpZ9vZ\n6TO5Eh5KUekbzOERSYTT7gsHGVzHGcB+cA2ezUTb1MqCM6XPQew09aHJRv30LJML\nCH5z2DduTEsiio+pdg8qvgMh+QJTxiTXOH3tEi/TLMgbkasO9R3qWatvkVaX8fqH\npzLUvXNGfwonVgCkQ6S8IaUG4J488A/eUZmF88ATuse2k7vFxiaYtM4qFfcM6Bpc\nU594M87s1N/lbShteyE1QRxkhCXrlX/xFo5RXwCqVegQ0Fenjb5Usvf5eKRW4zgE\nSDnOmso/z2yXrIJ4sSJdPbrkCiMCq2gd/qe6kGxC53ibGHSQz85kgxXBZFMSIh2/\nsM53Di/oIR+zvimoqOIbWKLwBn02oO41sNE0qvsV2C8fy1SVOy6cG8AX6D93PI3f\nhfJJH1uvIO2vkPfr+fxvTQ==\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Certificates/tvOS_Development.mobileprovision.enc",
    "content": "U2FsdGVkX19sMm4dCPgcgTnND1wPKUERPjbnGI40mBJnBBi5mimAk6o1qbZ5ciBA\n/StXHcQHcZxl+YNP/jcku6q0VI9zxdl7O5pBv2b4dSOlJAg35Jf0BE0C6SlLK9a1\nnN1BfFXlA8GKGSRExFOCfBdhE+NcFn7WHNLKkzgwdCCx5BU9+0T997f7DoZ0PANX\nYhHLVg0SQmft2q2CuBWdLWJDMoWKYAK/kK0Xr8emcjmTfE66+avfzDRZgpGzXyHs\nxkQ1e2+942urkiGqQQy65H6ig2brUPEvNWahEm2ss917+ZK89mgPm1SuQc5m2H0J\nFL6llVEgGp20agJRxFNeU2k02EcwVoTCltB43l646M9PRltTtolTh1VnhuLJcJOa\nNs80mfWkqkT+4ibsMZZ4+LJ5bvSMsX/XhZA69qF7vtOaTqGRhO6DdNzLI/cb4Uxu\nmwwGN1FrTHzHHiooi6bQ2/Iy+sLMSogBXkxHoTbJJPO0BwzDY1zQsqSYhfojQJRK\nsV/ijFYysttTg/W3oCPgnDPUSSUzhR4Po5dUUDeRSat025/dgTgfKxk9dwkakmvQ\nol6ima4OcHSVcghSTpbp3u28v6aDqOzzgMMbP1jK1+m8WFVaQ60YejJAAfSjOgV2\nDMp/t0RrzpyiqwX2LTpS6htf1Rqect/DxV0GjMOh0cG6C3NB6WMzlC3CzUPHN9Nt\nfYSl76wAbNQn1lLQ4L7xam8QbgFj3ZYLE2/FPt7mpsgxlV/e32l/J8o8OeJ3jEuR\nCokbuhWHCqfNRk/i7Y9tyKAskDCb/1XOLjlt2UGyF2Djhw2BkUXjLrp3lHjFDQS3\nLfIA/0URYypfZ1uicny9USAdfWjywjgRYZ/mlWZh3jmpgGOba/Is7G/0XeBBh67M\nZzpDWwm8+yqoT0ogISos8GEiAPEZY4No6dYuAJsI898x0bmYFPwpUbmhfrb+b48V\ndubveA5BMW1OPiRXngmYoEOWmXcmkzAkU3PofG7Ufqa/F8/rPVJcTNJ5XhQvQOew\nWW4DoKtiuvFTUFPXn6qZWx86xir1XS182dfqLldh7VznCnnUctuPHBrt2u7EwIzr\n8ZKcvVbuuiXF4ElxsAL4yBWumvZFr9RbHD3OFes/IrIFfP6eGdx1j6wK6mpeoJU5\n/j/2KxfDVPP8prt5ecTZQi2rSpIidAKDt3xIsu49JjvvgJR5U4iajRTjXexzi4zr\n/XOgzI0mVG9Il7BU22kgeRpk58kMdF15CR0qNOwmlpYHxSytjda78zJdaDOVBVUb\n7A+6Ae1YTLp1hMEHFiE2OcnxClwtCTO8SRLiEW3SoZrvfi/+WrHeIZtD7ddmw6OZ\nIO6EqAQ4i0eZHSCwfDJ8Yu4np9eCU360ccexVfsyIaoprGHJlc7CdQazAqRNnXnQ\nKRVc3IA751EoHUURxtiV0CM6JHqJ8Be6M/XLHOhztb0gI6nbf6YuMvHJkSZT03iu\noRpiMS3HNT671ijzPIy2Ql/+6St4YHQCVIZCAoZbmp+VIFR2GZk9In9PoAjHImiF\nwQXcmlFjYNJjFbD8YWaix0dZ5YZbP26sCgMi0qqp1jJLtsB911s+OmSvT94nrvgR\nBW+TeJNQMgvcZBtKjDGNwNgBEga4SAU8FwQUAOiDC228Mbf/CcC8Eib2a0rSyxhy\ntpnUmQU8oCmPG4dMSD3E2yY0nhiGoMDqrVZrhDwtG/k7yHXg+iidF7HrfhA0JLYf\nmzOlkJKpXasFCjOmJeNvCsDu56Db+qFbanSnTNnVRHrCVAvJOHHGmLgBIVRsFf3N\nhdaKjk35yyZuQ1HFrDoD7LyEK6M24I+NfmKz56StAOC/cswwz4KXp1uCC+Wpynil\nsuBdpq7Qa43L3Bx2WO5taaUPcI0qoGH0VPjqIf7upVw7gvvGPnOV8gZl6hWhbXgZ\nIbzRNgZa8JiyuX7oXSQzCqs5hV7F7yCTnLGPprmZsOUv1R6ntWtC3dm7Njm7fGEm\noLNxdx6xPz8W0AB4RtAaulPYBQ8mT2n+BcZ3Lk9rQNeur0/13GXeqSE4nQiwQlgU\nqY9y+ICOefmpfqV/SGHJ3hPOV4WDP3d2O2wwxCxvvLtjbQq6FdxGtkpBqtc/XYTB\ney4LCqNEU0ybEMRZC06/MOs7Wg1hTGBKsA38M7NIn4JzJYRasrkQxOTMik64R26l\n1Y7NG5e3fRXaucHTX3fMMLv5dRRmHyjkqsEQS+O8hDsaFYmSnCTx2QFGp8FnHQq1\n6qpyrYaCxEbfUWW4qyF2+T/AI1QV7pS1TiW+hoHaNvk/GNcsB9O7WX/5TonldUoW\nKtoh5Ji8b20TR7RgjcLalG6xIh6RCV5eXo9xht4n5JcrUHqj2l5S5F1dcdsmPdlk\nm/z4ZGiORKtiKEOEmsMMrhXH1LQy5m3XMtXyF1nIYepEaB+oxxYZgFhDEl30xS9L\nHtpbDWwSdPtHwAxSltbwLiwGMaHe5eADlIyE5eiuE8FhwdQXcUl5kfIQrYXwBRKr\nJdyjQLticndssWSfOSv8XW36A8AjWGlfqJPYxl5lLdOZdVHXhBCo3AmwcJSQ/Irb\nF8lZzD5gZE0vhgIiPOMFmwtd+oy6hawtOpGJ7U2kr5aDjxwWxff30DT2qS3HNm8z\nyf5QF1P/7Ja+DHC+ZSlqzWEA2RlKuHOJeodXz5YGguxZcbLaUT1ogBslHeQD/pHy\nLSAlz7s/86ItYLDZYmHLtj7iHPkedEcNvtX9OyxDi9cUsFNDMNfsmgQMowR7M8e2\nsMfxCzstmTO6X4zTULn/2G17kGYszu3YbXck5rb7E78Df1oikt1yFar8AsWcqTf4\n2kMt7t6yVJzLMQ5asrCDcfDRgoahjSpldVBnMlqu74HQMWNdtvxnGy59pBEU7O/M\nkKMN98vSjW2q0v3+lnyiwcWSpJNUO2ZdExURkcuiyW4EvPrsGjwBVQ1MtEHwX2iy\nej17UHtIPfVSNw+BAe5IEKOteQzK4M2Q6YKDrQQvjfKYHVHTYTDhAgvX8bJpBWQh\nQCFlvvlwGbgoj5ylx8uH7i7Qf7G4bzPNtdaMqPQ9nw9K4Qm3iix0NfjSqEFwDfRh\nXUnmmc0ybe7w3t8eUfKsdjDHjUBAOs4qJUwzhjJIvxr0XD3CS0xf7X9k2Wpvg2Bq\nTNRRWkANDGu6kUx8dfqtBVtE4Dxn6SNABUbYBIxmfGA3EnXdp3xSKZ/HCmhNCOwi\nVlqcTn4qPpaDXooHGc5FLDJxBX7e7hsmj+rhgkJlksPS9KfrdC0cFI1KJPU9qBVi\nRucQktSjtCy+IYicxbVzwtIjZ5K9IZjYbEXN3N3rl/kuChqlSySkt0DTDAA44vHI\napuLxTIWbBbTor2Ki2EV028yUJrDcVZftvkBZQvpacgLTH2S2kqHwdHs1YcwK3nE\nJQbyhPhoZ+wX5ix2T97kNcMB7ODoFvhOh82LT63Rtd+WPn+xCaVBShQTcjIq+iNl\nFk3efXTKjC+xupe2kEFQt3RP4DjKyS5cOreuyvrhdXpYFVTnFAwJWmc52W71bDvW\n4yow6HHgUTCCg/zMkB8w/AGv8HvN5NrnjSqUPTGaHtArV6rtVhqJgnTT3hTUlEOI\nkc7M1QHWUKv6XyUjpjiGGj6Ew/MkVd4VArFTqlmizgdHSfwtY25F/AWgGMX858j2\n0LoqJL+oxeu3EFNVgA1geoKZyWdaYX6Z9MgTnoBuVwhCCyOQPVl+Zjfzr3MOXp3j\nr4U8wRSyS+aBA85FfdWdqONsgnEQ/uY2nxLuAwdlW5fPRG8rMR3d2rBiHV52q7fa\n5SsjoQNXML+9r3iyeANELd/XoR3/khkYWj8c5tl+4nDcL/SwyekhVDj2tCZE/2PK\nqLmkQq7yCPLLxZcWWXNRKhn+xu2epaa9PbySIIdcARZBrWeBKsUEq3aqk+fg88NA\nhhLXTYGr3eL4q9fny6u7a4PrcoNyRaBMb7zZL9Ls/PlQri0RGmCTmOdyssvSPoMF\nTlAF1eyJJ9aAroS16Suq9Sz9mWZoLC86BhbWoA7GwHzHIkTpwjM1Wxp26hRbrkXE\nhRe+/2B8o1Fjxh53PdzQPq2WfrnwGDMxak+aF2UqVHfYhIXSbn8vlJEyEStgt4t2\nuibyn1XRH5WmwqM94vBAyjd/aCVgHGgl341Ey1136Fz87h6W8XfwHSH5Wuh+0/Rj\nvz9XUrtkEsCn3oRW/ZxcWvNrv28YUpiKFUUFUJ23xg5HTLfk8hRpIQGL66QZzxqY\na1z87PEwRzB2/U5bVEgfR1bRTn8sPx4nqY70Rg7aFwPGhz2bpJ4ePkq07pJ5NJIz\ntE5974WO11l5eD4S3af2Neo27RhCqrk0hFErAwe0ahEE/+ZV26825U1h0E3WoYYD\npOc/GOt9OdWmCdUQhKWmbH2GULxaEmVn0zzfApwkYJrwV6ma65Z8Fkvl/BSNUgqm\nvDkwkpoqVq7ce0oyB/E7Pzho6AhumFSQS92DIRMlXYncInIZOQyX/0s0ljNRFBfX\nM9gruY5pqTnPXjj2znO9ml1xRu2PiS5iPi3dPPiRYQmvLw97/7QimDNCRQR8BoyP\nlioDIx7SxAmUDQpo76pLJ5/ORMs5rVPVeCk3NVLLXwsJp2v6rUORGBHLh6IfHxs5\nXXpELhWkPvXXngfcvYBJFT3HCRbf0Xzw7T4t+3bYArRhvY//GWZxzIVLhp7b62yr\nHSf2gpCGVgMi0vt8lHSDbTHl2uvNe3++mkCMhvIWe4UX24iZdwNbmyuQTpvQ12+6\nwMzhAVLUTXAAG7m10pq/9Fetprr1U9gSOobMs2642weoRz/8y/d84vcxlALK95LM\nprolkaFhiWBMsjhdmWjqBSuYG0vXqoXUbtRcIl4zo6X+L5xIqCuFPxmPqDnNUddI\nAFIyM4bzEKBYTzaM+yuNiVlMLsn8oMEzZRLpmLk0v5SwklWo5oBNALBnSZQzh4T3\n5QxV9lekpRq9S48pexZ5P8iwS8SbfpdbgS8GwC3N1fJVEAV0C9e3+ocYKN0Vus/l\nb9Tb8ce1WLThxHdMe1px/Abk5+AR9zOEwwiW2m+V9lVGikkQYScJtMyX+JHzGtmK\nBsfP/nlali+6EgxPWfFauynVKzixWH5g77Xhmma2etNb4v5NWhD+X6Uqpu8DN27j\n0xiNdOths+lJVyWhVpLWyyarYp0kLxEdKWH2lhpSNHD70ZBYxhpIQuFpiB7oCZIy\nonTapHQf3/tYSfPBUz3+sE3YmYTYEjjROCIF8SWoEIrr0ycoFQ6sHTxkwudA08Wf\nmzTtzCBervBaXJIO89GPR/+OUJX7vRP4WHKR7pmxmuHbAXqqmJfhf/Yf2fa2MPxE\nCSeVBkSpawYTgulSHhohEwD87i6CnHpVKNa0kU4yA1bI4R5kS9VmDZxGZ8F/62Un\nDDJKzB5MQ2LtrfrIH4MFMkp3wyemFHFkbvNeqQsag+NVH5iDh0rBR1tkSOvySv/g\nOmjqgL7V08zwb6S9ncPGLkkF4gzwWGI35Iu4Ie415b3xqGcpnKWNV3xBDjbbur7O\n10EbJMAZOWPnThwPFfG6fKXNCgekH2XyerZSIwyCRcih3ZrT6Qe6P/6mMvKIK9rh\nPKMpztwZAeNk/uqmUE8ee8lmCvm4AN2BiW6XM/P6wWNNayumh6a2EfSsdNbDyMYI\neRO3vgTPl7Ap3UVySJy2jg2maHJfQgIQTVpCC1Uzc3XUebbnuXSk6kuC8DcOzK48\noCX6TIRMy624c++DLU4BVKIi5wCMpLl4SfB0DrYkRiL/g0inBUjliam+Sz0Ji5M4\ntl3PwpRzQaonGdni2L4/tDRaHGlAFeE4qgCJFj9Sc5hU9+7Krj8MtjsojcAO1FCZ\nJ4oiM88eyC4uJwZjRXBC0a9GtpgRYgcLjzhv8UKeufburonkJrSKmJSaPi7fZ9Y3\nYuD9eDtcxJMjyXZhp0BggVrUrnpWq6YpOBYOieLyy5FhlRqOkHTP4sowiJsSs30h\n/3A5O2FGMGTsw1Qd6hVsMkxV1mR71slwB4+0Z9ikPTLltzKyZWBGODDYR8oS8psC\neJZ/Wm1/laKY7AR8agB4nobiUxzsMdeiPCxAdoLxB2+9USMR2WuA5ayHvt9Nuiqr\nX4vUmzidszxywwCkdFXCrYiLqxQ+cBTa5+JGFZvc03u1cyZCFbaGXEO/9wch6Zd+\nXZqyXnmzRT+LxEvXrSH8lI2CRo9YYcgNsLmpocDxykOGt10qup9LAZy17GyOv88z\nQIXq9XBluX8TzlUPQEhnFM+r1wMECJT4ozFAuhQLDqY9rl884KF9agZWr9sn5Ujv\nACTHDbyA6SnfW449zT5QdVRK+Y4jJvxk6Ub6ARBLpXS5abBNB6plOJR3N0v63HNP\nY/EDNokDbTmJCm1GhR53yUqzjecKiHs6HHwbOTXZQPFHz3g+uDTDK88uUC0Ti2Ls\nrJEgQKvaoDjMkBh/RG1YcwSsRXzZbC3tBtf0K7wyO6lPwct5pYkeXnukgRUfEc4/\nIezcPxyl0gdSwdE//dK4eq6URVya6HpCvGmZcl+/Ga2rXrIW3za8uIu4RKdp76u5\nfm6RIKe6jGBdSaCvq1HIyfWcodXXZ6XeHrGyaYYPtamXPXzkUSmGA0AW6JKPeWWB\n5RxSOZytPDXnyOWBe37SfrttbanYG7WCOMy8kUbRpwLDB9r5nIPC0ysy6NDB60u8\n5dSaQTfNOBPa1GzYJUejWhwGvuEU83c0Xd42LSuVUmvImoa3b6/594ojcgn6pDho\nWNOh5xFpjMnKzbPQITc95qCCBPjWenZW5qEPnrjGfPHH5xffudMDqsfaXnC4d1Tm\n6dftfXHZYzEiu4IeCmm3cYCPs2F40n72Vv344JTjC/tQlri2VShf0iK+7nmiB/cG\n2iVIcQJmiInqOIVFyo+sY3QdjRpH3WF96Nb/GoyQILFeoyFZRi+/9U3G/vCwZo8O\nL06dWFV46oCe70LpDVTHp12+1EZsPVtnv3WulKirT+1Xgdwjy96PE7pIjMbJKAYA\nx9FfDhQnh0U/AT5E+knZl0GM+VTBko8tr1QbpS3zIi9UkRe10lwCPYxrHHu+625r\nbFk8idkeUQAYKavZKnG/xS9UakbAF+slxCZr0GW+bc3u7Rx3QLG3VW4MUIgfVlPg\nhM7ymURGz0UuqVh/4GLNoCPlE4S7c9zHRU5XHqONnnABWgmjIeanngZXUnqYY2Kp\nMbb/fkm8D+K7NFIhWuJtgcWAnVOAb5HR+z8EW3WgAgxsGHLxiUhFnMaRFduH+M//\nm9df7rRKt82SFNFc2boFQ7MF70zKtD70rAagLLOB0anJZZM3zQ2FHNX9Chzn4yU/\nXpsHdqbtLdFK5t92/kVpUXi53JkFrvPimDQH0seJBJPyPzpFJLkUZwE2jt9fCTjV\n21bDzw5zYscfegOsXagkMFhxLTfvJhwXytZBPBEWDvyMHFKEXFNgXnogiQKv1UDb\n8/tsgfWn50Ltyw3ah/ONxNUlA8jvRZTBXif3A4iUhLdYDkyN4F1XMRisCIWSMSD8\nloPLn1zqK/9ILqHxiXc0QJGynHVgxE/nQ52wUjnOhHVE2KLpm9bphOSyP1TIs1RU\nEGtOnA5hRDld3oy3GzzPXew1OfU+3YPBuwtbl8GojuXr3DhaLR4T3T9MaB69c0Ui\nwdDvh98Jo7wh2kDVQXLRSjLwyscmIS+IBavUlYnp7969GSoHjWu5q7LrZiluvYQx\ndzWP/m23WzR6dkhAfdtiuKxA13VnLDLN5kT5569C0WOxi2DAPayb3l6DtCPnQpgb\nX8zLVzlKFJFZsJ8vJ57kVJZ42bGumuNoxnTv2Urxu/82jtXFdZhlhgYOm8X4fAWO\nzr/JpQsYi+KRZVHM9tl9L2KIIyqCRrLz6ga7cwdRTLXBKVvizx686muqCqZ3jOIH\nLxiNyDkr/PYL88X15vKdP+tl9OIjbi+LuRBqZbJusz7hJmcoj+oT56GEegjjI8Ol\nE6lZkEipJUfK4GlOtnYvu0UGHwzobNwCZ4ae6cQDLM3P9OsHgDeYOA8I1UA1w4R5\nZ7JNP8waCNomLRpp151naFDtSxfEiHcT+gRkhShndQlr/V7SPvMoZNw0ohFW7gw4\nYsukrHbo2oYUxuOySy+k+2pS7vgMPNfeVW7QF9dVvqvAqQf3Yu2ev8hBp29hlDSc\nM+XySsIsfRCXVDCc5QS8Atwk4F8xrg2uk87TB103Q2KqgrWQ2xuk5andanb++GHw\nfjOz6+4vjv+KKxKlodiaGp5e2iyr9WEGZdtKUaG4gLiXrVuw9tlUFAA1Ca5pMy2B\n+h2s9Jc7kerLLekarcU2IBF3rKfpL69es8xWicJJn9Fvb34LLGi3nhmo3IlFzfct\nP4nZMMAqQ/GPbAbWjNyPjKv4c5cIfC0+2kG4nobDqWyP3pgdv5YyygTEefNjpCPP\nI78m5hU2JhaxYfXzcELtSLFrFOqn7mREin1Gaqj6tiHjsfqKAQIQYWF+X4eobJZM\nZiNrbhzfPGkBxXgYMVac8jyh6jYQJZUoq+0rlALckx1Vw/9BqX03eMpojCPwLvqw\nLGAJGH1QYWbgRaxO9eJ+TV0lAp53YnTzHPouatZ+E6iA+kn7MEa0iAhqzBQPU0LG\nFHg08g5KLMQsLc4xj7tOzst3Litt61+0TIF0Wo1V/JNIvEz2LH3vQRHCz42VRtV2\nMgqSH8/kH6R1laR2lDX3FgBVbJoLYRFhe9E0aaVyFcXF23hjRc5PpJYt8LfvnF6H\nwiLG0cxc0YEWX1cm6AzK40OyloPZJBlwos+QXJMeE9/OC5wYPR7YIBSjsbS9rws8\nu10aL32LrdaFkrmVOK+NWbdfH2K/NMJSPIQFCgGv6UjfsynW4YSu/HHm7+Kq020w\nqoouMDE7bn33KuhMpSsIBRcSTD01Afh35FWuD3/ruGmV5DOfC4YpLEwtQFU+oC15\nYFd61jllyeJO9oxcE6Z/k7986+labJ2c1EEAoOdwsPdiuvaI1z8N+4Q0e30gxe91\nTnL83suTfKM0vdRSEWupApq5uC7HH4daAmy1v3NEbCuC0ipTZdTB8vr+XN6Kzl3Q\n0RUqA8d6N9GbhIM/Qvc+FF5rft7TWP6PrHS+3scfH9tL/7FozXbr92HKUMoGkRbY\nA069syUohs4Y/qjnxRoHpJ5CmjBk/aTQ6yFQuGrGTEcu6Oe7XV6fyuiQONu0Fsaj\nkS8n90bWiR2ZodZznTwZBZA5FwBgSI1n7SJxXOS0RoVZML1/Yn88zHrNAvxehTSy\nH8SG6dUIVrDOjrqJKEl3wrfT0TQG4/UNqSRJy+2xiG2z8AnneaUuDxKGk2RLya2+\ntDpktV50baMI+E5wbWrIa+KWPhMn2n72zozuaZ7yhoWSGcTCs9dCqpsq6fNWr6c5\n5FYo2XZWY+Ba9Z3KHhErwDuTDdl/KfSMqRbeDUflkN13DVogMIqDwVLfAYv98VAq\n/fbWQL34l6mEpdJdE8DZCL9vFNxpGufBlJGTfiv1GbWwtecpcCOi/jeal/iPLpXR\ni2VDJQC4Cwo52bOhcthIMFZiu3ZMRiNCUfkugmjcifeCAIQh6ErASXyIk7A/w0SD\nZYmAW/JgQfqIczZPsifVku+vqwS0BaTkMVAFDw4nFl1HnAQ7HghayItT+g+CIH0B\nWcy9q15Ino1TGdeKcD24GuRDXbWvfuKLizQ79N4zSaxZ42tp/ZAIxP5xApND8v/r\ny24kkXE4fMPWbmrO+kMR/4/H9A4+iMisKpjKfeQofk4esJWcvf4a6HDtQ34k7euT\n6Om9Oc093ruKhN/RSb9S183/rDUIgcvKVAIZAaZOfZD5iMQ7rsqChglBtR0NVXAL\nJcUXaU09okwSAb7ppPc7Ue2+kX7rqjrUBkk9kg7qL9qkCr2jkJNuU+0FvtEkNuA7\ns7waBUTqqquVtUKQ7alOhRaNVTHWavztETcZdcLWBkq2RTWxCO2MtSZQX4T7pwxc\npZ5PVZLRfom9BI5Bp43F3jG07Y6smT9LGKR37F9mP4eWcgLdQ7KACVbVlO82KmBs\nJ/JMfylT/kvIazgqRaefxOKGk+EnV5bewoXjOEBqiai3w6eIwck6d9rS6UKWg5/G\nCKgclqViJ4x6TBVM6Hao+Wr4q7rBCtAOop1VlkwVteVKrk2IreJzhlBPRLTCi8RI\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/Base.xcconfig",
    "content": "ALWAYS_SEARCH_USER_PATHS = NO;\nCLANG_ANALYZER_NONNULL = YES\nCLANG_CXX_LANGUAGE_STANDARD = gnu++0x;\nCLANG_CXX_LIBRARY = libc++;\nCLANG_ENABLE_MODULES = YES;\nCLANG_ENABLE_OBJC_ARC = YES;\nCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\nCLANG_WARN_BOOL_CONVERSION = YES;\nCLANG_WARN_COMMA = YES;\nCLANG_WARN_CONSTANT_CONVERSION = YES;\nCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\nCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\nCLANG_WARN_EMPTY_BODY = YES;\nCLANG_WARN_ENUM_CONVERSION = YES;\nCLANG_WARN_INFINITE_RECURSION = YES;\nCLANG_WARN_INT_CONVERSION = YES;\nCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\nCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\nCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\nCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\nCLANG_WARN_STRICT_PROTOTYPES = YES;\nCLANG_WARN_SUSPICIOUS_MOVE = YES;\nCLANG_WARN_UNREACHABLE_CODE = YES;\nCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\nCURRENT_PROJECT_VERSION = 1;\nENABLE_STRICT_OBJC_MSGSEND = YES;\nGCC_C_LANGUAGE_STANDARD = gnu99;\nGCC_NO_COMMON_BLOCKS = YES;\nGCC_DYNAMIC_NO_PIC = NO;\nGCC_SYMBOLS_PRIVATE_EXTERN = NO;\nGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\nGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\nGCC_WARN_UNDECLARED_SELECTOR = YES;\nGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\nGCC_WARN_UNUSED_FUNCTION = YES;\nGCC_WARN_UNUSED_VARIABLE = YES;\nVERSIONING_SYSTEM = \"apple-generic\";\nVERSION_INFO_PREFIX = \"\";\n\nCODE_SIGN_IDENTITY = ;\nDEVELOPMENT_TEAM = ;\n\nIPHONEOS_DEPLOYMENT_TARGET = 9.0;\nWATCHOS_DEPLOYMENT_TARGET = 3.0;\nTVOS_DEPLOYMENT_TARGET = 9.0;\nMACOSX_DEPLOYMENT_TARGET = 10.9;\n\nSWIFT_VERSION = 5.0;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/Debug.xcconfig",
    "content": "#include \"Base.xcconfig\"\n\nBITCODE_GENERATION_MODE = marker;\nMTL_ENABLE_DEBUG_INFO = YES;\nCOPY_PHASE_STRIP = NO;\nENABLE_TESTABILITY = YES;\nGCC_OPTIMIZATION_LEVEL = 0;\nONLY_ACTIVE_ARCH = YES;\nSWIFT_OPTIMIZATION_LEVEL = -Onone;\n\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/KeychainAccess.xcconfig",
    "content": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator appletvos appletvsimulator;\nTARGETED_DEVICE_FAMILY = 1,2,3,4;\nSUPPORTS_MACCATALYST = YES;\nDERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES;\n\nCOMBINE_HIDPI_IMAGES = YES;\nPRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PLATFORM_NAME).$(PRODUCT_NAME:rfc1034identifier);\nPRODUCT_NAME = $(PROJECT_NAME);\nAPPLICATION_EXTENSION_API_ONLY = YES;\nINFOPLIST_FILE = KeychainAccess/Info.plist;\nSKIP_INSTALL = YES;\n\nBUILD_LIBRARY_FOR_DISTRIBUTION = YES;\nDEFINES_MODULE = YES;\nDYLIB_COMPATIBILITY_VERSION = 1;\nDYLIB_CURRENT_VERSION = 1;\nDYLIB_INSTALL_NAME_BASE = @rpath;\n\nENABLE_BITCODE[sdk=iphone*] = YES;\nENABLE_BITCODE[sdk=watch*] = YES;\nENABLE_BITCODE[sdk=appletv*] = YES;\n\nLD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/Release.xcconfig",
    "content": "#include \"Base.xcconfig\"\n\nBITCODE_GENERATION_MODE = bitcode;\nDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\nENABLE_NS_ASSERTIONS = NO;\nMTL_ENABLE_DEBUG_INFO = NO;\nVALIDATE_PRODUCT = YES;\nSWIFT_COMPILATION_MODE = wholemodule;\nSWIFT_OPTIMIZATION_LEVEL = -Owholemodule;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/TestHost.xcconfig",
    "content": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;\nTARGETED_DEVICE_FAMILY = 1,2,3;\nSUPPORTS_MACCATALYST = YES;\n\nCOMBINE_HIDPI_IMAGES = YES;\nCOPY_PHASE_STRIP = NO;\nINFOPLIST_FILE = TestHost/Info.plist;\nPRODUCT_NAME = $(TARGET_NAME);\nCLANG_MODULES_AUTOLINK = NO;\nASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\nALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\nEMBEDDED_CONTENT_CONTAINS_SWIFT = YES;\n\nPRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.KeychainAccess.TestHost;\n\nCODE_SIGN_ENTITLEMENTS = TestHost/TestHost.entitlements;\n\nCODE_SIGN_IDENTITY[sdk=iphone*] = iPhone Developer;\nCODE_SIGN_IDENTITY[sdk=macosx*] = Developer ID Application;\nPROVISIONING_PROFILE_SPECIFIER[sdk=iphone*] = iOS Development;\nPROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = KeychainAccess Tests;\n\nDEVELOPMENT_TEAM = 27AEDK3C9F;\n\nPRINCIPAL_CLASS[sdk=iphone*] = UIApplication;\nPRINCIPAL_CLASS[sdk=appletv*] = UIApplication;\nPRINCIPAL_CLASS[sdk=macosx*] = NSApplication;\n\nLD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Configurations/Tests.xcconfig",
    "content": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;\nTARGETED_DEVICE_FAMILY = 1,2;\nSUPPORTS_MACCATALYST = YES;\n\nCOMBINE_HIDPI_IMAGES = YES;\nPRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier);\nPRODUCT_NAME = $(TARGET_NAME);\nAPPLICATION_EXTENSION_API_ONLY = NO;\nINFOPLIST_FILE = KeychainAccessTests/Info.plist;\n\nLD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;\nLD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;\n\nTEST_HOST[sdk=iphone*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost;\nTEST_HOST[sdk=appletv*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost;\nTEST_HOST[sdk=macosx*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/Contents/MacOS/TestHost;\n\nEXCLUDED_SOURCE_FILE_NAMES[sdk=watch*] = *;\nEXCLUDED_SOURCE_FILE_NAMES[sdk=appletv*] = SharedCredentialTests.swift;\nEXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*] = SharedCredentialTests.swift;\n\nDEVELOPMENT_TEAM = 27AEDK3C9F;\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'rake'\ngem 'xcpretty'\ngem 'xcjobs'\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>4.2.2</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess/Keychain.swift",
    "content": "//\n//  Keychain.swift\n//  KeychainAccess\n//\n//  Created by kishikawa katsumi on 2014/12/24.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport Security\n#if os(iOS) || os(OSX)\nimport LocalAuthentication\n#endif\n\npublic let KeychainAccessErrorDomain = \"com.kishikawakatsumi.KeychainAccess.error\"\n\npublic enum ItemClass {\n    case genericPassword\n    case internetPassword\n}\n\npublic enum ProtocolType {\n    case ftp\n    case ftpAccount\n    case http\n    case irc\n    case nntp\n    case pop3\n    case smtp\n    case socks\n    case imap\n    case ldap\n    case appleTalk\n    case afp\n    case telnet\n    case ssh\n    case ftps\n    case https\n    case httpProxy\n    case httpsProxy\n    case ftpProxy\n    case smb\n    case rtsp\n    case rtspProxy\n    case daap\n    case eppc\n    case ipp\n    case nntps\n    case ldaps\n    case telnetS\n    case imaps\n    case ircs\n    case pop3S\n}\n\npublic enum AuthenticationType {\n    case ntlm\n    case msn\n    case dpa\n    case rpa\n    case httpBasic\n    case httpDigest\n    case htmlForm\n    case `default`\n}\n\npublic enum Accessibility {\n    /**\n     Item data can only be accessed\n     while the device is unlocked. This is recommended for items that only\n     need be accesible while the application is in the foreground. Items\n     with this attribute will migrate to a new device when using encrypted\n     backups.\n     */\n    case whenUnlocked\n\n    /**\n     Item data can only be\n     accessed once the device has been unlocked after a restart. This is\n     recommended for items that need to be accesible by background\n     applications. Items with this attribute will migrate to a new device\n     when using encrypted backups.\n     */\n    case afterFirstUnlock\n\n    /**\n     Item data can always be accessed\n     regardless of the lock state of the device. This is not recommended\n     for anything except system use. Items with this attribute will migrate\n     to a new device when using encrypted backups.\n     */\n    @available(macCatalyst, unavailable)\n    case always\n\n    /**\n     Item data can\n     only be accessed while the device is unlocked. This class is only\n     available if a passcode is set on the device. This is recommended for\n     items that only need to be accessible while the application is in the\n     foreground. Items with this attribute will never migrate to a new\n     device, so after a backup is restored to a new device, these items\n     will be missing. No items can be stored in this class on devices\n     without a passcode. Disabling the device passcode will cause all\n     items in this class to be deleted.\n     */\n    @available(iOS 8.0, OSX 10.10, *)\n    case whenPasscodeSetThisDeviceOnly\n\n    /**\n     Item data can only\n     be accessed while the device is unlocked. This is recommended for items\n     that only need be accesible while the application is in the foreground.\n     Items with this attribute will never migrate to a new device, so after\n     a backup is restored to a new device, these items will be missing.\n     */\n    case whenUnlockedThisDeviceOnly\n\n    /**\n     Item data can\n     only be accessed once the device has been unlocked after a restart.\n     This is recommended for items that need to be accessible by background\n     applications. Items with this attribute will never migrate to a new\n     device, so after a backup is restored to a new device these items will\n     be missing.\n     */\n    case afterFirstUnlockThisDeviceOnly\n\n    /**\n     Item data can always\n     be accessed regardless of the lock state of the device. This option\n     is not recommended for anything except system use. Items with this\n     attribute will never migrate to a new device, so after a backup is\n     restored to a new device, these items will be missing.\n     */\n    @available(macCatalyst, unavailable)\n    case alwaysThisDeviceOnly\n}\n\n/**\n Predefined item attribute constants used to get or set values\n in a dictionary. The kSecUseAuthenticationUI constant is the key and its\n value is one of the constants defined here.\n If the key kSecUseAuthenticationUI not provided then kSecUseAuthenticationUIAllow\n is used as default.\n */\npublic enum AuthenticationUI {\n    /**\n     Specifies that authenticate UI can appear.\n     */\n    case allow\n\n    /**\n     Specifies that the error\n     errSecInteractionNotAllowed will be returned if an item needs\n     to authenticate with UI\n     */\n    case fail\n\n    /**\n     Specifies that all items which need\n     to authenticate with UI will be silently skipped. This value can be used\n     only with SecItemCopyMatching.\n     */\n    case skip\n}\n\n@available(iOS 9.0, OSX 10.11, *)\nextension AuthenticationUI {\n    public var rawValue: String {\n        switch self {\n        case .allow:\n            return UseAuthenticationUIAllow\n        case .fail:\n            return UseAuthenticationUIFail\n        case .skip:\n            return UseAuthenticationUISkip\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .allow:\n            return \"allow\"\n        case .fail:\n            return \"fail\"\n        case .skip:\n            return \"skip\"\n        }\n    }\n}\n\npublic struct AuthenticationPolicy: OptionSet {\n    /**\n     User presence policy using Touch ID or Passcode. Touch ID does not\n     have to be available or enrolled. Item is still accessible by Touch ID\n     even if fingers are added or removed.\n     */\n    @available(iOS 8.0, OSX 10.10, watchOS 2.0, tvOS 8.0, *)\n    public static let userPresence = AuthenticationPolicy(rawValue: 1 << 0)\n\n    /**\n     Constraint: Touch ID (any finger) or Face ID. Touch ID or Face ID must be available. With Touch ID\n     at least one finger must be enrolled. With Face ID user has to be enrolled. Item is still accessible by Touch ID even\n     if fingers are added or removed. Item is still accessible by Face ID if user is re-enrolled.\n     */\n    @available(iOS 11.3, OSX 10.13.4, watchOS 4.3, tvOS 11.3, *)\n    public static let biometryAny = AuthenticationPolicy(rawValue: 1 << 1)\n\n    /**\n     Deprecated, please use biometryAny instead.\n     */\n    @available(iOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryAny\")\n    @available(OSX, introduced: 10.12.1, deprecated: 10.13.4, renamed: \"biometryAny\")\n    @available(watchOS, introduced: 2.0, deprecated: 4.3, renamed: \"biometryAny\")\n    @available(tvOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryAny\")\n    public static let touchIDAny = AuthenticationPolicy(rawValue: 1 << 1)\n\n    /**\n     Constraint: Touch ID from the set of currently enrolled fingers. Touch ID must be available and at least one finger must\n     be enrolled. When fingers are added or removed, the item is invalidated. When Face ID is re-enrolled this item is invalidated.\n     */\n    @available(iOS 11.3, OSX 10.13, watchOS 4.3, tvOS 11.3, *)\n    public static let biometryCurrentSet = AuthenticationPolicy(rawValue: 1 << 3)\n\n    /**\n     Deprecated, please use biometryCurrentSet instead.\n     */\n    @available(iOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryCurrentSet\")\n    @available(OSX, introduced: 10.12.1, deprecated: 10.13.4, renamed: \"biometryCurrentSet\")\n    @available(watchOS, introduced: 2.0, deprecated: 4.3, renamed: \"biometryCurrentSet\")\n    @available(tvOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryCurrentSet\")\n    public static let touchIDCurrentSet = AuthenticationPolicy(rawValue: 1 << 3)\n\n    /**\n     Constraint: Device passcode\n     */\n    @available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\n    public static let devicePasscode = AuthenticationPolicy(rawValue: 1 << 4)\n\n    /**\n     Constraint: Watch\n     */\n    @available(iOS, unavailable)\n    @available(OSX 10.15, *)\n    @available(watchOS, unavailable)\n    @available(tvOS, unavailable)\n    public static let watch = AuthenticationPolicy(rawValue: 1 << 5)\n\n    /**\n     Constraint logic operation: when using more than one constraint,\n     at least one of them must be satisfied.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let or = AuthenticationPolicy(rawValue: 1 << 14)\n\n    /**\n     Constraint logic operation: when using more than one constraint,\n     all must be satisfied.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let and = AuthenticationPolicy(rawValue: 1 << 15)\n\n    /**\n     Create access control for private key operations (i.e. sign operation)\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let privateKeyUsage = AuthenticationPolicy(rawValue: 1 << 30)\n\n    /**\n     Security: Application provided password for data encryption key generation.\n     This is not a constraint but additional item encryption mechanism.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let applicationPassword = AuthenticationPolicy(rawValue: 1 << 31)\n\n    #if swift(>=2.3)\n    public let rawValue: UInt\n\n    public init(rawValue: UInt) {\n        self.rawValue = rawValue\n    }\n    #else\n    public let rawValue: Int\n\n    public init(rawValue: Int) {\n        self.rawValue = rawValue\n    }\n    #endif\n}\n\npublic struct Attributes {\n    public var `class`: String? {\n        return attributes[Class] as? String\n    }\n    public var data: Data? {\n        return attributes[ValueData] as? Data\n    }\n    public var ref: Data? {\n        return attributes[ValueRef] as? Data\n    }\n    public var persistentRef: Data? {\n        return attributes[ValuePersistentRef] as? Data\n    }\n\n    public var accessible: String? {\n        return attributes[AttributeAccessible] as? String\n    }\n    public var accessControl: SecAccessControl? {\n        if #available(OSX 10.10, *) {\n            if let accessControl = attributes[AttributeAccessControl] {\n                return (accessControl as! SecAccessControl)\n            }\n            return nil\n        } else {\n            return nil\n        }\n    }\n    public var accessGroup: String? {\n        return attributes[AttributeAccessGroup] as? String\n    }\n    public var synchronizable: Bool? {\n        return attributes[AttributeSynchronizable] as? Bool\n    }\n    public var creationDate: Date? {\n        return attributes[AttributeCreationDate] as? Date\n    }\n    public var modificationDate: Date? {\n        return attributes[AttributeModificationDate] as? Date\n    }\n    public var attributeDescription: String? {\n        return attributes[AttributeDescription] as? String\n    }\n    public var comment: String? {\n        return attributes[AttributeComment] as? String\n    }\n    public var creator: String? {\n        return attributes[AttributeCreator] as? String\n    }\n    public var type: String? {\n        return attributes[AttributeType] as? String\n    }\n    public var label: String? {\n        return attributes[AttributeLabel] as? String\n    }\n    public var isInvisible: Bool? {\n        return attributes[AttributeIsInvisible] as? Bool\n    }\n    public var isNegative: Bool? {\n        return attributes[AttributeIsNegative] as? Bool\n    }\n    public var account: String? {\n        return attributes[AttributeAccount] as? String\n    }\n    public var service: String? {\n        return attributes[AttributeService] as? String\n    }\n    public var generic: Data? {\n        return attributes[AttributeGeneric] as? Data\n    }\n    public var securityDomain: String? {\n        return attributes[AttributeSecurityDomain] as? String\n    }\n    public var server: String? {\n        return attributes[AttributeServer] as? String\n    }\n    public var `protocol`: String? {\n        return attributes[AttributeProtocol] as? String\n    }\n    public var authenticationType: String? {\n        return attributes[AttributeAuthenticationType] as? String\n    }\n    public var port: Int? {\n        return attributes[AttributePort] as? Int\n    }\n    public var path: String? {\n        return attributes[AttributePath] as? String\n    }\n\n    fileprivate let attributes: [String: Any]\n\n    init(attributes: [String: Any]) {\n        self.attributes = attributes\n    }\n\n    public subscript(key: String) -> Any? {\n        get {\n            return attributes[key]\n        }\n    }\n}\n\npublic final class Keychain {\n    public var itemClass: ItemClass {\n        return options.itemClass\n    }\n\n    public var service: String {\n        return options.service\n    }\n\n    // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n    // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n    public var accessGroup: String? {\n        return options.accessGroup\n    }\n\n    public var server: URL {\n        return options.server\n    }\n\n    public var protocolType: ProtocolType {\n        return options.protocolType\n    }\n\n    public var authenticationType: AuthenticationType {\n        return options.authenticationType\n    }\n\n    public var accessibility: Accessibility {\n        return options.accessibility\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public var authenticationPolicy: AuthenticationPolicy? {\n        return options.authenticationPolicy\n    }\n\n    public var synchronizable: Bool {\n        return options.synchronizable\n    }\n\n    public var label: String? {\n        return options.label\n    }\n\n    public var comment: String? {\n        return options.comment\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public var authenticationPrompt: String? {\n        return options.authenticationPrompt\n    }\n\n    @available(iOS 9.0, OSX 10.11, *)\n    public var authenticationUI: AuthenticationUI {\n        return options.authenticationUI ?? .allow\n    }\n\n    #if os(iOS) || os(OSX)\n    @available(iOS 9.0, OSX 10.11, *)\n    public var authenticationContext: LAContext? {\n        return options.authenticationContext as? LAContext\n    }\n    #endif\n\n    fileprivate let options: Options\n\n    // MARK:\n\n    public convenience init() {\n        var options = Options()\n        if let bundleIdentifier = Bundle.main.bundleIdentifier {\n            options.service = bundleIdentifier\n        }\n        self.init(options)\n    }\n\n    public convenience init(service: String) {\n        var options = Options()\n        options.service = service\n        self.init(options)\n    }\n\n    public convenience init(accessGroup: String) {\n        var options = Options()\n        if let bundleIdentifier = Bundle.main.bundleIdentifier {\n            options.service = bundleIdentifier\n        }\n        options.accessGroup = accessGroup\n        self.init(options)\n    }\n\n    public convenience init(service: String, accessGroup: String) {\n        var options = Options()\n        options.service = service\n        options.accessGroup = accessGroup\n        self.init(options)\n    }\n\n    public convenience init(server: String, protocolType: ProtocolType, accessGroup: String? = nil, authenticationType: AuthenticationType = .default) {\n        self.init(server: URL(string: server)!, protocolType: protocolType, accessGroup: accessGroup, authenticationType: authenticationType)\n    }\n\n    public convenience init(server: URL, protocolType: ProtocolType, accessGroup: String? = nil, authenticationType: AuthenticationType = .default) {\n        var options = Options()\n        options.itemClass = .internetPassword\n        options.server = server\n        options.protocolType = protocolType\n        options.accessGroup = accessGroup\n        options.authenticationType = authenticationType\n        self.init(options)\n    }\n\n    fileprivate init(_ opts: Options) {\n        options = opts\n    }\n\n    // MARK:\n\n    public func accessibility(_ accessibility: Accessibility) -> Keychain {\n        var options = self.options\n        options.accessibility = accessibility\n        return Keychain(options)\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public func accessibility(_ accessibility: Accessibility, authenticationPolicy: AuthenticationPolicy) -> Keychain {\n        var options = self.options\n        options.accessibility = accessibility\n        options.authenticationPolicy = authenticationPolicy\n        return Keychain(options)\n    }\n\n    public func synchronizable(_ synchronizable: Bool) -> Keychain {\n        var options = self.options\n        options.synchronizable = synchronizable\n        return Keychain(options)\n    }\n\n    public func label(_ label: String) -> Keychain {\n        var options = self.options\n        options.label = label\n        return Keychain(options)\n    }\n\n    public func comment(_ comment: String) -> Keychain {\n        var options = self.options\n        options.comment = comment\n        return Keychain(options)\n    }\n\n    public func attributes(_ attributes: [String: Any]) -> Keychain {\n        var options = self.options\n        attributes.forEach { options.attributes.updateValue($1, forKey: $0) }\n        return Keychain(options)\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public func authenticationPrompt(_ authenticationPrompt: String) -> Keychain {\n        var options = self.options\n        options.authenticationPrompt = authenticationPrompt\n        return Keychain(options)\n    }\n\n    @available(iOS 9.0, OSX 10.11, *)\n    public func authenticationUI(_ authenticationUI: AuthenticationUI) -> Keychain {\n        var options = self.options\n        options.authenticationUI = authenticationUI\n        return Keychain(options)\n    }\n\n    #if os(iOS) || os(OSX)\n    @available(iOS 9.0, OSX 10.11, *)\n    public func authenticationContext(_ authenticationContext: LAContext) -> Keychain {\n        var options = self.options\n        options.authenticationContext = authenticationContext\n        return Keychain(options)\n    }\n    #endif\n\n    // MARK:\n\n    public func get(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> String? {\n        return try getString(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n    }\n\n    public func getString(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> String? {\n        guard let data = try getData(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable) else  {\n            return nil\n        }\n        guard let string = String(data: data, encoding: .utf8) else {\n            print(\"failed to convert data to string\")\n            throw Status.conversionError\n        }\n        return string\n    }\n\n    public func getData(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> Data? {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n\n        query[MatchLimit] = MatchLimitOne\n        query[ReturnData] = kCFBooleanTrue\n\n        query[AttributeAccount] = key\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            guard let data = result as? Data else {\n                throw Status.unexpectedError\n            }\n            return data\n        case errSecItemNotFound:\n            return nil\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    public func get<T>(_ key: String, ignoringAttributeSynchronizable: Bool = true, handler: (Attributes?) -> T) throws -> T {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n\n        query[MatchLimit] = MatchLimitOne\n\n        query[ReturnData] = kCFBooleanTrue\n        query[ReturnAttributes] = kCFBooleanTrue\n        query[ReturnRef] = kCFBooleanTrue\n        query[ReturnPersistentRef] = kCFBooleanTrue\n\n        query[AttributeAccount] = key\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            guard let attributes = result as? [String: Any] else {\n                throw Status.unexpectedError\n            }\n            return handler(Attributes(attributes: attributes))\n        case errSecItemNotFound:\n            return handler(nil)\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public func set(_ value: String, key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        guard let data = value.data(using: .utf8, allowLossyConversion: false) else {\n            print(\"failed to convert string to data\")\n            throw Status.conversionError\n        }\n        try set(data, key: key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n    }\n\n    public func set(_ value: Data, key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n        query[AttributeAccount] = key\n        #if os(iOS)\n        if #available(iOS 9.0, *) {\n            if let authenticationUI = options.authenticationUI {\n                query[UseAuthenticationUI] = authenticationUI.rawValue\n            } else {\n                query[UseAuthenticationUI] = UseAuthenticationUIFail\n            }\n        } else {\n            query[UseNoAuthenticationUI] = kCFBooleanTrue\n        }\n        #elseif os(OSX)\n        query[ReturnData] = kCFBooleanTrue\n        if #available(OSX 10.11, *) {\n            if let authenticationUI = options.authenticationUI {\n                query[UseAuthenticationUI] = authenticationUI.rawValue\n            } else {\n                query[UseAuthenticationUI] = UseAuthenticationUIFail\n            }\n        }\n        #else\n        if let authenticationUI = options.authenticationUI {\n            query[UseAuthenticationUI] = authenticationUI.rawValue\n        }\n        #endif\n\n        var status = SecItemCopyMatching(query as CFDictionary, nil)\n        switch status {\n        case errSecSuccess, errSecInteractionNotAllowed:\n            var query = options.query()\n            query[AttributeAccount] = key\n\n            var (attributes, error) = options.attributes(key: nil, value: value)\n            if let error = error {\n                print(error.localizedDescription)\n                throw error\n            }\n\n            options.attributes.forEach { attributes.updateValue($1, forKey: $0) }\n\n            #if os(iOS)\n            if status == errSecInteractionNotAllowed && floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_8_0) {\n                try remove(key)\n                try set(value, key: key)\n            } else {\n                status = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)\n                if status != errSecSuccess {\n                    throw securityError(status: status)\n                }\n            }\n            #else\n            status = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)\n            if status != errSecSuccess {\n                throw securityError(status: status)\n            }\n            #endif\n        case errSecItemNotFound:\n            var (attributes, error) = options.attributes(key: key, value: value)\n            if let error = error {\n                print(error.localizedDescription)\n                throw error\n            }\n\n            options.attributes.forEach { attributes.updateValue($1, forKey: $0) }\n\n            status = SecItemAdd(attributes as CFDictionary, nil)\n            if status != errSecSuccess {\n                throw securityError(status: status)\n            }\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    public subscript(key: String) -> String? {\n        get {\n            #if swift(>=5.0)\n            return try? get(key)\n            #else\n            return (try? get(key)).flatMap { $0 }\n            #endif\n        }\n\n        set {\n            if let value = newValue {\n                do {\n                    try set(value, key: key)\n                } catch {}\n            } else {\n                do {\n                    try remove(key)\n                } catch {}\n            }\n        }\n    }\n\n    public subscript(string key: String) -> String? {\n        get {\n            return self[key]\n        }\n\n        set {\n            self[key] = newValue\n        }\n    }\n\n    public subscript(data key: String) -> Data? {\n        get {\n            #if swift(>=5.0)\n            return try? getData(key)\n            #else\n            return (try? getData(key)).flatMap { $0 }\n            #endif\n        }\n\n        set {\n            if let value = newValue {\n                do {\n                    try set(value, key: key)\n                } catch {}\n            } else {\n                do {\n                    try remove(key)\n                } catch {}\n            }\n        }\n    }\n\n    public subscript(attributes key: String) -> Attributes? {\n        get {\n            #if swift(>=5.0)\n            return try? get(key) { $0 }\n            #else\n            return (try? get(key) { $0 }).flatMap { $0 }\n            #endif\n        }\n    }\n\n    // MARK:\n\n    public func remove(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n        query[AttributeAccount] = key\n\n        let status = SecItemDelete(query as CFDictionary)\n        if status != errSecSuccess && status != errSecItemNotFound {\n            throw securityError(status: status)\n        }\n    }\n\n    public func removeAll() throws {\n        var query = options.query()\n        #if !os(iOS) && !os(watchOS) && !os(tvOS)\n        query[MatchLimit] = MatchLimitAll\n        #endif\n\n        let status = SecItemDelete(query as CFDictionary)\n        if status != errSecSuccess && status != errSecItemNotFound {\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public func contains(_ key: String, withoutAuthenticationUI: Bool = false) throws -> Bool {\n        var query = options.query()\n        query[AttributeAccount] = key\n\n        if withoutAuthenticationUI {\n            #if os(iOS) || os(watchOS) || os(tvOS)\n            if #available(iOS 9.0, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                } else {\n                    query[UseAuthenticationUI] = UseAuthenticationUIFail\n                }\n            } else {\n                query[UseNoAuthenticationUI] = kCFBooleanTrue\n            }\n            #else\n            if #available(OSX 10.11, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                } else {\n                    query[UseAuthenticationUI] = UseAuthenticationUIFail\n                }\n            } else if #available(OSX 10.10, *) {\n                query[UseNoAuthenticationUI] = kCFBooleanTrue\n            }\n            #endif\n        } else {\n            if #available(iOS 9.0, OSX 10.11, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                }\n            }\n        }\n        \n        let status = SecItemCopyMatching(query as CFDictionary, nil)\n        switch status {\n        case errSecSuccess:\n                return true\n        case errSecInteractionNotAllowed:\n            if withoutAuthenticationUI {\n                return true\n            }\n            return false\n        case errSecItemNotFound:\n            return false\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public class func allKeys(_ itemClass: ItemClass) -> [(String, String)] {\n        var query = [String: Any]()\n        query[Class] = itemClass.rawValue\n        query[AttributeSynchronizable] = SynchronizableAny\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return prettify(itemClass: itemClass, items: items).map {\n                    switch itemClass {\n                    case .genericPassword:\n                        return (($0[\"service\"] ?? \"\") as! String, ($0[\"key\"] ?? \"\") as! String)\n                    case .internetPassword:\n                        return (($0[\"server\"] ?? \"\") as! String, ($0[\"key\"] ?? \"\") as! String)\n                    }\n                }\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    public func allKeys() -> [String] {\n        let allItems = type(of: self).prettify(itemClass: itemClass, items: items())\n        let filter: ([String: Any]) -> String? = { $0[\"key\"] as? String }\n\n        #if swift(>=4.1)\n            return allItems.compactMap(filter)\n        #else\n            return allItems.flatMap(filter)\n        #endif\n    }\n\n    public class func allItems(_ itemClass: ItemClass) -> [[String: Any]] {\n        var query = [String: Any]()\n        query[Class] = itemClass.rawValue\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n        #if os(iOS) || os(watchOS) || os(tvOS)\n        query[ReturnData] = kCFBooleanTrue\n        #endif\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return prettify(itemClass: itemClass, items: items)\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    public func allItems() -> [[String: Any]] {\n        return type(of: self).prettify(itemClass: itemClass, items: items())\n    }\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func getSharedPassword(_ completion: @escaping (_ account: String?, _ password: String?, _ error: Error?) -> () = { account, password, error -> () in }) {\n        if let domain = server.host {\n            type(of: self).requestSharedWebCredential(domain: domain, account: nil) { (credentials, error) -> () in\n                if let credential = credentials.first {\n                    let account = credential[\"account\"]\n                    let password = credential[\"password\"]\n                    completion(account, password, error)\n                } else {\n                    completion(nil, nil, error)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(nil, nil, error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func getSharedPassword(_ account: String, completion: @escaping (_ password: String?, _ error: Error?) -> () = { password, error -> () in }) {\n        if let domain = server.host {\n            type(of: self).requestSharedWebCredential(domain: domain, account: account) { (credentials, error) -> () in\n                if let credential = credentials.first {\n                    if let password = credential[\"password\"] {\n                        completion(password, error)\n                    } else {\n                        completion(nil, error)\n                    }\n                } else {\n                    completion(nil, error)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(nil, error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func setSharedPassword(_ password: String, account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        setSharedPassword(password as String?, account: account, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    fileprivate func setSharedPassword(_ password: String?, account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        if let domain = server.host {\n            SecAddSharedWebCredential(domain as CFString, account as CFString, password as CFString?) { error -> () in\n                if let error = error {\n                    completion(error.error)\n                } else {\n                    completion(nil)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func removeSharedPassword(_ account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        setSharedPassword(nil, account: account, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(_ completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: nil, account: nil, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(domain: String, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: domain, account: nil, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(domain: String, account: String, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: Optional(domain), account: Optional(account)!, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    fileprivate class func requestSharedWebCredential(domain: String?, account: String?, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> ()) {\n        SecRequestSharedWebCredential(domain as CFString?, account as CFString?) { (credentials, error) -> () in\n            var remoteError: NSError?\n            if let error = error {\n                remoteError = error.error\n                if remoteError?.code != Int(errSecItemNotFound) {\n                    print(\"error:[\\(remoteError!.code)] \\(remoteError!.localizedDescription)\")\n                }\n            }\n            if let credentials = credentials {\n                let credentials = (credentials as NSArray).map { credentials -> [String: String] in\n                    var credential = [String: String]()\n                    if let credentials = credentials as? [String: String] {\n                        if let server = credentials[AttributeServer] {\n                            credential[\"server\"] = server\n                        }\n                        if let account = credentials[AttributeAccount] {\n                            credential[\"account\"] = account\n                        }\n                        if let password = credentials[SharedPassword] {\n                            credential[\"password\"] = password\n                        }\n                    }\n                    return credential\n                }\n                completion(credentials, remoteError)\n            } else {\n                completion([], remoteError)\n            }\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    /**\n     @abstract Returns a randomly generated password.\n     @return String password in the form xxx-xxx-xxx-xxx where x is taken from the sets \"abcdefghkmnopqrstuvwxy\", \"ABCDEFGHJKLMNPQRSTUVWXYZ\", \"3456789\" with at least one character from each set being present.\n     */\n    @available(iOS 8.0, *)\n    public class func generatePassword() -> String {\n        return SecCreateSharedWebCredentialPassword()! as String\n    }\n    #endif\n\n    // MARK:\n\n    fileprivate func items() -> [[String: Any]] {\n        var query = options.query()\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n        #if os(iOS) || os(watchOS) || os(tvOS)\n        query[ReturnData] = kCFBooleanTrue\n        #endif\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return items\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    fileprivate class func prettify(itemClass: ItemClass, items: [[String: Any]]) -> [[String: Any]] {\n        let items = items.map { attributes -> [String: Any] in\n            var item = [String: Any]()\n\n            item[\"class\"] = itemClass.description\n            \n            if let accessGroup = attributes[AttributeAccessGroup] as? String {\n                item[\"accessGroup\"] = accessGroup\n            }\n\n            switch itemClass {\n            case .genericPassword:\n                if let service = attributes[AttributeService] as? String {\n                    item[\"service\"] = service\n                }\n            case .internetPassword:\n                if let server = attributes[AttributeServer] as? String {\n                    item[\"server\"] = server\n                }\n                if let proto = attributes[AttributeProtocol] as? String {\n                    if let protocolType = ProtocolType(rawValue: proto) {\n                        item[\"protocol\"] = protocolType.description\n                    }\n                }\n                if let auth = attributes[AttributeAuthenticationType] as? String {\n                    if let authenticationType = AuthenticationType(rawValue: auth) {\n                        item[\"authenticationType\"] = authenticationType.description\n                    }\n                }\n            }\n\n            if let key = attributes[AttributeAccount] as? String {\n                item[\"key\"] = key\n            }\n            if let data = attributes[ValueData] as? Data {\n                if let text = String(data: data, encoding: .utf8) {\n                    item[\"value\"] = text\n                } else  {\n                    item[\"value\"] = data\n                }\n            }\n\n            if let accessible = attributes[AttributeAccessible] as? String {\n                if let accessibility = Accessibility(rawValue: accessible) {\n                    item[\"accessibility\"] = accessibility.description\n                }\n            }\n            if let synchronizable = attributes[AttributeSynchronizable] as? Bool {\n                item[\"synchronizable\"] = synchronizable ? \"true\" : \"false\"\n            }\n\n            return item\n        }\n        return items\n    }\n\n    // MARK:\n\n    @discardableResult\n    fileprivate class func securityError(status: OSStatus) -> Error {\n        let error = Status(status: status)\n        if error != .userCanceled {\n            print(\"OSStatus error:[\\(error.errorCode)] \\(error.description)\")\n        }\n\n        return error\n    }\n\n    @discardableResult\n    fileprivate func securityError(status: OSStatus) -> Error {\n        return type(of: self).securityError(status: status)\n    }\n}\n\nstruct Options {\n    var itemClass: ItemClass = .genericPassword\n\n    var service: String = \"\"\n    var accessGroup: String? = nil\n\n    var server: URL!\n    var protocolType: ProtocolType!\n    var authenticationType: AuthenticationType = .default\n\n    var accessibility: Accessibility = .afterFirstUnlock\n    var authenticationPolicy: AuthenticationPolicy?\n\n    var synchronizable: Bool = false\n\n    var label: String?\n    var comment: String?\n\n    var authenticationPrompt: String?\n    var authenticationUI: AuthenticationUI?\n    var authenticationContext: AnyObject?\n\n    var attributes = [String: Any]()\n}\n\n/** Class Key Constant */\nprivate let Class = String(kSecClass)\n\n/** Attribute Key Constants */\nprivate let AttributeAccessible = String(kSecAttrAccessible)\n\n@available(iOS 8.0, OSX 10.10, *)\nprivate let AttributeAccessControl = String(kSecAttrAccessControl)\n\nprivate let AttributeAccessGroup = String(kSecAttrAccessGroup)\nprivate let AttributeSynchronizable = String(kSecAttrSynchronizable)\nprivate let AttributeCreationDate = String(kSecAttrCreationDate)\nprivate let AttributeModificationDate = String(kSecAttrModificationDate)\nprivate let AttributeDescription = String(kSecAttrDescription)\nprivate let AttributeComment = String(kSecAttrComment)\nprivate let AttributeCreator = String(kSecAttrCreator)\nprivate let AttributeType = String(kSecAttrType)\nprivate let AttributeLabel = String(kSecAttrLabel)\nprivate let AttributeIsInvisible = String(kSecAttrIsInvisible)\nprivate let AttributeIsNegative = String(kSecAttrIsNegative)\nprivate let AttributeAccount = String(kSecAttrAccount)\nprivate let AttributeService = String(kSecAttrService)\nprivate let AttributeGeneric = String(kSecAttrGeneric)\nprivate let AttributeSecurityDomain = String(kSecAttrSecurityDomain)\nprivate let AttributeServer = String(kSecAttrServer)\nprivate let AttributeProtocol = String(kSecAttrProtocol)\nprivate let AttributeAuthenticationType = String(kSecAttrAuthenticationType)\nprivate let AttributePort = String(kSecAttrPort)\nprivate let AttributePath = String(kSecAttrPath)\n\nprivate let SynchronizableAny = kSecAttrSynchronizableAny\n\n/** Search Constants */\nprivate let MatchLimit = String(kSecMatchLimit)\nprivate let MatchLimitOne = kSecMatchLimitOne\nprivate let MatchLimitAll = kSecMatchLimitAll\n\n/** Return Type Key Constants */\nprivate let ReturnData = String(kSecReturnData)\nprivate let ReturnAttributes = String(kSecReturnAttributes)\nprivate let ReturnRef = String(kSecReturnRef)\nprivate let ReturnPersistentRef = String(kSecReturnPersistentRef)\n\n/** Value Type Key Constants */\nprivate let ValueData = String(kSecValueData)\nprivate let ValueRef = String(kSecValueRef)\nprivate let ValuePersistentRef = String(kSecValuePersistentRef)\n\n/** Other Constants */\n@available(iOS 8.0, OSX 10.10, tvOS 8.0, *)\nprivate let UseOperationPrompt = String(kSecUseOperationPrompt)\n\n@available(iOS, introduced: 8.0, deprecated: 9.0, message: \"Use a UseAuthenticationUI instead.\")\n@available(OSX, introduced: 10.10, deprecated: 10.11, message: \"Use UseAuthenticationUI instead.\")\n@available(watchOS, introduced: 2.0, deprecated: 2.0, message: \"Use UseAuthenticationUI instead.\")\n@available(tvOS, introduced: 8.0, deprecated: 9.0, message: \"Use UseAuthenticationUI instead.\")\nprivate let UseNoAuthenticationUI = String(kSecUseNoAuthenticationUI)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUI = String(kSecUseAuthenticationUI)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationContext = String(kSecUseAuthenticationContext)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUIAllow = String(kSecUseAuthenticationUIAllow)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUIFail = String(kSecUseAuthenticationUIFail)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUISkip = String(kSecUseAuthenticationUISkip)\n\n#if os(iOS) && !targetEnvironment(macCatalyst)\n/** Credential Key Constants */\nprivate let SharedPassword = String(kSecSharedPassword)\n#endif\n\nextension Keychain: CustomStringConvertible, CustomDebugStringConvertible {\n    public var description: String {\n        let items = allItems()\n        if items.isEmpty {\n            return \"[]\"\n        }\n        var description = \"[\\n\"\n        for item in items {\n            description += \"  \"\n            description += \"\\(item)\\n\"\n        }\n        description += \"]\"\n        return description\n    }\n\n    public var debugDescription: String {\n        return \"\\(items())\"\n    }\n}\n\nextension Options {\n    func query(ignoringAttributeSynchronizable: Bool = true) -> [String: Any] {\n        var query = [String: Any]()\n\n        query[Class] = itemClass.rawValue\n        if let accessGroup = self.accessGroup {\n            query[AttributeAccessGroup] = accessGroup\n        }\n        if ignoringAttributeSynchronizable {\n            query[AttributeSynchronizable] = SynchronizableAny\n        } else {\n            query[AttributeSynchronizable] = synchronizable ? kCFBooleanTrue : kCFBooleanFalse\n        }\n\n        switch itemClass {\n        case .genericPassword:\n            query[AttributeService] = service\n        case .internetPassword:\n            query[AttributeServer] = server.host\n            query[AttributePort] = server.port\n            query[AttributeProtocol] = protocolType.rawValue\n            query[AttributeAuthenticationType] = authenticationType.rawValue\n        }\n\n        if #available(OSX 10.10, *) {\n            if authenticationPrompt != nil {\n                query[UseOperationPrompt] = authenticationPrompt\n            }\n        }\n\n        #if !os(watchOS)\n        if #available(iOS 9.0, OSX 10.11, *) {\n            if authenticationContext != nil {\n                query[UseAuthenticationContext] = authenticationContext\n            }\n        }\n        #endif\n\n        return query\n    }\n\n    func attributes(key: String?, value: Data) -> ([String: Any], Error?) {\n        var attributes: [String: Any]\n\n        if key != nil {\n            attributes = query()\n            attributes[AttributeAccount] = key\n        } else {\n            attributes = [String: Any]()\n        }\n\n        attributes[ValueData] = value\n\n        if label != nil {\n            attributes[AttributeLabel] = label\n        }\n        if comment != nil {\n            attributes[AttributeComment] = comment\n        }\n\n        if let policy = authenticationPolicy {\n            if #available(OSX 10.10, *) {\n                var error: Unmanaged<CFError>?\n                guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, SecAccessControlCreateFlags(rawValue: CFOptionFlags(policy.rawValue)), &error) else {\n                    if let error = error?.takeUnretainedValue() {\n                        return (attributes, error.error)\n                    }\n\n                    return (attributes, Status.unexpectedError)\n                }\n                attributes[AttributeAccessControl] = accessControl\n            } else {\n                print(\"Unavailable 'Touch ID integration' on OS X versions prior to 10.10.\")\n            }\n        } else {\n            attributes[AttributeAccessible] = accessibility.rawValue\n        }\n\n        attributes[AttributeSynchronizable] = synchronizable ? kCFBooleanTrue : kCFBooleanFalse\n\n        return (attributes, nil)\n    }\n}\n\n// MARK:\n\nextension Attributes: CustomStringConvertible, CustomDebugStringConvertible {\n    public var description: String {\n        return \"\\(attributes)\"\n    }\n\n    public var debugDescription: String {\n        return description\n    }\n}\n\nextension ItemClass: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecClassGenericPassword):\n            self = .genericPassword\n        case String(kSecClassInternetPassword):\n            self = .internetPassword\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .genericPassword:\n            return String(kSecClassGenericPassword)\n        case .internetPassword:\n            return String(kSecClassInternetPassword)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .genericPassword:\n            return \"GenericPassword\"\n        case .internetPassword:\n            return \"InternetPassword\"\n        }\n    }\n}\n\nextension ProtocolType: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecAttrProtocolFTP):\n            self = .ftp\n        case String(kSecAttrProtocolFTPAccount):\n            self = .ftpAccount\n        case String(kSecAttrProtocolHTTP):\n            self = .http\n        case String(kSecAttrProtocolIRC):\n            self = .irc\n        case String(kSecAttrProtocolNNTP):\n            self = .nntp\n        case String(kSecAttrProtocolPOP3):\n            self = .pop3\n        case String(kSecAttrProtocolSMTP):\n            self = .smtp\n        case String(kSecAttrProtocolSOCKS):\n            self = .socks\n        case String(kSecAttrProtocolIMAP):\n            self = .imap\n        case String(kSecAttrProtocolLDAP):\n            self = .ldap\n        case String(kSecAttrProtocolAppleTalk):\n            self = .appleTalk\n        case String(kSecAttrProtocolAFP):\n            self = .afp\n        case String(kSecAttrProtocolTelnet):\n            self = .telnet\n        case String(kSecAttrProtocolSSH):\n            self = .ssh\n        case String(kSecAttrProtocolFTPS):\n            self = .ftps\n        case String(kSecAttrProtocolHTTPS):\n            self = .https\n        case String(kSecAttrProtocolHTTPProxy):\n            self = .httpProxy\n        case String(kSecAttrProtocolHTTPSProxy):\n            self = .httpsProxy\n        case String(kSecAttrProtocolFTPProxy):\n            self = .ftpProxy\n        case String(kSecAttrProtocolSMB):\n            self = .smb\n        case String(kSecAttrProtocolRTSP):\n            self = .rtsp\n        case String(kSecAttrProtocolRTSPProxy):\n            self = .rtspProxy\n        case String(kSecAttrProtocolDAAP):\n            self = .daap\n        case String(kSecAttrProtocolEPPC):\n            self = .eppc\n        case String(kSecAttrProtocolIPP):\n            self = .ipp\n        case String(kSecAttrProtocolNNTPS):\n            self = .nntps\n        case String(kSecAttrProtocolLDAPS):\n            self = .ldaps\n        case String(kSecAttrProtocolTelnetS):\n            self = .telnetS\n        case String(kSecAttrProtocolIMAPS):\n            self = .imaps\n        case String(kSecAttrProtocolIRCS):\n            self = .ircs\n        case String(kSecAttrProtocolPOP3S):\n            self = .pop3S\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .ftp:\n            return String(kSecAttrProtocolFTP)\n        case .ftpAccount:\n            return String(kSecAttrProtocolFTPAccount)\n        case .http:\n            return String(kSecAttrProtocolHTTP)\n        case .irc:\n            return String(kSecAttrProtocolIRC)\n        case .nntp:\n            return String(kSecAttrProtocolNNTP)\n        case .pop3:\n            return String(kSecAttrProtocolPOP3)\n        case .smtp:\n            return String(kSecAttrProtocolSMTP)\n        case .socks:\n            return String(kSecAttrProtocolSOCKS)\n        case .imap:\n            return String(kSecAttrProtocolIMAP)\n        case .ldap:\n            return String(kSecAttrProtocolLDAP)\n        case .appleTalk:\n            return String(kSecAttrProtocolAppleTalk)\n        case .afp:\n            return String(kSecAttrProtocolAFP)\n        case .telnet:\n            return String(kSecAttrProtocolTelnet)\n        case .ssh:\n            return String(kSecAttrProtocolSSH)\n        case .ftps:\n            return String(kSecAttrProtocolFTPS)\n        case .https:\n            return String(kSecAttrProtocolHTTPS)\n        case .httpProxy:\n            return String(kSecAttrProtocolHTTPProxy)\n        case .httpsProxy:\n            return String(kSecAttrProtocolHTTPSProxy)\n        case .ftpProxy:\n            return String(kSecAttrProtocolFTPProxy)\n        case .smb:\n            return String(kSecAttrProtocolSMB)\n        case .rtsp:\n            return String(kSecAttrProtocolRTSP)\n        case .rtspProxy:\n            return String(kSecAttrProtocolRTSPProxy)\n        case .daap:\n            return String(kSecAttrProtocolDAAP)\n        case .eppc:\n            return String(kSecAttrProtocolEPPC)\n        case .ipp:\n            return String(kSecAttrProtocolIPP)\n        case .nntps:\n            return String(kSecAttrProtocolNNTPS)\n        case .ldaps:\n            return String(kSecAttrProtocolLDAPS)\n        case .telnetS:\n            return String(kSecAttrProtocolTelnetS)\n        case .imaps:\n            return String(kSecAttrProtocolIMAPS)\n        case .ircs:\n            return String(kSecAttrProtocolIRCS)\n        case .pop3S:\n            return String(kSecAttrProtocolPOP3S)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .ftp:\n            return \"FTP\"\n        case .ftpAccount:\n            return \"FTPAccount\"\n        case .http:\n            return \"HTTP\"\n        case .irc:\n            return \"IRC\"\n        case .nntp:\n            return \"NNTP\"\n        case .pop3:\n            return \"POP3\"\n        case .smtp:\n            return \"SMTP\"\n        case .socks:\n            return \"SOCKS\"\n        case .imap:\n            return \"IMAP\"\n        case .ldap:\n            return \"LDAP\"\n        case .appleTalk:\n            return \"AppleTalk\"\n        case .afp:\n            return \"AFP\"\n        case .telnet:\n            return \"Telnet\"\n        case .ssh:\n            return \"SSH\"\n        case .ftps:\n            return \"FTPS\"\n        case .https:\n            return \"HTTPS\"\n        case .httpProxy:\n            return \"HTTPProxy\"\n        case .httpsProxy:\n            return \"HTTPSProxy\"\n        case .ftpProxy:\n            return \"FTPProxy\"\n        case .smb:\n            return \"SMB\"\n        case .rtsp:\n            return \"RTSP\"\n        case .rtspProxy:\n            return \"RTSPProxy\"\n        case .daap:\n            return \"DAAP\"\n        case .eppc:\n            return \"EPPC\"\n        case .ipp:\n            return \"IPP\"\n        case .nntps:\n            return \"NNTPS\"\n        case .ldaps:\n            return \"LDAPS\"\n        case .telnetS:\n            return \"TelnetS\"\n        case .imaps:\n            return \"IMAPS\"\n        case .ircs:\n            return \"IRCS\"\n        case .pop3S:\n            return \"POP3S\"\n        }\n    }\n}\n\nextension AuthenticationType: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecAttrAuthenticationTypeNTLM):\n            self = .ntlm\n        case String(kSecAttrAuthenticationTypeMSN):\n            self = .msn\n        case String(kSecAttrAuthenticationTypeDPA):\n            self = .dpa\n        case String(kSecAttrAuthenticationTypeRPA):\n            self = .rpa\n        case String(kSecAttrAuthenticationTypeHTTPBasic):\n            self = .httpBasic\n        case String(kSecAttrAuthenticationTypeHTTPDigest):\n            self = .httpDigest\n        case String(kSecAttrAuthenticationTypeHTMLForm):\n            self = .htmlForm\n        case String(kSecAttrAuthenticationTypeDefault):\n            self = .`default`\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .ntlm:\n            return String(kSecAttrAuthenticationTypeNTLM)\n        case .msn:\n            return String(kSecAttrAuthenticationTypeMSN)\n        case .dpa:\n            return String(kSecAttrAuthenticationTypeDPA)\n        case .rpa:\n            return String(kSecAttrAuthenticationTypeRPA)\n        case .httpBasic:\n            return String(kSecAttrAuthenticationTypeHTTPBasic)\n        case .httpDigest:\n            return String(kSecAttrAuthenticationTypeHTTPDigest)\n        case .htmlForm:\n            return String(kSecAttrAuthenticationTypeHTMLForm)\n        case .`default`:\n            return String(kSecAttrAuthenticationTypeDefault)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .ntlm:\n            return \"NTLM\"\n        case .msn:\n            return \"MSN\"\n        case .dpa:\n            return \"DPA\"\n        case .rpa:\n            return \"RPA\"\n        case .httpBasic:\n            return \"HTTPBasic\"\n        case .httpDigest:\n            return \"HTTPDigest\"\n        case .htmlForm:\n            return \"HTMLForm\"\n        case .`default`:\n            return \"Default\"\n        }\n    }\n}\n\nextension Accessibility: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        if #available(OSX 10.10, *) {\n            switch rawValue {\n            case String(kSecAttrAccessibleWhenUnlocked):\n                self = .whenUnlocked\n            case String(kSecAttrAccessibleAfterFirstUnlock):\n                self = .afterFirstUnlock\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlways):\n                self = .always\n            #endif\n            case String(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly):\n                self = .whenPasscodeSetThisDeviceOnly\n            case String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly):\n                self = .whenUnlockedThisDeviceOnly\n            case String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly):\n                self = .afterFirstUnlockThisDeviceOnly\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlwaysThisDeviceOnly):\n                self = .alwaysThisDeviceOnly\n            #endif\n            default:\n                return nil\n            }\n        } else {\n            switch rawValue {\n            case String(kSecAttrAccessibleWhenUnlocked):\n                self = .whenUnlocked\n            case String(kSecAttrAccessibleAfterFirstUnlock):\n                self = .afterFirstUnlock\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlways):\n                self = .always\n            #endif\n            case String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly):\n                self = .whenUnlockedThisDeviceOnly\n            case String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly):\n                self = .afterFirstUnlockThisDeviceOnly\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlwaysThisDeviceOnly):\n                self = .alwaysThisDeviceOnly\n            #endif\n            default:\n                return nil\n            }\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .whenUnlocked:\n            return String(kSecAttrAccessibleWhenUnlocked)\n        case .afterFirstUnlock:\n            return String(kSecAttrAccessibleAfterFirstUnlock)\n        #if !targetEnvironment(macCatalyst)\n        case .always:\n            return String(kSecAttrAccessibleAlways)\n        #endif\n        case .whenPasscodeSetThisDeviceOnly:\n            if #available(OSX 10.10, *) {\n                return String(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly)\n            } else {\n                fatalError(\"'Accessibility.WhenPasscodeSetThisDeviceOnly' is not available on this version of OS.\")\n            }\n        case .whenUnlockedThisDeviceOnly:\n            return String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly)\n        case .afterFirstUnlockThisDeviceOnly:\n            return String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly)\n        #if !targetEnvironment(macCatalyst)\n        case .alwaysThisDeviceOnly:\n            return String(kSecAttrAccessibleAlwaysThisDeviceOnly)\n        #endif\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .whenUnlocked:\n            return \"WhenUnlocked\"\n        case .afterFirstUnlock:\n            return \"AfterFirstUnlock\"\n        #if !targetEnvironment(macCatalyst)\n        case .always:\n            return \"Always\"\n        #endif\n        case .whenPasscodeSetThisDeviceOnly:\n            return \"WhenPasscodeSetThisDeviceOnly\"\n        case .whenUnlockedThisDeviceOnly:\n            return \"WhenUnlockedThisDeviceOnly\"\n        case .afterFirstUnlockThisDeviceOnly:\n            return \"AfterFirstUnlockThisDeviceOnly\"\n        #if !targetEnvironment(macCatalyst)\n        case .alwaysThisDeviceOnly:\n            return \"AlwaysThisDeviceOnly\"\n        #endif\n        }\n    }\n}\n\nextension CFError {\n    var error: NSError {\n        let domain = CFErrorGetDomain(self) as String\n        let code = CFErrorGetCode(self)\n        let userInfo = CFErrorCopyUserInfo(self) as! [String: Any]\n\n        return NSError(domain: domain, code: code, userInfo: userInfo)\n    }\n}\n\npublic enum Status: OSStatus, Error {\n    case success                            = 0\n    case unimplemented                      = -4\n    case diskFull                           = -34\n    case io                                 = -36\n    case opWr                               = -49\n    case param                              = -50\n    case wrPerm                             = -61\n    case allocate                           = -108\n    case userCanceled                       = -128\n    case badReq                             = -909\n    case internalComponent                  = -2070\n    case notAvailable                       = -25291\n    case readOnly                           = -25292\n    case authFailed                         = -25293\n    case noSuchKeychain                     = -25294\n    case invalidKeychain                    = -25295\n    case duplicateKeychain                  = -25296\n    case duplicateCallback                  = -25297\n    case invalidCallback                    = -25298\n    case duplicateItem                      = -25299\n    case itemNotFound                       = -25300\n    case bufferTooSmall                     = -25301\n    case dataTooLarge                       = -25302\n    case noSuchAttr                         = -25303\n    case invalidItemRef                     = -25304\n    case invalidSearchRef                   = -25305\n    case noSuchClass                        = -25306\n    case noDefaultKeychain                  = -25307\n    case interactionNotAllowed              = -25308\n    case readOnlyAttr                       = -25309\n    case wrongSecVersion                    = -25310\n    case keySizeNotAllowed                  = -25311\n    case noStorageModule                    = -25312\n    case noCertificateModule                = -25313\n    case noPolicyModule                     = -25314\n    case interactionRequired                = -25315\n    case dataNotAvailable                   = -25316\n    case dataNotModifiable                  = -25317\n    case createChainFailed                  = -25318\n    case invalidPrefsDomain                 = -25319\n    case inDarkWake                         = -25320\n    case aclNotSimple                       = -25240\n    case policyNotFound                     = -25241\n    case invalidTrustSetting                = -25242\n    case noAccessForItem                    = -25243\n    case invalidOwnerEdit                   = -25244\n    case trustNotAvailable                  = -25245\n    case unsupportedFormat                  = -25256\n    case unknownFormat                      = -25257\n    case keyIsSensitive                     = -25258\n    case multiplePrivKeys                   = -25259\n    case passphraseRequired                 = -25260\n    case invalidPasswordRef                 = -25261\n    case invalidTrustSettings               = -25262\n    case noTrustSettings                    = -25263\n    case pkcs12VerifyFailure                = -25264\n    case invalidCertificate                 = -26265\n    case notSigner                          = -26267\n    case policyDenied                       = -26270\n    case invalidKey                         = -26274\n    case decode                             = -26275\n    case `internal`                         = -26276\n    case unsupportedAlgorithm               = -26268\n    case unsupportedOperation               = -26271\n    case unsupportedPadding                 = -26273\n    case itemInvalidKey                     = -34000\n    case itemInvalidKeyType                 = -34001\n    case itemInvalidValue                   = -34002\n    case itemClassMissing                   = -34003\n    case itemMatchUnsupported               = -34004\n    case useItemListUnsupported             = -34005\n    case useKeychainUnsupported             = -34006\n    case useKeychainListUnsupported         = -34007\n    case returnDataUnsupported              = -34008\n    case returnAttributesUnsupported        = -34009\n    case returnRefUnsupported               = -34010\n    case returnPersitentRefUnsupported      = -34011\n    case valueRefUnsupported                = -34012\n    case valuePersistentRefUnsupported      = -34013\n    case returnMissingPointer               = -34014\n    case matchLimitUnsupported              = -34015\n    case itemIllegalQuery                   = -34016\n    case waitForCallback                    = -34017\n    case missingEntitlement                 = -34018\n    case upgradePending                     = -34019\n    case mpSignatureInvalid                 = -25327\n    case otrTooOld                          = -25328\n    case otrIDTooNew                        = -25329\n    case serviceNotAvailable                = -67585\n    case insufficientClientID               = -67586\n    case deviceReset                        = -67587\n    case deviceFailed                       = -67588\n    case appleAddAppACLSubject              = -67589\n    case applePublicKeyIncomplete           = -67590\n    case appleSignatureMismatch             = -67591\n    case appleInvalidKeyStartDate           = -67592\n    case appleInvalidKeyEndDate             = -67593\n    case conversionError                    = -67594\n    case appleSSLv2Rollback                 = -67595\n    case quotaExceeded                      = -67596\n    case fileTooBig                         = -67597\n    case invalidDatabaseBlob                = -67598\n    case invalidKeyBlob                     = -67599\n    case incompatibleDatabaseBlob           = -67600\n    case incompatibleKeyBlob                = -67601\n    case hostNameMismatch                   = -67602\n    case unknownCriticalExtensionFlag       = -67603\n    case noBasicConstraints                 = -67604\n    case noBasicConstraintsCA               = -67605\n    case invalidAuthorityKeyID              = -67606\n    case invalidSubjectKeyID                = -67607\n    case invalidKeyUsageForPolicy           = -67608\n    case invalidExtendedKeyUsage            = -67609\n    case invalidIDLinkage                   = -67610\n    case pathLengthConstraintExceeded       = -67611\n    case invalidRoot                        = -67612\n    case crlExpired                         = -67613\n    case crlNotValidYet                     = -67614\n    case crlNotFound                        = -67615\n    case crlServerDown                      = -67616\n    case crlBadURI                          = -67617\n    case unknownCertExtension               = -67618\n    case unknownCRLExtension                = -67619\n    case crlNotTrusted                      = -67620\n    case crlPolicyFailed                    = -67621\n    case idpFailure                         = -67622\n    case smimeEmailAddressesNotFound        = -67623\n    case smimeBadExtendedKeyUsage           = -67624\n    case smimeBadKeyUsage                   = -67625\n    case smimeKeyUsageNotCritical           = -67626\n    case smimeNoEmailAddress                = -67627\n    case smimeSubjAltNameNotCritical        = -67628\n    case sslBadExtendedKeyUsage             = -67629\n    case ocspBadResponse                    = -67630\n    case ocspBadRequest                     = -67631\n    case ocspUnavailable                    = -67632\n    case ocspStatusUnrecognized             = -67633\n    case endOfData                          = -67634\n    case incompleteCertRevocationCheck      = -67635\n    case networkFailure                     = -67636\n    case ocspNotTrustedToAnchor             = -67637\n    case recordModified                     = -67638\n    case ocspSignatureError                 = -67639\n    case ocspNoSigner                       = -67640\n    case ocspResponderMalformedReq          = -67641\n    case ocspResponderInternalError         = -67642\n    case ocspResponderTryLater              = -67643\n    case ocspResponderSignatureRequired     = -67644\n    case ocspResponderUnauthorized          = -67645\n    case ocspResponseNonceMismatch          = -67646\n    case codeSigningBadCertChainLength      = -67647\n    case codeSigningNoBasicConstraints      = -67648\n    case codeSigningBadPathLengthConstraint = -67649\n    case codeSigningNoExtendedKeyUsage      = -67650\n    case codeSigningDevelopment             = -67651\n    case resourceSignBadCertChainLength     = -67652\n    case resourceSignBadExtKeyUsage         = -67653\n    case trustSettingDeny                   = -67654\n    case invalidSubjectName                 = -67655\n    case unknownQualifiedCertStatement      = -67656\n    case mobileMeRequestQueued              = -67657\n    case mobileMeRequestRedirected          = -67658\n    case mobileMeServerError                = -67659\n    case mobileMeServerNotAvailable         = -67660\n    case mobileMeServerAlreadyExists        = -67661\n    case mobileMeServerServiceErr           = -67662\n    case mobileMeRequestAlreadyPending      = -67663\n    case mobileMeNoRequestPending           = -67664\n    case mobileMeCSRVerifyFailure           = -67665\n    case mobileMeFailedConsistencyCheck     = -67666\n    case notInitialized                     = -67667\n    case invalidHandleUsage                 = -67668\n    case pvcReferentNotFound                = -67669\n    case functionIntegrityFail              = -67670\n    case internalError                      = -67671\n    case memoryError                        = -67672\n    case invalidData                        = -67673\n    case mdsError                           = -67674\n    case invalidPointer                     = -67675\n    case selfCheckFailed                    = -67676\n    case functionFailed                     = -67677\n    case moduleManifestVerifyFailed         = -67678\n    case invalidGUID                        = -67679\n    case invalidHandle                      = -67680\n    case invalidDBList                      = -67681\n    case invalidPassthroughID               = -67682\n    case invalidNetworkAddress              = -67683\n    case crlAlreadySigned                   = -67684\n    case invalidNumberOfFields              = -67685\n    case verificationFailure                = -67686\n    case unknownTag                         = -67687\n    case invalidSignature                   = -67688\n    case invalidName                        = -67689\n    case invalidCertificateRef              = -67690\n    case invalidCertificateGroup            = -67691\n    case tagNotFound                        = -67692\n    case invalidQuery                       = -67693\n    case invalidValue                       = -67694\n    case callbackFailed                     = -67695\n    case aclDeleteFailed                    = -67696\n    case aclReplaceFailed                   = -67697\n    case aclAddFailed                       = -67698\n    case aclChangeFailed                    = -67699\n    case invalidAccessCredentials           = -67700\n    case invalidRecord                      = -67701\n    case invalidACL                         = -67702\n    case invalidSampleValue                 = -67703\n    case incompatibleVersion                = -67704\n    case privilegeNotGranted                = -67705\n    case invalidScope                       = -67706\n    case pvcAlreadyConfigured               = -67707\n    case invalidPVC                         = -67708\n    case emmLoadFailed                      = -67709\n    case emmUnloadFailed                    = -67710\n    case addinLoadFailed                    = -67711\n    case invalidKeyRef                      = -67712\n    case invalidKeyHierarchy                = -67713\n    case addinUnloadFailed                  = -67714\n    case libraryReferenceNotFound           = -67715\n    case invalidAddinFunctionTable          = -67716\n    case invalidServiceMask                 = -67717\n    case moduleNotLoaded                    = -67718\n    case invalidSubServiceID                = -67719\n    case attributeNotInContext              = -67720\n    case moduleManagerInitializeFailed      = -67721\n    case moduleManagerNotFound              = -67722\n    case eventNotificationCallbackNotFound  = -67723\n    case inputLengthError                   = -67724\n    case outputLengthError                  = -67725\n    case privilegeNotSupported              = -67726\n    case deviceError                        = -67727\n    case attachHandleBusy                   = -67728\n    case notLoggedIn                        = -67729\n    case algorithmMismatch                  = -67730\n    case keyUsageIncorrect                  = -67731\n    case keyBlobTypeIncorrect               = -67732\n    case keyHeaderInconsistent              = -67733\n    case unsupportedKeyFormat               = -67734\n    case unsupportedKeySize                 = -67735\n    case invalidKeyUsageMask                = -67736\n    case unsupportedKeyUsageMask            = -67737\n    case invalidKeyAttributeMask            = -67738\n    case unsupportedKeyAttributeMask        = -67739\n    case invalidKeyLabel                    = -67740\n    case unsupportedKeyLabel                = -67741\n    case invalidKeyFormat                   = -67742\n    case unsupportedVectorOfBuffers         = -67743\n    case invalidInputVector                 = -67744\n    case invalidOutputVector                = -67745\n    case invalidContext                     = -67746\n    case invalidAlgorithm                   = -67747\n    case invalidAttributeKey                = -67748\n    case missingAttributeKey                = -67749\n    case invalidAttributeInitVector         = -67750\n    case missingAttributeInitVector         = -67751\n    case invalidAttributeSalt               = -67752\n    case missingAttributeSalt               = -67753\n    case invalidAttributePadding            = -67754\n    case missingAttributePadding            = -67755\n    case invalidAttributeRandom             = -67756\n    case missingAttributeRandom             = -67757\n    case invalidAttributeSeed               = -67758\n    case missingAttributeSeed               = -67759\n    case invalidAttributePassphrase         = -67760\n    case missingAttributePassphrase         = -67761\n    case invalidAttributeKeyLength          = -67762\n    case missingAttributeKeyLength          = -67763\n    case invalidAttributeBlockSize          = -67764\n    case missingAttributeBlockSize          = -67765\n    case invalidAttributeOutputSize         = -67766\n    case missingAttributeOutputSize         = -67767\n    case invalidAttributeRounds             = -67768\n    case missingAttributeRounds             = -67769\n    case invalidAlgorithmParms              = -67770\n    case missingAlgorithmParms              = -67771\n    case invalidAttributeLabel              = -67772\n    case missingAttributeLabel              = -67773\n    case invalidAttributeKeyType            = -67774\n    case missingAttributeKeyType            = -67775\n    case invalidAttributeMode               = -67776\n    case missingAttributeMode               = -67777\n    case invalidAttributeEffectiveBits      = -67778\n    case missingAttributeEffectiveBits      = -67779\n    case invalidAttributeStartDate          = -67780\n    case missingAttributeStartDate          = -67781\n    case invalidAttributeEndDate            = -67782\n    case missingAttributeEndDate            = -67783\n    case invalidAttributeVersion            = -67784\n    case missingAttributeVersion            = -67785\n    case invalidAttributePrime              = -67786\n    case missingAttributePrime              = -67787\n    case invalidAttributeBase               = -67788\n    case missingAttributeBase               = -67789\n    case invalidAttributeSubprime           = -67790\n    case missingAttributeSubprime           = -67791\n    case invalidAttributeIterationCount     = -67792\n    case missingAttributeIterationCount     = -67793\n    case invalidAttributeDLDBHandle         = -67794\n    case missingAttributeDLDBHandle         = -67795\n    case invalidAttributeAccessCredentials  = -67796\n    case missingAttributeAccessCredentials  = -67797\n    case invalidAttributePublicKeyFormat    = -67798\n    case missingAttributePublicKeyFormat    = -67799\n    case invalidAttributePrivateKeyFormat   = -67800\n    case missingAttributePrivateKeyFormat   = -67801\n    case invalidAttributeSymmetricKeyFormat = -67802\n    case missingAttributeSymmetricKeyFormat = -67803\n    case invalidAttributeWrappedKeyFormat   = -67804\n    case missingAttributeWrappedKeyFormat   = -67805\n    case stagedOperationInProgress          = -67806\n    case stagedOperationNotStarted          = -67807\n    case verifyFailed                       = -67808\n    case querySizeUnknown                   = -67809\n    case blockSizeMismatch                  = -67810\n    case publicKeyInconsistent              = -67811\n    case deviceVerifyFailed                 = -67812\n    case invalidLoginName                   = -67813\n    case alreadyLoggedIn                    = -67814\n    case invalidDigestAlgorithm             = -67815\n    case invalidCRLGroup                    = -67816\n    case certificateCannotOperate           = -67817\n    case certificateExpired                 = -67818\n    case certificateNotValidYet             = -67819\n    case certificateRevoked                 = -67820\n    case certificateSuspended               = -67821\n    case insufficientCredentials            = -67822\n    case invalidAction                      = -67823\n    case invalidAuthority                   = -67824\n    case verifyActionFailed                 = -67825\n    case invalidCertAuthority               = -67826\n    case invaldCRLAuthority                 = -67827\n    case invalidCRLEncoding                 = -67828\n    case invalidCRLType                     = -67829\n    case invalidCRL                         = -67830\n    case invalidFormType                    = -67831\n    case invalidID                          = -67832\n    case invalidIdentifier                  = -67833\n    case invalidIndex                       = -67834\n    case invalidPolicyIdentifiers           = -67835\n    case invalidTimeString                  = -67836\n    case invalidReason                      = -67837\n    case invalidRequestInputs               = -67838\n    case invalidResponseVector              = -67839\n    case invalidStopOnPolicy                = -67840\n    case invalidTuple                       = -67841\n    case multipleValuesUnsupported          = -67842\n    case notTrusted                         = -67843\n    case noDefaultAuthority                 = -67844\n    case rejectedForm                       = -67845\n    case requestLost                        = -67846\n    case requestRejected                    = -67847\n    case unsupportedAddressType             = -67848\n    case unsupportedService                 = -67849\n    case invalidTupleGroup                  = -67850\n    case invalidBaseACLs                    = -67851\n    case invalidTupleCredendtials           = -67852\n    case invalidEncoding                    = -67853\n    case invalidValidityPeriod              = -67854\n    case invalidRequestor                   = -67855\n    case requestDescriptor                  = -67856\n    case invalidBundleInfo                  = -67857\n    case invalidCRLIndex                    = -67858\n    case noFieldValues                      = -67859\n    case unsupportedFieldFormat             = -67860\n    case unsupportedIndexInfo               = -67861\n    case unsupportedLocality                = -67862\n    case unsupportedNumAttributes           = -67863\n    case unsupportedNumIndexes              = -67864\n    case unsupportedNumRecordTypes          = -67865\n    case fieldSpecifiedMultiple             = -67866\n    case incompatibleFieldFormat            = -67867\n    case invalidParsingModule               = -67868\n    case databaseLocked                     = -67869\n    case datastoreIsOpen                    = -67870\n    case missingValue                       = -67871\n    case unsupportedQueryLimits             = -67872\n    case unsupportedNumSelectionPreds       = -67873\n    case unsupportedOperator                = -67874\n    case invalidDBLocation                  = -67875\n    case invalidAccessRequest               = -67876\n    case invalidIndexInfo                   = -67877\n    case invalidNewOwner                    = -67878\n    case invalidModifyMode                  = -67879\n    case missingRequiredExtension           = -67880\n    case extendedKeyUsageNotCritical        = -67881\n    case timestampMissing                   = -67882\n    case timestampInvalid                   = -67883\n    case timestampNotTrusted                = -67884\n    case timestampServiceNotAvailable       = -67885\n    case timestampBadAlg                    = -67886\n    case timestampBadRequest                = -67887\n    case timestampBadDataFormat             = -67888\n    case timestampTimeNotAvailable          = -67889\n    case timestampUnacceptedPolicy          = -67890\n    case timestampUnacceptedExtension       = -67891\n    case timestampAddInfoNotAvailable       = -67892\n    case timestampSystemFailure             = -67893\n    case signingTimeMissing                 = -67894\n    case timestampRejection                 = -67895\n    case timestampWaiting                   = -67896\n    case timestampRevocationWarning         = -67897\n    case timestampRevocationNotification    = -67898\n    case unexpectedError                    = -99999\n}\n\nextension Status: RawRepresentable, CustomStringConvertible {\n\n    public init(status: OSStatus) {\n        if let mappedStatus = Status(rawValue: status) {\n            self = mappedStatus\n        } else {\n            self = .unexpectedError\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .success:\n            return \"No error.\"\n        case .unimplemented:\n            return \"Function or operation not implemented.\"\n        case .diskFull:\n            return \"The disk is full.\"\n        case .io:\n            return \"I/O error (bummers)\"\n        case .opWr:\n            return \"file already open with with write permission\"\n        case .param:\n            return \"One or more parameters passed to a function were not valid.\"\n        case .wrPerm:\n            return \"write permissions error\"\n        case .allocate:\n            return \"Failed to allocate memory.\"\n        case .userCanceled:\n            return \"User canceled the operation.\"\n        case .badReq:\n            return \"Bad parameter or invalid state for operation.\"\n        case .internalComponent:\n            return \"\"\n        case .notAvailable:\n            return \"No keychain is available. You may need to restart your computer.\"\n        case .readOnly:\n            return \"This keychain cannot be modified.\"\n        case .authFailed:\n            return \"The user name or passphrase you entered is not correct.\"\n        case .noSuchKeychain:\n            return \"The specified keychain could not be found.\"\n        case .invalidKeychain:\n            return \"The specified keychain is not a valid keychain file.\"\n        case .duplicateKeychain:\n            return \"A keychain with the same name already exists.\"\n        case .duplicateCallback:\n            return \"The specified callback function is already installed.\"\n        case .invalidCallback:\n            return \"The specified callback function is not valid.\"\n        case .duplicateItem:\n            return \"The specified item already exists in the keychain.\"\n        case .itemNotFound:\n            return \"The specified item could not be found in the keychain.\"\n        case .bufferTooSmall:\n            return \"There is not enough memory available to use the specified item.\"\n        case .dataTooLarge:\n            return \"This item contains information which is too large or in a format that cannot be displayed.\"\n        case .noSuchAttr:\n            return \"The specified attribute does not exist.\"\n        case .invalidItemRef:\n            return \"The specified item is no longer valid. It may have been deleted from the keychain.\"\n        case .invalidSearchRef:\n            return \"Unable to search the current keychain.\"\n        case .noSuchClass:\n            return \"The specified item does not appear to be a valid keychain item.\"\n        case .noDefaultKeychain:\n            return \"A default keychain could not be found.\"\n        case .interactionNotAllowed:\n            return \"User interaction is not allowed.\"\n        case .readOnlyAttr:\n            return \"The specified attribute could not be modified.\"\n        case .wrongSecVersion:\n            return \"This keychain was created by a different version of the system software and cannot be opened.\"\n        case .keySizeNotAllowed:\n            return \"This item specifies a key size which is too large.\"\n        case .noStorageModule:\n            return \"A required component (data storage module) could not be loaded. You may need to restart your computer.\"\n        case .noCertificateModule:\n            return \"A required component (certificate module) could not be loaded. You may need to restart your computer.\"\n        case .noPolicyModule:\n            return \"A required component (policy module) could not be loaded. You may need to restart your computer.\"\n        case .interactionRequired:\n            return \"User interaction is required, but is currently not allowed.\"\n        case .dataNotAvailable:\n            return \"The contents of this item cannot be retrieved.\"\n        case .dataNotModifiable:\n            return \"The contents of this item cannot be modified.\"\n        case .createChainFailed:\n            return \"One or more certificates required to validate this certificate cannot be found.\"\n        case .invalidPrefsDomain:\n            return \"The specified preferences domain is not valid.\"\n        case .inDarkWake:\n            return \"In dark wake, no UI possible\"\n        case .aclNotSimple:\n            return \"The specified access control list is not in standard (simple) form.\"\n        case .policyNotFound:\n            return \"The specified policy cannot be found.\"\n        case .invalidTrustSetting:\n            return \"The specified trust setting is invalid.\"\n        case .noAccessForItem:\n            return \"The specified item has no access control.\"\n        case .invalidOwnerEdit:\n            return \"Invalid attempt to change the owner of this item.\"\n        case .trustNotAvailable:\n            return \"No trust results are available.\"\n        case .unsupportedFormat:\n            return \"Import/Export format unsupported.\"\n        case .unknownFormat:\n            return \"Unknown format in import.\"\n        case .keyIsSensitive:\n            return \"Key material must be wrapped for export.\"\n        case .multiplePrivKeys:\n            return \"An attempt was made to import multiple private keys.\"\n        case .passphraseRequired:\n            return \"Passphrase is required for import/export.\"\n        case .invalidPasswordRef:\n            return \"The password reference was invalid.\"\n        case .invalidTrustSettings:\n            return \"The Trust Settings Record was corrupted.\"\n        case .noTrustSettings:\n            return \"No Trust Settings were found.\"\n        case .pkcs12VerifyFailure:\n            return \"MAC verification failed during PKCS12 import (wrong password?)\"\n        case .invalidCertificate:\n            return \"This certificate could not be decoded.\"\n        case .notSigner:\n            return \"A certificate was not signed by its proposed parent.\"\n        case .policyDenied:\n            return \"The certificate chain was not trusted due to a policy not accepting it.\"\n        case .invalidKey:\n            return \"The provided key material was not valid.\"\n        case .decode:\n            return \"Unable to decode the provided data.\"\n        case .`internal`:\n            return \"An internal error occurred in the Security framework.\"\n        case .unsupportedAlgorithm:\n            return \"An unsupported algorithm was encountered.\"\n        case .unsupportedOperation:\n            return \"The operation you requested is not supported by this key.\"\n        case .unsupportedPadding:\n            return \"The padding you requested is not supported.\"\n        case .itemInvalidKey:\n            return \"A string key in dictionary is not one of the supported keys.\"\n        case .itemInvalidKeyType:\n            return \"A key in a dictionary is neither a CFStringRef nor a CFNumberRef.\"\n        case .itemInvalidValue:\n            return \"A value in a dictionary is an invalid (or unsupported) CF type.\"\n        case .itemClassMissing:\n            return \"No kSecItemClass key was specified in a dictionary.\"\n        case .itemMatchUnsupported:\n            return \"The caller passed one or more kSecMatch keys to a function which does not support matches.\"\n        case .useItemListUnsupported:\n            return \"The caller passed in a kSecUseItemList key to a function which does not support it.\"\n        case .useKeychainUnsupported:\n            return \"The caller passed in a kSecUseKeychain key to a function which does not support it.\"\n        case .useKeychainListUnsupported:\n            return \"The caller passed in a kSecUseKeychainList key to a function which does not support it.\"\n        case .returnDataUnsupported:\n            return \"The caller passed in a kSecReturnData key to a function which does not support it.\"\n        case .returnAttributesUnsupported:\n            return \"The caller passed in a kSecReturnAttributes key to a function which does not support it.\"\n        case .returnRefUnsupported:\n            return \"The caller passed in a kSecReturnRef key to a function which does not support it.\"\n        case .returnPersitentRefUnsupported:\n            return \"The caller passed in a kSecReturnPersistentRef key to a function which does not support it.\"\n        case .valueRefUnsupported:\n            return \"The caller passed in a kSecValueRef key to a function which does not support it.\"\n        case .valuePersistentRefUnsupported:\n            return \"The caller passed in a kSecValuePersistentRef key to a function which does not support it.\"\n        case .returnMissingPointer:\n            return \"The caller passed asked for something to be returned but did not pass in a result pointer.\"\n        case .matchLimitUnsupported:\n            return \"The caller passed in a kSecMatchLimit key to a call which does not support limits.\"\n        case .itemIllegalQuery:\n            return \"The caller passed in a query which contained too many keys.\"\n        case .waitForCallback:\n            return \"This operation is incomplete, until the callback is invoked (not an error).\"\n        case .missingEntitlement:\n            return \"Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.\"\n        case .upgradePending:\n            return \"Error returned if keychain database needs a schema migration but the device is locked, clients should wait for a device unlock notification and retry the command.\"\n        case .mpSignatureInvalid:\n            return \"Signature invalid on MP message\"\n        case .otrTooOld:\n            return \"Message is too old to use\"\n        case .otrIDTooNew:\n            return \"Key ID is too new to use! Message from the future?\"\n        case .serviceNotAvailable:\n            return \"The required service is not available.\"\n        case .insufficientClientID:\n            return \"The client ID is not correct.\"\n        case .deviceReset:\n            return \"A device reset has occurred.\"\n        case .deviceFailed:\n            return \"A device failure has occurred.\"\n        case .appleAddAppACLSubject:\n            return \"Adding an application ACL subject failed.\"\n        case .applePublicKeyIncomplete:\n            return \"The public key is incomplete.\"\n        case .appleSignatureMismatch:\n            return \"A signature mismatch has occurred.\"\n        case .appleInvalidKeyStartDate:\n            return \"The specified key has an invalid start date.\"\n        case .appleInvalidKeyEndDate:\n            return \"The specified key has an invalid end date.\"\n        case .conversionError:\n            return \"A conversion error has occurred.\"\n        case .appleSSLv2Rollback:\n            return \"A SSLv2 rollback error has occurred.\"\n        case .quotaExceeded:\n            return \"The quota was exceeded.\"\n        case .fileTooBig:\n            return \"The file is too big.\"\n        case .invalidDatabaseBlob:\n            return \"The specified database has an invalid blob.\"\n        case .invalidKeyBlob:\n            return \"The specified database has an invalid key blob.\"\n        case .incompatibleDatabaseBlob:\n            return \"The specified database has an incompatible blob.\"\n        case .incompatibleKeyBlob:\n            return \"The specified database has an incompatible key blob.\"\n        case .hostNameMismatch:\n            return \"A host name mismatch has occurred.\"\n        case .unknownCriticalExtensionFlag:\n            return \"There is an unknown critical extension flag.\"\n        case .noBasicConstraints:\n            return \"No basic constraints were found.\"\n        case .noBasicConstraintsCA:\n            return \"No basic CA constraints were found.\"\n        case .invalidAuthorityKeyID:\n            return \"The authority key ID is not valid.\"\n        case .invalidSubjectKeyID:\n            return \"The subject key ID is not valid.\"\n        case .invalidKeyUsageForPolicy:\n            return \"The key usage is not valid for the specified policy.\"\n        case .invalidExtendedKeyUsage:\n            return \"The extended key usage is not valid.\"\n        case .invalidIDLinkage:\n            return \"The ID linkage is not valid.\"\n        case .pathLengthConstraintExceeded:\n            return \"The path length constraint was exceeded.\"\n        case .invalidRoot:\n            return \"The root or anchor certificate is not valid.\"\n        case .crlExpired:\n            return \"The CRL has expired.\"\n        case .crlNotValidYet:\n            return \"The CRL is not yet valid.\"\n        case .crlNotFound:\n            return \"The CRL was not found.\"\n        case .crlServerDown:\n            return \"The CRL server is down.\"\n        case .crlBadURI:\n            return \"The CRL has a bad Uniform Resource Identifier.\"\n        case .unknownCertExtension:\n            return \"An unknown certificate extension was encountered.\"\n        case .unknownCRLExtension:\n            return \"An unknown CRL extension was encountered.\"\n        case .crlNotTrusted:\n            return \"The CRL is not trusted.\"\n        case .crlPolicyFailed:\n            return \"The CRL policy failed.\"\n        case .idpFailure:\n            return \"The issuing distribution point was not valid.\"\n        case .smimeEmailAddressesNotFound:\n            return \"An email address mismatch was encountered.\"\n        case .smimeBadExtendedKeyUsage:\n            return \"The appropriate extended key usage for SMIME was not found.\"\n        case .smimeBadKeyUsage:\n            return \"The key usage is not compatible with SMIME.\"\n        case .smimeKeyUsageNotCritical:\n            return \"The key usage extension is not marked as critical.\"\n        case .smimeNoEmailAddress:\n            return \"No email address was found in the certificate.\"\n        case .smimeSubjAltNameNotCritical:\n            return \"The subject alternative name extension is not marked as critical.\"\n        case .sslBadExtendedKeyUsage:\n            return \"The appropriate extended key usage for SSL was not found.\"\n        case .ocspBadResponse:\n            return \"The OCSP response was incorrect or could not be parsed.\"\n        case .ocspBadRequest:\n            return \"The OCSP request was incorrect or could not be parsed.\"\n        case .ocspUnavailable:\n            return \"OCSP service is unavailable.\"\n        case .ocspStatusUnrecognized:\n            return \"The OCSP server did not recognize this certificate.\"\n        case .endOfData:\n            return \"An end-of-data was detected.\"\n        case .incompleteCertRevocationCheck:\n            return \"An incomplete certificate revocation check occurred.\"\n        case .networkFailure:\n            return \"A network failure occurred.\"\n        case .ocspNotTrustedToAnchor:\n            return \"The OCSP response was not trusted to a root or anchor certificate.\"\n        case .recordModified:\n            return \"The record was modified.\"\n        case .ocspSignatureError:\n            return \"The OCSP response had an invalid signature.\"\n        case .ocspNoSigner:\n            return \"The OCSP response had no signer.\"\n        case .ocspResponderMalformedReq:\n            return \"The OCSP responder was given a malformed request.\"\n        case .ocspResponderInternalError:\n            return \"The OCSP responder encountered an internal error.\"\n        case .ocspResponderTryLater:\n            return \"The OCSP responder is busy, try again later.\"\n        case .ocspResponderSignatureRequired:\n            return \"The OCSP responder requires a signature.\"\n        case .ocspResponderUnauthorized:\n            return \"The OCSP responder rejected this request as unauthorized.\"\n        case .ocspResponseNonceMismatch:\n            return \"The OCSP response nonce did not match the request.\"\n        case .codeSigningBadCertChainLength:\n            return \"Code signing encountered an incorrect certificate chain length.\"\n        case .codeSigningNoBasicConstraints:\n            return \"Code signing found no basic constraints.\"\n        case .codeSigningBadPathLengthConstraint:\n            return \"Code signing encountered an incorrect path length constraint.\"\n        case .codeSigningNoExtendedKeyUsage:\n            return \"Code signing found no extended key usage.\"\n        case .codeSigningDevelopment:\n            return \"Code signing indicated use of a development-only certificate.\"\n        case .resourceSignBadCertChainLength:\n            return \"Resource signing has encountered an incorrect certificate chain length.\"\n        case .resourceSignBadExtKeyUsage:\n            return \"Resource signing has encountered an error in the extended key usage.\"\n        case .trustSettingDeny:\n            return \"The trust setting for this policy was set to Deny.\"\n        case .invalidSubjectName:\n            return \"An invalid certificate subject name was encountered.\"\n        case .unknownQualifiedCertStatement:\n            return \"An unknown qualified certificate statement was encountered.\"\n        case .mobileMeRequestQueued:\n            return \"The MobileMe request will be sent during the next connection.\"\n        case .mobileMeRequestRedirected:\n            return \"The MobileMe request was redirected.\"\n        case .mobileMeServerError:\n            return \"A MobileMe server error occurred.\"\n        case .mobileMeServerNotAvailable:\n            return \"The MobileMe server is not available.\"\n        case .mobileMeServerAlreadyExists:\n            return \"The MobileMe server reported that the item already exists.\"\n        case .mobileMeServerServiceErr:\n            return \"A MobileMe service error has occurred.\"\n        case .mobileMeRequestAlreadyPending:\n            return \"A MobileMe request is already pending.\"\n        case .mobileMeNoRequestPending:\n            return \"MobileMe has no request pending.\"\n        case .mobileMeCSRVerifyFailure:\n            return \"A MobileMe CSR verification failure has occurred.\"\n        case .mobileMeFailedConsistencyCheck:\n            return \"MobileMe has found a failed consistency check.\"\n        case .notInitialized:\n            return \"A function was called without initializing CSSM.\"\n        case .invalidHandleUsage:\n            return \"The CSSM handle does not match with the service type.\"\n        case .pvcReferentNotFound:\n            return \"A reference to the calling module was not found in the list of authorized callers.\"\n        case .functionIntegrityFail:\n            return \"A function address was not within the verified module.\"\n        case .internalError:\n            return \"An internal error has occurred.\"\n        case .memoryError:\n            return \"A memory error has occurred.\"\n        case .invalidData:\n            return \"Invalid data was encountered.\"\n        case .mdsError:\n            return \"A Module Directory Service error has occurred.\"\n        case .invalidPointer:\n            return \"An invalid pointer was encountered.\"\n        case .selfCheckFailed:\n            return \"Self-check has failed.\"\n        case .functionFailed:\n            return \"A function has failed.\"\n        case .moduleManifestVerifyFailed:\n            return \"A module manifest verification failure has occurred.\"\n        case .invalidGUID:\n            return \"An invalid GUID was encountered.\"\n        case .invalidHandle:\n            return \"An invalid handle was encountered.\"\n        case .invalidDBList:\n            return \"An invalid DB list was encountered.\"\n        case .invalidPassthroughID:\n            return \"An invalid passthrough ID was encountered.\"\n        case .invalidNetworkAddress:\n            return \"An invalid network address was encountered.\"\n        case .crlAlreadySigned:\n            return \"The certificate revocation list is already signed.\"\n        case .invalidNumberOfFields:\n            return \"An invalid number of fields were encountered.\"\n        case .verificationFailure:\n            return \"A verification failure occurred.\"\n        case .unknownTag:\n            return \"An unknown tag was encountered.\"\n        case .invalidSignature:\n            return \"An invalid signature was encountered.\"\n        case .invalidName:\n            return \"An invalid name was encountered.\"\n        case .invalidCertificateRef:\n            return \"An invalid certificate reference was encountered.\"\n        case .invalidCertificateGroup:\n            return \"An invalid certificate group was encountered.\"\n        case .tagNotFound:\n            return \"The specified tag was not found.\"\n        case .invalidQuery:\n            return \"The specified query was not valid.\"\n        case .invalidValue:\n            return \"An invalid value was detected.\"\n        case .callbackFailed:\n            return \"A callback has failed.\"\n        case .aclDeleteFailed:\n            return \"An ACL delete operation has failed.\"\n        case .aclReplaceFailed:\n            return \"An ACL replace operation has failed.\"\n        case .aclAddFailed:\n            return \"An ACL add operation has failed.\"\n        case .aclChangeFailed:\n            return \"An ACL change operation has failed.\"\n        case .invalidAccessCredentials:\n            return \"Invalid access credentials were encountered.\"\n        case .invalidRecord:\n            return \"An invalid record was encountered.\"\n        case .invalidACL:\n            return \"An invalid ACL was encountered.\"\n        case .invalidSampleValue:\n            return \"An invalid sample value was encountered.\"\n        case .incompatibleVersion:\n            return \"An incompatible version was encountered.\"\n        case .privilegeNotGranted:\n            return \"The privilege was not granted.\"\n        case .invalidScope:\n            return \"An invalid scope was encountered.\"\n        case .pvcAlreadyConfigured:\n            return \"The PVC is already configured.\"\n        case .invalidPVC:\n            return \"An invalid PVC was encountered.\"\n        case .emmLoadFailed:\n            return \"The EMM load has failed.\"\n        case .emmUnloadFailed:\n            return \"The EMM unload has failed.\"\n        case .addinLoadFailed:\n            return \"The add-in load operation has failed.\"\n        case .invalidKeyRef:\n            return \"An invalid key was encountered.\"\n        case .invalidKeyHierarchy:\n            return \"An invalid key hierarchy was encountered.\"\n        case .addinUnloadFailed:\n            return \"The add-in unload operation has failed.\"\n        case .libraryReferenceNotFound:\n            return \"A library reference was not found.\"\n        case .invalidAddinFunctionTable:\n            return \"An invalid add-in function table was encountered.\"\n        case .invalidServiceMask:\n            return \"An invalid service mask was encountered.\"\n        case .moduleNotLoaded:\n            return \"A module was not loaded.\"\n        case .invalidSubServiceID:\n            return \"An invalid subservice ID was encountered.\"\n        case .attributeNotInContext:\n            return \"An attribute was not in the context.\"\n        case .moduleManagerInitializeFailed:\n            return \"A module failed to initialize.\"\n        case .moduleManagerNotFound:\n            return \"A module was not found.\"\n        case .eventNotificationCallbackNotFound:\n            return \"An event notification callback was not found.\"\n        case .inputLengthError:\n            return \"An input length error was encountered.\"\n        case .outputLengthError:\n            return \"An output length error was encountered.\"\n        case .privilegeNotSupported:\n            return \"The privilege is not supported.\"\n        case .deviceError:\n            return \"A device error was encountered.\"\n        case .attachHandleBusy:\n            return \"The CSP handle was busy.\"\n        case .notLoggedIn:\n            return \"You are not logged in.\"\n        case .algorithmMismatch:\n            return \"An algorithm mismatch was encountered.\"\n        case .keyUsageIncorrect:\n            return \"The key usage is incorrect.\"\n        case .keyBlobTypeIncorrect:\n            return \"The key blob type is incorrect.\"\n        case .keyHeaderInconsistent:\n            return \"The key header is inconsistent.\"\n        case .unsupportedKeyFormat:\n            return \"The key header format is not supported.\"\n        case .unsupportedKeySize:\n            return \"The key size is not supported.\"\n        case .invalidKeyUsageMask:\n            return \"The key usage mask is not valid.\"\n        case .unsupportedKeyUsageMask:\n            return \"The key usage mask is not supported.\"\n        case .invalidKeyAttributeMask:\n            return \"The key attribute mask is not valid.\"\n        case .unsupportedKeyAttributeMask:\n            return \"The key attribute mask is not supported.\"\n        case .invalidKeyLabel:\n            return \"The key label is not valid.\"\n        case .unsupportedKeyLabel:\n            return \"The key label is not supported.\"\n        case .invalidKeyFormat:\n            return \"The key format is not valid.\"\n        case .unsupportedVectorOfBuffers:\n            return \"The vector of buffers is not supported.\"\n        case .invalidInputVector:\n            return \"The input vector is not valid.\"\n        case .invalidOutputVector:\n            return \"The output vector is not valid.\"\n        case .invalidContext:\n            return \"An invalid context was encountered.\"\n        case .invalidAlgorithm:\n            return \"An invalid algorithm was encountered.\"\n        case .invalidAttributeKey:\n            return \"A key attribute was not valid.\"\n        case .missingAttributeKey:\n            return \"A key attribute was missing.\"\n        case .invalidAttributeInitVector:\n            return \"An init vector attribute was not valid.\"\n        case .missingAttributeInitVector:\n            return \"An init vector attribute was missing.\"\n        case .invalidAttributeSalt:\n            return \"A salt attribute was not valid.\"\n        case .missingAttributeSalt:\n            return \"A salt attribute was missing.\"\n        case .invalidAttributePadding:\n            return \"A padding attribute was not valid.\"\n        case .missingAttributePadding:\n            return \"A padding attribute was missing.\"\n        case .invalidAttributeRandom:\n            return \"A random number attribute was not valid.\"\n        case .missingAttributeRandom:\n            return \"A random number attribute was missing.\"\n        case .invalidAttributeSeed:\n            return \"A seed attribute was not valid.\"\n        case .missingAttributeSeed:\n            return \"A seed attribute was missing.\"\n        case .invalidAttributePassphrase:\n            return \"A passphrase attribute was not valid.\"\n        case .missingAttributePassphrase:\n            return \"A passphrase attribute was missing.\"\n        case .invalidAttributeKeyLength:\n            return \"A key length attribute was not valid.\"\n        case .missingAttributeKeyLength:\n            return \"A key length attribute was missing.\"\n        case .invalidAttributeBlockSize:\n            return \"A block size attribute was not valid.\"\n        case .missingAttributeBlockSize:\n            return \"A block size attribute was missing.\"\n        case .invalidAttributeOutputSize:\n            return \"An output size attribute was not valid.\"\n        case .missingAttributeOutputSize:\n            return \"An output size attribute was missing.\"\n        case .invalidAttributeRounds:\n            return \"The number of rounds attribute was not valid.\"\n        case .missingAttributeRounds:\n            return \"The number of rounds attribute was missing.\"\n        case .invalidAlgorithmParms:\n            return \"An algorithm parameters attribute was not valid.\"\n        case .missingAlgorithmParms:\n            return \"An algorithm parameters attribute was missing.\"\n        case .invalidAttributeLabel:\n            return \"A label attribute was not valid.\"\n        case .missingAttributeLabel:\n            return \"A label attribute was missing.\"\n        case .invalidAttributeKeyType:\n            return \"A key type attribute was not valid.\"\n        case .missingAttributeKeyType:\n            return \"A key type attribute was missing.\"\n        case .invalidAttributeMode:\n            return \"A mode attribute was not valid.\"\n        case .missingAttributeMode:\n            return \"A mode attribute was missing.\"\n        case .invalidAttributeEffectiveBits:\n            return \"An effective bits attribute was not valid.\"\n        case .missingAttributeEffectiveBits:\n            return \"An effective bits attribute was missing.\"\n        case .invalidAttributeStartDate:\n            return \"A start date attribute was not valid.\"\n        case .missingAttributeStartDate:\n            return \"A start date attribute was missing.\"\n        case .invalidAttributeEndDate:\n            return \"An end date attribute was not valid.\"\n        case .missingAttributeEndDate:\n            return \"An end date attribute was missing.\"\n        case .invalidAttributeVersion:\n            return \"A version attribute was not valid.\"\n        case .missingAttributeVersion:\n            return \"A version attribute was missing.\"\n        case .invalidAttributePrime:\n            return \"A prime attribute was not valid.\"\n        case .missingAttributePrime:\n            return \"A prime attribute was missing.\"\n        case .invalidAttributeBase:\n            return \"A base attribute was not valid.\"\n        case .missingAttributeBase:\n            return \"A base attribute was missing.\"\n        case .invalidAttributeSubprime:\n            return \"A subprime attribute was not valid.\"\n        case .missingAttributeSubprime:\n            return \"A subprime attribute was missing.\"\n        case .invalidAttributeIterationCount:\n            return \"An iteration count attribute was not valid.\"\n        case .missingAttributeIterationCount:\n            return \"An iteration count attribute was missing.\"\n        case .invalidAttributeDLDBHandle:\n            return \"A database handle attribute was not valid.\"\n        case .missingAttributeDLDBHandle:\n            return \"A database handle attribute was missing.\"\n        case .invalidAttributeAccessCredentials:\n            return \"An access credentials attribute was not valid.\"\n        case .missingAttributeAccessCredentials:\n            return \"An access credentials attribute was missing.\"\n        case .invalidAttributePublicKeyFormat:\n            return \"A public key format attribute was not valid.\"\n        case .missingAttributePublicKeyFormat:\n            return \"A public key format attribute was missing.\"\n        case .invalidAttributePrivateKeyFormat:\n            return \"A private key format attribute was not valid.\"\n        case .missingAttributePrivateKeyFormat:\n            return \"A private key format attribute was missing.\"\n        case .invalidAttributeSymmetricKeyFormat:\n            return \"A symmetric key format attribute was not valid.\"\n        case .missingAttributeSymmetricKeyFormat:\n            return \"A symmetric key format attribute was missing.\"\n        case .invalidAttributeWrappedKeyFormat:\n            return \"A wrapped key format attribute was not valid.\"\n        case .missingAttributeWrappedKeyFormat:\n            return \"A wrapped key format attribute was missing.\"\n        case .stagedOperationInProgress:\n            return \"A staged operation is in progress.\"\n        case .stagedOperationNotStarted:\n            return \"A staged operation was not started.\"\n        case .verifyFailed:\n            return \"A cryptographic verification failure has occurred.\"\n        case .querySizeUnknown:\n            return \"The query size is unknown.\"\n        case .blockSizeMismatch:\n            return \"A block size mismatch occurred.\"\n        case .publicKeyInconsistent:\n            return \"The public key was inconsistent.\"\n        case .deviceVerifyFailed:\n            return \"A device verification failure has occurred.\"\n        case .invalidLoginName:\n            return \"An invalid login name was detected.\"\n        case .alreadyLoggedIn:\n            return \"The user is already logged in.\"\n        case .invalidDigestAlgorithm:\n            return \"An invalid digest algorithm was detected.\"\n        case .invalidCRLGroup:\n            return \"An invalid CRL group was detected.\"\n        case .certificateCannotOperate:\n            return \"The certificate cannot operate.\"\n        case .certificateExpired:\n            return \"An expired certificate was detected.\"\n        case .certificateNotValidYet:\n            return \"The certificate is not yet valid.\"\n        case .certificateRevoked:\n            return \"The certificate was revoked.\"\n        case .certificateSuspended:\n            return \"The certificate was suspended.\"\n        case .insufficientCredentials:\n            return \"Insufficient credentials were detected.\"\n        case .invalidAction:\n            return \"The action was not valid.\"\n        case .invalidAuthority:\n            return \"The authority was not valid.\"\n        case .verifyActionFailed:\n            return \"A verify action has failed.\"\n        case .invalidCertAuthority:\n            return \"The certificate authority was not valid.\"\n        case .invaldCRLAuthority:\n            return \"The CRL authority was not valid.\"\n        case .invalidCRLEncoding:\n            return \"The CRL encoding was not valid.\"\n        case .invalidCRLType:\n            return \"The CRL type was not valid.\"\n        case .invalidCRL:\n            return \"The CRL was not valid.\"\n        case .invalidFormType:\n            return \"The form type was not valid.\"\n        case .invalidID:\n            return \"The ID was not valid.\"\n        case .invalidIdentifier:\n            return \"The identifier was not valid.\"\n        case .invalidIndex:\n            return \"The index was not valid.\"\n        case .invalidPolicyIdentifiers:\n            return \"The policy identifiers are not valid.\"\n        case .invalidTimeString:\n            return \"The time specified was not valid.\"\n        case .invalidReason:\n            return \"The trust policy reason was not valid.\"\n        case .invalidRequestInputs:\n            return \"The request inputs are not valid.\"\n        case .invalidResponseVector:\n            return \"The response vector was not valid.\"\n        case .invalidStopOnPolicy:\n            return \"The stop-on policy was not valid.\"\n        case .invalidTuple:\n            return \"The tuple was not valid.\"\n        case .multipleValuesUnsupported:\n            return \"Multiple values are not supported.\"\n        case .notTrusted:\n            return \"The trust policy was not trusted.\"\n        case .noDefaultAuthority:\n            return \"No default authority was detected.\"\n        case .rejectedForm:\n            return \"The trust policy had a rejected form.\"\n        case .requestLost:\n            return \"The request was lost.\"\n        case .requestRejected:\n            return \"The request was rejected.\"\n        case .unsupportedAddressType:\n            return \"The address type is not supported.\"\n        case .unsupportedService:\n            return \"The service is not supported.\"\n        case .invalidTupleGroup:\n            return \"The tuple group was not valid.\"\n        case .invalidBaseACLs:\n            return \"The base ACLs are not valid.\"\n        case .invalidTupleCredendtials:\n            return \"The tuple credentials are not valid.\"\n        case .invalidEncoding:\n            return \"The encoding was not valid.\"\n        case .invalidValidityPeriod:\n            return \"The validity period was not valid.\"\n        case .invalidRequestor:\n            return \"The requestor was not valid.\"\n        case .requestDescriptor:\n            return \"The request descriptor was not valid.\"\n        case .invalidBundleInfo:\n            return \"The bundle information was not valid.\"\n        case .invalidCRLIndex:\n            return \"The CRL index was not valid.\"\n        case .noFieldValues:\n            return \"No field values were detected.\"\n        case .unsupportedFieldFormat:\n            return \"The field format is not supported.\"\n        case .unsupportedIndexInfo:\n            return \"The index information is not supported.\"\n        case .unsupportedLocality:\n            return \"The locality is not supported.\"\n        case .unsupportedNumAttributes:\n            return \"The number of attributes is not supported.\"\n        case .unsupportedNumIndexes:\n            return \"The number of indexes is not supported.\"\n        case .unsupportedNumRecordTypes:\n            return \"The number of record types is not supported.\"\n        case .fieldSpecifiedMultiple:\n            return \"Too many fields were specified.\"\n        case .incompatibleFieldFormat:\n            return \"The field format was incompatible.\"\n        case .invalidParsingModule:\n            return \"The parsing module was not valid.\"\n        case .databaseLocked:\n            return \"The database is locked.\"\n        case .datastoreIsOpen:\n            return \"The data store is open.\"\n        case .missingValue:\n            return \"A missing value was detected.\"\n        case .unsupportedQueryLimits:\n            return \"The query limits are not supported.\"\n        case .unsupportedNumSelectionPreds:\n            return \"The number of selection predicates is not supported.\"\n        case .unsupportedOperator:\n            return \"The operator is not supported.\"\n        case .invalidDBLocation:\n            return \"The database location is not valid.\"\n        case .invalidAccessRequest:\n            return \"The access request is not valid.\"\n        case .invalidIndexInfo:\n            return \"The index information is not valid.\"\n        case .invalidNewOwner:\n            return \"The new owner is not valid.\"\n        case .invalidModifyMode:\n            return \"The modify mode is not valid.\"\n        case .missingRequiredExtension:\n            return \"A required certificate extension is missing.\"\n        case .extendedKeyUsageNotCritical:\n            return \"The extended key usage extension was not marked critical.\"\n        case .timestampMissing:\n            return \"A timestamp was expected but was not found.\"\n        case .timestampInvalid:\n            return \"The timestamp was not valid.\"\n        case .timestampNotTrusted:\n            return \"The timestamp was not trusted.\"\n        case .timestampServiceNotAvailable:\n            return \"The timestamp service is not available.\"\n        case .timestampBadAlg:\n            return \"An unrecognized or unsupported Algorithm Identifier in timestamp.\"\n        case .timestampBadRequest:\n            return \"The timestamp transaction is not permitted or supported.\"\n        case .timestampBadDataFormat:\n            return \"The timestamp data submitted has the wrong format.\"\n        case .timestampTimeNotAvailable:\n            return \"The time source for the Timestamp Authority is not available.\"\n        case .timestampUnacceptedPolicy:\n            return \"The requested policy is not supported by the Timestamp Authority.\"\n        case .timestampUnacceptedExtension:\n            return \"The requested extension is not supported by the Timestamp Authority.\"\n        case .timestampAddInfoNotAvailable:\n            return \"The additional information requested is not available.\"\n        case .timestampSystemFailure:\n            return \"The timestamp request cannot be handled due to system failure.\"\n        case .signingTimeMissing:\n            return \"A signing time was expected but was not found.\"\n        case .timestampRejection:\n            return \"A timestamp transaction was rejected.\"\n        case .timestampWaiting:\n            return \"A timestamp transaction is waiting.\"\n        case .timestampRevocationWarning:\n            return \"A timestamp authority revocation warning was issued.\"\n        case .timestampRevocationNotification:\n            return \"A timestamp authority revocation notification was issued.\"\n        case .unexpectedError:\n            return \"Unexpected error has occurred.\"\n        }\n    }\n}\n\nextension Status: CustomNSError {\n    public static let errorDomain = KeychainAccessErrorDomain\n\n    public var errorCode: Int {\n        return Int(rawValue)\n    }\n\n    public var errorUserInfo: [String : Any] {\n        return [NSLocalizedDescriptionKey: description]\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess/KeychainAccess.h",
    "content": "//\n//  KeychainAccess.h\n//  KeychainAccess\n//\n//  Created by kishikawa katsumi on 2014/12/24.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\nFOUNDATION_EXPORT double KeychainAccessVersionNumber;\nFOUNDATION_EXPORT const unsigned char KeychainAccessVersionString[];\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t140F19621A49D79400B0016A /* KeychainAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 140F19611A49D79400B0016A /* KeychainAccess.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */; };\n\t\t140F197B1A49D89200B0016A /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F197A1A49D89200B0016A /* Keychain.swift */; };\n\t\t142EDA851BCB505F00A32149 /* ErrorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */; };\n\t\t142EDB041BCBB0DD00A32149 /* SharedCredentialTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */; };\n\t\t148F9D4A1BCB4118006EDF48 /* EnumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148F9D491BCB4118006EDF48 /* EnumTests.swift */; };\n\t\t14A630181D3293C700809B3F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A630171D3293C700809B3F /* AppDelegate.swift */; };\n\t\t14A6301F1D3293C700809B3F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14A6301E1D3293C700809B3F /* Assets.xcassets */; };\n\t\t14C3A6781D32BF9C00349459 /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 140F195C1A49D79400B0016A /* KeychainAccess.framework */; };\n\t\t14C3A6791D32BF9C00349459 /* KeychainAccess.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 140F195C1A49D79400B0016A /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t140F19691A49D79500B0016A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 140F19531A49D79400B0016A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 140F195B1A49D79400B0016A;\n\t\t\tremoteInfo = KeychainAccess;\n\t\t};\n\t\t14C3A67A1D32BF9C00349459 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 140F19531A49D79400B0016A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 140F195B1A49D79400B0016A;\n\t\t\tremoteInfo = KeychainAccess;\n\t\t};\n\t\t14F0C1991D32A160007DCDDB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 140F19531A49D79400B0016A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 14A630141D3293C700809B3F;\n\t\t\tremoteInfo = TestHost;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t14C3A67C1D32BF9D00349459 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t14C3A6791D32BF9C00349459 /* KeychainAccess.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t140F195C1A49D79400B0016A /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t140F19601A49D79400B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t140F19611A49D79400B0016A /* KeychainAccess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeychainAccess.h; sourceTree = \"<group>\"; };\n\t\t140F19671A49D79500B0016A /* KeychainAccessTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KeychainAccessTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t140F196D1A49D79500B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t140F196E1A49D79500B0016A /* KeychainAccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessTests.swift; sourceTree = \"<group>\"; };\n\t\t140F197A1A49D89200B0016A /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = \"<group>\"; };\n\t\t142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorTypeTests.swift; sourceTree = \"<group>\"; };\n\t\t142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedCredentialTests.swift; sourceTree = \"<group>\"; };\n\t\t148E44E51BF9EDCB004FFEC1 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Base.xcconfig; path = Configurations/Base.xcconfig; sourceTree = \"<group>\"; };\n\t\t148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Configurations/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Configurations/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Tests.xcconfig; path = Configurations/Tests.xcconfig; sourceTree = \"<group>\"; };\n\t\t148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = KeychainAccess.xcconfig; path = Configurations/KeychainAccess.xcconfig; sourceTree = \"<group>\"; };\n\t\t148F9D491BCB4118006EDF48 /* EnumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumTests.swift; sourceTree = \"<group>\"; };\n\t\t14A630151D3293C700809B3F /* TestHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestHost.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t14A630171D3293C700809B3F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t14A6301E1D3293C700809B3F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t14A630231D3293C700809B3F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t14F0C1961D3295C4007DCDDB /* TestHost.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = TestHost.entitlements; sourceTree = \"<group>\"; };\n\t\t14F0C1981D329832007DCDDB /* TestHost.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = TestHost.xcconfig; path = Configurations/TestHost.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t140F19581A49D79400B0016A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t140F19641A49D79500B0016A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A630121D3293C700809B3F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14C3A6781D32BF9C00349459 /* KeychainAccess.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t140F19521A49D79400B0016A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F195E1A49D79400B0016A /* KeychainAccess */,\n\t\t\t\t140F196B1A49D79500B0016A /* KeychainAccessTests */,\n\t\t\t\t148E44E41BF9ED6D004FFEC1 /* Cofigurations */,\n\t\t\t\t14A630161D3293C700809B3F /* TestHost */,\n\t\t\t\t140F195D1A49D79400B0016A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t140F195D1A49D79400B0016A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F195C1A49D79400B0016A /* KeychainAccess.framework */,\n\t\t\t\t140F19671A49D79500B0016A /* KeychainAccessTests.xctest */,\n\t\t\t\t14A630151D3293C700809B3F /* TestHost.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t140F195E1A49D79400B0016A /* KeychainAccess */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F19611A49D79400B0016A /* KeychainAccess.h */,\n\t\t\t\t140F197A1A49D89200B0016A /* Keychain.swift */,\n\t\t\t\t140F195F1A49D79400B0016A /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = KeychainAccess;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t140F195F1A49D79400B0016A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F19601A49D79400B0016A /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t140F196B1A49D79500B0016A /* KeychainAccessTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F196E1A49D79500B0016A /* KeychainAccessTests.swift */,\n\t\t\t\t148F9D491BCB4118006EDF48 /* EnumTests.swift */,\n\t\t\t\t142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */,\n\t\t\t\t142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */,\n\t\t\t\t140F196C1A49D79500B0016A /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = KeychainAccessTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t140F196C1A49D79500B0016A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t140F196D1A49D79500B0016A /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t148E44E41BF9ED6D004FFEC1 /* Cofigurations */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t148E44E51BF9EDCB004FFEC1 /* Base.xcconfig */,\n\t\t\t\t148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */,\n\t\t\t\t148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */,\n\t\t\t\t148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */,\n\t\t\t\t148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */,\n\t\t\t\t14F0C1981D329832007DCDDB /* TestHost.xcconfig */,\n\t\t\t);\n\t\t\tname = Cofigurations;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A630161D3293C700809B3F /* TestHost */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A630171D3293C700809B3F /* AppDelegate.swift */,\n\t\t\t\t14A6301E1D3293C700809B3F /* Assets.xcassets */,\n\t\t\t\t14A630231D3293C700809B3F /* Info.plist */,\n\t\t\t\t14F0C1961D3295C4007DCDDB /* TestHost.entitlements */,\n\t\t\t);\n\t\t\tpath = TestHost;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t140F19591A49D79400B0016A /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140F19621A49D79400B0016A /* KeychainAccess.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t140F195B1A49D79400B0016A /* KeychainAccess */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 140F19721A49D79500B0016A /* Build configuration list for PBXNativeTarget \"KeychainAccess\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t140F19571A49D79400B0016A /* Sources */,\n\t\t\t\t140F19581A49D79400B0016A /* Frameworks */,\n\t\t\t\t140F19591A49D79400B0016A /* Headers */,\n\t\t\t\t140F195A1A49D79400B0016A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = KeychainAccess;\n\t\t\tproductName = KeychainAccess;\n\t\t\tproductReference = 140F195C1A49D79400B0016A /* KeychainAccess.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t140F19661A49D79500B0016A /* KeychainAccessTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 140F19751A49D79500B0016A /* Build configuration list for PBXNativeTarget \"KeychainAccessTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t140F19631A49D79500B0016A /* Sources */,\n\t\t\t\t140F19641A49D79500B0016A /* Frameworks */,\n\t\t\t\t140F19651A49D79500B0016A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t140F196A1A49D79500B0016A /* PBXTargetDependency */,\n\t\t\t\t14F0C19A1D32A160007DCDDB /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = KeychainAccessTests;\n\t\t\tproductName = KeychainAccessTests;\n\t\t\tproductReference = 140F19671A49D79500B0016A /* KeychainAccessTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t14A630141D3293C700809B3F /* TestHost */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 14A630241D3293C700809B3F /* Build configuration list for PBXNativeTarget \"TestHost\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t14A630111D3293C700809B3F /* Sources */,\n\t\t\t\t14A630121D3293C700809B3F /* Frameworks */,\n\t\t\t\t14A630131D3293C700809B3F /* Resources */,\n\t\t\t\t14C3A67C1D32BF9D00349459 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t14C3A67B1D32BF9C00349459 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TestHost;\n\t\t\tproductName = TestHost;\n\t\t\tproductReference = 14A630151D3293C700809B3F /* TestHost.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t140F19531A49D79400B0016A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = \"kishikawa katsumi\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t140F195B1A49D79400B0016A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tDevelopmentTeam = 27AEDK3C9F;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t140F19661A49D79500B0016A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tDevelopmentTeam = 27AEDK3C9F;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 14A62FFC1D32922C00809B3F;\n\t\t\t\t\t};\n\t\t\t\t\t14A630141D3293C700809B3F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tDevelopmentTeam = 27AEDK3C9F;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.Keychain = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 140F19561A49D79400B0016A /* Build configuration list for PBXProject \"KeychainAccess\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 140F19521A49D79400B0016A;\n\t\t\tproductRefGroup = 140F195D1A49D79400B0016A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t140F195B1A49D79400B0016A /* KeychainAccess */,\n\t\t\t\t140F19661A49D79500B0016A /* KeychainAccessTests */,\n\t\t\t\t14A630141D3293C700809B3F /* TestHost */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t140F195A1A49D79400B0016A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t140F19651A49D79500B0016A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A630131D3293C700809B3F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A6301F1D3293C700809B3F /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t140F19571A49D79400B0016A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140F197B1A49D89200B0016A /* Keychain.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t140F19631A49D79500B0016A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */,\n\t\t\t\t148F9D4A1BCB4118006EDF48 /* EnumTests.swift in Sources */,\n\t\t\t\t142EDA851BCB505F00A32149 /* ErrorTypeTests.swift in Sources */,\n\t\t\t\t142EDB041BCBB0DD00A32149 /* SharedCredentialTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A630111D3293C700809B3F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A630181D3293C700809B3F /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t140F196A1A49D79500B0016A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 140F195B1A49D79400B0016A /* KeychainAccess */;\n\t\t\ttargetProxy = 140F19691A49D79500B0016A /* PBXContainerItemProxy */;\n\t\t};\n\t\t14C3A67B1D32BF9C00349459 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 140F195B1A49D79400B0016A /* KeychainAccess */;\n\t\t\ttargetProxy = 14C3A67A1D32BF9C00349459 /* PBXContainerItemProxy */;\n\t\t};\n\t\t14F0C19A1D32A160007DCDDB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 14A630141D3293C700809B3F /* TestHost */;\n\t\t\ttargetProxy = 14F0C1991D32A160007DCDDB /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t140F19701A49D79500B0016A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t140F19711A49D79500B0016A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t140F19731A49D79500B0016A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t140F19741A49D79500B0016A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t140F19761A49D79500B0016A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t140F19771A49D79500B0016A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t14A630251D3293C700809B3F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 14F0C1981D329832007DCDDB /* TestHost.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14A630261D3293C700809B3F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 14F0C1981D329832007DCDDB /* TestHost.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t140F19561A49D79400B0016A /* Build configuration list for PBXProject \"KeychainAccess\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t140F19701A49D79500B0016A /* Debug */,\n\t\t\t\t140F19711A49D79500B0016A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t140F19721A49D79500B0016A /* Build configuration list for PBXNativeTarget \"KeychainAccess\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t140F19731A49D79500B0016A /* Debug */,\n\t\t\t\t140F19741A49D79500B0016A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t140F19751A49D79500B0016A /* Build configuration list for PBXNativeTarget \"KeychainAccessTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t140F19761A49D79500B0016A /* Debug */,\n\t\t\t\t140F19771A49D79500B0016A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t14A630241D3293C700809B3F /* Build configuration list for PBXNativeTarget \"TestHost\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14A630251D3293C700809B3F /* Debug */,\n\t\t\t\t14A630261D3293C700809B3F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 140F19531A49D79400B0016A /* Project object */;\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"140F195B1A49D79400B0016A\"\n               BuildableName = \"KeychainAccess.framework\"\n               BlueprintName = \"KeychainAccess\"\n               ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"NO\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"140F19661A49D79500B0016A\"\n               BuildableName = \"KeychainAccessTests.xctest\"\n               BlueprintName = \"KeychainAccessTests\"\n               ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"140F195B1A49D79400B0016A\"\n            BuildableName = \"KeychainAccess.framework\"\n            BlueprintName = \"KeychainAccess\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"140F19661A49D79500B0016A\"\n               BuildableName = \"KeychainAccessTests.xctest\"\n               BlueprintName = \"KeychainAccessTests\"\n               ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14A98C79235D292000BBB893\"\n               BuildableName = \"KeychainAccessTests-MacCatalyst.xctest\"\n               BlueprintName = \"KeychainAccessTests-MacCatalyst\"\n               ReferencedContainer = \"container:TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"140F195B1A49D79400B0016A\"\n            BuildableName = \"KeychainAccess.framework\"\n            BlueprintName = \"KeychainAccess\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"140F195B1A49D79400B0016A\"\n            BuildableName = \"KeychainAccess.framework\"\n            BlueprintName = \"KeychainAccess\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14A630141D3293C700809B3F\"\n               BuildableName = \"TestHost.app\"\n               BlueprintName = \"TestHost\"\n               ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14A630141D3293C700809B3F\"\n            BuildableName = \"TestHost.app\"\n            BlueprintName = \"TestHost\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14A630141D3293C700809B3F\"\n            BuildableName = \"TestHost.app\"\n            BlueprintName = \"TestHost\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14A630141D3293C700809B3F\"\n            BuildableName = \"TestHost.app\"\n            BlueprintName = \"TestHost\"\n            ReferencedContainer = \"container:KeychainAccess.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccessTests/EnumTests.swift",
    "content": "//\n//  EnumTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 10/12/15.\n//  Copyright © 2015 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport XCTest\nimport KeychainAccess\n\nclass EnumTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testItemClass() {\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassGenericPassword as String)\n            XCTAssertEqual(itemClass, .genericPassword)\n            XCTAssertEqual(itemClass?.description, \"GenericPassword\")\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassInternetPassword as String)\n            XCTAssertEqual(itemClass, .internetPassword)\n            XCTAssertEqual(itemClass?.description, \"InternetPassword\")\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassCertificate as String)\n            XCTAssertNil(itemClass)\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassKey as String)\n            XCTAssertNil(itemClass)\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassIdentity as String)\n            XCTAssertNil(itemClass)\n        }\n    }\n\n    func testProtocolType() {\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTP as String)\n            XCTAssertEqual(protocolType, .ftp)\n            XCTAssertEqual(protocolType?.description, \"FTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPAccount as String)\n            XCTAssertEqual(protocolType, .ftpAccount)\n            XCTAssertEqual(protocolType?.description, \"FTPAccount\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTP as String)\n            XCTAssertEqual(protocolType, .http)\n            XCTAssertEqual(protocolType?.description, \"HTTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRC as String)\n            XCTAssertEqual(protocolType, .irc)\n            XCTAssertEqual(protocolType?.description, \"IRC\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTP as String)\n            XCTAssertEqual(protocolType, .nntp)\n            XCTAssertEqual(protocolType?.description, \"NNTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3 as String)\n            XCTAssertEqual(protocolType, .pop3)\n            XCTAssertEqual(protocolType?.description, \"POP3\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMTP as String)\n            XCTAssertEqual(protocolType, .smtp)\n            XCTAssertEqual(protocolType?.description, \"SMTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSOCKS as String)\n            XCTAssertEqual(protocolType, .socks)\n            XCTAssertEqual(protocolType?.description, \"SOCKS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAP as String)\n            XCTAssertEqual(protocolType, .imap)\n            XCTAssertEqual(protocolType?.description, \"IMAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAP as String)\n            XCTAssertEqual(protocolType, .ldap)\n            XCTAssertEqual(protocolType?.description, \"LDAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolAppleTalk as String)\n            XCTAssertEqual(protocolType, .appleTalk)\n            XCTAssertEqual(protocolType?.description, \"AppleTalk\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolAFP as String)\n            XCTAssertEqual(protocolType, .afp)\n            XCTAssertEqual(protocolType?.description, \"AFP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnet as String)\n            XCTAssertEqual(protocolType, .telnet)\n            XCTAssertEqual(protocolType?.description, \"Telnet\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSSH as String)\n            XCTAssertEqual(protocolType, .ssh)\n            XCTAssertEqual(protocolType?.description, \"SSH\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPS as String)\n            XCTAssertEqual(protocolType, .ftps)\n            XCTAssertEqual(protocolType?.description, \"FTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPS as String)\n            XCTAssertEqual(protocolType, .https)\n            XCTAssertEqual(protocolType?.description, \"HTTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPProxy as String)\n            XCTAssertEqual(protocolType, .httpProxy)\n            XCTAssertEqual(protocolType?.description, \"HTTPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPSProxy as String)\n            XCTAssertEqual(protocolType, .httpsProxy)\n            XCTAssertEqual(protocolType?.description, \"HTTPSProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPProxy as String)\n            XCTAssertEqual(protocolType, .ftpProxy)\n            XCTAssertEqual(protocolType?.description, \"FTPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMB as String)\n            XCTAssertEqual(protocolType, .smb)\n            XCTAssertEqual(protocolType?.description, \"SMB\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSP as String)\n            XCTAssertEqual(protocolType, .rtsp)\n            XCTAssertEqual(protocolType?.description, \"RTSP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSPProxy as String)\n            XCTAssertEqual(protocolType, .rtspProxy)\n            XCTAssertEqual(protocolType?.description, \"RTSPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolDAAP as String)\n            XCTAssertEqual(protocolType, .daap)\n            XCTAssertEqual(protocolType?.description, \"DAAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolEPPC as String)\n            XCTAssertEqual(protocolType, .eppc)\n            XCTAssertEqual(protocolType?.description, \"EPPC\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIPP as String)\n            XCTAssertEqual(protocolType, .ipp)\n            XCTAssertEqual(protocolType?.description, \"IPP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTPS as String)\n            XCTAssertEqual(protocolType, .nntps)\n            XCTAssertEqual(protocolType?.description, \"NNTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAPS as String)\n            XCTAssertEqual(protocolType, .ldaps)\n            XCTAssertEqual(protocolType?.description, \"LDAPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnetS as String)\n            XCTAssertEqual(protocolType, .telnetS)\n            XCTAssertEqual(protocolType?.description, \"TelnetS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAPS as String)\n            XCTAssertEqual(protocolType, .imaps)\n            XCTAssertEqual(protocolType?.description, \"IMAPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRCS as String)\n            XCTAssertEqual(protocolType, .ircs)\n            XCTAssertEqual(protocolType?.description, \"IRCS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3S as String)\n            XCTAssertEqual(protocolType, .pop3S)\n            XCTAssertEqual(protocolType?.description, \"POP3S\")\n        }\n    }\n\n    func testAuthenticationType() {\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeNTLM as String)\n            XCTAssertEqual(authenticationType, .ntlm)\n            XCTAssertEqual(authenticationType?.description, \"NTLM\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeMSN as String)\n            XCTAssertEqual(authenticationType, .msn)\n            XCTAssertEqual(authenticationType?.description, \"MSN\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDPA as String)\n            XCTAssertEqual(authenticationType, .dpa)\n            XCTAssertEqual(authenticationType?.description, \"DPA\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeRPA as String)\n            XCTAssertEqual(authenticationType, .rpa)\n            XCTAssertEqual(authenticationType?.description, \"RPA\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPBasic as String)\n            XCTAssertEqual(authenticationType, .httpBasic)\n            XCTAssertEqual(authenticationType?.description, \"HTTPBasic\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPDigest as String)\n            XCTAssertEqual(authenticationType, .httpDigest)\n            XCTAssertEqual(authenticationType?.description, \"HTTPDigest\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTMLForm as String)\n            XCTAssertEqual(authenticationType, .htmlForm)\n            XCTAssertEqual(authenticationType?.description, \"HTMLForm\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDefault as String)\n            XCTAssertEqual(authenticationType, .default)\n            XCTAssertEqual(authenticationType?.description, \"Default\")\n        }\n    }\n\n    func testAccessibility() {\n        guard #available(OSX 10.10, *) else {\n            return\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlocked as String)\n            XCTAssertEqual(accessibility, .whenUnlocked)\n            XCTAssertEqual(accessibility?.description, \"WhenUnlocked\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlock as String)\n            XCTAssertEqual(accessibility, .afterFirstUnlock)\n            XCTAssertEqual(accessibility?.description, \"AfterFirstUnlock\")\n        }\n        #if !targetEnvironment(macCatalyst)\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlways as String)\n            XCTAssertEqual(accessibility, .always)\n            XCTAssertEqual(accessibility?.description, \"Always\")\n        }\n        #endif\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .whenPasscodeSetThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"WhenPasscodeSetThisDeviceOnly\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlockedThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .whenUnlockedThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"WhenUnlockedThisDeviceOnly\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .afterFirstUnlockThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"AfterFirstUnlockThisDeviceOnly\")\n        }\n        #if !targetEnvironment(macCatalyst)\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlwaysThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .alwaysThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"AlwaysThisDeviceOnly\")\n        }\n        #endif\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccessTests/ErrorTypeTests.swift",
    "content": "//\n//  ErrorTypeTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 10/12/15.\n//  Copyright © 2015 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport XCTest\nimport KeychainAccess\n\nclass ErrorTypeTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testErrorType() {\n        do {\n            let status = Status(rawValue: errSecSuccess)\n            XCTAssertEqual(status, .success)\n            XCTAssertEqual(status?.description, \"No error.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnimplemented)\n            XCTAssertEqual(status, .unimplemented)\n            XCTAssertEqual(status?.description, \"Function or operation not implemented.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecDiskFull)\n            XCTAssertEqual(status, .diskFull)\n            XCTAssertEqual(status?.description, \"The disk is full.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecIO)\n            XCTAssertEqual(status, .io)\n            XCTAssertEqual(status?.description, \"I/O error (bummers)\")\n        }\n        #if os(iOS)\n        do {\n            let status = Status(rawValue: errSecOpWr)\n            XCTAssertEqual(status, .opWr)\n            XCTAssertEqual(status?.description, \"file already open with with write permission\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecParam)\n            XCTAssertEqual(status, .param)\n            XCTAssertEqual(status?.description, \"One or more parameters passed to a function were not valid.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecWrPerm)\n            XCTAssertEqual(status, .wrPerm)\n            XCTAssertEqual(status?.description, \"write permissions error\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecAllocate)\n            XCTAssertEqual(status, .allocate)\n            XCTAssertEqual(status?.description, \"Failed to allocate memory.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUserCanceled)\n            XCTAssertEqual(status, .userCanceled)\n            XCTAssertEqual(status?.description, \"User canceled the operation.\")\n        }\n        do {\n            let status = Status(rawValue: errSecBadReq)\n            XCTAssertEqual(status, .badReq)\n            XCTAssertEqual(status?.description, \"Bad parameter or invalid state for operation.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInternalComponent)\n            XCTAssertEqual(status, .internalComponent)\n            XCTAssertEqual(status?.description, \"\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotAvailable)\n            XCTAssertEqual(status, .notAvailable)\n            XCTAssertEqual(status?.description, \"No keychain is available. You may need to restart your computer.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecReadOnly)\n            XCTAssertEqual(status, .readOnly)\n            XCTAssertEqual(status?.description, \"This keychain cannot be modified.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecAuthFailed)\n            XCTAssertEqual(status, .authFailed)\n            XCTAssertEqual(status?.description, \"The user name or passphrase you entered is not correct.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecNoSuchKeychain)\n            XCTAssertEqual(status, .noSuchKeychain)\n            XCTAssertEqual(status?.description, \"The specified keychain could not be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeychain)\n            XCTAssertEqual(status, .invalidKeychain)\n            XCTAssertEqual(status?.description, \"The specified keychain is not a valid keychain file.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDuplicateKeychain)\n            XCTAssertEqual(status, .duplicateKeychain)\n            XCTAssertEqual(status?.description, \"A keychain with the same name already exists.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDuplicateCallback)\n            XCTAssertEqual(status, .duplicateCallback)\n            XCTAssertEqual(status?.description, \"The specified callback function is already installed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCallback)\n            XCTAssertEqual(status, .invalidCallback)\n            XCTAssertEqual(status?.description, \"The specified callback function is not valid.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecDuplicateItem)\n            XCTAssertEqual(status, .duplicateItem)\n            XCTAssertEqual(status?.description, \"The specified item already exists in the keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecItemNotFound)\n            XCTAssertEqual(status, .itemNotFound)\n            XCTAssertEqual(status?.description, \"The specified item could not be found in the keychain.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecBufferTooSmall)\n            XCTAssertEqual(status, .bufferTooSmall)\n            XCTAssertEqual(status?.description, \"There is not enough memory available to use the specified item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataTooLarge)\n            XCTAssertEqual(status, .dataTooLarge)\n            XCTAssertEqual(status?.description, \"This item contains information which is too large or in a format that cannot be displayed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoSuchAttr)\n            XCTAssertEqual(status, .noSuchAttr)\n            XCTAssertEqual(status?.description, \"The specified attribute does not exist.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidItemRef)\n            XCTAssertEqual(status, .invalidItemRef)\n            XCTAssertEqual(status?.description, \"The specified item is no longer valid. It may have been deleted from the keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSearchRef)\n            XCTAssertEqual(status, .invalidSearchRef)\n            XCTAssertEqual(status?.description, \"Unable to search the current keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoSuchClass)\n            XCTAssertEqual(status, .noSuchClass)\n            XCTAssertEqual(status?.description, \"The specified item does not appear to be a valid keychain item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoDefaultKeychain)\n            XCTAssertEqual(status, .noDefaultKeychain)\n            XCTAssertEqual(status?.description, \"A default keychain could not be found.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecInteractionNotAllowed)\n            XCTAssertEqual(status, .interactionNotAllowed)\n            XCTAssertEqual(status?.description, \"User interaction is not allowed.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecReadOnlyAttr)\n            XCTAssertEqual(status, .readOnlyAttr)\n            XCTAssertEqual(status?.description, \"The specified attribute could not be modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecWrongSecVersion)\n            XCTAssertEqual(status, .wrongSecVersion)\n            XCTAssertEqual(status?.description, \"This keychain was created by a different version of the system software and cannot be opened.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeySizeNotAllowed)\n            XCTAssertEqual(status, .keySizeNotAllowed)\n            XCTAssertEqual(status?.description, \"This item specifies a key size which is too large.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoStorageModule)\n            XCTAssertEqual(status, .noStorageModule)\n            XCTAssertEqual(status?.description, \"A required component (data storage module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoCertificateModule)\n            XCTAssertEqual(status, .noCertificateModule)\n            XCTAssertEqual(status?.description, \"A required component (certificate module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoPolicyModule)\n            XCTAssertEqual(status, .noPolicyModule)\n            XCTAssertEqual(status?.description, \"A required component (policy module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInteractionRequired)\n            XCTAssertEqual(status, .interactionRequired)\n            XCTAssertEqual(status?.description, \"User interaction is required, but is currently not allowed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataNotAvailable)\n            XCTAssertEqual(status, .dataNotAvailable)\n            XCTAssertEqual(status?.description, \"The contents of this item cannot be retrieved.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataNotModifiable)\n            XCTAssertEqual(status, .dataNotModifiable)\n            XCTAssertEqual(status?.description, \"The contents of this item cannot be modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCreateChainFailed)\n            XCTAssertEqual(status, .createChainFailed)\n            XCTAssertEqual(status?.description, \"One or more certificates required to validate this certificate cannot be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPrefsDomain)\n            XCTAssertEqual(status, .invalidPrefsDomain)\n            XCTAssertEqual(status?.description, \"The specified preferences domain is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInDarkWake)\n            XCTAssertEqual(status, .inDarkWake)\n            XCTAssertEqual(status?.description, \"In dark wake, no UI possible\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLNotSimple)\n            XCTAssertEqual(status, .aclNotSimple)\n            XCTAssertEqual(status?.description, \"The specified access control list is not in standard (simple) form.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPolicyNotFound)\n            XCTAssertEqual(status, .policyNotFound)\n            XCTAssertEqual(status?.description, \"The specified policy cannot be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTrustSetting)\n            XCTAssertEqual(status, .invalidTrustSetting)\n            XCTAssertEqual(status?.description, \"The specified trust setting is invalid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoAccessForItem)\n            XCTAssertEqual(status, .noAccessForItem)\n            XCTAssertEqual(status?.description, \"The specified item has no access control.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidOwnerEdit)\n            XCTAssertEqual(status, .invalidOwnerEdit)\n            XCTAssertEqual(status?.description, \"Invalid attempt to change the owner of this item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTrustNotAvailable)\n            XCTAssertEqual(status, .trustNotAvailable)\n            XCTAssertEqual(status?.description, \"No trust results are available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedFormat)\n            XCTAssertEqual(status, .unsupportedFormat)\n            XCTAssertEqual(status?.description, \"Import/Export format unsupported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownFormat)\n            XCTAssertEqual(status, .unknownFormat)\n            XCTAssertEqual(status?.description, \"Unknown format in import.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyIsSensitive)\n            XCTAssertEqual(status, .keyIsSensitive)\n            XCTAssertEqual(status?.description, \"Key material must be wrapped for export.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMultiplePrivKeys)\n            XCTAssertEqual(status, .multiplePrivKeys)\n            XCTAssertEqual(status?.description, \"An attempt was made to import multiple private keys.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPassphraseRequired)\n            XCTAssertEqual(status, .passphraseRequired)\n            XCTAssertEqual(status?.description, \"Passphrase is required for import/export.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPasswordRef)\n            XCTAssertEqual(status, .invalidPasswordRef)\n            XCTAssertEqual(status?.description, \"The password reference was invalid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTrustSettings)\n            XCTAssertEqual(status, .invalidTrustSettings)\n            XCTAssertEqual(status?.description, \"The Trust Settings Record was corrupted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoTrustSettings)\n            XCTAssertEqual(status, .noTrustSettings)\n            XCTAssertEqual(status?.description, \"No Trust Settings were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPkcs12VerifyFailure)\n            XCTAssertEqual(status, .pkcs12VerifyFailure)\n            XCTAssertEqual(status?.description, \"MAC verification failed during PKCS12 import (wrong password?)\")\n        }\n        do {\n            let errSecInvalidCertificate: OSStatus = -26265\n            let status = Status(rawValue: errSecInvalidCertificate)\n            XCTAssertEqual(status, .invalidCertificate)\n            XCTAssertEqual(status?.description, \"This certificate could not be decoded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotSigner)\n            XCTAssertEqual(status, .notSigner)\n            XCTAssertEqual(status?.description, \"A certificate was not signed by its proposed parent.\")\n        }\n        do {\n            let errSecPolicyDenied: OSStatus = -26270\n            let status = Status(rawValue: errSecPolicyDenied)\n            XCTAssertEqual(status, .policyDenied)\n            XCTAssertEqual(status?.description, \"The certificate chain was not trusted due to a policy not accepting it.\")\n        }\n        do {\n            let errSecInvalidKey: OSStatus = -26274\n            let status = Status(rawValue: errSecInvalidKey)\n            XCTAssertEqual(status, .invalidKey)\n            XCTAssertEqual(status?.description, \"The provided key material was not valid.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecDecode)\n            XCTAssertEqual(status, .decode)\n            XCTAssertEqual(status?.description, \"Unable to decode the provided data.\")\n        }\n        do {\n            let errSecInternal: OSStatus = -26276\n            let status = Status(rawValue: errSecInternal)\n            XCTAssertEqual(status, .internal)\n            XCTAssertEqual(status?.description, \"An internal error occurred in the Security framework.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecServiceNotAvailable)\n            XCTAssertEqual(status, .serviceNotAvailable)\n            XCTAssertEqual(status?.description, \"The required service is not available.\")\n        }\n        do {\n            let errSecUnsupportedAlgorithm: OSStatus = -26268\n            let status = Status(rawValue: errSecUnsupportedAlgorithm)\n            XCTAssertEqual(status, .unsupportedAlgorithm)\n            XCTAssertEqual(status?.description, \"An unsupported algorithm was encountered.\")\n        }\n        do {\n            let errSecUnsupportedOperation: OSStatus = -26271\n            let status = Status(rawValue: errSecUnsupportedOperation)\n            XCTAssertEqual(status, .unsupportedOperation)\n            XCTAssertEqual(status?.description, \"The operation you requested is not supported by this key.\")\n        }\n        do {\n            let errSecUnsupportedPadding: OSStatus = -26273\n            let status = Status(rawValue: errSecUnsupportedPadding)\n            XCTAssertEqual(status, .unsupportedPadding)\n            XCTAssertEqual(status?.description, \"The padding you requested is not supported.\")\n        }\n        do {\n            let errSecItemInvalidKey: OSStatus = -34000\n            let status = Status(rawValue: errSecItemInvalidKey)\n            XCTAssertEqual(status, .itemInvalidKey)\n            XCTAssertEqual(status?.description, \"A string key in dictionary is not one of the supported keys.\")\n        }\n        do {\n            let errSecItemInvalidKeyType: OSStatus = -34001\n            let status = Status(rawValue: errSecItemInvalidKeyType)\n            XCTAssertEqual(status, .itemInvalidKeyType)\n            XCTAssertEqual(status?.description, \"A key in a dictionary is neither a CFStringRef nor a CFNumberRef.\")\n        }\n        do {\n            let errSecItemInvalidValue: OSStatus = -34002\n            let status = Status(rawValue: errSecItemInvalidValue)\n            XCTAssertEqual(status, .itemInvalidValue)\n            XCTAssertEqual(status?.description, \"A value in a dictionary is an invalid (or unsupported) CF type.\")\n        }\n        do {\n            let errSecItemClassMissing: OSStatus = -34003\n            let status = Status(rawValue: errSecItemClassMissing)\n            XCTAssertEqual(status, .itemClassMissing)\n            XCTAssertEqual(status?.description, \"No kSecItemClass key was specified in a dictionary.\")\n        }\n        do {\n            let errSecItemMatchUnsupported: OSStatus = -34004\n            let status = Status(rawValue: errSecItemMatchUnsupported)\n            XCTAssertEqual(status, .itemMatchUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed one or more kSecMatch keys to a function which does not support matches.\")\n        }\n        do {\n            let errSecUseItemListUnsupported: OSStatus = -34005\n            let status = Status(rawValue: errSecUseItemListUnsupported)\n            XCTAssertEqual(status, .useItemListUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseItemList key to a function which does not support it.\")\n        }\n        do {\n            let errSecUseKeychainUnsupported: OSStatus = -34006\n            let status = Status(rawValue: errSecUseKeychainUnsupported)\n            XCTAssertEqual(status, .useKeychainUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseKeychain key to a function which does not support it.\")\n        }\n        do {\n            let errSecUseKeychainListUnsupported: OSStatus = -34007\n            let status = Status(rawValue: errSecUseKeychainListUnsupported)\n            XCTAssertEqual(status, .useKeychainListUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseKeychainList key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnDataUnsupported: OSStatus = -34008\n            let status = Status(rawValue: errSecReturnDataUnsupported)\n            XCTAssertEqual(status, .returnDataUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnData key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnAttributesUnsupported: OSStatus = -34009\n            let status = Status(rawValue: errSecReturnAttributesUnsupported)\n            XCTAssertEqual(status, .returnAttributesUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnAttributes key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnRefUnsupported: OSStatus = -34010\n            let status = Status(rawValue: errSecReturnRefUnsupported)\n            XCTAssertEqual(status, .returnRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnPersitentRefUnsupported: OSStatus = -34011\n            let status = Status(rawValue: errSecReturnPersitentRefUnsupported)\n            XCTAssertEqual(status, .returnPersitentRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnPersistentRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecValueRefUnsupported: OSStatus = -34012\n            let status = Status(rawValue: errSecValueRefUnsupported)\n            XCTAssertEqual(status, .valueRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecValueRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecValuePersistentRefUnsupported: OSStatus = -34013\n            let status = Status(rawValue: errSecValuePersistentRefUnsupported)\n            XCTAssertEqual(status, .valuePersistentRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecValuePersistentRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnMissingPointer: OSStatus = -34014\n            let status = Status(rawValue: errSecReturnMissingPointer)\n            XCTAssertEqual(status, .returnMissingPointer)\n            XCTAssertEqual(status?.description, \"The caller passed asked for something to be returned but did not pass in a result pointer.\")\n        }\n        do {\n            let errSecMatchLimitUnsupported: OSStatus = -34015\n            let status = Status(rawValue: errSecMatchLimitUnsupported)\n            XCTAssertEqual(status, .matchLimitUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecMatchLimit key to a call which does not support limits.\")\n        }\n        do {\n            let errSecItemIllegalQuery: OSStatus = -34016\n            let status = Status(rawValue: errSecItemIllegalQuery)\n            XCTAssertEqual(status, .itemIllegalQuery)\n            XCTAssertEqual(status?.description, \"The caller passed in a query which contained too many keys.\")\n        }\n        do {\n            let errSecWaitForCallback: OSStatus = -34017\n            let status = Status(rawValue: errSecWaitForCallback)\n            XCTAssertEqual(status, .waitForCallback)\n            XCTAssertEqual(status?.description, \"This operation is incomplete, until the callback is invoked (not an error).\")\n        }\n        do {\n            let errSecMissingEntitlement: OSStatus = -34018\n            let status = Status(rawValue: errSecMissingEntitlement)\n            XCTAssertEqual(status, .missingEntitlement)\n            XCTAssertEqual(status?.description, \"Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.\")\n        }\n        do {\n            let errSecUpgradePending: OSStatus = -34019\n            let status = Status(rawValue: errSecUpgradePending)\n            XCTAssertEqual(status, .upgradePending)\n            XCTAssertEqual(status?.description, \"Error returned if keychain database needs a schema migration but the device is locked, clients should wait for a device unlock notification and retry the command.\")\n        }\n        do {\n            let errSecMPSignatureInvalid: OSStatus = -25327\n            let status = Status(rawValue: errSecMPSignatureInvalid)\n            XCTAssertEqual(status, .mpSignatureInvalid)\n            XCTAssertEqual(status?.description, \"Signature invalid on MP message\")\n        }\n        do {\n            let errSecOTRTooOld: OSStatus = -25328\n            let status = Status(rawValue: errSecOTRTooOld)\n            XCTAssertEqual(status, .otrTooOld)\n            XCTAssertEqual(status?.description, \"Message is too old to use\")\n        }\n        do {\n            let errSecOTRIDTooNew: OSStatus = -25329\n            let status = Status(rawValue: errSecOTRIDTooNew)\n            XCTAssertEqual(status, .otrIDTooNew)\n            XCTAssertEqual(status?.description, \"Key ID is too new to use! Message from the future?\")\n        }\n        do {\n            let status = Status(rawValue: errSecInsufficientClientID)\n            XCTAssertEqual(status, .insufficientClientID)\n            XCTAssertEqual(status?.description, \"The client ID is not correct.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceReset)\n            XCTAssertEqual(status, .deviceReset)\n            XCTAssertEqual(status?.description, \"A device reset has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceFailed)\n            XCTAssertEqual(status, .deviceFailed)\n            XCTAssertEqual(status?.description, \"A device failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleAddAppACLSubject)\n            XCTAssertEqual(status, .appleAddAppACLSubject)\n            XCTAssertEqual(status?.description, \"Adding an application ACL subject failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecApplePublicKeyIncomplete)\n            XCTAssertEqual(status, .applePublicKeyIncomplete)\n            XCTAssertEqual(status?.description, \"The public key is incomplete.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleSignatureMismatch)\n            XCTAssertEqual(status, .appleSignatureMismatch)\n            XCTAssertEqual(status?.description, \"A signature mismatch has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleInvalidKeyStartDate)\n            XCTAssertEqual(status, .appleInvalidKeyStartDate)\n            XCTAssertEqual(status?.description, \"The specified key has an invalid start date.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleInvalidKeyEndDate)\n            XCTAssertEqual(status, .appleInvalidKeyEndDate)\n            XCTAssertEqual(status?.description, \"The specified key has an invalid end date.\")\n        }\n        do {\n            let status = Status(rawValue: errSecConversionError)\n            XCTAssertEqual(status, .conversionError)\n            XCTAssertEqual(status?.description, \"A conversion error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleSSLv2Rollback)\n            XCTAssertEqual(status, .appleSSLv2Rollback)\n            XCTAssertEqual(status?.description, \"A SSLv2 rollback error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDiskFull)\n            XCTAssertEqual(status, .diskFull)\n            XCTAssertEqual(status?.description, \"The disk is full.\")\n        }\n        do {\n            let status = Status(rawValue: errSecQuotaExceeded)\n            XCTAssertEqual(status, .quotaExceeded)\n            XCTAssertEqual(status?.description, \"The quota was exceeded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFileTooBig)\n            XCTAssertEqual(status, .fileTooBig)\n            XCTAssertEqual(status?.description, \"The file is too big.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDatabaseBlob)\n            XCTAssertEqual(status, .invalidDatabaseBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an invalid blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyBlob)\n            XCTAssertEqual(status, .invalidKeyBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an invalid key blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleDatabaseBlob)\n            XCTAssertEqual(status, .incompatibleDatabaseBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an incompatible blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleKeyBlob)\n            XCTAssertEqual(status, .incompatibleKeyBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an incompatible key blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecHostNameMismatch)\n            XCTAssertEqual(status, .hostNameMismatch)\n            XCTAssertEqual(status?.description, \"A host name mismatch has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCriticalExtensionFlag)\n            XCTAssertEqual(status, .unknownCriticalExtensionFlag)\n            XCTAssertEqual(status?.description, \"There is an unknown critical extension flag.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoBasicConstraints)\n            XCTAssertEqual(status, .noBasicConstraints)\n            XCTAssertEqual(status?.description, \"No basic constraints were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoBasicConstraintsCA)\n            XCTAssertEqual(status, .noBasicConstraintsCA)\n            XCTAssertEqual(status?.description, \"No basic CA constraints were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAuthorityKeyID)\n            XCTAssertEqual(status, .invalidAuthorityKeyID)\n            XCTAssertEqual(status?.description, \"The authority key ID is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubjectKeyID)\n            XCTAssertEqual(status, .invalidSubjectKeyID)\n            XCTAssertEqual(status?.description, \"The subject key ID is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyUsageForPolicy)\n            XCTAssertEqual(status, .invalidKeyUsageForPolicy)\n            XCTAssertEqual(status?.description, \"The key usage is not valid for the specified policy.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidExtendedKeyUsage)\n            XCTAssertEqual(status, .invalidExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The extended key usage is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIDLinkage)\n            XCTAssertEqual(status, .invalidIDLinkage)\n            XCTAssertEqual(status?.description, \"The ID linkage is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPathLengthConstraintExceeded)\n            XCTAssertEqual(status, .pathLengthConstraintExceeded)\n            XCTAssertEqual(status?.description, \"The path length constraint was exceeded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRoot)\n            XCTAssertEqual(status, .invalidRoot)\n            XCTAssertEqual(status?.description, \"The root or anchor certificate is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLExpired)\n            XCTAssertEqual(status, .crlExpired)\n            XCTAssertEqual(status?.description, \"The CRL has expired.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotValidYet)\n            XCTAssertEqual(status, .crlNotValidYet)\n            XCTAssertEqual(status?.description, \"The CRL is not yet valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotFound)\n            XCTAssertEqual(status, .crlNotFound)\n            XCTAssertEqual(status?.description, \"The CRL was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLServerDown)\n            XCTAssertEqual(status, .crlServerDown)\n            XCTAssertEqual(status?.description, \"The CRL server is down.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLBadURI)\n            XCTAssertEqual(status, .crlBadURI)\n            XCTAssertEqual(status?.description, \"The CRL has a bad Uniform Resource Identifier.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCertExtension)\n            XCTAssertEqual(status, .unknownCertExtension)\n            XCTAssertEqual(status?.description, \"An unknown certificate extension was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCRLExtension)\n            XCTAssertEqual(status, .unknownCRLExtension)\n            XCTAssertEqual(status?.description, \"An unknown CRL extension was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotTrusted)\n            XCTAssertEqual(status, .crlNotTrusted)\n            XCTAssertEqual(status?.description, \"The CRL is not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLPolicyFailed)\n            XCTAssertEqual(status, .crlPolicyFailed)\n            XCTAssertEqual(status?.description, \"The CRL policy failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIDPFailure)\n            XCTAssertEqual(status, .idpFailure)\n            XCTAssertEqual(status?.description, \"The issuing distribution point was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEEmailAddressesNotFound)\n            XCTAssertEqual(status, .smimeEmailAddressesNotFound)\n            XCTAssertEqual(status?.description, \"An email address mismatch was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEBadExtendedKeyUsage)\n            XCTAssertEqual(status, .smimeBadExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The appropriate extended key usage for SMIME was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEBadKeyUsage)\n            XCTAssertEqual(status, .smimeBadKeyUsage)\n            XCTAssertEqual(status?.description, \"The key usage is not compatible with SMIME.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEKeyUsageNotCritical)\n            XCTAssertEqual(status, .smimeKeyUsageNotCritical)\n            XCTAssertEqual(status?.description, \"The key usage extension is not marked as critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMENoEmailAddress)\n            XCTAssertEqual(status, .smimeNoEmailAddress)\n            XCTAssertEqual(status?.description, \"No email address was found in the certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMESubjAltNameNotCritical)\n            XCTAssertEqual(status, .smimeSubjAltNameNotCritical)\n            XCTAssertEqual(status?.description, \"The subject alternative name extension is not marked as critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSSLBadExtendedKeyUsage)\n            XCTAssertEqual(status, .sslBadExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The appropriate extended key usage for SSL was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPBadResponse)\n            XCTAssertEqual(status, .ocspBadResponse)\n            XCTAssertEqual(status?.description, \"The OCSP response was incorrect or could not be parsed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPBadRequest)\n            XCTAssertEqual(status, .ocspBadRequest)\n            XCTAssertEqual(status?.description, \"The OCSP request was incorrect or could not be parsed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPUnavailable)\n            XCTAssertEqual(status, .ocspUnavailable)\n            XCTAssertEqual(status?.description, \"OCSP service is unavailable.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPStatusUnrecognized)\n            XCTAssertEqual(status, .ocspStatusUnrecognized)\n            XCTAssertEqual(status?.description, \"The OCSP server did not recognize this certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEndOfData)\n            XCTAssertEqual(status, .endOfData)\n            XCTAssertEqual(status?.description, \"An end-of-data was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompleteCertRevocationCheck)\n            XCTAssertEqual(status, .incompleteCertRevocationCheck)\n            XCTAssertEqual(status?.description, \"An incomplete certificate revocation check occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNetworkFailure)\n            XCTAssertEqual(status, .networkFailure)\n            XCTAssertEqual(status?.description, \"A network failure occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPNotTrustedToAnchor)\n            XCTAssertEqual(status, .ocspNotTrustedToAnchor)\n            XCTAssertEqual(status?.description, \"The OCSP response was not trusted to a root or anchor certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRecordModified)\n            XCTAssertEqual(status, .recordModified)\n            XCTAssertEqual(status?.description, \"The record was modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPSignatureError)\n            XCTAssertEqual(status, .ocspSignatureError)\n            XCTAssertEqual(status?.description, \"The OCSP response had an invalid signature.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPNoSigner)\n            XCTAssertEqual(status, .ocspNoSigner)\n            XCTAssertEqual(status?.description, \"The OCSP response had no signer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderMalformedReq)\n            XCTAssertEqual(status, .ocspResponderMalformedReq)\n            XCTAssertEqual(status?.description, \"The OCSP responder was given a malformed request.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderInternalError)\n            XCTAssertEqual(status, .ocspResponderInternalError)\n            XCTAssertEqual(status?.description, \"The OCSP responder encountered an internal error.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderTryLater)\n            XCTAssertEqual(status, .ocspResponderTryLater)\n            XCTAssertEqual(status?.description, \"The OCSP responder is busy, try again later.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderSignatureRequired)\n            XCTAssertEqual(status, .ocspResponderSignatureRequired)\n            XCTAssertEqual(status?.description, \"The OCSP responder requires a signature.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderUnauthorized)\n            XCTAssertEqual(status, .ocspResponderUnauthorized)\n            XCTAssertEqual(status?.description, \"The OCSP responder rejected this request as unauthorized.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponseNonceMismatch)\n            XCTAssertEqual(status, .ocspResponseNonceMismatch)\n            XCTAssertEqual(status?.description, \"The OCSP response nonce did not match the request.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningBadCertChainLength)\n            XCTAssertEqual(status, .codeSigningBadCertChainLength)\n            XCTAssertEqual(status?.description, \"Code signing encountered an incorrect certificate chain length.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningNoBasicConstraints)\n            XCTAssertEqual(status, .codeSigningNoBasicConstraints)\n            XCTAssertEqual(status?.description, \"Code signing found no basic constraints.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningBadPathLengthConstraint)\n            XCTAssertEqual(status, .codeSigningBadPathLengthConstraint)\n            XCTAssertEqual(status?.description, \"Code signing encountered an incorrect path length constraint.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningNoExtendedKeyUsage)\n            XCTAssertEqual(status, .codeSigningNoExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"Code signing found no extended key usage.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningDevelopment)\n            XCTAssertEqual(status, .codeSigningDevelopment)\n            XCTAssertEqual(status?.description, \"Code signing indicated use of a development-only certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecResourceSignBadCertChainLength)\n            XCTAssertEqual(status, .resourceSignBadCertChainLength)\n            XCTAssertEqual(status?.description, \"Resource signing has encountered an incorrect certificate chain length.\")\n        }\n        do {\n            let status = Status(rawValue: errSecResourceSignBadExtKeyUsage)\n            XCTAssertEqual(status, .resourceSignBadExtKeyUsage)\n            XCTAssertEqual(status?.description, \"Resource signing has encountered an error in the extended key usage.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTrustSettingDeny)\n            XCTAssertEqual(status, .trustSettingDeny)\n            XCTAssertEqual(status?.description, \"The trust setting for this policy was set to Deny.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubjectName)\n            XCTAssertEqual(status, .invalidSubjectName)\n            XCTAssertEqual(status?.description, \"An invalid certificate subject name was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownQualifiedCertStatement)\n            XCTAssertEqual(status, .unknownQualifiedCertStatement)\n            XCTAssertEqual(status?.description, \"An unknown qualified certificate statement was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestQueued)\n            XCTAssertEqual(status, .mobileMeRequestQueued)\n            XCTAssertEqual(status?.description, \"The MobileMe request will be sent during the next connection.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestRedirected)\n            XCTAssertEqual(status, .mobileMeRequestRedirected)\n            XCTAssertEqual(status?.description, \"The MobileMe request was redirected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerError)\n            XCTAssertEqual(status, .mobileMeServerError)\n            XCTAssertEqual(status?.description, \"A MobileMe server error occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerNotAvailable)\n            XCTAssertEqual(status, .mobileMeServerNotAvailable)\n            XCTAssertEqual(status?.description, \"The MobileMe server is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerAlreadyExists)\n            XCTAssertEqual(status, .mobileMeServerAlreadyExists)\n            XCTAssertEqual(status?.description, \"The MobileMe server reported that the item already exists.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerServiceErr)\n            XCTAssertEqual(status, .mobileMeServerServiceErr)\n            XCTAssertEqual(status?.description, \"A MobileMe service error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestAlreadyPending)\n            XCTAssertEqual(status, .mobileMeRequestAlreadyPending)\n            XCTAssertEqual(status?.description, \"A MobileMe request is already pending.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeNoRequestPending)\n            XCTAssertEqual(status, .mobileMeNoRequestPending)\n            XCTAssertEqual(status?.description, \"MobileMe has no request pending.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeCSRVerifyFailure)\n            XCTAssertEqual(status, .mobileMeCSRVerifyFailure)\n            XCTAssertEqual(status?.description, \"A MobileMe CSR verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeFailedConsistencyCheck)\n            XCTAssertEqual(status, .mobileMeFailedConsistencyCheck)\n            XCTAssertEqual(status?.description, \"MobileMe has found a failed consistency check.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotInitialized)\n            XCTAssertEqual(status, .notInitialized)\n            XCTAssertEqual(status?.description, \"A function was called without initializing CSSM.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidHandleUsage)\n            XCTAssertEqual(status, .invalidHandleUsage)\n            XCTAssertEqual(status?.description, \"The CSSM handle does not match with the service type.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPVCReferentNotFound)\n            XCTAssertEqual(status, .pvcReferentNotFound)\n            XCTAssertEqual(status?.description, \"A reference to the calling module was not found in the list of authorized callers.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFunctionIntegrityFail)\n            XCTAssertEqual(status, .functionIntegrityFail)\n            XCTAssertEqual(status?.description, \"A function address was not within the verified module.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInternalError)\n            XCTAssertEqual(status, .internalError)\n            XCTAssertEqual(status?.description, \"An internal error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMemoryError)\n            XCTAssertEqual(status, .memoryError)\n            XCTAssertEqual(status?.description, \"A memory error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidData)\n            XCTAssertEqual(status, .invalidData)\n            XCTAssertEqual(status?.description, \"Invalid data was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMDSError)\n            XCTAssertEqual(status, .mdsError)\n            XCTAssertEqual(status?.description, \"A Module Directory Service error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPointer)\n            XCTAssertEqual(status, .invalidPointer)\n            XCTAssertEqual(status?.description, \"An invalid pointer was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSelfCheckFailed)\n            XCTAssertEqual(status, .selfCheckFailed)\n            XCTAssertEqual(status?.description, \"Self-check has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFunctionFailed)\n            XCTAssertEqual(status, .functionFailed)\n            XCTAssertEqual(status?.description, \"A function has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManifestVerifyFailed)\n            XCTAssertEqual(status, .moduleManifestVerifyFailed)\n            XCTAssertEqual(status?.description, \"A module manifest verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidGUID)\n            XCTAssertEqual(status, .invalidGUID)\n            XCTAssertEqual(status?.description, \"An invalid GUID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidHandle)\n            XCTAssertEqual(status, .invalidHandle)\n            XCTAssertEqual(status?.description, \"An invalid handle was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDBList)\n            XCTAssertEqual(status, .invalidDBList)\n            XCTAssertEqual(status?.description, \"An invalid DB list was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPassthroughID)\n            XCTAssertEqual(status, .invalidPassthroughID)\n            XCTAssertEqual(status?.description, \"An invalid passthrough ID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNetworkAddress)\n            XCTAssertEqual(status, .invalidNetworkAddress)\n            XCTAssertEqual(status?.description, \"An invalid network address was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLAlreadySigned)\n            XCTAssertEqual(status, .crlAlreadySigned)\n            XCTAssertEqual(status?.description, \"The certificate revocation list is already signed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNumberOfFields)\n            XCTAssertEqual(status, .invalidNumberOfFields)\n            XCTAssertEqual(status?.description, \"An invalid number of fields were encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerificationFailure)\n            XCTAssertEqual(status, .verificationFailure)\n            XCTAssertEqual(status?.description, \"A verification failure occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownTag)\n            XCTAssertEqual(status, .unknownTag)\n            XCTAssertEqual(status?.description, \"An unknown tag was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSignature)\n            XCTAssertEqual(status, .invalidSignature)\n            XCTAssertEqual(status?.description, \"An invalid signature was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidName)\n            XCTAssertEqual(status, .invalidName)\n            XCTAssertEqual(status?.description, \"An invalid name was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertificateRef)\n            XCTAssertEqual(status, .invalidCertificateRef)\n            XCTAssertEqual(status?.description, \"An invalid certificate reference was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertificateGroup)\n            XCTAssertEqual(status, .invalidCertificateGroup)\n            XCTAssertEqual(status?.description, \"An invalid certificate group was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTagNotFound)\n            XCTAssertEqual(status, .tagNotFound)\n            XCTAssertEqual(status?.description, \"The specified tag was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidQuery)\n            XCTAssertEqual(status, .invalidQuery)\n            XCTAssertEqual(status?.description, \"The specified query was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidValue)\n            XCTAssertEqual(status, .invalidValue)\n            XCTAssertEqual(status?.description, \"An invalid value was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCallbackFailed)\n            XCTAssertEqual(status, .callbackFailed)\n            XCTAssertEqual(status?.description, \"A callback has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLDeleteFailed)\n            XCTAssertEqual(status, .aclDeleteFailed)\n            XCTAssertEqual(status?.description, \"An ACL delete operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLReplaceFailed)\n            XCTAssertEqual(status, .aclReplaceFailed)\n            XCTAssertEqual(status?.description, \"An ACL replace operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLAddFailed)\n            XCTAssertEqual(status, .aclAddFailed)\n            XCTAssertEqual(status?.description, \"An ACL add operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLChangeFailed)\n            XCTAssertEqual(status, .aclChangeFailed)\n            XCTAssertEqual(status?.description, \"An ACL change operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAccessCredentials)\n            XCTAssertEqual(status, .invalidAccessCredentials)\n            XCTAssertEqual(status?.description, \"Invalid access credentials were encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRecord)\n            XCTAssertEqual(status, .invalidRecord)\n            XCTAssertEqual(status?.description, \"An invalid record was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidACL)\n            XCTAssertEqual(status, .invalidACL)\n            XCTAssertEqual(status?.description, \"An invalid ACL was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSampleValue)\n            XCTAssertEqual(status, .invalidSampleValue)\n            XCTAssertEqual(status?.description, \"An invalid sample value was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleVersion)\n            XCTAssertEqual(status, .incompatibleVersion)\n            XCTAssertEqual(status?.description, \"An incompatible version was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPrivilegeNotGranted)\n            XCTAssertEqual(status, .privilegeNotGranted)\n            XCTAssertEqual(status?.description, \"The privilege was not granted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidScope)\n            XCTAssertEqual(status, .invalidScope)\n            XCTAssertEqual(status?.description, \"An invalid scope was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPVCAlreadyConfigured)\n            XCTAssertEqual(status, .pvcAlreadyConfigured)\n            XCTAssertEqual(status?.description, \"The PVC is already configured.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPVC)\n            XCTAssertEqual(status, .invalidPVC)\n            XCTAssertEqual(status?.description, \"An invalid PVC was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEMMLoadFailed)\n            XCTAssertEqual(status, .emmLoadFailed)\n            XCTAssertEqual(status?.description, \"The EMM load has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEMMUnloadFailed)\n            XCTAssertEqual(status, .emmUnloadFailed)\n            XCTAssertEqual(status?.description, \"The EMM unload has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAddinLoadFailed)\n            XCTAssertEqual(status, .addinLoadFailed)\n            XCTAssertEqual(status?.description, \"The add-in load operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyRef)\n            XCTAssertEqual(status, .invalidKeyRef)\n            XCTAssertEqual(status?.description, \"An invalid key was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyHierarchy)\n            XCTAssertEqual(status, .invalidKeyHierarchy)\n            XCTAssertEqual(status?.description, \"An invalid key hierarchy was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAddinUnloadFailed)\n            XCTAssertEqual(status, .addinUnloadFailed)\n            XCTAssertEqual(status?.description, \"The add-in unload operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecLibraryReferenceNotFound)\n            XCTAssertEqual(status, .libraryReferenceNotFound)\n            XCTAssertEqual(status?.description, \"A library reference was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAddinFunctionTable)\n            XCTAssertEqual(status, .invalidAddinFunctionTable)\n            XCTAssertEqual(status?.description, \"An invalid add-in function table was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidServiceMask)\n            XCTAssertEqual(status, .invalidServiceMask)\n            XCTAssertEqual(status?.description, \"An invalid service mask was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleNotLoaded)\n            XCTAssertEqual(status, .moduleNotLoaded)\n            XCTAssertEqual(status?.description, \"A module was not loaded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubServiceID)\n            XCTAssertEqual(status, .invalidSubServiceID)\n            XCTAssertEqual(status?.description, \"An invalid subservice ID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAttributeNotInContext)\n            XCTAssertEqual(status, .attributeNotInContext)\n            XCTAssertEqual(status?.description, \"An attribute was not in the context.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManagerInitializeFailed)\n            XCTAssertEqual(status, .moduleManagerInitializeFailed)\n            XCTAssertEqual(status?.description, \"A module failed to initialize.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManagerNotFound)\n            XCTAssertEqual(status, .moduleManagerNotFound)\n            XCTAssertEqual(status?.description, \"A module was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEventNotificationCallbackNotFound)\n            XCTAssertEqual(status, .eventNotificationCallbackNotFound)\n            XCTAssertEqual(status?.description, \"An event notification callback was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInputLengthError)\n            XCTAssertEqual(status, .inputLengthError)\n            XCTAssertEqual(status?.description, \"An input length error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOutputLengthError)\n            XCTAssertEqual(status, .outputLengthError)\n            XCTAssertEqual(status?.description, \"An output length error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPrivilegeNotSupported)\n            XCTAssertEqual(status, .privilegeNotSupported)\n            XCTAssertEqual(status?.description, \"The privilege is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceError)\n            XCTAssertEqual(status, .deviceError)\n            XCTAssertEqual(status?.description, \"A device error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAttachHandleBusy)\n            XCTAssertEqual(status, .attachHandleBusy)\n            XCTAssertEqual(status?.description, \"The CSP handle was busy.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotLoggedIn)\n            XCTAssertEqual(status, .notLoggedIn)\n            XCTAssertEqual(status?.description, \"You are not logged in.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAlgorithmMismatch)\n            XCTAssertEqual(status, .algorithmMismatch)\n            XCTAssertEqual(status?.description, \"An algorithm mismatch was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyUsageIncorrect)\n            XCTAssertEqual(status, .keyUsageIncorrect)\n            XCTAssertEqual(status?.description, \"The key usage is incorrect.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyBlobTypeIncorrect)\n            XCTAssertEqual(status, .keyBlobTypeIncorrect)\n            XCTAssertEqual(status?.description, \"The key blob type is incorrect.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyHeaderInconsistent)\n            XCTAssertEqual(status, .keyHeaderInconsistent)\n            XCTAssertEqual(status?.description, \"The key header is inconsistent.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyFormat)\n            XCTAssertEqual(status, .unsupportedKeyFormat)\n            XCTAssertEqual(status?.description, \"The key header format is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeySize)\n            XCTAssertEqual(status, .unsupportedKeySize)\n            XCTAssertEqual(status?.description, \"The key size is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyUsageMask)\n            XCTAssertEqual(status, .invalidKeyUsageMask)\n            XCTAssertEqual(status?.description, \"The key usage mask is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyUsageMask)\n            XCTAssertEqual(status, .unsupportedKeyUsageMask)\n            XCTAssertEqual(status?.description, \"The key usage mask is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyAttributeMask)\n            XCTAssertEqual(status, .invalidKeyAttributeMask)\n            XCTAssertEqual(status?.description, \"The key attribute mask is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyAttributeMask)\n            XCTAssertEqual(status, .unsupportedKeyAttributeMask)\n            XCTAssertEqual(status?.description, \"The key attribute mask is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyLabel)\n            XCTAssertEqual(status, .invalidKeyLabel)\n            XCTAssertEqual(status?.description, \"The key label is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyLabel)\n            XCTAssertEqual(status, .unsupportedKeyLabel)\n            XCTAssertEqual(status?.description, \"The key label is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyFormat)\n            XCTAssertEqual(status, .invalidKeyFormat)\n            XCTAssertEqual(status?.description, \"The key format is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedVectorOfBuffers)\n            XCTAssertEqual(status, .unsupportedVectorOfBuffers)\n            XCTAssertEqual(status?.description, \"The vector of buffers is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidInputVector)\n            XCTAssertEqual(status, .invalidInputVector)\n            XCTAssertEqual(status?.description, \"The input vector is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidOutputVector)\n            XCTAssertEqual(status, .invalidOutputVector)\n            XCTAssertEqual(status?.description, \"The output vector is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidContext)\n            XCTAssertEqual(status, .invalidContext)\n            XCTAssertEqual(status?.description, \"An invalid context was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAlgorithm)\n            XCTAssertEqual(status, .invalidAlgorithm)\n            XCTAssertEqual(status?.description, \"An invalid algorithm was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKey)\n            XCTAssertEqual(status, .invalidAttributeKey)\n            XCTAssertEqual(status?.description, \"A key attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKey)\n            XCTAssertEqual(status, .missingAttributeKey)\n            XCTAssertEqual(status?.description, \"A key attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeInitVector)\n            XCTAssertEqual(status, .invalidAttributeInitVector)\n            XCTAssertEqual(status?.description, \"An init vector attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeInitVector)\n            XCTAssertEqual(status, .missingAttributeInitVector)\n            XCTAssertEqual(status?.description, \"An init vector attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSalt)\n            XCTAssertEqual(status, .invalidAttributeSalt)\n            XCTAssertEqual(status?.description, \"A salt attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSalt)\n            XCTAssertEqual(status, .missingAttributeSalt)\n            XCTAssertEqual(status?.description, \"A salt attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePadding)\n            XCTAssertEqual(status, .invalidAttributePadding)\n            XCTAssertEqual(status?.description, \"A padding attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePadding)\n            XCTAssertEqual(status, .missingAttributePadding)\n            XCTAssertEqual(status?.description, \"A padding attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeRandom)\n            XCTAssertEqual(status, .invalidAttributeRandom)\n            XCTAssertEqual(status?.description, \"A random number attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeRandom)\n            XCTAssertEqual(status, .missingAttributeRandom)\n            XCTAssertEqual(status?.description, \"A random number attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSeed)\n            XCTAssertEqual(status, .invalidAttributeSeed)\n            XCTAssertEqual(status?.description, \"A seed attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSeed)\n            XCTAssertEqual(status, .missingAttributeSeed)\n            XCTAssertEqual(status?.description, \"A seed attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePassphrase)\n            XCTAssertEqual(status, .invalidAttributePassphrase)\n            XCTAssertEqual(status?.description, \"A passphrase attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePassphrase)\n            XCTAssertEqual(status, .missingAttributePassphrase)\n            XCTAssertEqual(status?.description, \"A passphrase attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKeyLength)\n            XCTAssertEqual(status, .invalidAttributeKeyLength)\n            XCTAssertEqual(status?.description, \"A key length attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKeyLength)\n            XCTAssertEqual(status, .missingAttributeKeyLength)\n            XCTAssertEqual(status?.description, \"A key length attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeBlockSize)\n            XCTAssertEqual(status, .invalidAttributeBlockSize)\n            XCTAssertEqual(status?.description, \"A block size attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeBlockSize)\n            XCTAssertEqual(status, .missingAttributeBlockSize)\n            XCTAssertEqual(status?.description, \"A block size attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeOutputSize)\n            XCTAssertEqual(status, .invalidAttributeOutputSize)\n            XCTAssertEqual(status?.description, \"An output size attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeOutputSize)\n            XCTAssertEqual(status, .missingAttributeOutputSize)\n            XCTAssertEqual(status?.description, \"An output size attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeRounds)\n            XCTAssertEqual(status, .invalidAttributeRounds)\n            XCTAssertEqual(status?.description, \"The number of rounds attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeRounds)\n            XCTAssertEqual(status, .missingAttributeRounds)\n            XCTAssertEqual(status?.description, \"The number of rounds attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAlgorithmParms)\n            XCTAssertEqual(status, .invalidAlgorithmParms)\n            XCTAssertEqual(status?.description, \"An algorithm parameters attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAlgorithmParms)\n            XCTAssertEqual(status, .missingAlgorithmParms)\n            XCTAssertEqual(status?.description, \"An algorithm parameters attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeLabel)\n            XCTAssertEqual(status, .invalidAttributeLabel)\n            XCTAssertEqual(status?.description, \"A label attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeLabel)\n            XCTAssertEqual(status, .missingAttributeLabel)\n            XCTAssertEqual(status?.description, \"A label attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKeyType)\n            XCTAssertEqual(status, .invalidAttributeKeyType)\n            XCTAssertEqual(status?.description, \"A key type attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKeyType)\n            XCTAssertEqual(status, .missingAttributeKeyType)\n            XCTAssertEqual(status?.description, \"A key type attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeMode)\n            XCTAssertEqual(status, .invalidAttributeMode)\n            XCTAssertEqual(status?.description, \"A mode attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeMode)\n            XCTAssertEqual(status, .missingAttributeMode)\n            XCTAssertEqual(status?.description, \"A mode attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeEffectiveBits)\n            XCTAssertEqual(status, .invalidAttributeEffectiveBits)\n            XCTAssertEqual(status?.description, \"An effective bits attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeEffectiveBits)\n            XCTAssertEqual(status, .missingAttributeEffectiveBits)\n            XCTAssertEqual(status?.description, \"An effective bits attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeStartDate)\n            XCTAssertEqual(status, .invalidAttributeStartDate)\n            XCTAssertEqual(status?.description, \"A start date attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeStartDate)\n            XCTAssertEqual(status, .missingAttributeStartDate)\n            XCTAssertEqual(status?.description, \"A start date attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeEndDate)\n            XCTAssertEqual(status, .invalidAttributeEndDate)\n            XCTAssertEqual(status?.description, \"An end date attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeEndDate)\n            XCTAssertEqual(status, .missingAttributeEndDate)\n            XCTAssertEqual(status?.description, \"An end date attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeVersion)\n            XCTAssertEqual(status, .invalidAttributeVersion)\n            XCTAssertEqual(status?.description, \"A version attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeVersion)\n            XCTAssertEqual(status, .missingAttributeVersion)\n            XCTAssertEqual(status?.description, \"A version attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePrime)\n            XCTAssertEqual(status, .invalidAttributePrime)\n            XCTAssertEqual(status?.description, \"A prime attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePrime)\n            XCTAssertEqual(status, .missingAttributePrime)\n            XCTAssertEqual(status?.description, \"A prime attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeBase)\n            XCTAssertEqual(status, .invalidAttributeBase)\n            XCTAssertEqual(status?.description, \"A base attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeBase)\n            XCTAssertEqual(status, .missingAttributeBase)\n            XCTAssertEqual(status?.description, \"A base attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSubprime)\n            XCTAssertEqual(status, .invalidAttributeSubprime)\n            XCTAssertEqual(status?.description, \"A subprime attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSubprime)\n            XCTAssertEqual(status, .missingAttributeSubprime)\n            XCTAssertEqual(status?.description, \"A subprime attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeIterationCount)\n            XCTAssertEqual(status, .invalidAttributeIterationCount)\n            XCTAssertEqual(status?.description, \"An iteration count attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeIterationCount)\n            XCTAssertEqual(status, .missingAttributeIterationCount)\n            XCTAssertEqual(status?.description, \"An iteration count attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeDLDBHandle)\n            XCTAssertEqual(status, .invalidAttributeDLDBHandle)\n            XCTAssertEqual(status?.description, \"A database handle attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeDLDBHandle)\n            XCTAssertEqual(status, .missingAttributeDLDBHandle)\n            XCTAssertEqual(status?.description, \"A database handle attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeAccessCredentials)\n            XCTAssertEqual(status, .invalidAttributeAccessCredentials)\n            XCTAssertEqual(status?.description, \"An access credentials attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeAccessCredentials)\n            XCTAssertEqual(status, .missingAttributeAccessCredentials)\n            XCTAssertEqual(status?.description, \"An access credentials attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePublicKeyFormat)\n            XCTAssertEqual(status, .invalidAttributePublicKeyFormat)\n            XCTAssertEqual(status?.description, \"A public key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePublicKeyFormat)\n            XCTAssertEqual(status, .missingAttributePublicKeyFormat)\n            XCTAssertEqual(status?.description, \"A public key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePrivateKeyFormat)\n            XCTAssertEqual(status, .invalidAttributePrivateKeyFormat)\n            XCTAssertEqual(status?.description, \"A private key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePrivateKeyFormat)\n            XCTAssertEqual(status, .missingAttributePrivateKeyFormat)\n            XCTAssertEqual(status?.description, \"A private key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status, .invalidAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status?.description, \"A symmetric key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status, .missingAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status?.description, \"A symmetric key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeWrappedKeyFormat)\n            XCTAssertEqual(status, .invalidAttributeWrappedKeyFormat)\n            XCTAssertEqual(status?.description, \"A wrapped key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeWrappedKeyFormat)\n            XCTAssertEqual(status, .missingAttributeWrappedKeyFormat)\n            XCTAssertEqual(status?.description, \"A wrapped key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecStagedOperationInProgress)\n            XCTAssertEqual(status, .stagedOperationInProgress)\n            XCTAssertEqual(status?.description, \"A staged operation is in progress.\")\n        }\n        do {\n            let status = Status(rawValue: errSecStagedOperationNotStarted)\n            XCTAssertEqual(status, .stagedOperationNotStarted)\n            XCTAssertEqual(status?.description, \"A staged operation was not started.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerifyFailed)\n            XCTAssertEqual(status, .verifyFailed)\n            XCTAssertEqual(status?.description, \"A cryptographic verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecQuerySizeUnknown)\n            XCTAssertEqual(status, .querySizeUnknown)\n            XCTAssertEqual(status?.description, \"The query size is unknown.\")\n        }\n        do {\n            let status = Status(rawValue: errSecBlockSizeMismatch)\n            XCTAssertEqual(status, .blockSizeMismatch)\n            XCTAssertEqual(status?.description, \"A block size mismatch occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPublicKeyInconsistent)\n            XCTAssertEqual(status, .publicKeyInconsistent)\n            XCTAssertEqual(status?.description, \"The public key was inconsistent.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceVerifyFailed)\n            XCTAssertEqual(status, .deviceVerifyFailed)\n            XCTAssertEqual(status?.description, \"A device verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidLoginName)\n            XCTAssertEqual(status, .invalidLoginName)\n            XCTAssertEqual(status?.description, \"An invalid login name was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAlreadyLoggedIn)\n            XCTAssertEqual(status, .alreadyLoggedIn)\n            XCTAssertEqual(status?.description, \"The user is already logged in.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDigestAlgorithm)\n            XCTAssertEqual(status, .invalidDigestAlgorithm)\n            XCTAssertEqual(status?.description, \"An invalid digest algorithm was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLGroup)\n            XCTAssertEqual(status, .invalidCRLGroup)\n            XCTAssertEqual(status?.description, \"An invalid CRL group was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateCannotOperate)\n            XCTAssertEqual(status, .certificateCannotOperate)\n            XCTAssertEqual(status?.description, \"The certificate cannot operate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateExpired)\n            XCTAssertEqual(status, .certificateExpired)\n            XCTAssertEqual(status?.description, \"An expired certificate was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateNotValidYet)\n            XCTAssertEqual(status, .certificateNotValidYet)\n            XCTAssertEqual(status?.description, \"The certificate is not yet valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateRevoked)\n            XCTAssertEqual(status, .certificateRevoked)\n            XCTAssertEqual(status?.description, \"The certificate was revoked.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateSuspended)\n            XCTAssertEqual(status, .certificateSuspended)\n            XCTAssertEqual(status?.description, \"The certificate was suspended.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInsufficientCredentials)\n            XCTAssertEqual(status, .insufficientCredentials)\n            XCTAssertEqual(status?.description, \"Insufficient credentials were detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAction)\n            XCTAssertEqual(status, .invalidAction)\n            XCTAssertEqual(status?.description, \"The action was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAuthority)\n            XCTAssertEqual(status, .invalidAuthority)\n            XCTAssertEqual(status?.description, \"The authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerifyActionFailed)\n            XCTAssertEqual(status, .verifyActionFailed)\n            XCTAssertEqual(status?.description, \"A verify action has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertAuthority)\n            XCTAssertEqual(status, .invalidCertAuthority)\n            XCTAssertEqual(status?.description, \"The certificate authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvaldCRLAuthority)\n            XCTAssertEqual(status, .invaldCRLAuthority)\n            XCTAssertEqual(status?.description, \"The CRL authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLEncoding)\n            XCTAssertEqual(status, .invalidCRLEncoding)\n            XCTAssertEqual(status?.description, \"The CRL encoding was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLType)\n            XCTAssertEqual(status, .invalidCRLType)\n            XCTAssertEqual(status?.description, \"The CRL type was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRL)\n            XCTAssertEqual(status, .invalidCRL)\n            XCTAssertEqual(status?.description, \"The CRL was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidFormType)\n            XCTAssertEqual(status, .invalidFormType)\n            XCTAssertEqual(status?.description, \"The form type was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidID)\n            XCTAssertEqual(status, .invalidID)\n            XCTAssertEqual(status?.description, \"The ID was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIdentifier)\n            XCTAssertEqual(status, .invalidIdentifier)\n            XCTAssertEqual(status?.description, \"The identifier was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIndex)\n            XCTAssertEqual(status, .invalidIndex)\n            XCTAssertEqual(status?.description, \"The index was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPolicyIdentifiers)\n            XCTAssertEqual(status, .invalidPolicyIdentifiers)\n            XCTAssertEqual(status?.description, \"The policy identifiers are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTimeString)\n            XCTAssertEqual(status, .invalidTimeString)\n            XCTAssertEqual(status?.description, \"The time specified was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidReason)\n            XCTAssertEqual(status, .invalidReason)\n            XCTAssertEqual(status?.description, \"The trust policy reason was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRequestInputs)\n            XCTAssertEqual(status, .invalidRequestInputs)\n            XCTAssertEqual(status?.description, \"The request inputs are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidResponseVector)\n            XCTAssertEqual(status, .invalidResponseVector)\n            XCTAssertEqual(status?.description, \"The response vector was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidStopOnPolicy)\n            XCTAssertEqual(status, .invalidStopOnPolicy)\n            XCTAssertEqual(status?.description, \"The stop-on policy was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTuple)\n            XCTAssertEqual(status, .invalidTuple)\n            XCTAssertEqual(status?.description, \"The tuple was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMultipleValuesUnsupported)\n            XCTAssertEqual(status, .multipleValuesUnsupported)\n            XCTAssertEqual(status?.description, \"Multiple values are not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotTrusted)\n            XCTAssertEqual(status, .notTrusted)\n            XCTAssertEqual(status?.description, \"The trust policy was not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoDefaultAuthority)\n            XCTAssertEqual(status, .noDefaultAuthority)\n            XCTAssertEqual(status?.description, \"No default authority was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRejectedForm)\n            XCTAssertEqual(status, .rejectedForm)\n            XCTAssertEqual(status?.description, \"The trust policy had a rejected form.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestLost)\n            XCTAssertEqual(status, .requestLost)\n            XCTAssertEqual(status?.description, \"The request was lost.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestRejected)\n            XCTAssertEqual(status, .requestRejected)\n            XCTAssertEqual(status?.description, \"The request was rejected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedAddressType)\n            XCTAssertEqual(status, .unsupportedAddressType)\n            XCTAssertEqual(status?.description, \"The address type is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedService)\n            XCTAssertEqual(status, .unsupportedService)\n            XCTAssertEqual(status?.description, \"The service is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTupleGroup)\n            XCTAssertEqual(status, .invalidTupleGroup)\n            XCTAssertEqual(status?.description, \"The tuple group was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidBaseACLs)\n            XCTAssertEqual(status, .invalidBaseACLs)\n            XCTAssertEqual(status?.description, \"The base ACLs are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTupleCredendtials)\n            XCTAssertEqual(status, .invalidTupleCredendtials)\n            XCTAssertEqual(status?.description, \"The tuple credentials are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidEncoding)\n            XCTAssertEqual(status, .invalidEncoding)\n            XCTAssertEqual(status?.description, \"The encoding was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidValidityPeriod)\n            XCTAssertEqual(status, .invalidValidityPeriod)\n            XCTAssertEqual(status?.description, \"The validity period was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRequestor)\n            XCTAssertEqual(status, .invalidRequestor)\n            XCTAssertEqual(status?.description, \"The requestor was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestDescriptor)\n            XCTAssertEqual(status, .requestDescriptor)\n            XCTAssertEqual(status?.description, \"The request descriptor was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidBundleInfo)\n            XCTAssertEqual(status, .invalidBundleInfo)\n            XCTAssertEqual(status?.description, \"The bundle information was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLIndex)\n            XCTAssertEqual(status, .invalidCRLIndex)\n            XCTAssertEqual(status?.description, \"The CRL index was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoFieldValues)\n            XCTAssertEqual(status, .noFieldValues)\n            XCTAssertEqual(status?.description, \"No field values were detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedFieldFormat)\n            XCTAssertEqual(status, .unsupportedFieldFormat)\n            XCTAssertEqual(status?.description, \"The field format is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedIndexInfo)\n            XCTAssertEqual(status, .unsupportedIndexInfo)\n            XCTAssertEqual(status?.description, \"The index information is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedLocality)\n            XCTAssertEqual(status, .unsupportedLocality)\n            XCTAssertEqual(status?.description, \"The locality is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumAttributes)\n            XCTAssertEqual(status, .unsupportedNumAttributes)\n            XCTAssertEqual(status?.description, \"The number of attributes is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumIndexes)\n            XCTAssertEqual(status, .unsupportedNumIndexes)\n            XCTAssertEqual(status?.description, \"The number of indexes is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumRecordTypes)\n            XCTAssertEqual(status, .unsupportedNumRecordTypes)\n            XCTAssertEqual(status?.description, \"The number of record types is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFieldSpecifiedMultiple)\n            XCTAssertEqual(status, .fieldSpecifiedMultiple)\n            XCTAssertEqual(status?.description, \"Too many fields were specified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleFieldFormat)\n            XCTAssertEqual(status, .incompatibleFieldFormat)\n            XCTAssertEqual(status?.description, \"The field format was incompatible.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidParsingModule)\n            XCTAssertEqual(status, .invalidParsingModule)\n            XCTAssertEqual(status?.description, \"The parsing module was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDatabaseLocked)\n            XCTAssertEqual(status, .databaseLocked)\n            XCTAssertEqual(status?.description, \"The database is locked.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDatastoreIsOpen)\n            XCTAssertEqual(status, .datastoreIsOpen)\n            XCTAssertEqual(status?.description, \"The data store is open.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingValue)\n            XCTAssertEqual(status, .missingValue)\n            XCTAssertEqual(status?.description, \"A missing value was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedQueryLimits)\n            XCTAssertEqual(status, .unsupportedQueryLimits)\n            XCTAssertEqual(status?.description, \"The query limits are not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumSelectionPreds)\n            XCTAssertEqual(status, .unsupportedNumSelectionPreds)\n            XCTAssertEqual(status?.description, \"The number of selection predicates is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedOperator)\n            XCTAssertEqual(status, .unsupportedOperator)\n            XCTAssertEqual(status?.description, \"The operator is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDBLocation)\n            XCTAssertEqual(status, .invalidDBLocation)\n            XCTAssertEqual(status?.description, \"The database location is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAccessRequest)\n            XCTAssertEqual(status, .invalidAccessRequest)\n            XCTAssertEqual(status?.description, \"The access request is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIndexInfo)\n            XCTAssertEqual(status, .invalidIndexInfo)\n            XCTAssertEqual(status?.description, \"The index information is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNewOwner)\n            XCTAssertEqual(status, .invalidNewOwner)\n            XCTAssertEqual(status?.description, \"The new owner is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidModifyMode)\n            XCTAssertEqual(status, .invalidModifyMode)\n            XCTAssertEqual(status?.description, \"The modify mode is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingRequiredExtension)\n            XCTAssertEqual(status, .missingRequiredExtension)\n            XCTAssertEqual(status?.description, \"A required certificate extension is missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecExtendedKeyUsageNotCritical)\n            XCTAssertEqual(status, .extendedKeyUsageNotCritical)\n            XCTAssertEqual(status?.description, \"The extended key usage extension was not marked critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampMissing)\n            XCTAssertEqual(status, .timestampMissing)\n            XCTAssertEqual(status?.description, \"A timestamp was expected but was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampInvalid)\n            XCTAssertEqual(status, .timestampInvalid)\n            XCTAssertEqual(status?.description, \"The timestamp was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampNotTrusted)\n            XCTAssertEqual(status, .timestampNotTrusted)\n            XCTAssertEqual(status?.description, \"The timestamp was not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampServiceNotAvailable)\n            XCTAssertEqual(status, .timestampServiceNotAvailable)\n            XCTAssertEqual(status?.description, \"The timestamp service is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadAlg)\n            XCTAssertEqual(status, .timestampBadAlg)\n            XCTAssertEqual(status?.description, \"An unrecognized or unsupported Algorithm Identifier in timestamp.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadRequest)\n            XCTAssertEqual(status, .timestampBadRequest)\n            XCTAssertEqual(status?.description, \"The timestamp transaction is not permitted or supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadDataFormat)\n            XCTAssertEqual(status, .timestampBadDataFormat)\n            XCTAssertEqual(status?.description, \"The timestamp data submitted has the wrong format.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampTimeNotAvailable)\n            XCTAssertEqual(status, .timestampTimeNotAvailable)\n            XCTAssertEqual(status?.description, \"The time source for the Timestamp Authority is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampUnacceptedPolicy)\n            XCTAssertEqual(status, .timestampUnacceptedPolicy)\n            XCTAssertEqual(status?.description, \"The requested policy is not supported by the Timestamp Authority.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampUnacceptedExtension)\n            XCTAssertEqual(status, .timestampUnacceptedExtension)\n            XCTAssertEqual(status?.description, \"The requested extension is not supported by the Timestamp Authority.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampAddInfoNotAvailable)\n            XCTAssertEqual(status, .timestampAddInfoNotAvailable)\n            XCTAssertEqual(status?.description, \"The additional information requested is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampSystemFailure)\n            XCTAssertEqual(status, .timestampSystemFailure)\n            XCTAssertEqual(status?.description, \"The timestamp request cannot be handled due to system failure.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSigningTimeMissing)\n            XCTAssertEqual(status, .signingTimeMissing)\n            XCTAssertEqual(status?.description, \"A signing time was expected but was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRejection)\n            XCTAssertEqual(status, .timestampRejection)\n            XCTAssertEqual(status?.description, \"A timestamp transaction was rejected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampWaiting)\n            XCTAssertEqual(status, .timestampWaiting)\n            XCTAssertEqual(status?.description, \"A timestamp transaction is waiting.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRevocationWarning)\n            XCTAssertEqual(status, .timestampRevocationWarning)\n            XCTAssertEqual(status?.description, \"A timestamp authority revocation warning was issued.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRevocationNotification)\n            XCTAssertEqual(status, .timestampRevocationNotification)\n            XCTAssertEqual(status?.description, \"A timestamp authority revocation notification was issued.\")\n        }\n        #endif\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccessTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccessTests/KeychainAccessTests.swift",
    "content": "//\n//  KeychainAccessTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 2014/12/24.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport KeychainAccess\n\nclass KeychainAccessTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n\n        do { try Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").removeAll() } catch {}\n        do { try Keychain(service: \"Twitter\").removeAll() } catch {}\n\n        do { try Keychain(server: URL(string: \"https://example.com\")!, protocolType: .https).removeAll() } catch {}\n        do { try Keychain(server: URL(string: \"https://example.com:443\")!, protocolType: .https).removeAll() } catch {}\n\n        do { try Keychain().removeAll() } catch {}\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    // MARK:\n\n    func testGenericPassword() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testGenericPasswordSubscripting() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = \"kishikawa_katsumi\"\n            keychain[\"password\"] = \"password_1234\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = \"katsumi_kishikawa\"\n            keychain[\"password\"] = \"1234_password\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = nil\n            keychain[\"password\"] = nil\n\n            XCTAssertNil(keychain[\"username\"])\n            XCTAssertNil(keychain[\"password\"])\n        }\n    }\n\n    func testGenericPasswordWithAccessGroup1() {\n        do {\n            // Add Keychain items\n            // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n            // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n            // https://developer.apple.com/documentation/security/ksecattraccessgroup\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychainWithAccessGroup.remove(\"username\") } catch {}\n            do { try keychainWithAccessGroup.remove(\"password\") } catch {}\n\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            XCTAssertNotNil(try! keychain.get(\"username\"))\n            XCTAssertNotNil(try! keychain.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testGenericPasswordWithAccessGroup2() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            // If the access group is empty, the query will match all access group. So delete all values in other access groups.\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n        }\n    }\n\n    // MARK:\n\n    func testInternetPassword() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testInternetPasswordSubscripting() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = \"kishikawa_katsumi\"\n            keychain[\"password\"] = \"password_1234\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = \"katsumi_kishikawa\"\n            keychain[\"password\"] = \"1234_password\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = nil\n            keychain[\"password\"] = nil\n\n            XCTAssertNil(keychain[\"username\"])\n            XCTAssertNil(keychain[\"password\"])\n        }\n    }\n\n    func testInternetPasswordWithAccessGroup1() {\n        do {\n            // Add Keychain items\n            // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n            // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n            // https://developer.apple.com/documentation/security/ksecattraccessgroup\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychainWithAccessGroup.remove(\"username\") } catch {}\n            do { try keychainWithAccessGroup.remove(\"password\") } catch {}\n\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            XCTAssertNotNil(try! keychain.get(\"username\"))\n            XCTAssertNotNil(try! keychain.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testInternetPasswordWithAccessGroup2() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            // If the access group is empty, the query will match all access group. So delete all values in other access groups.\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n        }\n    }\n\n\n    // MARK:\n\n    func testDefaultInitializer() {\n        let keychain = Keychain()\n        XCTAssertEqual(keychain.service, Bundle.main.bundleIdentifier)\n        let service: String\n        #if targetEnvironment(macCatalyst)\n        service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n        #else\n        service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n        #endif\n        XCTAssertEqual(keychain.service, service)\n        XCTAssertNil(keychain.accessGroup)\n    }\n\n    func testInitializerWithService() {\n        let keychain = Keychain(service: \"com.example.github-token\")\n        XCTAssertEqual(keychain.service, \"com.example.github-token\")\n        XCTAssertNil(keychain.accessGroup)\n    }\n\n    func testInitializerWithAccessGroup() {\n        let keychain = Keychain(accessGroup: \"27AEDK3C9F.shared\")\n        let service: String\n        #if targetEnvironment(macCatalyst)\n        service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n        #else\n        service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n        #endif\n        XCTAssertEqual(keychain.service, service)\n        XCTAssertEqual(keychain.accessGroup, \"27AEDK3C9F.shared\")\n    }\n\n    func testInitializerWithServiceAndAccessGroup() {\n        let keychain = Keychain(service: \"com.example.github-token\", accessGroup: \"27AEDK3C9F.shared\")\n        XCTAssertEqual(keychain.service, \"com.example.github-token\")\n        XCTAssertEqual(keychain.accessGroup, \"27AEDK3C9F.shared\")\n    }\n\n    func testInitializerWithServer() {\n        let server = \"https://kishikawakatsumi.com\"\n        let url = URL(string: server)!\n\n        do {\n            let keychain = Keychain(server: server, protocolType: .https)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.default)\n        }\n        do {\n            let keychain = Keychain(server: url, protocolType: .https)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.default)\n        }\n    }\n\n    func testInitializerWithServerAndAuthenticationType() {\n        let server = \"https://kishikawakatsumi.com\"\n        let url = URL(string: server)!\n\n        do {\n            let keychain = Keychain(server: server, protocolType: .https, authenticationType: .htmlForm)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.htmlForm)\n        }\n        do {\n            let keychain = Keychain(server: url, protocolType: .https, authenticationType: .htmlForm)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.htmlForm)\n        }\n    }\n\n    // MARK:\n\n    func testContains() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertFalse(try! keychain.contains(\"username\"), \"not stored username\")\n        XCTAssertFalse(try! keychain.contains(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertTrue(try! keychain.contains(\"username\"), \"stored username\")\n        XCTAssertFalse(try! keychain.contains(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertTrue(try! keychain.contains(\"username\"), \"stored username\")\n        XCTAssertTrue(try! keychain.contains(\"password\"), \"stored password\")\n    }\n\n    // MARK:\n\n    func testSetString() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n    }\n\n    func testSetStringWithLabel() {\n        let keychain = Keychain(service: \"Twitter\")\n            .label(\"Twitter Account\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertNil(label)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertEqual(label, \"Twitter Account\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetStringWithComment() {\n        let keychain = Keychain(service: \"Twitter\")\n            .comment(\"Kishikawa Katsumi\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertNil(comment)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertEqual(comment, \"Kishikawa Katsumi\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetStringWithLabelAndComment() {\n        let keychain = Keychain(service: \"Twitter\")\n            .label(\"Twitter Account\")\n            .comment(\"Kishikawa Katsumi\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertNil(label)\n\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertNil(comment)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertEqual(label, \"Twitter Account\")\n\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertEqual(comment, \"Kishikawa Katsumi\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetData() {\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"not stored JSON data\")\n\n        do { try keychain.set(JSONData, key: \"JSONData\") } catch {}\n        XCTAssertEqual(try! keychain.getData(\"JSONData\"), JSONData, \"stored JSON data\")\n    }\n\n    func testStringConversionError() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        let length = 256\n        let data = NSMutableData(length: length)!\n        let bytes = data.mutableBytes.bindMemory(to: UInt8.self, capacity: length)\n        _ = SecRandomCopyBytes(kSecRandomDefault, length, bytes)\n\n        do {\n            try keychain.set(data as Data, key: \"RandomData\")\n            let _ = try keychain.getString(\"RandomData\")\n            XCTFail(\"no error occurred\")\n        } catch let error as NSError {\n            XCTAssertEqual(error.domain, KeychainAccessErrorDomain)\n            XCTAssertEqual(error.code, Int(Status.conversionError.rawValue))\n            XCTAssertEqual(error.userInfo[NSLocalizedDescriptionKey] as! String, Status.conversionError.localizedDescription)\n        } catch {\n            XCTFail(\"unexpected error occurred\")\n        }\n\n        do {\n            try keychain.set(data as Data, key: \"RandomData\")\n            let _ = try keychain.getString(\"RandomData\")\n            XCTFail(\"no error occurred\")\n        } catch Status.conversionError {\n            XCTAssertTrue(true)\n        } catch {\n            XCTFail(\"unexpected error occurred\")\n        }\n    }\n\n    func testGetPersistentRef() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let persistentRef = try keychain.get(\"kishikawakatsumi\") { $0?.persistentRef }\n            XCTAssertNil(persistentRef)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let persistentRef = try keychain.get(\"kishikawakatsumi\") { $0?.persistentRef }\n            XCTAssertNotNil(persistentRef)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    #if os(iOS) || os(tvOS)\n    func testSetAttributes() {\n        do {\n            var attributes = [String: Any]()\n            attributes[String(kSecAttrDescription)] = \"Description Test\"\n            attributes[String(kSecAttrComment)] = \"Comment Test\"\n            attributes[String(kSecAttrCreator)] = \"Creator Test\"\n            attributes[String(kSecAttrType)] = \"Type Test\"\n            attributes[String(kSecAttrLabel)] = \"Label Test\"\n            attributes[String(kSecAttrIsInvisible)] = true\n            attributes[String(kSecAttrIsNegative)] = true\n\n            let keychain = Keychain(service: \"Twitter\")\n                .attributes(attributes)\n\n            XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertNil(attributes)\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            keychain[\"kishikawakatsumi\"] = \"password1234\"\n            XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.genericPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if targetEnvironment(macCatalyst)\n                XCTAssertNotNil(attributes?.accessControl)\n                #else\n                if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 11, minorVersion: 3, patchVersion: 0)) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertEqual(attributes?.service, \"Twitter\")\n                XCTAssertNil(attributes?.generic)\n                XCTAssertNil(attributes?.securityDomain)\n                XCTAssertNil(attributes?.server)\n                XCTAssertNil(attributes?.`protocol`)\n                XCTAssertNil(attributes?.authenticationType)\n                XCTAssertNil(attributes?.port)\n                XCTAssertNil(attributes?.path)\n\n                XCTAssertEqual(attributes?[String(kSecClass)] as? String, ItemClass.genericPassword.rawValue)\n                XCTAssertEqual(attributes?[String(kSecValueData)] as? Data, \"password1234\".data(using: .utf8))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n\n        do {\n            var attributes = [String: Any]()\n            attributes[String(kSecAttrDescription)] = \"Description Test\"\n            attributes[String(kSecAttrComment)] = \"Comment Test\"\n            attributes[String(kSecAttrCreator)] = \"Creator Test\"\n            attributes[String(kSecAttrType)] = \"Type Test\"\n            attributes[String(kSecAttrLabel)] = \"Label Test\"\n            attributes[String(kSecAttrIsInvisible)] = true\n            attributes[String(kSecAttrIsNegative)] = true\n            attributes[String(kSecAttrSecurityDomain)] = \"securitydomain\"\n\n            let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n                .attributes(attributes)\n\n            XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertNil(attributes)\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                keychain[\"kishikawakatsumi\"] = \"password1234\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n                keychain[\"kishikawakatsumi\"] = \"1234password\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"1234password\", \"updated password\")\n\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"1234password\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n                    .attributes([String(kSecAttrDescription): \"Updated Description\"])\n\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"1234password\", \"stored password\")\n\n                keychain[\"kishikawakatsumi\"] = \"password1234\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"updated password\")\n\n                let attributes = keychain[attributes: \"kishikawakatsumi\"]\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Updated Description\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            }\n        }\n    }\n    #endif\n\n    func testRemoveString() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n\n        do { try keychain.remove(\"username\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"left password\")\n\n        do { try keychain.remove(\"password\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"removed username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"removed password\")\n    }\n\n    func testRemoveData() {\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"not stored JSON data\")\n\n        do { try keychain.set(JSONData, key: \"JSONData\") } catch {}\n        XCTAssertEqual(try! keychain.getData(\"JSONData\"), JSONData, \"stored JSON data\")\n\n        do { try keychain.remove(\"JSONData\") } catch {}\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"removed JSON data\")\n    }\n\n    // MARK:\n\n    func testSubscripting() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(keychain[\"username\"], \"not stored username\")\n        XCTAssertNil(keychain[\"password\"], \"not stored password\")\n        XCTAssertNil(keychain[string: \"username\"], \"not stored username\")\n        XCTAssertNil(keychain[string: \"password\"], \"not stored password\")\n\n        keychain[\"username\"] = \"kishikawakatsumi\"\n        XCTAssertEqual(keychain[\"username\"], \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(keychain[string: \"username\"], \"kishikawakatsumi\", \"stored username\")\n\n        keychain[\"password\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"password\"], \"password1234\", \"stored password\")\n        XCTAssertEqual(keychain[string: \"password\"], \"password1234\", \"stored password\")\n\n        keychain[string: \"username\"] = nil\n        XCTAssertNil(keychain[\"username\"], \"removed username\")\n        XCTAssertEqual(keychain[\"password\"], \"password1234\", \"left password\")\n        XCTAssertNil(keychain[string: \"username\"], \"removed username\")\n        XCTAssertEqual(keychain[string: \"password\"], \"password1234\", \"left password\")\n\n        keychain[string: \"password\"] = nil\n        XCTAssertNil(keychain[\"username\"], \"removed username\")\n        XCTAssertNil(keychain[\"password\"], \"removed password\")\n        XCTAssertNil(keychain[string: \"username\"], \"removed username\")\n        XCTAssertNil(keychain[string: \"password\"], \"removed password\")\n\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        XCTAssertNil(keychain[data:\"JSONData\"], \"not stored JSON data\")\n\n        keychain[data: \"JSONData\"] = JSONData\n        XCTAssertEqual(keychain[data: \"JSONData\"], JSONData, \"stored JSON data\")\n\n        keychain[data: \"JSONData\"] = nil\n        XCTAssertNil(keychain[data:\"JSONData\"], \"removed JSON data\")\n    }\n\n    // MARK:\n\n    func testErrorHandling() {\n        do {\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain(service: \"Twitter\")\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain()\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.set(\"kishikawa_katsumi\", key: \"username\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.set(\"password_1234\", key: \"password\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                let username = try keychain.get(\"username\")\n                XCTAssertEqual(username, \"kishikawa_katsumi\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let password = try keychain.get(\"password\")\n                XCTAssertEqual(password, \"password_1234\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.set(\"katsumi_kishikawa\", key: \"username\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.set(\"1234_password\", key: \"password\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                let username = try keychain.get(\"username\")\n                XCTAssertEqual(username, \"katsumi_kishikawa\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let password = try keychain.get(\"password\")\n                XCTAssertEqual(password, \"1234_password\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n        \n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.remove(\"username\")\n                XCTAssertNil(try! keychain.get(\"username\"))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.remove(\"password\")\n                XCTAssertNil(try! keychain.get(\"username\"))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n    }\n\n    // MARK:\n\n    func testSetStringWithCustomService() {\n        let username_1 = \"kishikawakatsumi\"\n        let password_1 = \"password1234\"\n        let username_2 = \"kishikawa_katsumi\"\n        let password_2 = \"password_1234\"\n        let username_3 = \"k_katsumi\"\n        let password_3 = \"12341234\"\n\n        let service_1 = \"\"\n        let service_2 = \"com.kishikawakatsumi.KeychainAccess\"\n        let service_3 = \"example.com\"\n\n        do { try Keychain().removeAll() } catch {}\n        do { try Keychain(service: service_1).removeAll() } catch {}\n        do { try Keychain(service: service_2).removeAll() } catch {}\n        do { try Keychain(service: service_3).removeAll() } catch {}\n\n        XCTAssertNil(try! Keychain().get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain().get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain().set(username_1, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_1).set(username_1, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_2).set(username_2, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_3).set(username_3, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"stored username\")\n\n        do { try Keychain().set(password_1, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_1).set(password_1, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_2).set(password_2, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_3).set(password_3, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"stored password\")\n\n        do { try Keychain().remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_1).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_2).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_3).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"removed username\")\n\n        do { try Keychain().remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_1).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_2).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_3).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n    }\n\n    // MARK:\n\n    func testProperties() {\n        guard #available(OSX 10.10, *) else {\n            return\n        }\n\n        let keychain = Keychain()\n\n        XCTAssertEqual(keychain.synchronizable, false)\n        XCTAssertEqual(keychain.synchronizable(true).synchronizable, true)\n        XCTAssertEqual(keychain.synchronizable(false).synchronizable, false)\n        XCTAssertEqual(keychain.accessibility(.afterFirstUnlock).accessibility, Accessibility.afterFirstUnlock)\n        XCTAssertEqual(keychain.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence).accessibility, Accessibility.whenPasscodeSetThisDeviceOnly)\n        XCTAssertEqual(keychain.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence).authenticationPolicy, AuthenticationPolicy.userPresence)\n        XCTAssertNil(keychain.label)\n        XCTAssertEqual(keychain.label(\"Label\").label, \"Label\")\n        XCTAssertNil(keychain.comment)\n        XCTAssertEqual(keychain.comment(\"Comment\").comment, \"Comment\")\n        XCTAssertEqual(keychain.authenticationPrompt(\"Prompt\").authenticationPrompt, \"Prompt\")\n    }\n\n    // MARK:\n\n    func testAllKeys() {\n        do {\n            let keychain = Keychain()\n            keychain[\"key1\"] = \"value1\"\n            keychain[\"key2\"] = \"value2\"\n            keychain[\"key3\"] = \"value3\"\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 3)\n            XCTAssertEqual(allKeys.sorted(), [\"key1\", \"key2\", \"key3\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 3)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n\n            let service: String\n            let accessGroup: String\n            #if targetEnvironment(macCatalyst)\n            service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedItems[0][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n\n            XCTAssertEqual(sortedItems[1][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n\n            XCTAssertEqual(sortedItems[2][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[2][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[2][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[2][\"value\"] as? String, \"value3\")\n            XCTAssertEqual(sortedItems[2][\"key\"] as? String, \"key3\")\n            XCTAssertEqual(sortedItems[2][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[2][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[2][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[2][\"key\"] as? String, \"key3\")\n            XCTAssertEqual(sortedItems[2][\"class\"] as? String, \"GenericPassword\")\n            #endif\n        }\n        do {\n            let keychain = Keychain(service: \"service1\")\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.whenUnlockedThisDeviceOnly)\n                .set(\"service1_value1\", key: \"service1_key1\")\n\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.afterFirstUnlockThisDeviceOnly)\n                .set(\"service1_value2\", key: \"service1_key2\")\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 2)\n            XCTAssertEqual(allKeys.sorted(), [\"service1_key1\", \"service1_key2\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 2)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n\n            let accessGroup: String\n            #if targetEnvironment(macCatalyst)\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedItems[0][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"true\")\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"service1_value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"service1_key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"WhenUnlockedThisDeviceOnly\")\n\n            XCTAssertEqual(sortedItems[1][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"service1_value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"service1_key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlockThisDeviceOnly\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"service1_key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"service1_key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            #endif\n        }\n        do {\n            let keychain = Keychain(server: \"https://google.com\", protocolType: .https)\n            #if !targetEnvironment(macCatalyst)\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.alwaysThisDeviceOnly)\n                .set(\"google.com_value1\", key: \"google.com_key1\")\n            #else\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.afterFirstUnlockThisDeviceOnly)\n                .set(\"google.com_value1\", key: \"google.com_key1\")\n            #endif\n\n            #if !targetEnvironment(macCatalyst)\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.always)\n                .set(\"google.com_value2\", key: \"google.com_key2\")\n            #else\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.afterFirstUnlock)\n                .set(\"google.com_value2\", key: \"google.com_key2\")\n            #endif\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 2)\n            XCTAssertEqual(allKeys.sorted(), [\"google.com_key1\", \"google.com_key2\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 2)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"google.com_value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"google.com_key1\")\n            XCTAssertEqual(sortedItems[0][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[0][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[0][\"protocol\"] as? String, \"HTTPS\")\n            #if targetEnvironment(macCatalyst)\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AfterFirstUnlockThisDeviceOnly\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AlwaysThisDeviceOnly\")\n            #endif\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"true\")\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"google.com_value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"google.com_key2\")\n            XCTAssertEqual(sortedItems[1][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[1][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[1][\"protocol\"] as? String, \"HTTPS\")\n            #if targetEnvironment(macCatalyst)\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n            #else\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"Always\")\n            #endif\n            #else\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"google.com_key1\")\n            XCTAssertEqual(sortedItems[0][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[0][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[0][\"protocol\"] as? String, \"HTTPS\")\n\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"google.com_key2\")\n            XCTAssertEqual(sortedItems[1][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[1][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[1][\"protocol\"] as? String, \"HTTPS\")\n            #endif\n        }\n\n        #if !os(OSX)\n        do {\n            let allKeys = Keychain.allKeys(.genericPassword)\n            XCTAssertEqual(allKeys.count, 5)\n\n            let sortedKeys = allKeys.sorted { (key1, key2) -> Bool in\n                return key1.1.compare(key2.1) == .orderedAscending || key1.1.compare(key2.1) == .orderedSame\n            }\n\n            let service: String\n            #if targetEnvironment(macCatalyst)\n            service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedKeys[0].0, service)\n            XCTAssertEqual(sortedKeys[0].1, \"key1\")\n            XCTAssertEqual(sortedKeys[1].0, service)\n            XCTAssertEqual(sortedKeys[1].1, \"key2\")\n            XCTAssertEqual(sortedKeys[2].0, service)\n            XCTAssertEqual(sortedKeys[2].1, \"key3\")\n            XCTAssertEqual(sortedKeys[3].0, \"service1\")\n            XCTAssertEqual(sortedKeys[3].1, \"service1_key1\")\n            XCTAssertEqual(sortedKeys[4].0, \"service1\")\n            XCTAssertEqual(sortedKeys[4].1, \"service1_key2\")\n        }\n        do {\n            let allKeys = Keychain.allKeys(.internetPassword)\n            XCTAssertEqual(allKeys.count, 2)\n\n            let sortedKeys = allKeys.sorted { (key1, key2) -> Bool in\n                return key1.1.compare(key2.1) == .orderedAscending || key1.1.compare(key2.1) == .orderedSame\n            }\n            XCTAssertEqual(sortedKeys[0].0, \"google.com\")\n            XCTAssertEqual(sortedKeys[0].1, \"google.com_key1\")\n            XCTAssertEqual(sortedKeys[1].0, \"google.com\")\n            XCTAssertEqual(sortedKeys[1].1, \"google.com_key2\")\n        }\n        #endif\n    }\n\n    func testDescription() {\n        do {\n            let keychain = Keychain()\n\n            XCTAssertEqual(keychain.description, \"[]\")\n            XCTAssertEqual(keychain.debugDescription, \"[]\")\n        }\n    }\n\n    // MARK:\n\n    func testAuthenticationPolicy() {\n        guard #available(iOS 9.0, OSX 10.11, *) else {\n            return\n        }\n\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        #if os(iOS)\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .or, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .and, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        #endif\n        #if os(OSX)\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        #endif\n    }\n\n    func testIgnoringAttributeSynchronizable() {\n        let keychain = Keychain(service: \"Twitter\").synchronizable(false)\n        let keychainSynchronizable = Keychain(service: \"Twitter\").synchronizable(true)\n\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\", ignoringAttributeSynchronizable: false) } catch {}\n        do { try keychainSynchronizable.set(\"kishikawakatsumi_synchronizable\", key: \"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\", ignoringAttributeSynchronizable: false) } catch {}\n        do { try keychainSynchronizable.set(\"password1234_synchronizable\", key: \"password\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.remove(\"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n\n        do { try keychainSynchronizable.remove(\"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        \n        XCTAssertEqual(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.removeAll() } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n    }\n\n    func testIgnoringAttributeSynchronizableBackwardCompatibility() {\n        let keychain = Keychain(service: \"Twitter\").synchronizable(false)\n        let keychainSynchronizable = Keychain(service: \"Twitter\").synchronizable(true)\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n\n        do { try keychainSynchronizable.set(\"kishikawakatsumi_synchronizable\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234\", \"stored password\")\n\n        do { try keychainSynchronizable.set(\"password1234_synchronizable\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.remove(\"username\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.removeAll() } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/KeychainAccessTests/SharedCredentialTests.swift",
    "content": "//\n//  SharedCredentialTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 10/12/15.\n//  Copyright © 2015 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport XCTest\nimport KeychainAccess\n\nclass SharedCredentialTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testGetSharedPassword() {\n        do {\n            let expectation = self.expectation(description: \"getSharedPassword\")\n\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https)\n\n            keychain.getSharedPassword(\"kishikawakatsumi\") { (password, error) -> () in\n                XCTAssertNil(password)\n                XCTAssertNotNil(error)\n                expectation.fulfill()\n            }\n\n            waitForExpectations(timeout: 10.0, handler: nil)\n        }\n        do {\n            let expectation = self.expectation(description: \"getSharedPassword\")\n\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https)\n\n            keychain.getSharedPassword { (account, password, error) -> () in\n                XCTAssertNil(account)\n                XCTAssertNil(password)\n                XCTAssertNotNil(error)\n                expectation.fulfill()\n            }\n\n            waitForExpectations(timeout: 10.0, handler: nil)\n        }\n\n    }\n\n    func testGeneratePassword() {\n        do {\n            var passwords = Set<String>()\n            for _ in 0...100_000 {\n                let password = Keychain.generatePassword()\n\n                #if swift(>=4.2)\n                XCTAssertEqual(password.count, \"xxx-xxx-xxx-xxx\".count)\n                #else\n                XCTAssertEqual(password.characters.count, \"xxx-xxx-xxx-xxx\".characters.count)\n                #endif\n                XCTAssertFalse(passwords.contains(password))\n\n                passwords.insert(password)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Rakefile",
    "content": "require 'xcjobs'\nrequire 'json'\n\ndef xcode_version\n  `xcodebuild -version`.split(\"\\n\").first.scan(/\\d+/).join('.')\nend\n\ndef destinations(platform: 'iphonesimulator')\n  if platform == 'iphonesimulator'\n    if xcode_version.start_with?('11')\n      [ 'name=iPhone 11 Pro,OS=13.0'\n      ]\n    elsif xcode_version.start_with?('10')\n      [ 'name=iPhone 5s,OS=12.0',\n        'name=iPhone 6,OS=12.0',\n        'name=iPhone 6s Plus,OS=12.0',\n        'name=iPhone SE,OS=12.0',\n        'name=iPad Air 2,OS=12.0',\n        'name=iPad Pro (9.7-inch),OS=12.0',\n        'name=iPad Pro (12.9-inch),OS=12.0'\n      ]\n    elsif xcode_version.start_with?('9.4')\n      [ 'name=iPhone 5s,OS=11.4',\n        'name=iPhone 6,OS=11.4',\n        'name=iPhone 6s Plus,OS=11.4',\n        'name=iPhone SE,OS=11.4',\n        'name=iPad Air 2,OS=11.4',\n        'name=iPad Pro (9.7-inch),OS=11.4',\n        'name=iPad Pro (12.9-inch),OS=11.4'\n      ]\n    elsif xcode_version.start_with?('9.3')\n      [ 'name=iPhone 5s,OS=11.0.1',\n        'name=iPhone 5s,OS=11.1',\n        'name=iPhone 6,OS=11.2',\n        'name=iPhone 6s Plus,OS=11.3',\n        'name=iPhone SE,OS=11.0.1',\n        'name=iPad Air 2,OS=11.1',\n        'name=iPad Pro (9.7-inch),OS=11.2',\n        'name=iPad Pro (12.9-inch),OS=11.3'\n      ]\n    elsif xcode_version.start_with?('9.2')\n      [ 'name=iPhone 5s,OS=11.2',\n        'name=iPhone 5s,OS=11.2',\n        'name=iPhone 6,OS=11.2',\n        'name=iPhone 6s Plus,OS=11.2',\n        'name=iPhone SE,OS=11.2',\n        'name=iPad Air 2,OS=11.2',\n        'name=iPad Pro (9.7-inch),OS=11.2',\n        'name=iPad Pro (12.9-inch),OS=11.2'\n      ]\n    elsif xcode_version.start_with?('9.1')\n      [ 'name=iPhone 5s,OS=11.1',\n        'name=iPhone 5s,OS=11.1',\n        'name=iPhone 6,OS=11.1',\n        'name=iPhone 6s Plus,OS=11.1',\n        'name=iPhone SE,OS=11.1',\n        'name=iPad Air 2,OS=11.1',\n        'name=iPad Pro (9.7-inch),OS=11.1',\n        'name=iPad Pro (12.9-inch),OS=11.1'\n      ]\n    elsif xcode_version.start_with?('9')\n      [ 'name=iPhone 5,OS=10.0',\n        'name=iPhone 5s,OS=10.0',\n        'name=iPhone 6,OS=10.0',\n        'name=iPhone 6s Plus,OS=10.3.1',\n        'name=iPhone SE,OS=10.3.1',\n        'name=iPhone 7,OS=11.0',\n        'name=iPad Air 2,OS=10.0',\n        'name=iPad Pro (9.7-inch),OS=10.0',\n        'name=iPad Pro (12.9-inch),OS=10.0',\n        'name=iPad Pro (10.5-inch),OS=11.0'\n      ]\n    else\n      [ 'name=iPhone 5,OS=10.0',\n        'name=iPhone 5s,OS=10.0',\n        'name=iPhone 6,OS=10.0',\n        'name=iPhone 6s Plus,OS=10.3.1',\n        'name=iPhone SE,OS=10.3.1',\n        'name=iPad Air 2,OS=10.0',\n        'name=iPad Pro (9.7-inch),OS=10.0',\n        'name=iPad Pro (12.9-inch),OS=10.0'\n      ]\n    end\n  elsif platform == 'watchsimulator'\n    if xcode_version.start_with?('11')\n      [ 'name=Apple Watch Series 4 - 44mm,OS=6.0'\n      ]\n    elsif xcode_version.start_with?('10')\n      [ 'name=Apple Watch Series 4 - 40mm,OS=5.0',\n        'name=Apple Watch Series 4 - 44mm,OS=5.0'\n      ]\n    elsif xcode_version.start_with?('9.4')\n      [ 'name=Apple Watch Series 3 - 38mm,OS=4.3',\n        'name=Apple Watch Series 3 - 42mm,OS=4.3'\n      ]\n    elsif xcode_version.start_with?('9.3')\n      [ 'name=Apple Watch - 38mm,OS=4.3',\n        'name=Apple Watch - 42mm,OS=4.3',\n        'name=Apple Watch Series 2 - 42mm,OS=4.3'\n      ]\n    elsif xcode_version.start_with?('9.2')\n      [ 'name=Apple Watch - 38mm,OS=4.2',\n        'name=Apple Watch - 42mm,OS=4.2',\n        'name=Apple Watch Series 2 - 42mm,OS=4.2'\n      ]\n    elsif xcode_version.start_with?('9.1')\n      [ 'name=Apple Watch - 38mm,OS=4.1',\n        'name=Apple Watch - 42mm,OS=4.1',\n        'name=Apple Watch Series 2 - 42mm,OS=4.1'\n      ]\n    elsif xcode_version.start_with?('9')\n      [ 'name=Apple Watch - 38mm,OS=3.2',\n        'name=Apple Watch - 42mm,OS=4.0',\n        'name=Apple Watch Series 2 - 42mm,OS=4.0'\n      ]\n    else\n      [ 'name=Apple Watch - 38mm,OS=3.2',\n        'name=Apple Watch Series 2 - 42mm,OS=3.2'\n      ]\n    end\n  elsif platform == 'appletvsimulator'\n    if xcode_version.start_with?('11')\n      [ 'name=Apple TV 4K,OS=13.0'\n      ]\n    elsif xcode_version.start_with?('10')\n      [ 'name=Apple TV 4K,OS=12.0'\n      ]\n    elsif xcode_version.start_with?('9.4')\n      [ 'name=Apple TV 4K,OS=11.4'\n      ]\n    elsif xcode_version.start_with?('9.3')\n      [ 'name=Apple TV 4K,OS=11.3'\n      ]\n    elsif xcode_version.start_with?('9.2')\n      [ 'name=Apple TV 4K,OS=11.2'\n      ]\n    elsif xcode_version.start_with?('9.1')\n      [ 'name=Apple TV 4K,OS=11.1'\n      ]\n    elsif xcode_version.start_with?('9')\n      [ 'name=Apple TV 1080p,OS=10.2',\n        'name=Apple TV 1080p,OS=11.0'\n      ]\n    else\n      [ 'name=Apple TV 1080p,OS=10.2'\n      ]\n    end\n  else\n    [\n      'platform=OS X,arch=x86_64'\n    ]\n  end\nend\n\ndef supportedPlatforms\n  ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator']\nend\n\ndef configurations\n  ['Debug', 'Release']\nend\n\ndesc \"build for all platforms\"\ntask :build do |t|\n  supportedPlatforms\n    .product(configurations)\n    .map { |platform, configuration| Rake::Task[\"build:#{platform}:#{configuration.downcase}\"] }\n    .map(&:invoke)\nend\n\nnamespace :build do\n  supportedPlatforms.product(configurations).each do |platform, configuration|\n    XCJobs::Build.new(\"#{platform}:#{configuration.downcase}\") do |t|\n      t.project = 'KeychainAccess'\n      t.scheme = 'KeychainAccess'\n      t.sdk = platform\n      t.configuration = configuration\n      t.build_dir = 'build'\n      t.hide_shell_script_environment = true\n      t.formatter = 'xcpretty -c'\n      if ENV['CI']\n        t.add_build_setting('CODE_SIGN_IDENTITY', '')\n        t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO')\n      end\n      if xcode_version.start_with?('11')\n        t.add_build_setting('SWIFT_VERSION', '5.1')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 11,OS=13.0')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch Series 4 - 44mm,OS=6.0')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=13.0')\n        end\n      elsif xcode_version.start_with?('10.3')\n        t.add_build_setting('SWIFT_VERSION', '5.0')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=12.0')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch Series 4 - 44mm,OS=5.0')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=12.0')\n        end\n      elsif xcode_version.start_with?('10')\n        t.add_build_setting('SWIFT_VERSION', '4.2')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=12.0')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch Series 4 - 44mm,OS=5.0')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=12.0')\n        end\n      elsif xcode_version.start_with?('9.4')\n        t.add_build_setting('SWIFT_VERSION', '4.1')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=11.4')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch Series 3 - 42mm,OS=4.3')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=11.4')\n        end\n      elsif xcode_version.start_with?('9.3')\n        t.add_build_setting('SWIFT_VERSION', '4.1')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=11.3')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch - 42mm,OS=4.3')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=11.3')\n        end\n      elsif xcode_version.start_with?('9.2')\n        t.add_build_setting('SWIFT_VERSION', '4.0')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=11.2')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch - 42mm,OS=4.2')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=11.2')\n        end\n      elsif xcode_version.start_with?('9.1')\n        t.add_build_setting('SWIFT_VERSION', '4.0')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=11.1')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch - 42mm,OS=4.1')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 4K,OS=11.1')\n        end\n      elsif xcode_version.start_with?('9')\n        t.add_build_setting('SWIFT_VERSION', '4.0')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=11.0')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch - 42mm,OS=4.0')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 1080p,OS=11.0')\n        end\n      else\n        t.add_build_setting('SWIFT_VERSION', '3.0')\n        if platform == 'iphonesimulator'\n          t.add_destination('name=iPhone 7,OS=10.3.1')\n        elsif platform == 'watchsimulator'\n          t.add_destination('name=Apple Watch - 42mm,OS=3.2')\n        elsif platform == 'appletvsimulator'\n          t.add_destination('name=Apple TV 1080p,OS=10.0')\n        end\n      end\n    end\n  end\n\n  task :carthage do\n    sh %[echo 'github \\\"kishikawakatsumi/KeychainAccess\\\"' > Cartfile]\n    if xcode_version.start_with?('11')\n      sh %[echo SWIFT_VERSION=\\\"5.1\\\" > swift.xcconfig]\n    elsif xcode_version.start_with?('10.3')\n      sh %[echo SWIFT_VERSION=\\\"5.0\\\" > swift.xcconfig]\n    elsif xcode_version.start_with?('10')\n      sh %[echo SWIFT_VERSION=\\\"4.2\\\" > swift.xcconfig]\n    elsif xcode_version.start_with?('9.4')\n      sh %[echo SWIFT_VERSION=\\\"4.1\\\" > swift.xcconfig]\n    elsif xcode_version.start_with?('9.3')\n      sh %[echo SWIFT_VERSION=\\\"4.1\\\" > swift.xcconfig]\n    elsif xcode_version.start_with?('9')\n      sh %[echo SWIFT_VERSION=\\\"4.0\\\" > swift.xcconfig]\n    else\n      sh %[echo SWIFT_VERSION=\\\"3.0\\\" > swift.xcconfig]\n    end\n    sh %[XCODE_XCCONFIG_FILE=`pwd`/swift.xcconfig carthage update --no-use-binaries]\n    sh %[find . -name '*.bcsymbolmap' | xargs grep swiftlang]\n  end\nend\n\nnamespace :test do\n  supportedPlatforms\n    .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }\n    .each do |platform|\n      task platform do |t|\n        configurations.each do |configuration|\n          destinations(platform: platform)\n            .map { |destination| Rake::Task[\"test:#{platform}:#{configuration.downcase}:#{destination}\"] }\n            .map(&:invoke)\n        end\n      end\n    end\nend\n\nnamespace :test do\n  supportedPlatforms\n    .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }\n    .product(configurations)\n    .each do |platform, configuration|\n      destinations(platform: platform).each do |destination|\n        XCJobs::Test.new(\"#{platform}:#{configuration.downcase}:#{destination}\") do |t|\n          t.project = 'KeychainAccess'\n          t.scheme = 'KeychainAccess'\n          t.sdk = platform\n          t.configuration = configuration\n          t.add_destination(destination)\n          t.coverage = true\n          t.build_dir = 'build'\n          t.hide_shell_script_environment = true\n          if xcode_version.start_with?('11')\n            t.add_build_setting('SWIFT_VERSION', '5.1')\n          elsif xcode_version.start_with?('10.3')\n            t.add_build_setting('SWIFT_VERSION', '5.0')\n          elsif xcode_version.start_with?('10')\n            t.add_build_setting('SWIFT_VERSION', '4.2')\n          elsif xcode_version.start_with?('9.4')\n            t.add_build_setting('SWIFT_VERSION', '4.1')\n          elsif xcode_version.start_with?('9.3')\n            t.add_build_setting('SWIFT_VERSION', '4.1')\n          elsif xcode_version.start_with?('9')\n            t.add_build_setting('SWIFT_VERSION', '4.0')\n          else\n            t.add_build_setting('SWIFT_VERSION', '3.0')\n          end\n          t.after_action do\n            build_coverage_reports()\n            puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'`\n          end\n        end\n      end\n    end\nend\n\ndef build_coverage_reports()\n  project_name = 'KeychainAccess'\n  profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first\n  Dir.glob(File.join('build', \"/**/#{project_name}\")) do |target|\n    output = `xcrun llvm-cov report -instr-profile \"#{profdata}\" \"#{target}\" -arch=x86_64`\n    if $?.success?\n      puts output\n      `xcrun llvm-cov show -instr-profile \"#{profdata}\" \"#{target}\" -arch=x86_64 -use-color=0 > coverage.txt`\n      break\n    end\n  end\nend\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Scripts/add_key.sh",
    "content": "#!/bin/sh\n\nsecurity create-keychain -p travis build.keychain\nsecurity default-keychain -s build.keychain\nsecurity unlock-keychain -p travis build.keychain\nsecurity set-keychain-settings -t 3600 -l ~/Library/Keychains/build.keychain\n\nsecurity import ./Lib/Certificates/apple.cer -k ~/Library/Keychains/build.keychain -T /usr/bin/codesign\nsecurity import ./Lib/Certificates/ios_developer.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign\nsecurity import ./Lib/Certificates/developer_id_app.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign\n\nsecurity set-key-partition-list -S apple-tool:,apple:,codesign: -s -k travis build.keychain\n\nmkdir -p ~/Library/MobileDevice/Provisioning\\ Profiles\ncp ./Lib/Certificates/*.mobileprovision ~/Library/MobileDevice/Provisioning\\ Profiles/\ncp ./Lib/Certificates/*.provisionprofile ~/Library/MobileDevice/Provisioning\\ Profiles/\n"
  },
  {
    "path": "External/KeychainAccess/Lib/Scripts/decode_cert.sh",
    "content": "#!/bin/sh\n\nCERT_DIR=\"./Lib/Certificates\"\nFILES=('ios_developer.p12' 'developer_id_app.p12' 'iOS_Development.mobileprovision'\\\n       'tvOS_Development.mobileprovision' 'KeychainAccess_Tests.provisionprofile')\n\nfor file in ${FILES[@]}; do\n  openssl aes-256-cbc -k \"$ENCRYPTION_SECRET\" -in \"$CERT_DIR\"/\"$file\".enc -d -a -out \"$CERT_DIR\"/\"$file\"\ndone\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  TestHost\n//\n//  Created by kishikawa katsumi on 7/10/16.\n//  Copyright © 2016 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n#if os(OSX)\nimport Cocoa\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate {\n    @IBOutlet weak var window: NSWindow!\n    func applicationDidFinishLaunching(aNotification: NSNotification) {}\n}\n#else\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n\n    #if swift(>=4.2)\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {\n        return true\n    }\n    #else\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {\n        return true\n    }\n    #endif\n}\n#endif\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIRequiresFullScreen</key>\n\t<true/>\n\t<key>NSPrincipalClass</key>\n\t<string>$(PRINCIPAL_CLASS)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost/TestHost.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>$(AppIdentifierPrefix)com.kishikawakatsumi.KeychainAccess.TestHost</string>\n\t\t<string>$(AppIdentifierPrefix)shared</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/EnumTests.swift",
    "content": "//\n//  EnumTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 10/12/15.\n//  Copyright © 2015 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport XCTest\nimport KeychainAccess\n\nclass EnumTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testItemClass() {\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassGenericPassword as String)\n            XCTAssertEqual(itemClass, .genericPassword)\n            XCTAssertEqual(itemClass?.description, \"GenericPassword\")\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassInternetPassword as String)\n            XCTAssertEqual(itemClass, .internetPassword)\n            XCTAssertEqual(itemClass?.description, \"InternetPassword\")\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassCertificate as String)\n            XCTAssertNil(itemClass)\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassKey as String)\n            XCTAssertNil(itemClass)\n        }\n        do {\n            let itemClass = ItemClass(rawValue: kSecClassIdentity as String)\n            XCTAssertNil(itemClass)\n        }\n    }\n\n    func testProtocolType() {\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTP as String)\n            XCTAssertEqual(protocolType, .ftp)\n            XCTAssertEqual(protocolType?.description, \"FTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPAccount as String)\n            XCTAssertEqual(protocolType, .ftpAccount)\n            XCTAssertEqual(protocolType?.description, \"FTPAccount\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTP as String)\n            XCTAssertEqual(protocolType, .http)\n            XCTAssertEqual(protocolType?.description, \"HTTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRC as String)\n            XCTAssertEqual(protocolType, .irc)\n            XCTAssertEqual(protocolType?.description, \"IRC\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTP as String)\n            XCTAssertEqual(protocolType, .nntp)\n            XCTAssertEqual(protocolType?.description, \"NNTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3 as String)\n            XCTAssertEqual(protocolType, .pop3)\n            XCTAssertEqual(protocolType?.description, \"POP3\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMTP as String)\n            XCTAssertEqual(protocolType, .smtp)\n            XCTAssertEqual(protocolType?.description, \"SMTP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSOCKS as String)\n            XCTAssertEqual(protocolType, .socks)\n            XCTAssertEqual(protocolType?.description, \"SOCKS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAP as String)\n            XCTAssertEqual(protocolType, .imap)\n            XCTAssertEqual(protocolType?.description, \"IMAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAP as String)\n            XCTAssertEqual(protocolType, .ldap)\n            XCTAssertEqual(protocolType?.description, \"LDAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolAppleTalk as String)\n            XCTAssertEqual(protocolType, .appleTalk)\n            XCTAssertEqual(protocolType?.description, \"AppleTalk\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolAFP as String)\n            XCTAssertEqual(protocolType, .afp)\n            XCTAssertEqual(protocolType?.description, \"AFP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnet as String)\n            XCTAssertEqual(protocolType, .telnet)\n            XCTAssertEqual(protocolType?.description, \"Telnet\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSSH as String)\n            XCTAssertEqual(protocolType, .ssh)\n            XCTAssertEqual(protocolType?.description, \"SSH\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPS as String)\n            XCTAssertEqual(protocolType, .ftps)\n            XCTAssertEqual(protocolType?.description, \"FTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPS as String)\n            XCTAssertEqual(protocolType, .https)\n            XCTAssertEqual(protocolType?.description, \"HTTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPProxy as String)\n            XCTAssertEqual(protocolType, .httpProxy)\n            XCTAssertEqual(protocolType?.description, \"HTTPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPSProxy as String)\n            XCTAssertEqual(protocolType, .httpsProxy)\n            XCTAssertEqual(protocolType?.description, \"HTTPSProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPProxy as String)\n            XCTAssertEqual(protocolType, .ftpProxy)\n            XCTAssertEqual(protocolType?.description, \"FTPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMB as String)\n            XCTAssertEqual(protocolType, .smb)\n            XCTAssertEqual(protocolType?.description, \"SMB\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSP as String)\n            XCTAssertEqual(protocolType, .rtsp)\n            XCTAssertEqual(protocolType?.description, \"RTSP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSPProxy as String)\n            XCTAssertEqual(protocolType, .rtspProxy)\n            XCTAssertEqual(protocolType?.description, \"RTSPProxy\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolDAAP as String)\n            XCTAssertEqual(protocolType, .daap)\n            XCTAssertEqual(protocolType?.description, \"DAAP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolEPPC as String)\n            XCTAssertEqual(protocolType, .eppc)\n            XCTAssertEqual(protocolType?.description, \"EPPC\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIPP as String)\n            XCTAssertEqual(protocolType, .ipp)\n            XCTAssertEqual(protocolType?.description, \"IPP\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTPS as String)\n            XCTAssertEqual(protocolType, .nntps)\n            XCTAssertEqual(protocolType?.description, \"NNTPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAPS as String)\n            XCTAssertEqual(protocolType, .ldaps)\n            XCTAssertEqual(protocolType?.description, \"LDAPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnetS as String)\n            XCTAssertEqual(protocolType, .telnetS)\n            XCTAssertEqual(protocolType?.description, \"TelnetS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAPS as String)\n            XCTAssertEqual(protocolType, .imaps)\n            XCTAssertEqual(protocolType?.description, \"IMAPS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRCS as String)\n            XCTAssertEqual(protocolType, .ircs)\n            XCTAssertEqual(protocolType?.description, \"IRCS\")\n        }\n        do {\n            let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3S as String)\n            XCTAssertEqual(protocolType, .pop3S)\n            XCTAssertEqual(protocolType?.description, \"POP3S\")\n        }\n    }\n\n    func testAuthenticationType() {\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeNTLM as String)\n            XCTAssertEqual(authenticationType, .ntlm)\n            XCTAssertEqual(authenticationType?.description, \"NTLM\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeMSN as String)\n            XCTAssertEqual(authenticationType, .msn)\n            XCTAssertEqual(authenticationType?.description, \"MSN\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDPA as String)\n            XCTAssertEqual(authenticationType, .dpa)\n            XCTAssertEqual(authenticationType?.description, \"DPA\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeRPA as String)\n            XCTAssertEqual(authenticationType, .rpa)\n            XCTAssertEqual(authenticationType?.description, \"RPA\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPBasic as String)\n            XCTAssertEqual(authenticationType, .httpBasic)\n            XCTAssertEqual(authenticationType?.description, \"HTTPBasic\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPDigest as String)\n            XCTAssertEqual(authenticationType, .httpDigest)\n            XCTAssertEqual(authenticationType?.description, \"HTTPDigest\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTMLForm as String)\n            XCTAssertEqual(authenticationType, .htmlForm)\n            XCTAssertEqual(authenticationType?.description, \"HTMLForm\")\n        }\n        do {\n            let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDefault as String)\n            XCTAssertEqual(authenticationType, .default)\n            XCTAssertEqual(authenticationType?.description, \"Default\")\n        }\n    }\n\n    func testAccessibility() {\n        guard #available(OSX 10.10, *) else {\n            return\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlocked as String)\n            XCTAssertEqual(accessibility, .whenUnlocked)\n            XCTAssertEqual(accessibility?.description, \"WhenUnlocked\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlock as String)\n            XCTAssertEqual(accessibility, .afterFirstUnlock)\n            XCTAssertEqual(accessibility?.description, \"AfterFirstUnlock\")\n        }\n        #if !targetEnvironment(macCatalyst)\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlways as String)\n            XCTAssertEqual(accessibility, .always)\n            XCTAssertEqual(accessibility?.description, \"Always\")\n        }\n        #endif\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .whenPasscodeSetThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"WhenPasscodeSetThisDeviceOnly\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlockedThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .whenUnlockedThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"WhenUnlockedThisDeviceOnly\")\n        }\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .afterFirstUnlockThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"AfterFirstUnlockThisDeviceOnly\")\n        }\n        #if !targetEnvironment(macCatalyst)\n        do {\n            let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlwaysThisDeviceOnly as String)\n            XCTAssertEqual(accessibility, .alwaysThisDeviceOnly)\n            XCTAssertEqual(accessibility?.description, \"AlwaysThisDeviceOnly\")\n        }\n        #endif\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/ErrorTypeTests.swift",
    "content": "//\n//  ErrorTypeTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 10/12/15.\n//  Copyright © 2015 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport XCTest\nimport KeychainAccess\n\nclass ErrorTypeTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testErrorType() {\n        do {\n            let status = Status(rawValue: errSecSuccess)\n            XCTAssertEqual(status, .success)\n            XCTAssertEqual(status?.description, \"No error.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnimplemented)\n            XCTAssertEqual(status, .unimplemented)\n            XCTAssertEqual(status?.description, \"Function or operation not implemented.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecDiskFull)\n            XCTAssertEqual(status, .diskFull)\n            XCTAssertEqual(status?.description, \"The disk is full.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecIO)\n            XCTAssertEqual(status, .io)\n            XCTAssertEqual(status?.description, \"I/O error (bummers)\")\n        }\n        #if os(iOS)\n        do {\n            let status = Status(rawValue: errSecOpWr)\n            XCTAssertEqual(status, .opWr)\n            XCTAssertEqual(status?.description, \"file already open with with write permission\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecParam)\n            XCTAssertEqual(status, .param)\n            XCTAssertEqual(status?.description, \"One or more parameters passed to a function were not valid.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecWrPerm)\n            XCTAssertEqual(status, .wrPerm)\n            XCTAssertEqual(status?.description, \"write permissions error\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecAllocate)\n            XCTAssertEqual(status, .allocate)\n            XCTAssertEqual(status?.description, \"Failed to allocate memory.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUserCanceled)\n            XCTAssertEqual(status, .userCanceled)\n            XCTAssertEqual(status?.description, \"User canceled the operation.\")\n        }\n        do {\n            let status = Status(rawValue: errSecBadReq)\n            XCTAssertEqual(status, .badReq)\n            XCTAssertEqual(status?.description, \"Bad parameter or invalid state for operation.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInternalComponent)\n            XCTAssertEqual(status, .internalComponent)\n            XCTAssertEqual(status?.description, \"\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotAvailable)\n            XCTAssertEqual(status, .notAvailable)\n            XCTAssertEqual(status?.description, \"No keychain is available. You may need to restart your computer.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecReadOnly)\n            XCTAssertEqual(status, .readOnly)\n            XCTAssertEqual(status?.description, \"This keychain cannot be modified.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecAuthFailed)\n            XCTAssertEqual(status, .authFailed)\n            XCTAssertEqual(status?.description, \"The user name or passphrase you entered is not correct.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecNoSuchKeychain)\n            XCTAssertEqual(status, .noSuchKeychain)\n            XCTAssertEqual(status?.description, \"The specified keychain could not be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeychain)\n            XCTAssertEqual(status, .invalidKeychain)\n            XCTAssertEqual(status?.description, \"The specified keychain is not a valid keychain file.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDuplicateKeychain)\n            XCTAssertEqual(status, .duplicateKeychain)\n            XCTAssertEqual(status?.description, \"A keychain with the same name already exists.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDuplicateCallback)\n            XCTAssertEqual(status, .duplicateCallback)\n            XCTAssertEqual(status?.description, \"The specified callback function is already installed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCallback)\n            XCTAssertEqual(status, .invalidCallback)\n            XCTAssertEqual(status?.description, \"The specified callback function is not valid.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecDuplicateItem)\n            XCTAssertEqual(status, .duplicateItem)\n            XCTAssertEqual(status?.description, \"The specified item already exists in the keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecItemNotFound)\n            XCTAssertEqual(status, .itemNotFound)\n            XCTAssertEqual(status?.description, \"The specified item could not be found in the keychain.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecBufferTooSmall)\n            XCTAssertEqual(status, .bufferTooSmall)\n            XCTAssertEqual(status?.description, \"There is not enough memory available to use the specified item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataTooLarge)\n            XCTAssertEqual(status, .dataTooLarge)\n            XCTAssertEqual(status?.description, \"This item contains information which is too large or in a format that cannot be displayed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoSuchAttr)\n            XCTAssertEqual(status, .noSuchAttr)\n            XCTAssertEqual(status?.description, \"The specified attribute does not exist.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidItemRef)\n            XCTAssertEqual(status, .invalidItemRef)\n            XCTAssertEqual(status?.description, \"The specified item is no longer valid. It may have been deleted from the keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSearchRef)\n            XCTAssertEqual(status, .invalidSearchRef)\n            XCTAssertEqual(status?.description, \"Unable to search the current keychain.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoSuchClass)\n            XCTAssertEqual(status, .noSuchClass)\n            XCTAssertEqual(status?.description, \"The specified item does not appear to be a valid keychain item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoDefaultKeychain)\n            XCTAssertEqual(status, .noDefaultKeychain)\n            XCTAssertEqual(status?.description, \"A default keychain could not be found.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecInteractionNotAllowed)\n            XCTAssertEqual(status, .interactionNotAllowed)\n            XCTAssertEqual(status?.description, \"User interaction is not allowed.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecReadOnlyAttr)\n            XCTAssertEqual(status, .readOnlyAttr)\n            XCTAssertEqual(status?.description, \"The specified attribute could not be modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecWrongSecVersion)\n            XCTAssertEqual(status, .wrongSecVersion)\n            XCTAssertEqual(status?.description, \"This keychain was created by a different version of the system software and cannot be opened.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeySizeNotAllowed)\n            XCTAssertEqual(status, .keySizeNotAllowed)\n            XCTAssertEqual(status?.description, \"This item specifies a key size which is too large.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoStorageModule)\n            XCTAssertEqual(status, .noStorageModule)\n            XCTAssertEqual(status?.description, \"A required component (data storage module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoCertificateModule)\n            XCTAssertEqual(status, .noCertificateModule)\n            XCTAssertEqual(status?.description, \"A required component (certificate module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoPolicyModule)\n            XCTAssertEqual(status, .noPolicyModule)\n            XCTAssertEqual(status?.description, \"A required component (policy module) could not be loaded. You may need to restart your computer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInteractionRequired)\n            XCTAssertEqual(status, .interactionRequired)\n            XCTAssertEqual(status?.description, \"User interaction is required, but is currently not allowed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataNotAvailable)\n            XCTAssertEqual(status, .dataNotAvailable)\n            XCTAssertEqual(status?.description, \"The contents of this item cannot be retrieved.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDataNotModifiable)\n            XCTAssertEqual(status, .dataNotModifiable)\n            XCTAssertEqual(status?.description, \"The contents of this item cannot be modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCreateChainFailed)\n            XCTAssertEqual(status, .createChainFailed)\n            XCTAssertEqual(status?.description, \"One or more certificates required to validate this certificate cannot be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPrefsDomain)\n            XCTAssertEqual(status, .invalidPrefsDomain)\n            XCTAssertEqual(status?.description, \"The specified preferences domain is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInDarkWake)\n            XCTAssertEqual(status, .inDarkWake)\n            XCTAssertEqual(status?.description, \"In dark wake, no UI possible\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLNotSimple)\n            XCTAssertEqual(status, .aclNotSimple)\n            XCTAssertEqual(status?.description, \"The specified access control list is not in standard (simple) form.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPolicyNotFound)\n            XCTAssertEqual(status, .policyNotFound)\n            XCTAssertEqual(status?.description, \"The specified policy cannot be found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTrustSetting)\n            XCTAssertEqual(status, .invalidTrustSetting)\n            XCTAssertEqual(status?.description, \"The specified trust setting is invalid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoAccessForItem)\n            XCTAssertEqual(status, .noAccessForItem)\n            XCTAssertEqual(status?.description, \"The specified item has no access control.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidOwnerEdit)\n            XCTAssertEqual(status, .invalidOwnerEdit)\n            XCTAssertEqual(status?.description, \"Invalid attempt to change the owner of this item.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTrustNotAvailable)\n            XCTAssertEqual(status, .trustNotAvailable)\n            XCTAssertEqual(status?.description, \"No trust results are available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedFormat)\n            XCTAssertEqual(status, .unsupportedFormat)\n            XCTAssertEqual(status?.description, \"Import/Export format unsupported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownFormat)\n            XCTAssertEqual(status, .unknownFormat)\n            XCTAssertEqual(status?.description, \"Unknown format in import.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyIsSensitive)\n            XCTAssertEqual(status, .keyIsSensitive)\n            XCTAssertEqual(status?.description, \"Key material must be wrapped for export.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMultiplePrivKeys)\n            XCTAssertEqual(status, .multiplePrivKeys)\n            XCTAssertEqual(status?.description, \"An attempt was made to import multiple private keys.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPassphraseRequired)\n            XCTAssertEqual(status, .passphraseRequired)\n            XCTAssertEqual(status?.description, \"Passphrase is required for import/export.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPasswordRef)\n            XCTAssertEqual(status, .invalidPasswordRef)\n            XCTAssertEqual(status?.description, \"The password reference was invalid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTrustSettings)\n            XCTAssertEqual(status, .invalidTrustSettings)\n            XCTAssertEqual(status?.description, \"The Trust Settings Record was corrupted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoTrustSettings)\n            XCTAssertEqual(status, .noTrustSettings)\n            XCTAssertEqual(status?.description, \"No Trust Settings were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPkcs12VerifyFailure)\n            XCTAssertEqual(status, .pkcs12VerifyFailure)\n            XCTAssertEqual(status?.description, \"MAC verification failed during PKCS12 import (wrong password?)\")\n        }\n        do {\n            let errSecInvalidCertificate: OSStatus = -26265\n            let status = Status(rawValue: errSecInvalidCertificate)\n            XCTAssertEqual(status, .invalidCertificate)\n            XCTAssertEqual(status?.description, \"This certificate could not be decoded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotSigner)\n            XCTAssertEqual(status, .notSigner)\n            XCTAssertEqual(status?.description, \"A certificate was not signed by its proposed parent.\")\n        }\n        do {\n            let errSecPolicyDenied: OSStatus = -26270\n            let status = Status(rawValue: errSecPolicyDenied)\n            XCTAssertEqual(status, .policyDenied)\n            XCTAssertEqual(status?.description, \"The certificate chain was not trusted due to a policy not accepting it.\")\n        }\n        do {\n            let errSecInvalidKey: OSStatus = -26274\n            let status = Status(rawValue: errSecInvalidKey)\n            XCTAssertEqual(status, .invalidKey)\n            XCTAssertEqual(status?.description, \"The provided key material was not valid.\")\n        }\n        #endif\n        do {\n            let status = Status(rawValue: errSecDecode)\n            XCTAssertEqual(status, .decode)\n            XCTAssertEqual(status?.description, \"Unable to decode the provided data.\")\n        }\n        do {\n            let errSecInternal: OSStatus = -26276\n            let status = Status(rawValue: errSecInternal)\n            XCTAssertEqual(status, .internal)\n            XCTAssertEqual(status?.description, \"An internal error occurred in the Security framework.\")\n        }\n        #if os(OSX)\n        do {\n            let status = Status(rawValue: errSecServiceNotAvailable)\n            XCTAssertEqual(status, .serviceNotAvailable)\n            XCTAssertEqual(status?.description, \"The required service is not available.\")\n        }\n        do {\n            let errSecUnsupportedAlgorithm: OSStatus = -26268\n            let status = Status(rawValue: errSecUnsupportedAlgorithm)\n            XCTAssertEqual(status, .unsupportedAlgorithm)\n            XCTAssertEqual(status?.description, \"An unsupported algorithm was encountered.\")\n        }\n        do {\n            let errSecUnsupportedOperation: OSStatus = -26271\n            let status = Status(rawValue: errSecUnsupportedOperation)\n            XCTAssertEqual(status, .unsupportedOperation)\n            XCTAssertEqual(status?.description, \"The operation you requested is not supported by this key.\")\n        }\n        do {\n            let errSecUnsupportedPadding: OSStatus = -26273\n            let status = Status(rawValue: errSecUnsupportedPadding)\n            XCTAssertEqual(status, .unsupportedPadding)\n            XCTAssertEqual(status?.description, \"The padding you requested is not supported.\")\n        }\n        do {\n            let errSecItemInvalidKey: OSStatus = -34000\n            let status = Status(rawValue: errSecItemInvalidKey)\n            XCTAssertEqual(status, .itemInvalidKey)\n            XCTAssertEqual(status?.description, \"A string key in dictionary is not one of the supported keys.\")\n        }\n        do {\n            let errSecItemInvalidKeyType: OSStatus = -34001\n            let status = Status(rawValue: errSecItemInvalidKeyType)\n            XCTAssertEqual(status, .itemInvalidKeyType)\n            XCTAssertEqual(status?.description, \"A key in a dictionary is neither a CFStringRef nor a CFNumberRef.\")\n        }\n        do {\n            let errSecItemInvalidValue: OSStatus = -34002\n            let status = Status(rawValue: errSecItemInvalidValue)\n            XCTAssertEqual(status, .itemInvalidValue)\n            XCTAssertEqual(status?.description, \"A value in a dictionary is an invalid (or unsupported) CF type.\")\n        }\n        do {\n            let errSecItemClassMissing: OSStatus = -34003\n            let status = Status(rawValue: errSecItemClassMissing)\n            XCTAssertEqual(status, .itemClassMissing)\n            XCTAssertEqual(status?.description, \"No kSecItemClass key was specified in a dictionary.\")\n        }\n        do {\n            let errSecItemMatchUnsupported: OSStatus = -34004\n            let status = Status(rawValue: errSecItemMatchUnsupported)\n            XCTAssertEqual(status, .itemMatchUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed one or more kSecMatch keys to a function which does not support matches.\")\n        }\n        do {\n            let errSecUseItemListUnsupported: OSStatus = -34005\n            let status = Status(rawValue: errSecUseItemListUnsupported)\n            XCTAssertEqual(status, .useItemListUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseItemList key to a function which does not support it.\")\n        }\n        do {\n            let errSecUseKeychainUnsupported: OSStatus = -34006\n            let status = Status(rawValue: errSecUseKeychainUnsupported)\n            XCTAssertEqual(status, .useKeychainUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseKeychain key to a function which does not support it.\")\n        }\n        do {\n            let errSecUseKeychainListUnsupported: OSStatus = -34007\n            let status = Status(rawValue: errSecUseKeychainListUnsupported)\n            XCTAssertEqual(status, .useKeychainListUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecUseKeychainList key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnDataUnsupported: OSStatus = -34008\n            let status = Status(rawValue: errSecReturnDataUnsupported)\n            XCTAssertEqual(status, .returnDataUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnData key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnAttributesUnsupported: OSStatus = -34009\n            let status = Status(rawValue: errSecReturnAttributesUnsupported)\n            XCTAssertEqual(status, .returnAttributesUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnAttributes key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnRefUnsupported: OSStatus = -34010\n            let status = Status(rawValue: errSecReturnRefUnsupported)\n            XCTAssertEqual(status, .returnRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnPersitentRefUnsupported: OSStatus = -34011\n            let status = Status(rawValue: errSecReturnPersitentRefUnsupported)\n            XCTAssertEqual(status, .returnPersitentRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecReturnPersistentRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecValueRefUnsupported: OSStatus = -34012\n            let status = Status(rawValue: errSecValueRefUnsupported)\n            XCTAssertEqual(status, .valueRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecValueRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecValuePersistentRefUnsupported: OSStatus = -34013\n            let status = Status(rawValue: errSecValuePersistentRefUnsupported)\n            XCTAssertEqual(status, .valuePersistentRefUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecValuePersistentRef key to a function which does not support it.\")\n        }\n        do {\n            let errSecReturnMissingPointer: OSStatus = -34014\n            let status = Status(rawValue: errSecReturnMissingPointer)\n            XCTAssertEqual(status, .returnMissingPointer)\n            XCTAssertEqual(status?.description, \"The caller passed asked for something to be returned but did not pass in a result pointer.\")\n        }\n        do {\n            let errSecMatchLimitUnsupported: OSStatus = -34015\n            let status = Status(rawValue: errSecMatchLimitUnsupported)\n            XCTAssertEqual(status, .matchLimitUnsupported)\n            XCTAssertEqual(status?.description, \"The caller passed in a kSecMatchLimit key to a call which does not support limits.\")\n        }\n        do {\n            let errSecItemIllegalQuery: OSStatus = -34016\n            let status = Status(rawValue: errSecItemIllegalQuery)\n            XCTAssertEqual(status, .itemIllegalQuery)\n            XCTAssertEqual(status?.description, \"The caller passed in a query which contained too many keys.\")\n        }\n        do {\n            let errSecWaitForCallback: OSStatus = -34017\n            let status = Status(rawValue: errSecWaitForCallback)\n            XCTAssertEqual(status, .waitForCallback)\n            XCTAssertEqual(status?.description, \"This operation is incomplete, until the callback is invoked (not an error).\")\n        }\n        do {\n            let errSecMissingEntitlement: OSStatus = -34018\n            let status = Status(rawValue: errSecMissingEntitlement)\n            XCTAssertEqual(status, .missingEntitlement)\n            XCTAssertEqual(status?.description, \"Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.\")\n        }\n        do {\n            let errSecUpgradePending: OSStatus = -34019\n            let status = Status(rawValue: errSecUpgradePending)\n            XCTAssertEqual(status, .upgradePending)\n            XCTAssertEqual(status?.description, \"Error returned if keychain database needs a schema migration but the device is locked, clients should wait for a device unlock notification and retry the command.\")\n        }\n        do {\n            let errSecMPSignatureInvalid: OSStatus = -25327\n            let status = Status(rawValue: errSecMPSignatureInvalid)\n            XCTAssertEqual(status, .mpSignatureInvalid)\n            XCTAssertEqual(status?.description, \"Signature invalid on MP message\")\n        }\n        do {\n            let errSecOTRTooOld: OSStatus = -25328\n            let status = Status(rawValue: errSecOTRTooOld)\n            XCTAssertEqual(status, .otrTooOld)\n            XCTAssertEqual(status?.description, \"Message is too old to use\")\n        }\n        do {\n            let errSecOTRIDTooNew: OSStatus = -25329\n            let status = Status(rawValue: errSecOTRIDTooNew)\n            XCTAssertEqual(status, .otrIDTooNew)\n            XCTAssertEqual(status?.description, \"Key ID is too new to use! Message from the future?\")\n        }\n        do {\n            let status = Status(rawValue: errSecInsufficientClientID)\n            XCTAssertEqual(status, .insufficientClientID)\n            XCTAssertEqual(status?.description, \"The client ID is not correct.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceReset)\n            XCTAssertEqual(status, .deviceReset)\n            XCTAssertEqual(status?.description, \"A device reset has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceFailed)\n            XCTAssertEqual(status, .deviceFailed)\n            XCTAssertEqual(status?.description, \"A device failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleAddAppACLSubject)\n            XCTAssertEqual(status, .appleAddAppACLSubject)\n            XCTAssertEqual(status?.description, \"Adding an application ACL subject failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecApplePublicKeyIncomplete)\n            XCTAssertEqual(status, .applePublicKeyIncomplete)\n            XCTAssertEqual(status?.description, \"The public key is incomplete.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleSignatureMismatch)\n            XCTAssertEqual(status, .appleSignatureMismatch)\n            XCTAssertEqual(status?.description, \"A signature mismatch has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleInvalidKeyStartDate)\n            XCTAssertEqual(status, .appleInvalidKeyStartDate)\n            XCTAssertEqual(status?.description, \"The specified key has an invalid start date.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleInvalidKeyEndDate)\n            XCTAssertEqual(status, .appleInvalidKeyEndDate)\n            XCTAssertEqual(status?.description, \"The specified key has an invalid end date.\")\n        }\n        do {\n            let status = Status(rawValue: errSecConversionError)\n            XCTAssertEqual(status, .conversionError)\n            XCTAssertEqual(status?.description, \"A conversion error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAppleSSLv2Rollback)\n            XCTAssertEqual(status, .appleSSLv2Rollback)\n            XCTAssertEqual(status?.description, \"A SSLv2 rollback error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDiskFull)\n            XCTAssertEqual(status, .diskFull)\n            XCTAssertEqual(status?.description, \"The disk is full.\")\n        }\n        do {\n            let status = Status(rawValue: errSecQuotaExceeded)\n            XCTAssertEqual(status, .quotaExceeded)\n            XCTAssertEqual(status?.description, \"The quota was exceeded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFileTooBig)\n            XCTAssertEqual(status, .fileTooBig)\n            XCTAssertEqual(status?.description, \"The file is too big.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDatabaseBlob)\n            XCTAssertEqual(status, .invalidDatabaseBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an invalid blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyBlob)\n            XCTAssertEqual(status, .invalidKeyBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an invalid key blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleDatabaseBlob)\n            XCTAssertEqual(status, .incompatibleDatabaseBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an incompatible blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleKeyBlob)\n            XCTAssertEqual(status, .incompatibleKeyBlob)\n            XCTAssertEqual(status?.description, \"The specified database has an incompatible key blob.\")\n        }\n        do {\n            let status = Status(rawValue: errSecHostNameMismatch)\n            XCTAssertEqual(status, .hostNameMismatch)\n            XCTAssertEqual(status?.description, \"A host name mismatch has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCriticalExtensionFlag)\n            XCTAssertEqual(status, .unknownCriticalExtensionFlag)\n            XCTAssertEqual(status?.description, \"There is an unknown critical extension flag.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoBasicConstraints)\n            XCTAssertEqual(status, .noBasicConstraints)\n            XCTAssertEqual(status?.description, \"No basic constraints were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoBasicConstraintsCA)\n            XCTAssertEqual(status, .noBasicConstraintsCA)\n            XCTAssertEqual(status?.description, \"No basic CA constraints were found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAuthorityKeyID)\n            XCTAssertEqual(status, .invalidAuthorityKeyID)\n            XCTAssertEqual(status?.description, \"The authority key ID is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubjectKeyID)\n            XCTAssertEqual(status, .invalidSubjectKeyID)\n            XCTAssertEqual(status?.description, \"The subject key ID is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyUsageForPolicy)\n            XCTAssertEqual(status, .invalidKeyUsageForPolicy)\n            XCTAssertEqual(status?.description, \"The key usage is not valid for the specified policy.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidExtendedKeyUsage)\n            XCTAssertEqual(status, .invalidExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The extended key usage is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIDLinkage)\n            XCTAssertEqual(status, .invalidIDLinkage)\n            XCTAssertEqual(status?.description, \"The ID linkage is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPathLengthConstraintExceeded)\n            XCTAssertEqual(status, .pathLengthConstraintExceeded)\n            XCTAssertEqual(status?.description, \"The path length constraint was exceeded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRoot)\n            XCTAssertEqual(status, .invalidRoot)\n            XCTAssertEqual(status?.description, \"The root or anchor certificate is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLExpired)\n            XCTAssertEqual(status, .crlExpired)\n            XCTAssertEqual(status?.description, \"The CRL has expired.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotValidYet)\n            XCTAssertEqual(status, .crlNotValidYet)\n            XCTAssertEqual(status?.description, \"The CRL is not yet valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotFound)\n            XCTAssertEqual(status, .crlNotFound)\n            XCTAssertEqual(status?.description, \"The CRL was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLServerDown)\n            XCTAssertEqual(status, .crlServerDown)\n            XCTAssertEqual(status?.description, \"The CRL server is down.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLBadURI)\n            XCTAssertEqual(status, .crlBadURI)\n            XCTAssertEqual(status?.description, \"The CRL has a bad Uniform Resource Identifier.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCertExtension)\n            XCTAssertEqual(status, .unknownCertExtension)\n            XCTAssertEqual(status?.description, \"An unknown certificate extension was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownCRLExtension)\n            XCTAssertEqual(status, .unknownCRLExtension)\n            XCTAssertEqual(status?.description, \"An unknown CRL extension was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLNotTrusted)\n            XCTAssertEqual(status, .crlNotTrusted)\n            XCTAssertEqual(status?.description, \"The CRL is not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLPolicyFailed)\n            XCTAssertEqual(status, .crlPolicyFailed)\n            XCTAssertEqual(status?.description, \"The CRL policy failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIDPFailure)\n            XCTAssertEqual(status, .idpFailure)\n            XCTAssertEqual(status?.description, \"The issuing distribution point was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEEmailAddressesNotFound)\n            XCTAssertEqual(status, .smimeEmailAddressesNotFound)\n            XCTAssertEqual(status?.description, \"An email address mismatch was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEBadExtendedKeyUsage)\n            XCTAssertEqual(status, .smimeBadExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The appropriate extended key usage for SMIME was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEBadKeyUsage)\n            XCTAssertEqual(status, .smimeBadKeyUsage)\n            XCTAssertEqual(status?.description, \"The key usage is not compatible with SMIME.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMEKeyUsageNotCritical)\n            XCTAssertEqual(status, .smimeKeyUsageNotCritical)\n            XCTAssertEqual(status?.description, \"The key usage extension is not marked as critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMENoEmailAddress)\n            XCTAssertEqual(status, .smimeNoEmailAddress)\n            XCTAssertEqual(status?.description, \"No email address was found in the certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSMIMESubjAltNameNotCritical)\n            XCTAssertEqual(status, .smimeSubjAltNameNotCritical)\n            XCTAssertEqual(status?.description, \"The subject alternative name extension is not marked as critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSSLBadExtendedKeyUsage)\n            XCTAssertEqual(status, .sslBadExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"The appropriate extended key usage for SSL was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPBadResponse)\n            XCTAssertEqual(status, .ocspBadResponse)\n            XCTAssertEqual(status?.description, \"The OCSP response was incorrect or could not be parsed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPBadRequest)\n            XCTAssertEqual(status, .ocspBadRequest)\n            XCTAssertEqual(status?.description, \"The OCSP request was incorrect or could not be parsed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPUnavailable)\n            XCTAssertEqual(status, .ocspUnavailable)\n            XCTAssertEqual(status?.description, \"OCSP service is unavailable.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPStatusUnrecognized)\n            XCTAssertEqual(status, .ocspStatusUnrecognized)\n            XCTAssertEqual(status?.description, \"The OCSP server did not recognize this certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEndOfData)\n            XCTAssertEqual(status, .endOfData)\n            XCTAssertEqual(status?.description, \"An end-of-data was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompleteCertRevocationCheck)\n            XCTAssertEqual(status, .incompleteCertRevocationCheck)\n            XCTAssertEqual(status?.description, \"An incomplete certificate revocation check occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNetworkFailure)\n            XCTAssertEqual(status, .networkFailure)\n            XCTAssertEqual(status?.description, \"A network failure occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPNotTrustedToAnchor)\n            XCTAssertEqual(status, .ocspNotTrustedToAnchor)\n            XCTAssertEqual(status?.description, \"The OCSP response was not trusted to a root or anchor certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRecordModified)\n            XCTAssertEqual(status, .recordModified)\n            XCTAssertEqual(status?.description, \"The record was modified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPSignatureError)\n            XCTAssertEqual(status, .ocspSignatureError)\n            XCTAssertEqual(status?.description, \"The OCSP response had an invalid signature.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPNoSigner)\n            XCTAssertEqual(status, .ocspNoSigner)\n            XCTAssertEqual(status?.description, \"The OCSP response had no signer.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderMalformedReq)\n            XCTAssertEqual(status, .ocspResponderMalformedReq)\n            XCTAssertEqual(status?.description, \"The OCSP responder was given a malformed request.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderInternalError)\n            XCTAssertEqual(status, .ocspResponderInternalError)\n            XCTAssertEqual(status?.description, \"The OCSP responder encountered an internal error.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderTryLater)\n            XCTAssertEqual(status, .ocspResponderTryLater)\n            XCTAssertEqual(status?.description, \"The OCSP responder is busy, try again later.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderSignatureRequired)\n            XCTAssertEqual(status, .ocspResponderSignatureRequired)\n            XCTAssertEqual(status?.description, \"The OCSP responder requires a signature.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponderUnauthorized)\n            XCTAssertEqual(status, .ocspResponderUnauthorized)\n            XCTAssertEqual(status?.description, \"The OCSP responder rejected this request as unauthorized.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOCSPResponseNonceMismatch)\n            XCTAssertEqual(status, .ocspResponseNonceMismatch)\n            XCTAssertEqual(status?.description, \"The OCSP response nonce did not match the request.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningBadCertChainLength)\n            XCTAssertEqual(status, .codeSigningBadCertChainLength)\n            XCTAssertEqual(status?.description, \"Code signing encountered an incorrect certificate chain length.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningNoBasicConstraints)\n            XCTAssertEqual(status, .codeSigningNoBasicConstraints)\n            XCTAssertEqual(status?.description, \"Code signing found no basic constraints.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningBadPathLengthConstraint)\n            XCTAssertEqual(status, .codeSigningBadPathLengthConstraint)\n            XCTAssertEqual(status?.description, \"Code signing encountered an incorrect path length constraint.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningNoExtendedKeyUsage)\n            XCTAssertEqual(status, .codeSigningNoExtendedKeyUsage)\n            XCTAssertEqual(status?.description, \"Code signing found no extended key usage.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCodeSigningDevelopment)\n            XCTAssertEqual(status, .codeSigningDevelopment)\n            XCTAssertEqual(status?.description, \"Code signing indicated use of a development-only certificate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecResourceSignBadCertChainLength)\n            XCTAssertEqual(status, .resourceSignBadCertChainLength)\n            XCTAssertEqual(status?.description, \"Resource signing has encountered an incorrect certificate chain length.\")\n        }\n        do {\n            let status = Status(rawValue: errSecResourceSignBadExtKeyUsage)\n            XCTAssertEqual(status, .resourceSignBadExtKeyUsage)\n            XCTAssertEqual(status?.description, \"Resource signing has encountered an error in the extended key usage.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTrustSettingDeny)\n            XCTAssertEqual(status, .trustSettingDeny)\n            XCTAssertEqual(status?.description, \"The trust setting for this policy was set to Deny.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubjectName)\n            XCTAssertEqual(status, .invalidSubjectName)\n            XCTAssertEqual(status?.description, \"An invalid certificate subject name was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownQualifiedCertStatement)\n            XCTAssertEqual(status, .unknownQualifiedCertStatement)\n            XCTAssertEqual(status?.description, \"An unknown qualified certificate statement was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestQueued)\n            XCTAssertEqual(status, .mobileMeRequestQueued)\n            XCTAssertEqual(status?.description, \"The MobileMe request will be sent during the next connection.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestRedirected)\n            XCTAssertEqual(status, .mobileMeRequestRedirected)\n            XCTAssertEqual(status?.description, \"The MobileMe request was redirected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerError)\n            XCTAssertEqual(status, .mobileMeServerError)\n            XCTAssertEqual(status?.description, \"A MobileMe server error occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerNotAvailable)\n            XCTAssertEqual(status, .mobileMeServerNotAvailable)\n            XCTAssertEqual(status?.description, \"The MobileMe server is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerAlreadyExists)\n            XCTAssertEqual(status, .mobileMeServerAlreadyExists)\n            XCTAssertEqual(status?.description, \"The MobileMe server reported that the item already exists.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeServerServiceErr)\n            XCTAssertEqual(status, .mobileMeServerServiceErr)\n            XCTAssertEqual(status?.description, \"A MobileMe service error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeRequestAlreadyPending)\n            XCTAssertEqual(status, .mobileMeRequestAlreadyPending)\n            XCTAssertEqual(status?.description, \"A MobileMe request is already pending.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeNoRequestPending)\n            XCTAssertEqual(status, .mobileMeNoRequestPending)\n            XCTAssertEqual(status?.description, \"MobileMe has no request pending.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeCSRVerifyFailure)\n            XCTAssertEqual(status, .mobileMeCSRVerifyFailure)\n            XCTAssertEqual(status?.description, \"A MobileMe CSR verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMobileMeFailedConsistencyCheck)\n            XCTAssertEqual(status, .mobileMeFailedConsistencyCheck)\n            XCTAssertEqual(status?.description, \"MobileMe has found a failed consistency check.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotInitialized)\n            XCTAssertEqual(status, .notInitialized)\n            XCTAssertEqual(status?.description, \"A function was called without initializing CSSM.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidHandleUsage)\n            XCTAssertEqual(status, .invalidHandleUsage)\n            XCTAssertEqual(status?.description, \"The CSSM handle does not match with the service type.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPVCReferentNotFound)\n            XCTAssertEqual(status, .pvcReferentNotFound)\n            XCTAssertEqual(status?.description, \"A reference to the calling module was not found in the list of authorized callers.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFunctionIntegrityFail)\n            XCTAssertEqual(status, .functionIntegrityFail)\n            XCTAssertEqual(status?.description, \"A function address was not within the verified module.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInternalError)\n            XCTAssertEqual(status, .internalError)\n            XCTAssertEqual(status?.description, \"An internal error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMemoryError)\n            XCTAssertEqual(status, .memoryError)\n            XCTAssertEqual(status?.description, \"A memory error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidData)\n            XCTAssertEqual(status, .invalidData)\n            XCTAssertEqual(status?.description, \"Invalid data was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMDSError)\n            XCTAssertEqual(status, .mdsError)\n            XCTAssertEqual(status?.description, \"A Module Directory Service error has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPointer)\n            XCTAssertEqual(status, .invalidPointer)\n            XCTAssertEqual(status?.description, \"An invalid pointer was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSelfCheckFailed)\n            XCTAssertEqual(status, .selfCheckFailed)\n            XCTAssertEqual(status?.description, \"Self-check has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFunctionFailed)\n            XCTAssertEqual(status, .functionFailed)\n            XCTAssertEqual(status?.description, \"A function has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManifestVerifyFailed)\n            XCTAssertEqual(status, .moduleManifestVerifyFailed)\n            XCTAssertEqual(status?.description, \"A module manifest verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidGUID)\n            XCTAssertEqual(status, .invalidGUID)\n            XCTAssertEqual(status?.description, \"An invalid GUID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidHandle)\n            XCTAssertEqual(status, .invalidHandle)\n            XCTAssertEqual(status?.description, \"An invalid handle was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDBList)\n            XCTAssertEqual(status, .invalidDBList)\n            XCTAssertEqual(status?.description, \"An invalid DB list was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPassthroughID)\n            XCTAssertEqual(status, .invalidPassthroughID)\n            XCTAssertEqual(status?.description, \"An invalid passthrough ID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNetworkAddress)\n            XCTAssertEqual(status, .invalidNetworkAddress)\n            XCTAssertEqual(status?.description, \"An invalid network address was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCRLAlreadySigned)\n            XCTAssertEqual(status, .crlAlreadySigned)\n            XCTAssertEqual(status?.description, \"The certificate revocation list is already signed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNumberOfFields)\n            XCTAssertEqual(status, .invalidNumberOfFields)\n            XCTAssertEqual(status?.description, \"An invalid number of fields were encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerificationFailure)\n            XCTAssertEqual(status, .verificationFailure)\n            XCTAssertEqual(status?.description, \"A verification failure occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnknownTag)\n            XCTAssertEqual(status, .unknownTag)\n            XCTAssertEqual(status?.description, \"An unknown tag was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSignature)\n            XCTAssertEqual(status, .invalidSignature)\n            XCTAssertEqual(status?.description, \"An invalid signature was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidName)\n            XCTAssertEqual(status, .invalidName)\n            XCTAssertEqual(status?.description, \"An invalid name was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertificateRef)\n            XCTAssertEqual(status, .invalidCertificateRef)\n            XCTAssertEqual(status?.description, \"An invalid certificate reference was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertificateGroup)\n            XCTAssertEqual(status, .invalidCertificateGroup)\n            XCTAssertEqual(status?.description, \"An invalid certificate group was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTagNotFound)\n            XCTAssertEqual(status, .tagNotFound)\n            XCTAssertEqual(status?.description, \"The specified tag was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidQuery)\n            XCTAssertEqual(status, .invalidQuery)\n            XCTAssertEqual(status?.description, \"The specified query was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidValue)\n            XCTAssertEqual(status, .invalidValue)\n            XCTAssertEqual(status?.description, \"An invalid value was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCallbackFailed)\n            XCTAssertEqual(status, .callbackFailed)\n            XCTAssertEqual(status?.description, \"A callback has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLDeleteFailed)\n            XCTAssertEqual(status, .aclDeleteFailed)\n            XCTAssertEqual(status?.description, \"An ACL delete operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLReplaceFailed)\n            XCTAssertEqual(status, .aclReplaceFailed)\n            XCTAssertEqual(status?.description, \"An ACL replace operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLAddFailed)\n            XCTAssertEqual(status, .aclAddFailed)\n            XCTAssertEqual(status?.description, \"An ACL add operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecACLChangeFailed)\n            XCTAssertEqual(status, .aclChangeFailed)\n            XCTAssertEqual(status?.description, \"An ACL change operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAccessCredentials)\n            XCTAssertEqual(status, .invalidAccessCredentials)\n            XCTAssertEqual(status?.description, \"Invalid access credentials were encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRecord)\n            XCTAssertEqual(status, .invalidRecord)\n            XCTAssertEqual(status?.description, \"An invalid record was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidACL)\n            XCTAssertEqual(status, .invalidACL)\n            XCTAssertEqual(status?.description, \"An invalid ACL was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSampleValue)\n            XCTAssertEqual(status, .invalidSampleValue)\n            XCTAssertEqual(status?.description, \"An invalid sample value was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleVersion)\n            XCTAssertEqual(status, .incompatibleVersion)\n            XCTAssertEqual(status?.description, \"An incompatible version was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPrivilegeNotGranted)\n            XCTAssertEqual(status, .privilegeNotGranted)\n            XCTAssertEqual(status?.description, \"The privilege was not granted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidScope)\n            XCTAssertEqual(status, .invalidScope)\n            XCTAssertEqual(status?.description, \"An invalid scope was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPVCAlreadyConfigured)\n            XCTAssertEqual(status, .pvcAlreadyConfigured)\n            XCTAssertEqual(status?.description, \"The PVC is already configured.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPVC)\n            XCTAssertEqual(status, .invalidPVC)\n            XCTAssertEqual(status?.description, \"An invalid PVC was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEMMLoadFailed)\n            XCTAssertEqual(status, .emmLoadFailed)\n            XCTAssertEqual(status?.description, \"The EMM load has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEMMUnloadFailed)\n            XCTAssertEqual(status, .emmUnloadFailed)\n            XCTAssertEqual(status?.description, \"The EMM unload has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAddinLoadFailed)\n            XCTAssertEqual(status, .addinLoadFailed)\n            XCTAssertEqual(status?.description, \"The add-in load operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyRef)\n            XCTAssertEqual(status, .invalidKeyRef)\n            XCTAssertEqual(status?.description, \"An invalid key was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyHierarchy)\n            XCTAssertEqual(status, .invalidKeyHierarchy)\n            XCTAssertEqual(status?.description, \"An invalid key hierarchy was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAddinUnloadFailed)\n            XCTAssertEqual(status, .addinUnloadFailed)\n            XCTAssertEqual(status?.description, \"The add-in unload operation has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecLibraryReferenceNotFound)\n            XCTAssertEqual(status, .libraryReferenceNotFound)\n            XCTAssertEqual(status?.description, \"A library reference was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAddinFunctionTable)\n            XCTAssertEqual(status, .invalidAddinFunctionTable)\n            XCTAssertEqual(status?.description, \"An invalid add-in function table was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidServiceMask)\n            XCTAssertEqual(status, .invalidServiceMask)\n            XCTAssertEqual(status?.description, \"An invalid service mask was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleNotLoaded)\n            XCTAssertEqual(status, .moduleNotLoaded)\n            XCTAssertEqual(status?.description, \"A module was not loaded.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidSubServiceID)\n            XCTAssertEqual(status, .invalidSubServiceID)\n            XCTAssertEqual(status?.description, \"An invalid subservice ID was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAttributeNotInContext)\n            XCTAssertEqual(status, .attributeNotInContext)\n            XCTAssertEqual(status?.description, \"An attribute was not in the context.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManagerInitializeFailed)\n            XCTAssertEqual(status, .moduleManagerInitializeFailed)\n            XCTAssertEqual(status?.description, \"A module failed to initialize.\")\n        }\n        do {\n            let status = Status(rawValue: errSecModuleManagerNotFound)\n            XCTAssertEqual(status, .moduleManagerNotFound)\n            XCTAssertEqual(status?.description, \"A module was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecEventNotificationCallbackNotFound)\n            XCTAssertEqual(status, .eventNotificationCallbackNotFound)\n            XCTAssertEqual(status?.description, \"An event notification callback was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInputLengthError)\n            XCTAssertEqual(status, .inputLengthError)\n            XCTAssertEqual(status?.description, \"An input length error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecOutputLengthError)\n            XCTAssertEqual(status, .outputLengthError)\n            XCTAssertEqual(status?.description, \"An output length error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPrivilegeNotSupported)\n            XCTAssertEqual(status, .privilegeNotSupported)\n            XCTAssertEqual(status?.description, \"The privilege is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceError)\n            XCTAssertEqual(status, .deviceError)\n            XCTAssertEqual(status?.description, \"A device error was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAttachHandleBusy)\n            XCTAssertEqual(status, .attachHandleBusy)\n            XCTAssertEqual(status?.description, \"The CSP handle was busy.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotLoggedIn)\n            XCTAssertEqual(status, .notLoggedIn)\n            XCTAssertEqual(status?.description, \"You are not logged in.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAlgorithmMismatch)\n            XCTAssertEqual(status, .algorithmMismatch)\n            XCTAssertEqual(status?.description, \"An algorithm mismatch was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyUsageIncorrect)\n            XCTAssertEqual(status, .keyUsageIncorrect)\n            XCTAssertEqual(status?.description, \"The key usage is incorrect.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyBlobTypeIncorrect)\n            XCTAssertEqual(status, .keyBlobTypeIncorrect)\n            XCTAssertEqual(status?.description, \"The key blob type is incorrect.\")\n        }\n        do {\n            let status = Status(rawValue: errSecKeyHeaderInconsistent)\n            XCTAssertEqual(status, .keyHeaderInconsistent)\n            XCTAssertEqual(status?.description, \"The key header is inconsistent.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyFormat)\n            XCTAssertEqual(status, .unsupportedKeyFormat)\n            XCTAssertEqual(status?.description, \"The key header format is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeySize)\n            XCTAssertEqual(status, .unsupportedKeySize)\n            XCTAssertEqual(status?.description, \"The key size is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyUsageMask)\n            XCTAssertEqual(status, .invalidKeyUsageMask)\n            XCTAssertEqual(status?.description, \"The key usage mask is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyUsageMask)\n            XCTAssertEqual(status, .unsupportedKeyUsageMask)\n            XCTAssertEqual(status?.description, \"The key usage mask is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyAttributeMask)\n            XCTAssertEqual(status, .invalidKeyAttributeMask)\n            XCTAssertEqual(status?.description, \"The key attribute mask is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyAttributeMask)\n            XCTAssertEqual(status, .unsupportedKeyAttributeMask)\n            XCTAssertEqual(status?.description, \"The key attribute mask is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyLabel)\n            XCTAssertEqual(status, .invalidKeyLabel)\n            XCTAssertEqual(status?.description, \"The key label is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedKeyLabel)\n            XCTAssertEqual(status, .unsupportedKeyLabel)\n            XCTAssertEqual(status?.description, \"The key label is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidKeyFormat)\n            XCTAssertEqual(status, .invalidKeyFormat)\n            XCTAssertEqual(status?.description, \"The key format is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedVectorOfBuffers)\n            XCTAssertEqual(status, .unsupportedVectorOfBuffers)\n            XCTAssertEqual(status?.description, \"The vector of buffers is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidInputVector)\n            XCTAssertEqual(status, .invalidInputVector)\n            XCTAssertEqual(status?.description, \"The input vector is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidOutputVector)\n            XCTAssertEqual(status, .invalidOutputVector)\n            XCTAssertEqual(status?.description, \"The output vector is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidContext)\n            XCTAssertEqual(status, .invalidContext)\n            XCTAssertEqual(status?.description, \"An invalid context was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAlgorithm)\n            XCTAssertEqual(status, .invalidAlgorithm)\n            XCTAssertEqual(status?.description, \"An invalid algorithm was encountered.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKey)\n            XCTAssertEqual(status, .invalidAttributeKey)\n            XCTAssertEqual(status?.description, \"A key attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKey)\n            XCTAssertEqual(status, .missingAttributeKey)\n            XCTAssertEqual(status?.description, \"A key attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeInitVector)\n            XCTAssertEqual(status, .invalidAttributeInitVector)\n            XCTAssertEqual(status?.description, \"An init vector attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeInitVector)\n            XCTAssertEqual(status, .missingAttributeInitVector)\n            XCTAssertEqual(status?.description, \"An init vector attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSalt)\n            XCTAssertEqual(status, .invalidAttributeSalt)\n            XCTAssertEqual(status?.description, \"A salt attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSalt)\n            XCTAssertEqual(status, .missingAttributeSalt)\n            XCTAssertEqual(status?.description, \"A salt attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePadding)\n            XCTAssertEqual(status, .invalidAttributePadding)\n            XCTAssertEqual(status?.description, \"A padding attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePadding)\n            XCTAssertEqual(status, .missingAttributePadding)\n            XCTAssertEqual(status?.description, \"A padding attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeRandom)\n            XCTAssertEqual(status, .invalidAttributeRandom)\n            XCTAssertEqual(status?.description, \"A random number attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeRandom)\n            XCTAssertEqual(status, .missingAttributeRandom)\n            XCTAssertEqual(status?.description, \"A random number attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSeed)\n            XCTAssertEqual(status, .invalidAttributeSeed)\n            XCTAssertEqual(status?.description, \"A seed attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSeed)\n            XCTAssertEqual(status, .missingAttributeSeed)\n            XCTAssertEqual(status?.description, \"A seed attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePassphrase)\n            XCTAssertEqual(status, .invalidAttributePassphrase)\n            XCTAssertEqual(status?.description, \"A passphrase attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePassphrase)\n            XCTAssertEqual(status, .missingAttributePassphrase)\n            XCTAssertEqual(status?.description, \"A passphrase attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKeyLength)\n            XCTAssertEqual(status, .invalidAttributeKeyLength)\n            XCTAssertEqual(status?.description, \"A key length attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKeyLength)\n            XCTAssertEqual(status, .missingAttributeKeyLength)\n            XCTAssertEqual(status?.description, \"A key length attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeBlockSize)\n            XCTAssertEqual(status, .invalidAttributeBlockSize)\n            XCTAssertEqual(status?.description, \"A block size attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeBlockSize)\n            XCTAssertEqual(status, .missingAttributeBlockSize)\n            XCTAssertEqual(status?.description, \"A block size attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeOutputSize)\n            XCTAssertEqual(status, .invalidAttributeOutputSize)\n            XCTAssertEqual(status?.description, \"An output size attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeOutputSize)\n            XCTAssertEqual(status, .missingAttributeOutputSize)\n            XCTAssertEqual(status?.description, \"An output size attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeRounds)\n            XCTAssertEqual(status, .invalidAttributeRounds)\n            XCTAssertEqual(status?.description, \"The number of rounds attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeRounds)\n            XCTAssertEqual(status, .missingAttributeRounds)\n            XCTAssertEqual(status?.description, \"The number of rounds attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAlgorithmParms)\n            XCTAssertEqual(status, .invalidAlgorithmParms)\n            XCTAssertEqual(status?.description, \"An algorithm parameters attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAlgorithmParms)\n            XCTAssertEqual(status, .missingAlgorithmParms)\n            XCTAssertEqual(status?.description, \"An algorithm parameters attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeLabel)\n            XCTAssertEqual(status, .invalidAttributeLabel)\n            XCTAssertEqual(status?.description, \"A label attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeLabel)\n            XCTAssertEqual(status, .missingAttributeLabel)\n            XCTAssertEqual(status?.description, \"A label attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeKeyType)\n            XCTAssertEqual(status, .invalidAttributeKeyType)\n            XCTAssertEqual(status?.description, \"A key type attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeKeyType)\n            XCTAssertEqual(status, .missingAttributeKeyType)\n            XCTAssertEqual(status?.description, \"A key type attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeMode)\n            XCTAssertEqual(status, .invalidAttributeMode)\n            XCTAssertEqual(status?.description, \"A mode attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeMode)\n            XCTAssertEqual(status, .missingAttributeMode)\n            XCTAssertEqual(status?.description, \"A mode attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeEffectiveBits)\n            XCTAssertEqual(status, .invalidAttributeEffectiveBits)\n            XCTAssertEqual(status?.description, \"An effective bits attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeEffectiveBits)\n            XCTAssertEqual(status, .missingAttributeEffectiveBits)\n            XCTAssertEqual(status?.description, \"An effective bits attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeStartDate)\n            XCTAssertEqual(status, .invalidAttributeStartDate)\n            XCTAssertEqual(status?.description, \"A start date attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeStartDate)\n            XCTAssertEqual(status, .missingAttributeStartDate)\n            XCTAssertEqual(status?.description, \"A start date attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeEndDate)\n            XCTAssertEqual(status, .invalidAttributeEndDate)\n            XCTAssertEqual(status?.description, \"An end date attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeEndDate)\n            XCTAssertEqual(status, .missingAttributeEndDate)\n            XCTAssertEqual(status?.description, \"An end date attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeVersion)\n            XCTAssertEqual(status, .invalidAttributeVersion)\n            XCTAssertEqual(status?.description, \"A version attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeVersion)\n            XCTAssertEqual(status, .missingAttributeVersion)\n            XCTAssertEqual(status?.description, \"A version attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePrime)\n            XCTAssertEqual(status, .invalidAttributePrime)\n            XCTAssertEqual(status?.description, \"A prime attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePrime)\n            XCTAssertEqual(status, .missingAttributePrime)\n            XCTAssertEqual(status?.description, \"A prime attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeBase)\n            XCTAssertEqual(status, .invalidAttributeBase)\n            XCTAssertEqual(status?.description, \"A base attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeBase)\n            XCTAssertEqual(status, .missingAttributeBase)\n            XCTAssertEqual(status?.description, \"A base attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSubprime)\n            XCTAssertEqual(status, .invalidAttributeSubprime)\n            XCTAssertEqual(status?.description, \"A subprime attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSubprime)\n            XCTAssertEqual(status, .missingAttributeSubprime)\n            XCTAssertEqual(status?.description, \"A subprime attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeIterationCount)\n            XCTAssertEqual(status, .invalidAttributeIterationCount)\n            XCTAssertEqual(status?.description, \"An iteration count attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeIterationCount)\n            XCTAssertEqual(status, .missingAttributeIterationCount)\n            XCTAssertEqual(status?.description, \"An iteration count attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeDLDBHandle)\n            XCTAssertEqual(status, .invalidAttributeDLDBHandle)\n            XCTAssertEqual(status?.description, \"A database handle attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeDLDBHandle)\n            XCTAssertEqual(status, .missingAttributeDLDBHandle)\n            XCTAssertEqual(status?.description, \"A database handle attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeAccessCredentials)\n            XCTAssertEqual(status, .invalidAttributeAccessCredentials)\n            XCTAssertEqual(status?.description, \"An access credentials attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeAccessCredentials)\n            XCTAssertEqual(status, .missingAttributeAccessCredentials)\n            XCTAssertEqual(status?.description, \"An access credentials attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePublicKeyFormat)\n            XCTAssertEqual(status, .invalidAttributePublicKeyFormat)\n            XCTAssertEqual(status?.description, \"A public key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePublicKeyFormat)\n            XCTAssertEqual(status, .missingAttributePublicKeyFormat)\n            XCTAssertEqual(status?.description, \"A public key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributePrivateKeyFormat)\n            XCTAssertEqual(status, .invalidAttributePrivateKeyFormat)\n            XCTAssertEqual(status?.description, \"A private key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributePrivateKeyFormat)\n            XCTAssertEqual(status, .missingAttributePrivateKeyFormat)\n            XCTAssertEqual(status?.description, \"A private key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status, .invalidAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status?.description, \"A symmetric key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status, .missingAttributeSymmetricKeyFormat)\n            XCTAssertEqual(status?.description, \"A symmetric key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAttributeWrappedKeyFormat)\n            XCTAssertEqual(status, .invalidAttributeWrappedKeyFormat)\n            XCTAssertEqual(status?.description, \"A wrapped key format attribute was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingAttributeWrappedKeyFormat)\n            XCTAssertEqual(status, .missingAttributeWrappedKeyFormat)\n            XCTAssertEqual(status?.description, \"A wrapped key format attribute was missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecStagedOperationInProgress)\n            XCTAssertEqual(status, .stagedOperationInProgress)\n            XCTAssertEqual(status?.description, \"A staged operation is in progress.\")\n        }\n        do {\n            let status = Status(rawValue: errSecStagedOperationNotStarted)\n            XCTAssertEqual(status, .stagedOperationNotStarted)\n            XCTAssertEqual(status?.description, \"A staged operation was not started.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerifyFailed)\n            XCTAssertEqual(status, .verifyFailed)\n            XCTAssertEqual(status?.description, \"A cryptographic verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecQuerySizeUnknown)\n            XCTAssertEqual(status, .querySizeUnknown)\n            XCTAssertEqual(status?.description, \"The query size is unknown.\")\n        }\n        do {\n            let status = Status(rawValue: errSecBlockSizeMismatch)\n            XCTAssertEqual(status, .blockSizeMismatch)\n            XCTAssertEqual(status?.description, \"A block size mismatch occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecPublicKeyInconsistent)\n            XCTAssertEqual(status, .publicKeyInconsistent)\n            XCTAssertEqual(status?.description, \"The public key was inconsistent.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDeviceVerifyFailed)\n            XCTAssertEqual(status, .deviceVerifyFailed)\n            XCTAssertEqual(status?.description, \"A device verification failure has occurred.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidLoginName)\n            XCTAssertEqual(status, .invalidLoginName)\n            XCTAssertEqual(status?.description, \"An invalid login name was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecAlreadyLoggedIn)\n            XCTAssertEqual(status, .alreadyLoggedIn)\n            XCTAssertEqual(status?.description, \"The user is already logged in.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDigestAlgorithm)\n            XCTAssertEqual(status, .invalidDigestAlgorithm)\n            XCTAssertEqual(status?.description, \"An invalid digest algorithm was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLGroup)\n            XCTAssertEqual(status, .invalidCRLGroup)\n            XCTAssertEqual(status?.description, \"An invalid CRL group was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateCannotOperate)\n            XCTAssertEqual(status, .certificateCannotOperate)\n            XCTAssertEqual(status?.description, \"The certificate cannot operate.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateExpired)\n            XCTAssertEqual(status, .certificateExpired)\n            XCTAssertEqual(status?.description, \"An expired certificate was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateNotValidYet)\n            XCTAssertEqual(status, .certificateNotValidYet)\n            XCTAssertEqual(status?.description, \"The certificate is not yet valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateRevoked)\n            XCTAssertEqual(status, .certificateRevoked)\n            XCTAssertEqual(status?.description, \"The certificate was revoked.\")\n        }\n        do {\n            let status = Status(rawValue: errSecCertificateSuspended)\n            XCTAssertEqual(status, .certificateSuspended)\n            XCTAssertEqual(status?.description, \"The certificate was suspended.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInsufficientCredentials)\n            XCTAssertEqual(status, .insufficientCredentials)\n            XCTAssertEqual(status?.description, \"Insufficient credentials were detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAction)\n            XCTAssertEqual(status, .invalidAction)\n            XCTAssertEqual(status?.description, \"The action was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAuthority)\n            XCTAssertEqual(status, .invalidAuthority)\n            XCTAssertEqual(status?.description, \"The authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecVerifyActionFailed)\n            XCTAssertEqual(status, .verifyActionFailed)\n            XCTAssertEqual(status?.description, \"A verify action has failed.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCertAuthority)\n            XCTAssertEqual(status, .invalidCertAuthority)\n            XCTAssertEqual(status?.description, \"The certificate authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvaldCRLAuthority)\n            XCTAssertEqual(status, .invaldCRLAuthority)\n            XCTAssertEqual(status?.description, \"The CRL authority was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLEncoding)\n            XCTAssertEqual(status, .invalidCRLEncoding)\n            XCTAssertEqual(status?.description, \"The CRL encoding was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLType)\n            XCTAssertEqual(status, .invalidCRLType)\n            XCTAssertEqual(status?.description, \"The CRL type was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRL)\n            XCTAssertEqual(status, .invalidCRL)\n            XCTAssertEqual(status?.description, \"The CRL was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidFormType)\n            XCTAssertEqual(status, .invalidFormType)\n            XCTAssertEqual(status?.description, \"The form type was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidID)\n            XCTAssertEqual(status, .invalidID)\n            XCTAssertEqual(status?.description, \"The ID was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIdentifier)\n            XCTAssertEqual(status, .invalidIdentifier)\n            XCTAssertEqual(status?.description, \"The identifier was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIndex)\n            XCTAssertEqual(status, .invalidIndex)\n            XCTAssertEqual(status?.description, \"The index was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidPolicyIdentifiers)\n            XCTAssertEqual(status, .invalidPolicyIdentifiers)\n            XCTAssertEqual(status?.description, \"The policy identifiers are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTimeString)\n            XCTAssertEqual(status, .invalidTimeString)\n            XCTAssertEqual(status?.description, \"The time specified was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidReason)\n            XCTAssertEqual(status, .invalidReason)\n            XCTAssertEqual(status?.description, \"The trust policy reason was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRequestInputs)\n            XCTAssertEqual(status, .invalidRequestInputs)\n            XCTAssertEqual(status?.description, \"The request inputs are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidResponseVector)\n            XCTAssertEqual(status, .invalidResponseVector)\n            XCTAssertEqual(status?.description, \"The response vector was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidStopOnPolicy)\n            XCTAssertEqual(status, .invalidStopOnPolicy)\n            XCTAssertEqual(status?.description, \"The stop-on policy was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTuple)\n            XCTAssertEqual(status, .invalidTuple)\n            XCTAssertEqual(status?.description, \"The tuple was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMultipleValuesUnsupported)\n            XCTAssertEqual(status, .multipleValuesUnsupported)\n            XCTAssertEqual(status?.description, \"Multiple values are not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNotTrusted)\n            XCTAssertEqual(status, .notTrusted)\n            XCTAssertEqual(status?.description, \"The trust policy was not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoDefaultAuthority)\n            XCTAssertEqual(status, .noDefaultAuthority)\n            XCTAssertEqual(status?.description, \"No default authority was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRejectedForm)\n            XCTAssertEqual(status, .rejectedForm)\n            XCTAssertEqual(status?.description, \"The trust policy had a rejected form.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestLost)\n            XCTAssertEqual(status, .requestLost)\n            XCTAssertEqual(status?.description, \"The request was lost.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestRejected)\n            XCTAssertEqual(status, .requestRejected)\n            XCTAssertEqual(status?.description, \"The request was rejected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedAddressType)\n            XCTAssertEqual(status, .unsupportedAddressType)\n            XCTAssertEqual(status?.description, \"The address type is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedService)\n            XCTAssertEqual(status, .unsupportedService)\n            XCTAssertEqual(status?.description, \"The service is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTupleGroup)\n            XCTAssertEqual(status, .invalidTupleGroup)\n            XCTAssertEqual(status?.description, \"The tuple group was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidBaseACLs)\n            XCTAssertEqual(status, .invalidBaseACLs)\n            XCTAssertEqual(status?.description, \"The base ACLs are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidTupleCredendtials)\n            XCTAssertEqual(status, .invalidTupleCredendtials)\n            XCTAssertEqual(status?.description, \"The tuple credentials are not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidEncoding)\n            XCTAssertEqual(status, .invalidEncoding)\n            XCTAssertEqual(status?.description, \"The encoding was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidValidityPeriod)\n            XCTAssertEqual(status, .invalidValidityPeriod)\n            XCTAssertEqual(status?.description, \"The validity period was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidRequestor)\n            XCTAssertEqual(status, .invalidRequestor)\n            XCTAssertEqual(status?.description, \"The requestor was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecRequestDescriptor)\n            XCTAssertEqual(status, .requestDescriptor)\n            XCTAssertEqual(status?.description, \"The request descriptor was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidBundleInfo)\n            XCTAssertEqual(status, .invalidBundleInfo)\n            XCTAssertEqual(status?.description, \"The bundle information was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidCRLIndex)\n            XCTAssertEqual(status, .invalidCRLIndex)\n            XCTAssertEqual(status?.description, \"The CRL index was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecNoFieldValues)\n            XCTAssertEqual(status, .noFieldValues)\n            XCTAssertEqual(status?.description, \"No field values were detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedFieldFormat)\n            XCTAssertEqual(status, .unsupportedFieldFormat)\n            XCTAssertEqual(status?.description, \"The field format is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedIndexInfo)\n            XCTAssertEqual(status, .unsupportedIndexInfo)\n            XCTAssertEqual(status?.description, \"The index information is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedLocality)\n            XCTAssertEqual(status, .unsupportedLocality)\n            XCTAssertEqual(status?.description, \"The locality is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumAttributes)\n            XCTAssertEqual(status, .unsupportedNumAttributes)\n            XCTAssertEqual(status?.description, \"The number of attributes is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumIndexes)\n            XCTAssertEqual(status, .unsupportedNumIndexes)\n            XCTAssertEqual(status?.description, \"The number of indexes is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumRecordTypes)\n            XCTAssertEqual(status, .unsupportedNumRecordTypes)\n            XCTAssertEqual(status?.description, \"The number of record types is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecFieldSpecifiedMultiple)\n            XCTAssertEqual(status, .fieldSpecifiedMultiple)\n            XCTAssertEqual(status?.description, \"Too many fields were specified.\")\n        }\n        do {\n            let status = Status(rawValue: errSecIncompatibleFieldFormat)\n            XCTAssertEqual(status, .incompatibleFieldFormat)\n            XCTAssertEqual(status?.description, \"The field format was incompatible.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidParsingModule)\n            XCTAssertEqual(status, .invalidParsingModule)\n            XCTAssertEqual(status?.description, \"The parsing module was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDatabaseLocked)\n            XCTAssertEqual(status, .databaseLocked)\n            XCTAssertEqual(status?.description, \"The database is locked.\")\n        }\n        do {\n            let status = Status(rawValue: errSecDatastoreIsOpen)\n            XCTAssertEqual(status, .datastoreIsOpen)\n            XCTAssertEqual(status?.description, \"The data store is open.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingValue)\n            XCTAssertEqual(status, .missingValue)\n            XCTAssertEqual(status?.description, \"A missing value was detected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedQueryLimits)\n            XCTAssertEqual(status, .unsupportedQueryLimits)\n            XCTAssertEqual(status?.description, \"The query limits are not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedNumSelectionPreds)\n            XCTAssertEqual(status, .unsupportedNumSelectionPreds)\n            XCTAssertEqual(status?.description, \"The number of selection predicates is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecUnsupportedOperator)\n            XCTAssertEqual(status, .unsupportedOperator)\n            XCTAssertEqual(status?.description, \"The operator is not supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidDBLocation)\n            XCTAssertEqual(status, .invalidDBLocation)\n            XCTAssertEqual(status?.description, \"The database location is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidAccessRequest)\n            XCTAssertEqual(status, .invalidAccessRequest)\n            XCTAssertEqual(status?.description, \"The access request is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidIndexInfo)\n            XCTAssertEqual(status, .invalidIndexInfo)\n            XCTAssertEqual(status?.description, \"The index information is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidNewOwner)\n            XCTAssertEqual(status, .invalidNewOwner)\n            XCTAssertEqual(status?.description, \"The new owner is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecInvalidModifyMode)\n            XCTAssertEqual(status, .invalidModifyMode)\n            XCTAssertEqual(status?.description, \"The modify mode is not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecMissingRequiredExtension)\n            XCTAssertEqual(status, .missingRequiredExtension)\n            XCTAssertEqual(status?.description, \"A required certificate extension is missing.\")\n        }\n        do {\n            let status = Status(rawValue: errSecExtendedKeyUsageNotCritical)\n            XCTAssertEqual(status, .extendedKeyUsageNotCritical)\n            XCTAssertEqual(status?.description, \"The extended key usage extension was not marked critical.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampMissing)\n            XCTAssertEqual(status, .timestampMissing)\n            XCTAssertEqual(status?.description, \"A timestamp was expected but was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampInvalid)\n            XCTAssertEqual(status, .timestampInvalid)\n            XCTAssertEqual(status?.description, \"The timestamp was not valid.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampNotTrusted)\n            XCTAssertEqual(status, .timestampNotTrusted)\n            XCTAssertEqual(status?.description, \"The timestamp was not trusted.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampServiceNotAvailable)\n            XCTAssertEqual(status, .timestampServiceNotAvailable)\n            XCTAssertEqual(status?.description, \"The timestamp service is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadAlg)\n            XCTAssertEqual(status, .timestampBadAlg)\n            XCTAssertEqual(status?.description, \"An unrecognized or unsupported Algorithm Identifier in timestamp.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadRequest)\n            XCTAssertEqual(status, .timestampBadRequest)\n            XCTAssertEqual(status?.description, \"The timestamp transaction is not permitted or supported.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampBadDataFormat)\n            XCTAssertEqual(status, .timestampBadDataFormat)\n            XCTAssertEqual(status?.description, \"The timestamp data submitted has the wrong format.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampTimeNotAvailable)\n            XCTAssertEqual(status, .timestampTimeNotAvailable)\n            XCTAssertEqual(status?.description, \"The time source for the Timestamp Authority is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampUnacceptedPolicy)\n            XCTAssertEqual(status, .timestampUnacceptedPolicy)\n            XCTAssertEqual(status?.description, \"The requested policy is not supported by the Timestamp Authority.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampUnacceptedExtension)\n            XCTAssertEqual(status, .timestampUnacceptedExtension)\n            XCTAssertEqual(status?.description, \"The requested extension is not supported by the Timestamp Authority.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampAddInfoNotAvailable)\n            XCTAssertEqual(status, .timestampAddInfoNotAvailable)\n            XCTAssertEqual(status?.description, \"The additional information requested is not available.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampSystemFailure)\n            XCTAssertEqual(status, .timestampSystemFailure)\n            XCTAssertEqual(status?.description, \"The timestamp request cannot be handled due to system failure.\")\n        }\n        do {\n            let status = Status(rawValue: errSecSigningTimeMissing)\n            XCTAssertEqual(status, .signingTimeMissing)\n            XCTAssertEqual(status?.description, \"A signing time was expected but was not found.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRejection)\n            XCTAssertEqual(status, .timestampRejection)\n            XCTAssertEqual(status?.description, \"A timestamp transaction was rejected.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampWaiting)\n            XCTAssertEqual(status, .timestampWaiting)\n            XCTAssertEqual(status?.description, \"A timestamp transaction is waiting.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRevocationWarning)\n            XCTAssertEqual(status, .timestampRevocationWarning)\n            XCTAssertEqual(status?.description, \"A timestamp authority revocation warning was issued.\")\n        }\n        do {\n            let status = Status(rawValue: errSecTimestampRevocationNotification)\n            XCTAssertEqual(status, .timestampRevocationNotification)\n            XCTAssertEqual(status?.description, \"A timestamp authority revocation notification was issued.\")\n        }\n        #endif\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/KeychainAccessTests.swift",
    "content": "//\n//  KeychainAccessTests.swift\n//  KeychainAccessTests\n//\n//  Created by kishikawa katsumi on 2014/12/24.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport KeychainAccess\n\nclass KeychainAccessTests: XCTestCase {\n    override func setUp() {\n        super.setUp()\n\n        do { try Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").removeAll() } catch {}\n        do { try Keychain(service: \"Twitter\").removeAll() } catch {}\n\n        do { try Keychain(server: URL(string: \"https://example.com\")!, protocolType: .https).removeAll() } catch {}\n        do { try Keychain(server: URL(string: \"https://example.com:443\")!, protocolType: .https).removeAll() } catch {}\n\n        do { try Keychain().removeAll() } catch {}\n    }\n\n    override func tearDown() {\n        super.tearDown()\n    }\n\n    // MARK:\n\n    func testGenericPassword() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testGenericPasswordSubscripting() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = \"kishikawa_katsumi\"\n            keychain[\"password\"] = \"password_1234\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = \"katsumi_kishikawa\"\n            keychain[\"password\"] = \"1234_password\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n\n            keychain[\"username\"] = nil\n            keychain[\"password\"] = nil\n\n            XCTAssertNil(keychain[\"username\"])\n            XCTAssertNil(keychain[\"password\"])\n        }\n    }\n\n    func testGenericPasswordWithAccessGroup1() {\n        do {\n            // Add Keychain items\n            // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n            // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n            // https://developer.apple.com/documentation/security/ksecattraccessgroup\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychainWithAccessGroup.remove(\"username\") } catch {}\n            do { try keychainWithAccessGroup.remove(\"password\") } catch {}\n\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            XCTAssertNotNil(try! keychain.get(\"username\"))\n            XCTAssertNotNil(try! keychain.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testGenericPasswordWithAccessGroup2() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\").synchronizable(true)\n            let keychainWithAccessGroup = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            // If the access group is empty, the query will match all access group. So delete all values in other access groups.\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n        }\n    }\n\n    // MARK:\n\n    func testInternetPassword() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n\n            let username = try! keychain.get(\"username\")\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = try! keychain.get(\"password\")\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testInternetPasswordSubscripting() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = \"kishikawa_katsumi\"\n            keychain[\"password\"] = \"password_1234\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"kishikawa_katsumi\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"password_1234\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = \"katsumi_kishikawa\"\n            keychain[\"password\"] = \"1234_password\"\n\n            let username = keychain[\"username\"]\n            XCTAssertEqual(username, \"katsumi_kishikawa\")\n\n            let password = keychain[\"password\"]\n            XCTAssertEqual(password, \"1234_password\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n\n            keychain[\"username\"] = nil\n            keychain[\"password\"] = nil\n\n            XCTAssertNil(keychain[\"username\"])\n            XCTAssertNil(keychain[\"password\"])\n        }\n    }\n\n    func testInternetPasswordWithAccessGroup1() {\n        do {\n            // Add Keychain items\n            // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n            // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n            // https://developer.apple.com/documentation/security/ksecattraccessgroup\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychainWithAccessGroup.remove(\"username\") } catch {}\n            do { try keychainWithAccessGroup.remove(\"password\") } catch {}\n\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            XCTAssertNotNil(try! keychain.get(\"username\"))\n            XCTAssertNotNil(try! keychain.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n        }\n    }\n\n    func testInternetPasswordWithAccessGroup2() {\n        do {\n            // Add Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"kishikawa_katsumi\", key: \"username\") } catch {}\n            do { try keychain.set(\"password_1234\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"kishikawa_katsumi_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"password_1234_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawa_katsumi\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"password_1234\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"kishikawa_katsumi_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"password_1234_access_group\")\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            do { try keychain.set(\"katsumi_kishikawa\", key: \"username\") } catch {}\n            do { try keychain.set(\"1234_password\", key: \"password\") } catch {}\n            do { try keychainWithAccessGroup.set(\"katsumi_kishikawa_access_group\", key: \"username\") } catch {}\n            do { try keychainWithAccessGroup.set(\"1234_password_access_group\", key: \"password\") } catch {}\n\n            XCTAssertEqual(try! keychain.get(\"username\"), \"katsumi_kishikawa\")\n            XCTAssertEqual(try! keychain.get(\"password\"), \"1234_password\")\n\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"username\"), \"katsumi_kishikawa_access_group\")\n            XCTAssertEqual(try! keychainWithAccessGroup.get(\"password\"), \"1234_password_access_group\")\n        }\n\n        do {\n            // Remove Keychain items\n            let keychain = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https).synchronizable(true)\n            let keychainWithAccessGroup = Keychain(server: \"https://kishikawakatsumi.com\", protocolType: .https, accessGroup: \"27AEDK3C9F.shared\").synchronizable(true)\n\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNotNil(try! keychainWithAccessGroup.get(\"password\"))\n\n            do { try keychain.remove(\"username\") } catch {}\n            do { try keychain.remove(\"password\") } catch {}\n\n            // If the access group is empty, the query will match all access group. So delete all values in other access groups.\n            XCTAssertNil(try! keychain.get(\"username\"))\n            XCTAssertNil(try! keychain.get(\"password\"))\n\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"username\"))\n            XCTAssertNil(try! keychainWithAccessGroup.get(\"password\"))\n        }\n    }\n\n\n    // MARK:\n\n    func testDefaultInitializer() {\n        let keychain = Keychain()\n        XCTAssertEqual(keychain.service, Bundle.main.bundleIdentifier)\n        let service: String\n        #if targetEnvironment(macCatalyst)\n        service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n        #else\n        service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n        #endif\n        XCTAssertEqual(keychain.service, service)\n        XCTAssertNil(keychain.accessGroup)\n    }\n\n    func testInitializerWithService() {\n        let keychain = Keychain(service: \"com.example.github-token\")\n        XCTAssertEqual(keychain.service, \"com.example.github-token\")\n        XCTAssertNil(keychain.accessGroup)\n    }\n\n    func testInitializerWithAccessGroup() {\n        let keychain = Keychain(accessGroup: \"27AEDK3C9F.shared\")\n        let service: String\n        #if targetEnvironment(macCatalyst)\n        service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n        #else\n        service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n        #endif\n        XCTAssertEqual(keychain.service, service)\n        XCTAssertEqual(keychain.accessGroup, \"27AEDK3C9F.shared\")\n    }\n\n    func testInitializerWithServiceAndAccessGroup() {\n        let keychain = Keychain(service: \"com.example.github-token\", accessGroup: \"27AEDK3C9F.shared\")\n        XCTAssertEqual(keychain.service, \"com.example.github-token\")\n        XCTAssertEqual(keychain.accessGroup, \"27AEDK3C9F.shared\")\n    }\n\n    func testInitializerWithServer() {\n        let server = \"https://kishikawakatsumi.com\"\n        let url = URL(string: server)!\n\n        do {\n            let keychain = Keychain(server: server, protocolType: .https)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.default)\n        }\n        do {\n            let keychain = Keychain(server: url, protocolType: .https)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.default)\n        }\n    }\n\n    func testInitializerWithServerAndAuthenticationType() {\n        let server = \"https://kishikawakatsumi.com\"\n        let url = URL(string: server)!\n\n        do {\n            let keychain = Keychain(server: server, protocolType: .https, authenticationType: .htmlForm)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.htmlForm)\n        }\n        do {\n            let keychain = Keychain(server: url, protocolType: .https, authenticationType: .htmlForm)\n            XCTAssertEqual(keychain.server, url)\n            XCTAssertEqual(keychain.protocolType, ProtocolType.https)\n            XCTAssertEqual(keychain.authenticationType, AuthenticationType.htmlForm)\n        }\n    }\n\n    // MARK:\n\n    func testContains() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertFalse(try! keychain.contains(\"username\"), \"not stored username\")\n        XCTAssertFalse(try! keychain.contains(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertTrue(try! keychain.contains(\"username\"), \"stored username\")\n        XCTAssertFalse(try! keychain.contains(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertTrue(try! keychain.contains(\"username\"), \"stored username\")\n        XCTAssertTrue(try! keychain.contains(\"password\"), \"stored password\")\n    }\n\n    // MARK:\n\n    func testSetString() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n    }\n\n    func testSetStringWithLabel() {\n        let keychain = Keychain(service: \"Twitter\")\n            .label(\"Twitter Account\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertNil(label)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertEqual(label, \"Twitter Account\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetStringWithComment() {\n        let keychain = Keychain(service: \"Twitter\")\n            .comment(\"Kishikawa Katsumi\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertNil(comment)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertEqual(comment, \"Kishikawa Katsumi\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetStringWithLabelAndComment() {\n        let keychain = Keychain(service: \"Twitter\")\n            .label(\"Twitter Account\")\n            .comment(\"Kishikawa Katsumi\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertNil(label)\n\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertNil(comment)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let label = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.label\n            }\n            XCTAssertEqual(label, \"Twitter Account\")\n\n            let comment = try keychain.get(\"kishikawakatsumi\") { (attributes) -> String? in\n                return attributes?.comment\n            }\n            XCTAssertEqual(comment, \"Kishikawa Katsumi\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    func testSetData() {\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"not stored JSON data\")\n\n        do { try keychain.set(JSONData, key: \"JSONData\") } catch {}\n        XCTAssertEqual(try! keychain.getData(\"JSONData\"), JSONData, \"stored JSON data\")\n    }\n\n    func testStringConversionError() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        let length = 256\n        let data = NSMutableData(length: length)!\n        let bytes = data.mutableBytes.bindMemory(to: UInt8.self, capacity: length)\n        _ = SecRandomCopyBytes(kSecRandomDefault, length, bytes)\n\n        do {\n            try keychain.set(data as Data, key: \"RandomData\")\n            let _ = try keychain.getString(\"RandomData\")\n            XCTFail(\"no error occurred\")\n        } catch let error as NSError {\n            XCTAssertEqual(error.domain, KeychainAccessErrorDomain)\n            XCTAssertEqual(error.code, Int(Status.conversionError.rawValue))\n            XCTAssertEqual(error.userInfo[NSLocalizedDescriptionKey] as! String, Status.conversionError.localizedDescription)\n        } catch {\n            XCTFail(\"unexpected error occurred\")\n        }\n\n        do {\n            try keychain.set(data as Data, key: \"RandomData\")\n            let _ = try keychain.getString(\"RandomData\")\n            XCTFail(\"no error occurred\")\n        } catch Status.conversionError {\n            XCTAssertTrue(true)\n        } catch {\n            XCTFail(\"unexpected error occurred\")\n        }\n    }\n\n    func testGetPersistentRef() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n        do {\n            let persistentRef = try keychain.get(\"kishikawakatsumi\") { $0?.persistentRef }\n            XCTAssertNil(persistentRef)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        keychain[\"kishikawakatsumi\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n        do {\n            let persistentRef = try keychain.get(\"kishikawakatsumi\") { $0?.persistentRef }\n            XCTAssertNotNil(persistentRef)\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n    }\n\n    #if os(iOS) || os(tvOS)\n    func testSetAttributes() {\n        do {\n            var attributes = [String: Any]()\n            attributes[String(kSecAttrDescription)] = \"Description Test\"\n            attributes[String(kSecAttrComment)] = \"Comment Test\"\n            attributes[String(kSecAttrCreator)] = \"Creator Test\"\n            attributes[String(kSecAttrType)] = \"Type Test\"\n            attributes[String(kSecAttrLabel)] = \"Label Test\"\n            attributes[String(kSecAttrIsInvisible)] = true\n            attributes[String(kSecAttrIsNegative)] = true\n\n            let keychain = Keychain(service: \"Twitter\")\n                .attributes(attributes)\n\n            XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertNil(attributes)\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            keychain[\"kishikawakatsumi\"] = \"password1234\"\n            XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.genericPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if targetEnvironment(macCatalyst)\n                XCTAssertNotNil(attributes?.accessControl)\n                #else\n                if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 11, minorVersion: 3, patchVersion: 0)) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertEqual(attributes?.service, \"Twitter\")\n                XCTAssertNil(attributes?.generic)\n                XCTAssertNil(attributes?.securityDomain)\n                XCTAssertNil(attributes?.server)\n                XCTAssertNil(attributes?.`protocol`)\n                XCTAssertNil(attributes?.authenticationType)\n                XCTAssertNil(attributes?.port)\n                XCTAssertNil(attributes?.path)\n\n                XCTAssertEqual(attributes?[String(kSecClass)] as? String, ItemClass.genericPassword.rawValue)\n                XCTAssertEqual(attributes?[String(kSecValueData)] as? Data, \"password1234\".data(using: .utf8))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n\n        do {\n            var attributes = [String: Any]()\n            attributes[String(kSecAttrDescription)] = \"Description Test\"\n            attributes[String(kSecAttrComment)] = \"Comment Test\"\n            attributes[String(kSecAttrCreator)] = \"Creator Test\"\n            attributes[String(kSecAttrType)] = \"Type Test\"\n            attributes[String(kSecAttrLabel)] = \"Label Test\"\n            attributes[String(kSecAttrIsInvisible)] = true\n            attributes[String(kSecAttrIsNegative)] = true\n            attributes[String(kSecAttrSecurityDomain)] = \"securitydomain\"\n\n            let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n                .attributes(attributes)\n\n            XCTAssertNil(keychain[\"kishikawakatsumi\"], \"not stored password\")\n\n            do {\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertNil(attributes)\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                keychain[\"kishikawakatsumi\"] = \"password1234\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"stored password\")\n\n                keychain[\"kishikawakatsumi\"] = \"1234password\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"1234password\", \"updated password\")\n\n                let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"1234password\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Description Test\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let keychain = Keychain(server: URL(string: \"https://example.com:443/api/login/\")!, protocolType: .https)\n                    .attributes([String(kSecAttrDescription): \"Updated Description\"])\n\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"1234password\", \"stored password\")\n\n                keychain[\"kishikawakatsumi\"] = \"password1234\"\n                XCTAssertEqual(keychain[\"kishikawakatsumi\"], \"password1234\", \"updated password\")\n\n                let attributes = keychain[attributes: \"kishikawakatsumi\"]\n                XCTAssertEqual(attributes?.`class`, ItemClass.internetPassword.rawValue)\n                XCTAssertEqual(attributes?.data, \"password1234\".data(using: .utf8))\n                XCTAssertNil(attributes?.ref)\n                XCTAssertNotNil(attributes?.persistentRef)\n                XCTAssertEqual(attributes?.accessible, Accessibility.afterFirstUnlock.rawValue)\n                #if os(iOS)\n                if #available(iOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else if #available(iOS 9.0, *) {\n                    XCTAssertNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNotNil(attributes?.accessControl)\n                }\n                #else\n                if #available(tvOS 11.3, *) {\n                    XCTAssertNotNil(attributes?.accessControl)\n                } else {\n                    XCTAssertNil(attributes?.accessControl)\n                }\n                #endif\n                let accessGroup: String\n                #if targetEnvironment(macCatalyst)\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n                #else\n                accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n                #endif\n                XCTAssertEqual(attributes?.accessGroup, accessGroup)\n                XCTAssertNotNil(attributes?.synchronizable)\n                XCTAssertNotNil(attributes?.creationDate)\n                XCTAssertNotNil(attributes?.modificationDate)\n                XCTAssertEqual(attributes?.attributeDescription, \"Updated Description\")\n                XCTAssertEqual(attributes?.comment, \"Comment Test\")\n                XCTAssertEqual(attributes?.creator, \"Creator Test\")\n                XCTAssertEqual(attributes?.type, \"Type Test\")\n                XCTAssertEqual(attributes?.label, \"Label Test\")\n                XCTAssertEqual(attributes?.isInvisible, true)\n                XCTAssertEqual(attributes?.isNegative, true)\n                XCTAssertEqual(attributes?.account, \"kishikawakatsumi\")\n                XCTAssertNil(attributes?.service)\n                XCTAssertNil(attributes?.generic)\n                XCTAssertEqual(attributes?.securityDomain, \"securitydomain\")\n                XCTAssertEqual(attributes?.server, \"example.com\")\n                XCTAssertEqual(attributes?.`protocol`, ProtocolType.https.rawValue)\n                XCTAssertEqual(attributes?.authenticationType, AuthenticationType.default.rawValue)\n                XCTAssertEqual(attributes?.port, 443)\n                XCTAssertEqual(attributes?.path, \"\")\n            }\n        }\n    }\n    #endif\n\n    func testRemoveString() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n\n        do { try keychain.remove(\"username\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"left password\")\n\n        do { try keychain.remove(\"password\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"removed username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"removed password\")\n    }\n\n    func testRemoveData() {\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"not stored JSON data\")\n\n        do { try keychain.set(JSONData, key: \"JSONData\") } catch {}\n        XCTAssertEqual(try! keychain.getData(\"JSONData\"), JSONData, \"stored JSON data\")\n\n        do { try keychain.remove(\"JSONData\") } catch {}\n        XCTAssertNil(try! keychain.getData(\"JSONData\"), \"removed JSON data\")\n    }\n\n    // MARK:\n\n    func testSubscripting() {\n        let keychain = Keychain(service: \"Twitter\")\n\n        XCTAssertNil(keychain[\"username\"], \"not stored username\")\n        XCTAssertNil(keychain[\"password\"], \"not stored password\")\n        XCTAssertNil(keychain[string: \"username\"], \"not stored username\")\n        XCTAssertNil(keychain[string: \"password\"], \"not stored password\")\n\n        keychain[\"username\"] = \"kishikawakatsumi\"\n        XCTAssertEqual(keychain[\"username\"], \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(keychain[string: \"username\"], \"kishikawakatsumi\", \"stored username\")\n\n        keychain[\"password\"] = \"password1234\"\n        XCTAssertEqual(keychain[\"password\"], \"password1234\", \"stored password\")\n        XCTAssertEqual(keychain[string: \"password\"], \"password1234\", \"stored password\")\n\n        keychain[string: \"username\"] = nil\n        XCTAssertNil(keychain[\"username\"], \"removed username\")\n        XCTAssertEqual(keychain[\"password\"], \"password1234\", \"left password\")\n        XCTAssertNil(keychain[string: \"username\"], \"removed username\")\n        XCTAssertEqual(keychain[string: \"password\"], \"password1234\", \"left password\")\n\n        keychain[string: \"password\"] = nil\n        XCTAssertNil(keychain[\"username\"], \"removed username\")\n        XCTAssertNil(keychain[\"password\"], \"removed password\")\n        XCTAssertNil(keychain[string: \"username\"], \"removed username\")\n        XCTAssertNil(keychain[string: \"password\"], \"removed password\")\n\n        let JSONObject = [\"username\": \"kishikawakatsumi\", \"password\": \"password1234\"]\n        let JSONData = try! JSONSerialization.data(withJSONObject: JSONObject, options: [])\n\n        XCTAssertNil(keychain[data:\"JSONData\"], \"not stored JSON data\")\n\n        keychain[data: \"JSONData\"] = JSONData\n        XCTAssertEqual(keychain[data: \"JSONData\"], JSONData, \"stored JSON data\")\n\n        keychain[data: \"JSONData\"] = nil\n        XCTAssertNil(keychain[data:\"JSONData\"], \"removed JSON data\")\n    }\n\n    // MARK:\n\n    func testErrorHandling() {\n        do {\n            let keychain = Keychain(service: \"Twitter\", accessGroup: \"27AEDK3C9F.shared\")\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain(service: \"Twitter\")\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain(server: URL(string: \"https://kishikawakatsumi.com\")!, protocolType: .https)\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            let keychain = Keychain()\n            try keychain.removeAll()\n            XCTAssertTrue(true, \"no error occurred\")\n        } catch {\n            XCTFail(\"error occurred\")\n        }\n\n        do {\n            // Add Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.set(\"kishikawa_katsumi\", key: \"username\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.set(\"password_1234\", key: \"password\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                let username = try keychain.get(\"username\")\n                XCTAssertEqual(username, \"kishikawa_katsumi\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let password = try keychain.get(\"password\")\n                XCTAssertEqual(password, \"password_1234\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n\n        do {\n            // Update Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.set(\"katsumi_kishikawa\", key: \"username\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.set(\"1234_password\", key: \"password\")\n                XCTAssertTrue(true, \"no error occurred\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n\n            do {\n                let username = try keychain.get(\"username\")\n                XCTAssertEqual(username, \"katsumi_kishikawa\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                let password = try keychain.get(\"password\")\n                XCTAssertEqual(password, \"1234_password\")\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n        \n        do {\n            // Remove Keychain items\n            let keychain = Keychain(service: \"Twitter\")\n\n            do {\n                try keychain.remove(\"username\")\n                XCTAssertNil(try! keychain.get(\"username\"))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n            do {\n                try keychain.remove(\"password\")\n                XCTAssertNil(try! keychain.get(\"username\"))\n            } catch {\n                XCTFail(\"error occurred\")\n            }\n        }\n    }\n\n    // MARK:\n\n    func testSetStringWithCustomService() {\n        let username_1 = \"kishikawakatsumi\"\n        let password_1 = \"password1234\"\n        let username_2 = \"kishikawa_katsumi\"\n        let password_2 = \"password_1234\"\n        let username_3 = \"k_katsumi\"\n        let password_3 = \"12341234\"\n\n        let service_1 = \"\"\n        let service_2 = \"com.kishikawakatsumi.KeychainAccess\"\n        let service_3 = \"example.com\"\n\n        do { try Keychain().removeAll() } catch {}\n        do { try Keychain(service: service_1).removeAll() } catch {}\n        do { try Keychain(service: service_2).removeAll() } catch {}\n        do { try Keychain(service: service_3).removeAll() } catch {}\n\n        XCTAssertNil(try! Keychain().get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain().get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain().set(username_1, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_1).set(username_1, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_2).set(username_2, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"stored username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"not stored username\")\n\n        do { try Keychain(service: service_3).set(username_3, key: \"username\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"stored username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"stored username\")\n\n        do { try Keychain().set(password_1, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_1).set(password_1, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_2).set(password_2, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"stored password\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"password\"), \"not stored password\")\n\n        do { try Keychain(service: service_3).set(password_3, key: \"password\") } catch {}\n        XCTAssertEqual(try! Keychain().get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"stored password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"stored password\")\n\n        do { try Keychain().remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"username\"), username_1, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_1).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"username\"), username_2, \"left username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_2).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"removed username\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"username\"), username_3, \"left username\")\n\n        do { try Keychain(service: service_3).remove(\"username\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"username\"), \"removed username\")\n        XCTAssertNil(try! Keychain(service: service_3).get(\"username\"), \"removed username\")\n\n        do { try Keychain().remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_1).get(\"password\"), password_1, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_1).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_2).get(\"password\"), password_2, \"left password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_2).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_1).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertEqual(try! Keychain(service: service_3).get(\"password\"), password_3, \"left password\")\n\n        do { try Keychain(service: service_3).remove(\"password\") } catch {}\n        XCTAssertNil(try! Keychain().get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n        XCTAssertNil(try! Keychain(service: service_2).get(\"password\"), \"removed password\")\n    }\n\n    // MARK:\n\n    func testProperties() {\n        guard #available(OSX 10.10, *) else {\n            return\n        }\n\n        let keychain = Keychain()\n\n        XCTAssertEqual(keychain.synchronizable, false)\n        XCTAssertEqual(keychain.synchronizable(true).synchronizable, true)\n        XCTAssertEqual(keychain.synchronizable(false).synchronizable, false)\n        XCTAssertEqual(keychain.accessibility(.afterFirstUnlock).accessibility, Accessibility.afterFirstUnlock)\n        XCTAssertEqual(keychain.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence).accessibility, Accessibility.whenPasscodeSetThisDeviceOnly)\n        XCTAssertEqual(keychain.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence).authenticationPolicy, AuthenticationPolicy.userPresence)\n        XCTAssertNil(keychain.label)\n        XCTAssertEqual(keychain.label(\"Label\").label, \"Label\")\n        XCTAssertNil(keychain.comment)\n        XCTAssertEqual(keychain.comment(\"Comment\").comment, \"Comment\")\n        XCTAssertEqual(keychain.authenticationPrompt(\"Prompt\").authenticationPrompt, \"Prompt\")\n    }\n\n    // MARK:\n\n    func testAllKeys() {\n        do {\n            let keychain = Keychain()\n            keychain[\"key1\"] = \"value1\"\n            keychain[\"key2\"] = \"value2\"\n            keychain[\"key3\"] = \"value3\"\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 3)\n            XCTAssertEqual(allKeys.sorted(), [\"key1\", \"key2\", \"key3\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 3)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n\n            let service: String\n            let accessGroup: String\n            #if targetEnvironment(macCatalyst)\n            service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedItems[0][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n\n            XCTAssertEqual(sortedItems[1][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n\n            XCTAssertEqual(sortedItems[2][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[2][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[2][\"service\"] as? String, service)\n            XCTAssertEqual(sortedItems[2][\"value\"] as? String, \"value3\")\n            XCTAssertEqual(sortedItems[2][\"key\"] as? String, \"key3\")\n            XCTAssertEqual(sortedItems[2][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[2][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[2][\"service\"] as? String, \"com.kishikawakatsumi.KeychainAccess.TestHost\")\n            XCTAssertEqual(sortedItems[2][\"key\"] as? String, \"key3\")\n            XCTAssertEqual(sortedItems[2][\"class\"] as? String, \"GenericPassword\")\n            #endif\n        }\n        do {\n            let keychain = Keychain(service: \"service1\")\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.whenUnlockedThisDeviceOnly)\n                .set(\"service1_value1\", key: \"service1_key1\")\n\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.afterFirstUnlockThisDeviceOnly)\n                .set(\"service1_value2\", key: \"service1_key2\")\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 2)\n            XCTAssertEqual(allKeys.sorted(), [\"service1_key1\", \"service1_key2\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 2)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n\n            let accessGroup: String\n            #if targetEnvironment(macCatalyst)\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedItems[0][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"true\")\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"service1_value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"service1_key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"WhenUnlockedThisDeviceOnly\")\n\n            XCTAssertEqual(sortedItems[1][\"accessGroup\"] as? String, accessGroup)\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"service1_value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"service1_key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlockThisDeviceOnly\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"service1_key1\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"GenericPassword\")\n\n            XCTAssertEqual(sortedItems[1][\"service\"] as? String, \"service1\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"service1_key2\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"GenericPassword\")\n            #endif\n        }\n        do {\n            let keychain = Keychain(server: \"https://google.com\", protocolType: .https)\n            #if !targetEnvironment(macCatalyst)\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.alwaysThisDeviceOnly)\n                .set(\"google.com_value1\", key: \"google.com_key1\")\n            #else\n            try! keychain\n                .synchronizable(false)\n                .accessibility(.afterFirstUnlockThisDeviceOnly)\n                .set(\"google.com_value1\", key: \"google.com_key1\")\n            #endif\n\n            #if !targetEnvironment(macCatalyst)\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.always)\n                .set(\"google.com_value2\", key: \"google.com_key2\")\n            #else\n            try! keychain\n                .synchronizable(true)\n                .accessibility(.afterFirstUnlock)\n                .set(\"google.com_value2\", key: \"google.com_key2\")\n            #endif\n\n            let allKeys = keychain.allKeys()\n            XCTAssertEqual(allKeys.count, 2)\n            XCTAssertEqual(allKeys.sorted(), [\"google.com_key1\", \"google.com_key2\"])\n\n            let allItems = keychain.allItems()\n            XCTAssertEqual(allItems.count, 2)\n\n            let sortedItems = allItems.sorted { (item1, item2) -> Bool in\n                let key1 = item1[\"key\"] as! String\n                let key2 = item2[\"key\"] as! String\n                return key1.compare(key2) == .orderedAscending || key1.compare(key2) == .orderedSame\n            }\n\n            #if !os(OSX)\n            XCTAssertEqual(sortedItems[0][\"synchronizable\"] as? String, \"false\")\n            XCTAssertEqual(sortedItems[0][\"value\"] as? String, \"google.com_value1\")\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"google.com_key1\")\n            XCTAssertEqual(sortedItems[0][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[0][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[0][\"protocol\"] as? String, \"HTTPS\")\n            #if targetEnvironment(macCatalyst)\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AfterFirstUnlockThisDeviceOnly\")\n            #else\n            XCTAssertEqual(sortedItems[0][\"accessibility\"] as? String, \"AlwaysThisDeviceOnly\")\n            #endif\n            XCTAssertEqual(sortedItems[1][\"synchronizable\"] as? String, \"true\")\n            XCTAssertEqual(sortedItems[1][\"value\"] as? String, \"google.com_value2\")\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"google.com_key2\")\n            XCTAssertEqual(sortedItems[1][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[1][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[1][\"protocol\"] as? String, \"HTTPS\")\n            #if targetEnvironment(macCatalyst)\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"AfterFirstUnlock\")\n            #else\n            XCTAssertEqual(sortedItems[1][\"accessibility\"] as? String, \"Always\")\n            #endif\n            #else\n            XCTAssertEqual(sortedItems[0][\"key\"] as? String, \"google.com_key1\")\n            XCTAssertEqual(sortedItems[0][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[0][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[0][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[0][\"protocol\"] as? String, \"HTTPS\")\n\n            XCTAssertEqual(sortedItems[1][\"key\"] as? String, \"google.com_key2\")\n            XCTAssertEqual(sortedItems[1][\"server\"] as? String, \"google.com\")\n            XCTAssertEqual(sortedItems[1][\"class\"] as? String, \"InternetPassword\")\n            XCTAssertEqual(sortedItems[1][\"authenticationType\"] as? String, \"Default\")\n            XCTAssertEqual(sortedItems[1][\"protocol\"] as? String, \"HTTPS\")\n            #endif\n        }\n\n        #if !os(OSX)\n        do {\n            let allKeys = Keychain.allKeys(.genericPassword)\n            XCTAssertEqual(allKeys.count, 5)\n\n            let sortedKeys = allKeys.sorted { (key1, key2) -> Bool in\n                return key1.1.compare(key2.1) == .orderedAscending || key1.1.compare(key2.1) == .orderedSame\n            }\n\n            let service: String\n            #if targetEnvironment(macCatalyst)\n            service = \"maccatalyst.com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\"\n            #else\n            service = \"com.kishikawakatsumi.KeychainAccess.TestHost\"\n            #endif\n\n            XCTAssertEqual(sortedKeys[0].0, service)\n            XCTAssertEqual(sortedKeys[0].1, \"key1\")\n            XCTAssertEqual(sortedKeys[1].0, service)\n            XCTAssertEqual(sortedKeys[1].1, \"key2\")\n            XCTAssertEqual(sortedKeys[2].0, service)\n            XCTAssertEqual(sortedKeys[2].1, \"key3\")\n            XCTAssertEqual(sortedKeys[3].0, \"service1\")\n            XCTAssertEqual(sortedKeys[3].1, \"service1_key1\")\n            XCTAssertEqual(sortedKeys[4].0, \"service1\")\n            XCTAssertEqual(sortedKeys[4].1, \"service1_key2\")\n        }\n        do {\n            let allKeys = Keychain.allKeys(.internetPassword)\n            XCTAssertEqual(allKeys.count, 2)\n\n            let sortedKeys = allKeys.sorted { (key1, key2) -> Bool in\n                return key1.1.compare(key2.1) == .orderedAscending || key1.1.compare(key2.1) == .orderedSame\n            }\n            XCTAssertEqual(sortedKeys[0].0, \"google.com\")\n            XCTAssertEqual(sortedKeys[0].1, \"google.com_key1\")\n            XCTAssertEqual(sortedKeys[1].0, \"google.com\")\n            XCTAssertEqual(sortedKeys[1].1, \"google.com_key2\")\n        }\n        #endif\n    }\n\n    func testDescription() {\n        do {\n            let keychain = Keychain()\n\n            XCTAssertEqual(keychain.description, \"[]\")\n            XCTAssertEqual(keychain.debugDescription, \"[]\")\n        }\n    }\n\n    // MARK:\n\n    func testAuthenticationPolicy() {\n        guard #available(iOS 9.0, OSX 10.11, *) else {\n            return\n        }\n\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        #if os(iOS)\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .applicationPassword]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDCurrentSet, .applicationPassword, .privateKeyUsage]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .or, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.touchIDAny, .and, .devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertTrue(accessControl != nil)\n        }\n        #endif\n        #if os(OSX)\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.userPresence]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        do {\n            let accessibility: Accessibility = .whenPasscodeSetThisDeviceOnly\n\n            let policy: AuthenticationPolicy = [.devicePasscode]\n            let flags = SecAccessControlCreateFlags(rawValue: policy.rawValue)\n\n            var error: Unmanaged<CFError>?\n            let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, flags, &error)\n\n            XCTAssertNil(error)\n            XCTAssertNotNil(accessControl)\n        }\n        #endif\n    }\n\n    func testIgnoringAttributeSynchronizable() {\n        let keychain = Keychain(service: \"Twitter\").synchronizable(false)\n        let keychainSynchronizable = Keychain(service: \"Twitter\").synchronizable(true)\n\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\", ignoringAttributeSynchronizable: false) } catch {}\n        do { try keychainSynchronizable.set(\"kishikawakatsumi_synchronizable\", key: \"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\", ignoringAttributeSynchronizable: false) } catch {}\n        do { try keychainSynchronizable.set(\"password1234_synchronizable\", key: \"password\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.remove(\"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"kishikawakatsumi_synchronizable\", \"stored username\")\n\n        do { try keychainSynchronizable.remove(\"username\", ignoringAttributeSynchronizable: false) } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        \n        XCTAssertEqual(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.removeAll() } catch {}\n        XCTAssertNil(try! keychain.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\", ignoringAttributeSynchronizable: false), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\", ignoringAttributeSynchronizable: false), \"not stored password\")\n    }\n\n    func testIgnoringAttributeSynchronizableBackwardCompatibility() {\n        let keychain = Keychain(service: \"Twitter\").synchronizable(false)\n        let keychainSynchronizable = Keychain(service: \"Twitter\").synchronizable(true)\n\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"kishikawakatsumi\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi\", \"stored username\")\n\n        do { try keychainSynchronizable.set(\"kishikawakatsumi_synchronizable\", key: \"username\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n\n        do { try keychain.set(\"password1234\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234\", \"stored password\")\n\n        do { try keychainSynchronizable.set(\"password1234_synchronizable\", key: \"password\") } catch {}\n        XCTAssertEqual(try! keychain.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"username\"), \"kishikawakatsumi_synchronizable\", \"stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.remove(\"username\") } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertEqual(try! keychain.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n        XCTAssertEqual(try! keychainSynchronizable.get(\"password\"), \"password1234_synchronizable\", \"stored password\")\n\n        do { try keychain.removeAll() } catch {}\n        XCTAssertNil(try! keychain.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"username\"), \"not stored username\")\n        XCTAssertNil(try! keychain.get(\"password\"), \"not stored password\")\n        XCTAssertNil(try! keychainSynchronizable.get(\"password\"), \"not stored password\")\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  TestHost-MacCatalyst\n//\n//  Created by Kishikawa Katsumi on 2019/10/21.\n//  Copyright © 2019 Kishikawa Katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        return true\n    }\n\n    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {\n        return UISceneConfiguration(name: \"Default Configuration\", sessionRole: connectingSceneSession.role)\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>\n\t\t\t\t\t<key>UISceneStoryboardFile</key>\n\t\t\t\t\t<string>Main</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/SceneDelegate.swift",
    "content": "//\n//  SceneDelegate.swift\n//  TestHost-MacCatalyst\n//\n//  Created by Kishikawa Katsumi on 2019/10/21.\n//  Copyright © 2019 Kishikawa Katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nclass SceneDelegate: UIResponder, UIWindowSceneDelegate {\n    var window: UIWindow?\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/TestHost-MacCatalyst.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n\t<true/>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>$(AppIdentifierPrefix)com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst</string>\n\t\t<string>$(AppIdentifierPrefix)shared</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  TestHost-MacCatalyst\n//\n//  Created by Kishikawa Katsumi on 2019/10/21.\n//  Copyright © 2019 Kishikawa Katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nclass ViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t14A98C4F235D284F00BBB893 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C4E235D284F00BBB893 /* AppDelegate.swift */; };\n\t\t14A98C51235D284F00BBB893 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C50235D284F00BBB893 /* SceneDelegate.swift */; };\n\t\t14A98C53235D284F00BBB893 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C52235D284F00BBB893 /* ViewController.swift */; };\n\t\t14A98C56235D284F00BBB893 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14A98C54235D284F00BBB893 /* Main.storyboard */; };\n\t\t14A98C58235D285000BBB893 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14A98C57235D285000BBB893 /* Assets.xcassets */; };\n\t\t14A98C5B235D285000BBB893 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14A98C59235D285000BBB893 /* LaunchScreen.storyboard */; };\n\t\t14A98C65235D286B00BBB893 /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14A98C64235D286B00BBB893 /* KeychainAccess.framework */; };\n\t\t14A98C66235D286B00BBB893 /* KeychainAccess.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 14A98C64235D286B00BBB893 /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t14A98C88235D2AFA00BBB893 /* ErrorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C84235D2AFA00BBB893 /* ErrorTypeTests.swift */; };\n\t\t14A98C8A235D2AFA00BBB893 /* KeychainAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C86235D2AFA00BBB893 /* KeychainAccessTests.swift */; };\n\t\t14A98C8B235D2AFA00BBB893 /* EnumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A98C87235D2AFA00BBB893 /* EnumTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t14A98C82235D293300BBB893 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 14A98C43235D284F00BBB893 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 14A98C4A235D284F00BBB893;\n\t\t\tremoteInfo = \"TestHost-MacCatalyst\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t14A98C67235D286B00BBB893 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t14A98C66235D286B00BBB893 /* KeychainAccess.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t14A98C4B235D284F00BBB893 /* TestHost-MacCatalyst.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"TestHost-MacCatalyst.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t14A98C4E235D284F00BBB893 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t14A98C50235D284F00BBB893 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\t14A98C52235D284F00BBB893 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t14A98C55235D284F00BBB893 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t14A98C57235D285000BBB893 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t14A98C5A235D285000BBB893 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t14A98C5C235D285000BBB893 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t14A98C62235D286500BBB893 /* TestHost-MacCatalyst.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = \"TestHost-MacCatalyst.entitlements\"; sourceTree = \"<group>\"; };\n\t\t14A98C64235D286B00BBB893 /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t14A98C7A235D292000BBB893 /* KeychainAccessTests-MacCatalyst.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"KeychainAccessTests-MacCatalyst.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t14A98C7E235D292000BBB893 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t14A98C84235D2AFA00BBB893 /* ErrorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorTypeTests.swift; sourceTree = \"<group>\"; };\n\t\t14A98C86235D2AFA00BBB893 /* KeychainAccessTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainAccessTests.swift; sourceTree = \"<group>\"; };\n\t\t14A98C87235D2AFA00BBB893 /* EnumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t14A98C48235D284F00BBB893 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A98C65235D286B00BBB893 /* KeychainAccess.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A98C77235D292000BBB893 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t14A98C42235D284F00BBB893 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C4D235D284F00BBB893 /* TestHost-MacCatalyst */,\n\t\t\t\t14A98C7B235D292000BBB893 /* KeychainAccessTests-MacCatalyst */,\n\t\t\t\t14A98C4C235D284F00BBB893 /* Products */,\n\t\t\t\t14A98C63235D286B00BBB893 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A98C4C235D284F00BBB893 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C4B235D284F00BBB893 /* TestHost-MacCatalyst.app */,\n\t\t\t\t14A98C7A235D292000BBB893 /* KeychainAccessTests-MacCatalyst.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A98C4D235D284F00BBB893 /* TestHost-MacCatalyst */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C4E235D284F00BBB893 /* AppDelegate.swift */,\n\t\t\t\t14A98C50235D284F00BBB893 /* SceneDelegate.swift */,\n\t\t\t\t14A98C52235D284F00BBB893 /* ViewController.swift */,\n\t\t\t\t14A98C54235D284F00BBB893 /* Main.storyboard */,\n\t\t\t\t14A98C59235D285000BBB893 /* LaunchScreen.storyboard */,\n\t\t\t\t14A98C57235D285000BBB893 /* Assets.xcassets */,\n\t\t\t\t14A98C5C235D285000BBB893 /* Info.plist */,\n\t\t\t\t14A98C62235D286500BBB893 /* TestHost-MacCatalyst.entitlements */,\n\t\t\t);\n\t\t\tpath = \"TestHost-MacCatalyst\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A98C63235D286B00BBB893 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C64235D286B00BBB893 /* KeychainAccess.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A98C7B235D292000BBB893 /* KeychainAccessTests-MacCatalyst */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C86235D2AFA00BBB893 /* KeychainAccessTests.swift */,\n\t\t\t\t14A98C87235D2AFA00BBB893 /* EnumTests.swift */,\n\t\t\t\t14A98C84235D2AFA00BBB893 /* ErrorTypeTests.swift */,\n\t\t\t\t14A98C7E235D292000BBB893 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = \"KeychainAccessTests-MacCatalyst\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t14A98C4A235D284F00BBB893 /* TestHost-MacCatalyst */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 14A98C5F235D285000BBB893 /* Build configuration list for PBXNativeTarget \"TestHost-MacCatalyst\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t14A98C47235D284F00BBB893 /* Sources */,\n\t\t\t\t14A98C48235D284F00BBB893 /* Frameworks */,\n\t\t\t\t14A98C49235D284F00BBB893 /* Resources */,\n\t\t\t\t14A98C67235D286B00BBB893 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"TestHost-MacCatalyst\";\n\t\t\tproductName = \"TestHost-MacCatalyst\";\n\t\t\tproductReference = 14A98C4B235D284F00BBB893 /* TestHost-MacCatalyst.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t14A98C79235D292000BBB893 /* KeychainAccessTests-MacCatalyst */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 14A98C7F235D292000BBB893 /* Build configuration list for PBXNativeTarget \"KeychainAccessTests-MacCatalyst\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t14A98C76235D292000BBB893 /* Sources */,\n\t\t\t\t14A98C77235D292000BBB893 /* Frameworks */,\n\t\t\t\t14A98C78235D292000BBB893 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t14A98C83235D293300BBB893 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"KeychainAccessTests-MacCatalyst\";\n\t\t\tproductName = \"KeychainAccessTests-MacCatalyst\";\n\t\t\tproductReference = 14A98C7A235D292000BBB893 /* KeychainAccessTests-MacCatalyst.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t14A98C43235D284F00BBB893 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1100;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = \"Kishikawa Katsumi\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t14A98C4A235D284F00BBB893 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.0;\n\t\t\t\t\t};\n\t\t\t\t\t14A98C79235D292000BBB893 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.0;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t\tTestTargetID = 14A98C4A235D284F00BBB893;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 14A98C46235D284F00BBB893 /* Build configuration list for PBXProject \"TestHost-MacCatalyst\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 14A98C42235D284F00BBB893;\n\t\t\tproductRefGroup = 14A98C4C235D284F00BBB893 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t14A98C4A235D284F00BBB893 /* TestHost-MacCatalyst */,\n\t\t\t\t14A98C79235D292000BBB893 /* KeychainAccessTests-MacCatalyst */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t14A98C49235D284F00BBB893 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A98C5B235D285000BBB893 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t14A98C58235D285000BBB893 /* Assets.xcassets in Resources */,\n\t\t\t\t14A98C56235D284F00BBB893 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A98C78235D292000BBB893 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t14A98C47235D284F00BBB893 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A98C53235D284F00BBB893 /* ViewController.swift in Sources */,\n\t\t\t\t14A98C4F235D284F00BBB893 /* AppDelegate.swift in Sources */,\n\t\t\t\t14A98C51235D284F00BBB893 /* SceneDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t14A98C76235D292000BBB893 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A98C88235D2AFA00BBB893 /* ErrorTypeTests.swift in Sources */,\n\t\t\t\t14A98C8B235D2AFA00BBB893 /* EnumTests.swift in Sources */,\n\t\t\t\t14A98C8A235D2AFA00BBB893 /* KeychainAccessTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t14A98C83235D293300BBB893 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 14A98C4A235D284F00BBB893 /* TestHost-MacCatalyst */;\n\t\t\ttargetProxy = 14A98C82235D293300BBB893 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t14A98C54235D284F00BBB893 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C55235D284F00BBB893 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A98C59235D285000BBB893 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t14A98C5A235D285000BBB893 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t14A98C5D235D285000BBB893 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14A98C5E235D285000BBB893 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t14A98C60235D285000BBB893 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"TestHost-MacCatalyst/TestHost-MacCatalyst.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"TestHost-MacCatalyst/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14A98C61235D285000BBB893 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"TestHost-MacCatalyst/TestHost-MacCatalyst.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"TestHost-MacCatalyst/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.KeychainAccess.TestHost-MacCatalyst\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t14A98C80235D292000BBB893 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"KeychainAccessTests-MacCatalyst/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.KeychainAccessTests-MacCatalyst\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/TestHost-MacCatalyst.app/TestHost-MacCatalyst\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t14A98C81235D292000BBB893 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 27AEDK3C9F;\n\t\t\t\tINFOPLIST_FILE = \"KeychainAccessTests-MacCatalyst/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.kishikawakatsumi.KeychainAccessTests-MacCatalyst\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/TestHost-MacCatalyst.app/TestHost-MacCatalyst\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t14A98C46235D284F00BBB893 /* Build configuration list for PBXProject \"TestHost-MacCatalyst\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14A98C5D235D285000BBB893 /* Debug */,\n\t\t\t\t14A98C5E235D285000BBB893 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t14A98C5F235D285000BBB893 /* Build configuration list for PBXNativeTarget \"TestHost-MacCatalyst\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14A98C60235D285000BBB893 /* Debug */,\n\t\t\t\t14A98C61235D285000BBB893 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t14A98C7F235D292000BBB893 /* Build configuration list for PBXNativeTarget \"KeychainAccessTests-MacCatalyst\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t14A98C80235D292000BBB893 /* Debug */,\n\t\t\t\t14A98C81235D292000BBB893 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 14A98C43235D284F00BBB893 /* Project object */;\n}\n"
  },
  {
    "path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj/xcshareddata/xcschemes/TestHost-MacCatalyst.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"14A98C4A235D284F00BBB893\"\n               BuildableName = \"TestHost-MacCatalyst.app\"\n               BlueprintName = \"TestHost-MacCatalyst\"\n               ReferencedContainer = \"container:TestHost-MacCatalyst.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14A98C4A235D284F00BBB893\"\n            BuildableName = \"TestHost-MacCatalyst.app\"\n            BlueprintName = \"TestHost-MacCatalyst\"\n            ReferencedContainer = \"container:TestHost-MacCatalyst.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"14A98C4A235D284F00BBB893\"\n            BuildableName = \"TestHost-MacCatalyst.app\"\n            BlueprintName = \"TestHost-MacCatalyst\"\n            ReferencedContainer = \"container:TestHost-MacCatalyst.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "External/KeychainAccess/Package.swift",
    "content": "// swift-tools-version:5.0\n\n//  Package.swift\n//  KeychainAccess\n//\n//  Created by kishikawa katsumi on 2015/12/4.\n//  Copyright (c) 2015 kishikawa katsumi. All rights reserved.\n//\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"KeychainAccess\",\n    platforms: [\n        .macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v2)\n    ],\n    products: [\n        .library(name: \"KeychainAccess\", targets: [\"KeychainAccess\"])\n    ],\n    targets: [\n        .target(name: \"KeychainAccess\", path: \"Lib/KeychainAccess\")\n    ]\n)\n"
  },
  {
    "path": "External/KeychainAccess/Package@swift-5.3.swift",
    "content": "// swift-tools-version:5.3\n\n//  Package.swift\n//  KeychainAccess\n//\n//  Created by kishikawa katsumi on 2015/12/4.\n//  Copyright (c) 2015 kishikawa katsumi. All rights reserved.\n//\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"KeychainAccess\",\n    platforms: [\n        .macOS(.v10_10), .iOS(.v9), .tvOS(.v9), .watchOS(.v2)\n    ],\n    products: [\n        .library(name: \"KeychainAccess\", targets: [\"KeychainAccess\"])\n    ],\n    targets: [\n        .target(name: \"KeychainAccess\", path: \"Lib/KeychainAccess\", exclude:[\"Info.plist\"])\n    ]\n)\n"
  },
  {
    "path": "External/KeychainAccess/README.md",
    "content": "# KeychainAccess\n\n[![Build Status](https://travis-ci.com/kishikawakatsumi/KeychainAccess.svg?branch=master)](https://travis-ci.com/kishikawakatsumi/KeychainAccess)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![SPM supported](https://img.shields.io/badge/SPM-supported-DE5C43.svg?style=flat)](https://swift.org/package-manager)\n[![Version](https://img.shields.io/cocoapods/v/KeychainAccess.svg)](http://cocoadocs.org/docsets/KeychainAccess)\n[![Platform](https://img.shields.io/cocoapods/p/KeychainAccess.svg)](http://cocoadocs.org/docsets/KeychainAccess)\n\nKeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs extremely easy and much more palatable to use in Swift.\n\n<img src=\"https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/01.png\" width=\"320px\" />\n<img src=\"https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/02.png\" width=\"320px\" />\n<img src=\"https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/03.png\" width=\"320px\" />\n\n## :bulb: Features\n\n- Simple interface\n- Support access group\n- [Support accessibility](#accessibility)\n- [Support iCloud sharing](#icloud_sharing)\n- **[Support TouchID and Keychain integration (iOS 8+)](#touch_id_integration)**\n- **[Support Shared Web Credentials (iOS 8+)](#shared_web_credentials)**\n- [Works on both iOS & macOS](#requirements)\n- [watchOS and tvOS are supported](#requirements)\n- **[Mac Catalyst is supported](#requirements)**\n- **[Swift 3, 4 and 5 compatible](#requirements)**\n\n## :book: Usage\n\n##### :eyes: See also:  \n- [:link: iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS)\n\n### :key: Basics\n\n#### Saving Application Password\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n#### Saving Internet Password\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n### :key: Instantiation\n\n#### Create Keychain for Application Password\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n```\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\", accessGroup: \"12ABCD3E4F.shared\")\n```\n\n#### Create Keychain for Internet Password\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\n```\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https, authenticationType: .htmlForm)\n```\n\n### :key: Adding an item\n\n#### subscripting\n\n##### for String\n\n```swift\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n```swift\nkeychain[string: \"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n##### for NSData\n\n```swift\nkeychain[data: \"secret\"] = NSData(contentsOfFile: \"secret.bin\")\n```\n\n#### set method\n\n```swift\nkeychain.set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n```\n\n#### error handling\n\n```swift\ndo {\n    try keychain.set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n}\ncatch let error {\n    print(error)\n}\n```\n\n### :key: Obtaining an item\n\n#### subscripting\n\n##### for String (If the value is NSData, attempt to convert to String)\n\n```swift\nlet token = keychain[\"kishikawakatsumi\"]\n```\n\n```swift\nlet token = keychain[string: \"kishikawakatsumi\"]\n```\n\n##### for NSData\n\n```swift\nlet secretData = keychain[data: \"secret\"]\n```\n\n#### get methods\n\n##### as String\n\n```swift\nlet token = try? keychain.get(\"kishikawakatsumi\")\n```\n\n```swift\nlet token = try? keychain.getString(\"kishikawakatsumi\")\n```\n\n##### as NSData\n\n```swift\nlet data = try? keychain.getData(\"kishikawakatsumi\")\n```\n\n### :key: Removing an item\n\n#### subscripting\n\n```swift\nkeychain[\"kishikawakatsumi\"] = nil\n```\n\n#### remove method\n\n```swift\ndo {\n    try keychain.remove(\"kishikawakatsumi\")\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n### :key: Set Label and Comment\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\ndo {\n    try keychain\n        .label(\"github.com (kishikawakatsumi)\")\n        .comment(\"github access token\")\n        .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n### :key: Obtaining Other Attributes\n\n#### PersistentRef\n\n```swift\nlet keychain = Keychain()\nlet persistentRef = keychain[attributes: \"kishikawakatsumi\"]?.persistentRef\n...\n```\n\n#### Creation Date\n\n```swift\nlet keychain = Keychain()\nlet creationDate = keychain[attributes: \"kishikawakatsumi\"]?.creationDate\n...\n```\n\n#### All Attributes\n\n```swift\nlet keychain = Keychain()\ndo {\n    let attributes = try keychain.get(\"kishikawakatsumi\") { $0 }\n    print(attributes?.comment)\n    print(attributes?.label)\n    print(attributes?.creator)\n    ...\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n##### subscripting\n\n```swift\nlet keychain = Keychain()\nif let attributes = keychain[attributes: \"kishikawakatsumi\"] {\n    print(attributes.comment)\n    print(attributes.label)\n    print(attributes.creator)\n}\n```\n\n### :key: Configuration (Accessibility, Sharing, iCloud Sync)\n\n**Provides fluent interfaces**\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n    .label(\"github.com (kishikawakatsumi)\")\n    .synchronizable(true)\n    .accessibility(.afterFirstUnlock)\n```\n\n#### <a name=\"accessibility\"> Accessibility\n\n##### Default accessibility matches background application (=kSecAttrAccessibleAfterFirstUnlock)\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n```\n\n##### For background application\n\n###### Creating instance\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n    .accessibility(.afterFirstUnlock)\n\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n###### One-shot\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\ndo {\n    try keychain\n        .accessibility(.afterFirstUnlock)\n        .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n##### For foreground application\n\n###### Creating instance\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n    .accessibility(.whenUnlocked)\n\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n###### One-shot\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\ndo {\n    try keychain\n        .accessibility(.whenUnlocked)\n        .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n#### :couple: Sharing Keychain items\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\", accessGroup: \"12ABCD3E4F.shared\")\n```\n\n#### <a name=\"icloud_sharing\"> :arrows_counterclockwise: Synchronizing Keychain items with iCloud\n\n###### Creating instance\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n    .synchronizable(true)\n\nkeychain[\"kishikawakatsumi\"] = \"01234567-89ab-cdef-0123-456789abcdef\"\n```\n\n###### One-shot\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\ndo {\n    try keychain\n        .synchronizable(true)\n        .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n} catch let error {\n    print(\"error: \\(error)\")\n}\n```\n\n### <a name=\"touch_id_integration\"> :cyclone: Touch ID (Face ID) integration\n\n**Any Operation that require authentication must be run in the background thread.**  \n**If you run in the main thread, UI thread will lock for the system to try to display the authentication dialog.**\n\n\n**To use Face ID, add `NSFaceIDUsageDescription` key to your `Info.plist`**\n\n#### :closed_lock_with_key: Adding a Touch ID (Face ID) protected item\n\nIf you want to store the Touch ID protected Keychain item, specify `accessibility` and `authenticationPolicy` attributes.  \n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\nDispatchQueue.global().async {\n    do {\n        // Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`\n        try keychain\n            .accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: [.biometryAny])\n            .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n    } catch let error {\n        // Error handling if needed...\n    }\n}\n```\n\n#### :closed_lock_with_key: Updating a Touch ID (Face ID) protected item\n\nThe same way as when adding.  \n\n**Do not run in the main thread if there is a possibility that the item you are trying to add already exists, and protected.**\n**Because updating protected items requires authentication.**\n\nAdditionally, you want to show custom authentication prompt message when updating, specify an `authenticationPrompt` attribute.\nIf the item not protected, the `authenticationPrompt` parameter just be ignored.\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\nDispatchQueue.global().async {\n    do {\n        // Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`\n        try keychain\n            .accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: [.biometryAny])\n            .authenticationPrompt(\"Authenticate to update your access token\")\n            .set(\"01234567-89ab-cdef-0123-456789abcdef\", key: \"kishikawakatsumi\")\n    } catch let error {\n        // Error handling if needed...\n    }\n}\n```\n\n#### :closed_lock_with_key: Obtaining a Touch ID (Face ID) protected item\n\nThe same way as when you get a normal item. It will be displayed automatically Touch ID or passcode authentication If the item you try to get is protected.  \nIf you want to show custom authentication prompt message, specify an `authenticationPrompt` attribute.\nIf the item not protected, the `authenticationPrompt` parameter just be ignored.\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\nDispatchQueue.global().async {\n    do {\n        let password = try keychain\n            .authenticationPrompt(\"Authenticate to login to server\")\n            .get(\"kishikawakatsumi\")\n\n        print(\"password: \\(password)\")\n    } catch let error {\n        // Error handling if needed...\n    }\n}\n```\n\n#### :closed_lock_with_key: Removing a Touch ID (Face ID) protected item\n\nThe same way as when you remove a normal item.\nThere is no way to show Touch ID or passcode authentication when removing Keychain items.\n\n```swift\nlet keychain = Keychain(service: \"com.example.github-token\")\n\ndo {\n    try keychain.remove(\"kishikawakatsumi\")\n} catch let error {\n    // Error handling if needed...\n}\n```\n\n### <a name=\"shared_web_credentials\"> :key: Shared Web Credentials\n\n> Shared web credentials is a programming interface that enables native iOS apps to share credentials with their website counterparts. For example, a user may log in to a website in Safari, entering a user name and password, and save those credentials using the iCloud Keychain. Later, the user may run a native app from the same developer, and instead of the app requiring the user to reenter a user name and password, shared web credentials gives it access to the credentials that were entered earlier in Safari. The user can also create new accounts, update passwords, or delete her account from within the app. These changes are then saved and used by Safari.  \n<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>\n\n\n```swift\nlet keychain = Keychain(server: \"https://www.kishikawakatsumi.com\", protocolType: .HTTPS)\n\nlet username = \"kishikawakatsumi@mac.com\"\n\n// First, check the credential in the app's Keychain\nif let password = try? keychain.get(username) {\n    // If found password in the Keychain,\n    // then log into the server\n} else {\n    // If not found password in the Keychain,\n    // try to read from Shared Web Credentials\n    keychain.getSharedPassword(username) { (password, error) -> () in\n        if password != nil {\n            // If found password in the Shared Web Credentials,\n            // then log into the server\n            // and save the password to the Keychain\n\n            keychain[username] = password\n        } else {\n            // If not found password either in the Keychain also Shared Web Credentials,\n            // prompt for username and password\n\n            // Log into server\n\n            // If the login is successful,\n            // save the credentials to both the Keychain and the Shared Web Credentials.\n\n            keychain[username] = inputPassword\n            keychain.setSharedPassword(inputPassword, account: username)\n        }\n    }\n}\n```\n\n#### Request all associated domain's credentials\n\n```swift\nKeychain.requestSharedWebCredential { (credentials, error) -> () in\n\n}\n```\n\n#### Generate strong random password\n\nGenerate strong random password that is in the same format used by Safari autofill (xxx-xxx-xxx-xxx).\n\n```swift\nlet password = Keychain.generatePassword() // => Nhu-GKm-s3n-pMx\n```\n\n#### How to set up Shared Web Credentials\n\n> 1. Add a com.apple.developer.associated-domains entitlement to your app. This entitlement must include all the domains with which you want to share credentials.\n>\n> 2. Add an apple-app-site-association file to your website. This file must include application identifiers for all the apps with which the site wants to share credentials, and it must be properly signed.\n>\n> 3. When the app is installed, the system downloads and verifies the site association file for each of its associated domains. If the verification is successful, the app is associated with the domain.\n\n**More details:**  \n<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>\n\n### :mag: Debugging\n\n#### Display all stored items if print keychain object\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\nprint(\"\\(keychain)\")\n```\n\n```\n=>\n[\n  [authenticationType: default, key: kishikawakatsumi, server: github.com, class: internetPassword, protocol: https]\n  [authenticationType: default, key: hirohamada, server: github.com, class: internetPassword, protocol: https]\n  [authenticationType: default, key: honeylemon, server: github.com, class: internetPassword, protocol: https]\n]\n```\n\n#### Obtaining all stored keys\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\n\nlet keys = keychain.allKeys()\nfor key in keys {\n  print(\"key: \\(key)\")\n}\n```\n\n```\n=>\nkey: kishikawakatsumi\nkey: hirohamada\nkey: honeylemon\n```\n\n#### Obtaining all stored items\n\n```swift\nlet keychain = Keychain(server: \"https://github.com\", protocolType: .https)\n\nlet items = keychain.allItems()\nfor item in items {\n  print(\"item: \\(item)\")\n}\n```\n\n```\n=>\nitem: [authenticationType: Default, key: kishikawakatsumi, server: github.com, class: InternetPassword, protocol: https]\nitem: [authenticationType: Default, key: hirohamada, server: github.com, class: InternetPassword, protocol: https]\nitem: [authenticationType: Default, key: honeylemon, server: github.com, class: InternetPassword, protocol: https]\n```\n\n## Keychain sharing capability\n\nIf you encounter the error below, you need to add an `Keychain.entitlements`.\n\n```\nOSStatus error:[-34018] Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.\n```\n\n<img alt=\"Screen Shot 2019-10-27 at 8 08 50\" src=\"https://user-images.githubusercontent.com/40610/67627108-1a7f2f80-f891-11e9-97bc-7f7313cb63d1.png\" width=\"500\">\n\n<img src=\"https://user-images.githubusercontent.com/40610/67627072-333b1580-f890-11e9-9feb-bf507abc2724.png\" width=\"500\" />\n\n## Requirements\n\n|            | OS                                                         | Swift              |\n|------------|------------------------------------------------------------|--------------------|\n| **v1.1.x** | iOS 7+, macOS 10.9+                                        | 1.1                |\n| **v1.2.x** | iOS 7+, macOS 10.9+                                        | 1.2                |\n| **v2.0.x** | iOS 7+, macOS 10.9+, watchOS 2+                            | 2.0                |\n| **v2.1.x** | iOS 7+, macOS 10.9+, watchOS 2+                            | 2.0                |\n| **v2.2.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 2.0, 2.1           |\n| **v2.3.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 2.0, 2.1, 2.2      |\n| **v2.4.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 2.2, 2.3           |\n| **v3.0.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 3.x                |\n| **v3.1.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 4.0, 4.1, 4.2      |\n| **v3.2.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 4.0, 4.1, 4.2, 5.0 |\n| **v4.0.x** | iOS 8+, macOS 10.9+, watchOS 2+, tvOS 9+                   | 4.0, 4.1, 4.2, 5.1 |\n| **v4.1.x** | iOS 8+, macOS 10.9+, watchOS 3+, tvOS 9+, Mac Catalyst 13+ | 4.0, 4.1, 4.2, 5.1 |\n\n## Installation\n\n### CocoaPods\n\nKeychainAccess is available through [CocoaPods](http://cocoapods.org). To install\nit, simply add the following lines to your Podfile:\n\n```ruby\nuse_frameworks!\npod 'KeychainAccess'\n```\n\n### Carthage\n\nKeychainAccess is available through [Carthage](https://github.com/Carthage/Carthage). To install\nit, simply add the following line to your Cartfile:\n\n`github \"kishikawakatsumi/KeychainAccess\"`\n\n### Swift Package Manager\n\nKeychainAccess is also available through [Swift Package Manager](https://github.com/apple/swift-package-manager/).\n\n#### Xcode\n\nSelect `File > Add Packages... > Add Package Dependency...`,  \n\n<img src=\"https://user-images.githubusercontent.com/40610/67627000-2833b580-f88f-11e9-89ef-18819b1a6c67.png\" width=\"800px\" />\n\n#### CLI\n\nFirst, create `Package.swift` that its package declaration includes:\n\n```swift\n// swift-tools-version:5.0\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyLibrary\",\n    products: [\n        .library(name: \"MyLibrary\", targets: [\"MyLibrary\"]),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/kishikawakatsumi/KeychainAccess.git\", from: \"3.0.0\"),\n    ],\n    targets: [\n        .target(name: \"MyLibrary\", dependencies: [\"KeychainAccess\"]),\n    ]\n)\n```\n\nThen, type\n\n```shell\n$ swift build\n```\n\n### To manually add to your project\n\n1. Add `Lib/KeychainAccess.xcodeproj` to your project\n2. Link `KeychainAccess.framework` with your target\n3. Add `Copy Files Build Phase` to include the framework to your application bundle\n\n_See [iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS) as reference._\n\n<img src=\"https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/Installation.png\" width=\"800px\" />\n\n## Author\n\nkishikawa katsumi, kishikawakatsumi@mac.com\n\n## License\n\nKeychainAccess is available under the MIT license. See the LICENSE file for more info.\n"
  },
  {
    "path": "External/KeychainAccess/Sources/Keychain.swift",
    "content": "//\n//  Keychain.swift\n//  KeychainAccess\n//\n//  Created by kishikawa katsumi on 2014/12/24.\n//  Copyright (c) 2014 kishikawa katsumi. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport Security\n#if os(iOS) || os(OSX)\nimport LocalAuthentication\n#endif\n\npublic let KeychainAccessErrorDomain = \"com.kishikawakatsumi.KeychainAccess.error\"\n\npublic enum ItemClass {\n    case genericPassword\n    case internetPassword\n}\n\npublic enum ProtocolType {\n    case ftp\n    case ftpAccount\n    case http\n    case irc\n    case nntp\n    case pop3\n    case smtp\n    case socks\n    case imap\n    case ldap\n    case appleTalk\n    case afp\n    case telnet\n    case ssh\n    case ftps\n    case https\n    case httpProxy\n    case httpsProxy\n    case ftpProxy\n    case smb\n    case rtsp\n    case rtspProxy\n    case daap\n    case eppc\n    case ipp\n    case nntps\n    case ldaps\n    case telnetS\n    case imaps\n    case ircs\n    case pop3S\n}\n\npublic enum AuthenticationType {\n    case ntlm\n    case msn\n    case dpa\n    case rpa\n    case httpBasic\n    case httpDigest\n    case htmlForm\n    case `default`\n}\n\npublic enum Accessibility {\n    /**\n     Item data can only be accessed\n     while the device is unlocked. This is recommended for items that only\n     need be accesible while the application is in the foreground. Items\n     with this attribute will migrate to a new device when using encrypted\n     backups.\n     */\n    case whenUnlocked\n\n    /**\n     Item data can only be\n     accessed once the device has been unlocked after a restart. This is\n     recommended for items that need to be accesible by background\n     applications. Items with this attribute will migrate to a new device\n     when using encrypted backups.\n     */\n    case afterFirstUnlock\n\n    /**\n     Item data can always be accessed\n     regardless of the lock state of the device. This is not recommended\n     for anything except system use. Items with this attribute will migrate\n     to a new device when using encrypted backups.\n     */\n    @available(macCatalyst, unavailable)\n    case always\n\n    /**\n     Item data can\n     only be accessed while the device is unlocked. This class is only\n     available if a passcode is set on the device. This is recommended for\n     items that only need to be accessible while the application is in the\n     foreground. Items with this attribute will never migrate to a new\n     device, so after a backup is restored to a new device, these items\n     will be missing. No items can be stored in this class on devices\n     without a passcode. Disabling the device passcode will cause all\n     items in this class to be deleted.\n     */\n    @available(iOS 8.0, OSX 10.10, *)\n    case whenPasscodeSetThisDeviceOnly\n\n    /**\n     Item data can only\n     be accessed while the device is unlocked. This is recommended for items\n     that only need be accesible while the application is in the foreground.\n     Items with this attribute will never migrate to a new device, so after\n     a backup is restored to a new device, these items will be missing.\n     */\n    case whenUnlockedThisDeviceOnly\n\n    /**\n     Item data can\n     only be accessed once the device has been unlocked after a restart.\n     This is recommended for items that need to be accessible by background\n     applications. Items with this attribute will never migrate to a new\n     device, so after a backup is restored to a new device these items will\n     be missing.\n     */\n    case afterFirstUnlockThisDeviceOnly\n\n    /**\n     Item data can always\n     be accessed regardless of the lock state of the device. This option\n     is not recommended for anything except system use. Items with this\n     attribute will never migrate to a new device, so after a backup is\n     restored to a new device, these items will be missing.\n     */\n    @available(macCatalyst, unavailable)\n    case alwaysThisDeviceOnly\n}\n\n/**\n Predefined item attribute constants used to get or set values\n in a dictionary. The kSecUseAuthenticationUI constant is the key and its\n value is one of the constants defined here.\n If the key kSecUseAuthenticationUI not provided then kSecUseAuthenticationUIAllow\n is used as default.\n */\npublic enum AuthenticationUI {\n    /**\n     Specifies that authenticate UI can appear.\n     */\n    case allow\n\n    /**\n     Specifies that the error\n     errSecInteractionNotAllowed will be returned if an item needs\n     to authenticate with UI\n     */\n    case fail\n\n    /**\n     Specifies that all items which need\n     to authenticate with UI will be silently skipped. This value can be used\n     only with SecItemCopyMatching.\n     */\n    case skip\n}\n\n@available(iOS 9.0, OSX 10.11, *)\nextension AuthenticationUI {\n    public var rawValue: String {\n        switch self {\n        case .allow:\n            return UseAuthenticationUIAllow\n        case .fail:\n            return UseAuthenticationUIFail\n        case .skip:\n            return UseAuthenticationUISkip\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .allow:\n            return \"allow\"\n        case .fail:\n            return \"fail\"\n        case .skip:\n            return \"skip\"\n        }\n    }\n}\n\npublic struct AuthenticationPolicy: OptionSet {\n    /**\n     User presence policy using Touch ID or Passcode. Touch ID does not\n     have to be available or enrolled. Item is still accessible by Touch ID\n     even if fingers are added or removed.\n     */\n    @available(iOS 8.0, OSX 10.10, watchOS 2.0, tvOS 8.0, *)\n    public static let userPresence = AuthenticationPolicy(rawValue: 1 << 0)\n\n    /**\n     Constraint: Touch ID (any finger) or Face ID. Touch ID or Face ID must be available. With Touch ID\n     at least one finger must be enrolled. With Face ID user has to be enrolled. Item is still accessible by Touch ID even\n     if fingers are added or removed. Item is still accessible by Face ID if user is re-enrolled.\n     */\n    @available(iOS 11.3, OSX 10.13.4, watchOS 4.3, tvOS 11.3, *)\n    public static let biometryAny = AuthenticationPolicy(rawValue: 1 << 1)\n\n    /**\n     Deprecated, please use biometryAny instead.\n     */\n    @available(iOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryAny\")\n    @available(OSX, introduced: 10.12.1, deprecated: 10.13.4, renamed: \"biometryAny\")\n    @available(watchOS, introduced: 2.0, deprecated: 4.3, renamed: \"biometryAny\")\n    @available(tvOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryAny\")\n    public static let touchIDAny = AuthenticationPolicy(rawValue: 1 << 1)\n\n    /**\n     Constraint: Touch ID from the set of currently enrolled fingers. Touch ID must be available and at least one finger must\n     be enrolled. When fingers are added or removed, the item is invalidated. When Face ID is re-enrolled this item is invalidated.\n     */\n    @available(iOS 11.3, OSX 10.13, watchOS 4.3, tvOS 11.3, *)\n    public static let biometryCurrentSet = AuthenticationPolicy(rawValue: 1 << 3)\n\n    /**\n     Deprecated, please use biometryCurrentSet instead.\n     */\n    @available(iOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryCurrentSet\")\n    @available(OSX, introduced: 10.12.1, deprecated: 10.13.4, renamed: \"biometryCurrentSet\")\n    @available(watchOS, introduced: 2.0, deprecated: 4.3, renamed: \"biometryCurrentSet\")\n    @available(tvOS, introduced: 9.0, deprecated: 11.3, renamed: \"biometryCurrentSet\")\n    public static let touchIDCurrentSet = AuthenticationPolicy(rawValue: 1 << 3)\n\n    /**\n     Constraint: Device passcode\n     */\n    @available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\n    public static let devicePasscode = AuthenticationPolicy(rawValue: 1 << 4)\n\n    /**\n     Constraint: Watch\n     */\n    @available(iOS, unavailable)\n    @available(OSX 10.15, *)\n    @available(watchOS, unavailable)\n    @available(tvOS, unavailable)\n    public static let watch = AuthenticationPolicy(rawValue: 1 << 5)\n\n    /**\n     Constraint logic operation: when using more than one constraint,\n     at least one of them must be satisfied.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let or = AuthenticationPolicy(rawValue: 1 << 14)\n\n    /**\n     Constraint logic operation: when using more than one constraint,\n     all must be satisfied.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let and = AuthenticationPolicy(rawValue: 1 << 15)\n\n    /**\n     Create access control for private key operations (i.e. sign operation)\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let privateKeyUsage = AuthenticationPolicy(rawValue: 1 << 30)\n\n    /**\n     Security: Application provided password for data encryption key generation.\n     This is not a constraint but additional item encryption mechanism.\n     */\n    @available(iOS 9.0, OSX 10.12.1, watchOS 2.0, tvOS 9.0, *)\n    public static let applicationPassword = AuthenticationPolicy(rawValue: 1 << 31)\n\n    #if swift(>=2.3)\n    public let rawValue: UInt\n\n    public init(rawValue: UInt) {\n        self.rawValue = rawValue\n    }\n    #else\n    public let rawValue: Int\n\n    public init(rawValue: Int) {\n        self.rawValue = rawValue\n    }\n    #endif\n}\n\npublic struct Attributes {\n    public var `class`: String? {\n        return attributes[Class] as? String\n    }\n    public var data: Data? {\n        return attributes[ValueData] as? Data\n    }\n    public var ref: Data? {\n        return attributes[ValueRef] as? Data\n    }\n    public var persistentRef: Data? {\n        return attributes[ValuePersistentRef] as? Data\n    }\n\n    public var accessible: String? {\n        return attributes[AttributeAccessible] as? String\n    }\n    public var accessControl: SecAccessControl? {\n        if #available(OSX 10.10, *) {\n            if let accessControl = attributes[AttributeAccessControl] {\n                return (accessControl as! SecAccessControl)\n            }\n            return nil\n        } else {\n            return nil\n        }\n    }\n    public var accessGroup: String? {\n        return attributes[AttributeAccessGroup] as? String\n    }\n    public var synchronizable: Bool? {\n        return attributes[AttributeSynchronizable] as? Bool\n    }\n    public var creationDate: Date? {\n        return attributes[AttributeCreationDate] as? Date\n    }\n    public var modificationDate: Date? {\n        return attributes[AttributeModificationDate] as? Date\n    }\n    public var attributeDescription: String? {\n        return attributes[AttributeDescription] as? String\n    }\n    public var comment: String? {\n        return attributes[AttributeComment] as? String\n    }\n    public var creator: String? {\n        return attributes[AttributeCreator] as? String\n    }\n    public var type: String? {\n        return attributes[AttributeType] as? String\n    }\n    public var label: String? {\n        return attributes[AttributeLabel] as? String\n    }\n    public var isInvisible: Bool? {\n        return attributes[AttributeIsInvisible] as? Bool\n    }\n    public var isNegative: Bool? {\n        return attributes[AttributeIsNegative] as? Bool\n    }\n    public var account: String? {\n        return attributes[AttributeAccount] as? String\n    }\n    public var service: String? {\n        return attributes[AttributeService] as? String\n    }\n    public var generic: Data? {\n        return attributes[AttributeGeneric] as? Data\n    }\n    public var securityDomain: String? {\n        return attributes[AttributeSecurityDomain] as? String\n    }\n    public var server: String? {\n        return attributes[AttributeServer] as? String\n    }\n    public var `protocol`: String? {\n        return attributes[AttributeProtocol] as? String\n    }\n    public var authenticationType: String? {\n        return attributes[AttributeAuthenticationType] as? String\n    }\n    public var port: Int? {\n        return attributes[AttributePort] as? Int\n    }\n    public var path: String? {\n        return attributes[AttributePath] as? String\n    }\n\n    fileprivate let attributes: [String: Any]\n\n    init(attributes: [String: Any]) {\n        self.attributes = attributes\n    }\n\n    public subscript(key: String) -> Any? {\n        get {\n            return attributes[key]\n        }\n    }\n}\n\npublic final class Keychain {\n    public var itemClass: ItemClass {\n        return options.itemClass\n    }\n\n    public var service: String {\n        return options.service\n    }\n\n    // This attribute (kSecAttrAccessGroup) applies to macOS keychain items only if you also set a value of true for the\n    // kSecUseDataProtectionKeychain key, the kSecAttrSynchronizable key, or both.\n    public var accessGroup: String? {\n        return options.accessGroup\n    }\n\n    public var server: URL {\n        return options.server\n    }\n\n    public var protocolType: ProtocolType {\n        return options.protocolType\n    }\n\n    public var authenticationType: AuthenticationType {\n        return options.authenticationType\n    }\n\n    public var accessibility: Accessibility {\n        return options.accessibility\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public var authenticationPolicy: AuthenticationPolicy? {\n        return options.authenticationPolicy\n    }\n\n    public var synchronizable: Bool {\n        return options.synchronizable\n    }\n\n    public var label: String? {\n        return options.label\n    }\n\n    public var comment: String? {\n        return options.comment\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public var authenticationPrompt: String? {\n        return options.authenticationPrompt\n    }\n\n    @available(iOS 9.0, OSX 10.11, *)\n    public var authenticationUI: AuthenticationUI {\n        return options.authenticationUI ?? .allow\n    }\n\n    #if os(iOS) || os(OSX)\n    @available(iOS 9.0, OSX 10.11, *)\n    public var authenticationContext: LAContext? {\n        return options.authenticationContext as? LAContext\n    }\n    #endif\n\n    fileprivate let options: Options\n\n    // MARK:\n\n    public convenience init() {\n        var options = Options()\n        if let bundleIdentifier = Bundle.main.bundleIdentifier {\n            options.service = bundleIdentifier\n        }\n        self.init(options)\n    }\n\n    public convenience init(service: String) {\n        var options = Options()\n        options.service = service\n        self.init(options)\n    }\n\n    public convenience init(accessGroup: String) {\n        var options = Options()\n        if let bundleIdentifier = Bundle.main.bundleIdentifier {\n            options.service = bundleIdentifier\n        }\n        options.accessGroup = accessGroup\n        self.init(options)\n    }\n\n    public convenience init(service: String, accessGroup: String) {\n        var options = Options()\n        options.service = service\n        options.accessGroup = accessGroup\n        self.init(options)\n    }\n\n    public convenience init(server: String, protocolType: ProtocolType, accessGroup: String? = nil, authenticationType: AuthenticationType = .default) {\n        self.init(server: URL(string: server)!, protocolType: protocolType, accessGroup: accessGroup, authenticationType: authenticationType)\n    }\n\n    public convenience init(server: URL, protocolType: ProtocolType, accessGroup: String? = nil, authenticationType: AuthenticationType = .default) {\n        var options = Options()\n        options.itemClass = .internetPassword\n        options.server = server\n        options.protocolType = protocolType\n        options.accessGroup = accessGroup\n        options.authenticationType = authenticationType\n        self.init(options)\n    }\n\n    fileprivate init(_ opts: Options) {\n        options = opts\n    }\n\n    // MARK:\n\n    public func accessibility(_ accessibility: Accessibility) -> Keychain {\n        var options = self.options\n        options.accessibility = accessibility\n        return Keychain(options)\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public func accessibility(_ accessibility: Accessibility, authenticationPolicy: AuthenticationPolicy) -> Keychain {\n        var options = self.options\n        options.accessibility = accessibility\n        options.authenticationPolicy = authenticationPolicy\n        return Keychain(options)\n    }\n\n    public func synchronizable(_ synchronizable: Bool) -> Keychain {\n        var options = self.options\n        options.synchronizable = synchronizable\n        return Keychain(options)\n    }\n\n    public func label(_ label: String) -> Keychain {\n        var options = self.options\n        options.label = label\n        return Keychain(options)\n    }\n\n    public func comment(_ comment: String) -> Keychain {\n        var options = self.options\n        options.comment = comment\n        return Keychain(options)\n    }\n\n    public func attributes(_ attributes: [String: Any]) -> Keychain {\n        var options = self.options\n        attributes.forEach { options.attributes.updateValue($1, forKey: $0) }\n        return Keychain(options)\n    }\n\n    @available(iOS 8.0, OSX 10.10, *)\n    @available(watchOS, unavailable)\n    public func authenticationPrompt(_ authenticationPrompt: String) -> Keychain {\n        var options = self.options\n        options.authenticationPrompt = authenticationPrompt\n        return Keychain(options)\n    }\n\n    @available(iOS 9.0, OSX 10.11, *)\n    public func authenticationUI(_ authenticationUI: AuthenticationUI) -> Keychain {\n        var options = self.options\n        options.authenticationUI = authenticationUI\n        return Keychain(options)\n    }\n\n    #if os(iOS) || os(OSX)\n    @available(iOS 9.0, OSX 10.11, *)\n    public func authenticationContext(_ authenticationContext: LAContext) -> Keychain {\n        var options = self.options\n        options.authenticationContext = authenticationContext\n        return Keychain(options)\n    }\n    #endif\n\n    // MARK:\n\n    public func get(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> String? {\n        return try getString(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n    }\n\n    public func getString(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> String? {\n        guard let data = try getData(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable) else  {\n            return nil\n        }\n        guard let string = String(data: data, encoding: .utf8) else {\n            print(\"failed to convert data to string\")\n            throw Status.conversionError\n        }\n        return string\n    }\n\n    public func getData(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> Data? {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n\n        query[MatchLimit] = MatchLimitOne\n        query[ReturnData] = kCFBooleanTrue\n\n        query[AttributeAccount] = key\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            guard let data = result as? Data else {\n                throw Status.unexpectedError\n            }\n            return data\n        case errSecItemNotFound:\n            return nil\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    public func get<T>(_ key: String, ignoringAttributeSynchronizable: Bool = true, handler: (Attributes?) -> T) throws -> T {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n\n        query[MatchLimit] = MatchLimitOne\n\n        query[ReturnData] = kCFBooleanTrue\n        query[ReturnAttributes] = kCFBooleanTrue\n        query[ReturnRef] = kCFBooleanTrue\n        query[ReturnPersistentRef] = kCFBooleanTrue\n\n        query[AttributeAccount] = key\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            guard let attributes = result as? [String: Any] else {\n                throw Status.unexpectedError\n            }\n            return handler(Attributes(attributes: attributes))\n        case errSecItemNotFound:\n            return handler(nil)\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public func set(_ value: String, key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        guard let data = value.data(using: .utf8, allowLossyConversion: false) else {\n            print(\"failed to convert string to data\")\n            throw Status.conversionError\n        }\n        try set(data, key: key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n    }\n\n    public func set(_ value: Data, key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n        query[AttributeAccount] = key\n        #if os(iOS)\n        if #available(iOS 9.0, *) {\n            if let authenticationUI = options.authenticationUI {\n                query[UseAuthenticationUI] = authenticationUI.rawValue\n            } else {\n                query[UseAuthenticationUI] = UseAuthenticationUIFail\n            }\n        } else {\n            query[UseNoAuthenticationUI] = kCFBooleanTrue\n        }\n        #elseif os(OSX)\n        query[ReturnData] = kCFBooleanTrue\n        if #available(OSX 10.11, *) {\n            if let authenticationUI = options.authenticationUI {\n                query[UseAuthenticationUI] = authenticationUI.rawValue\n            } else {\n                query[UseAuthenticationUI] = UseAuthenticationUIFail\n            }\n        }\n        #else\n        if let authenticationUI = options.authenticationUI {\n            query[UseAuthenticationUI] = authenticationUI.rawValue\n        }\n        #endif\n\n        var status = SecItemCopyMatching(query as CFDictionary, nil)\n        switch status {\n        case errSecSuccess, errSecInteractionNotAllowed:\n            var query = options.query()\n            query[AttributeAccount] = key\n\n            var (attributes, error) = options.attributes(key: nil, value: value)\n            if let error = error {\n                print(error.localizedDescription)\n                throw error\n            }\n\n            options.attributes.forEach { attributes.updateValue($1, forKey: $0) }\n\n            #if os(iOS)\n            if status == errSecInteractionNotAllowed && floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_8_0) {\n                try remove(key)\n                try set(value, key: key)\n            } else {\n                status = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)\n                if status != errSecSuccess {\n                    throw securityError(status: status)\n                }\n            }\n            #else\n            status = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)\n            if status != errSecSuccess {\n                throw securityError(status: status)\n            }\n            #endif\n        case errSecItemNotFound:\n            var (attributes, error) = options.attributes(key: key, value: value)\n            if let error = error {\n                print(error.localizedDescription)\n                throw error\n            }\n\n            options.attributes.forEach { attributes.updateValue($1, forKey: $0) }\n\n            status = SecItemAdd(attributes as CFDictionary, nil)\n            if status != errSecSuccess {\n                throw securityError(status: status)\n            }\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    public subscript(key: String) -> String? {\n        get {\n            #if swift(>=5.0)\n            return try? get(key)\n            #else\n            return (try? get(key)).flatMap { $0 }\n            #endif\n        }\n\n        set {\n            if let value = newValue {\n                do {\n                    try set(value, key: key)\n                } catch {}\n            } else {\n                do {\n                    try remove(key)\n                } catch {}\n            }\n        }\n    }\n\n    public subscript(string key: String) -> String? {\n        get {\n            return self[key]\n        }\n\n        set {\n            self[key] = newValue\n        }\n    }\n\n    public subscript(data key: String) -> Data? {\n        get {\n            #if swift(>=5.0)\n            return try? getData(key)\n            #else\n            return (try? getData(key)).flatMap { $0 }\n            #endif\n        }\n\n        set {\n            if let value = newValue {\n                do {\n                    try set(value, key: key)\n                } catch {}\n            } else {\n                do {\n                    try remove(key)\n                } catch {}\n            }\n        }\n    }\n\n    public subscript(attributes key: String) -> Attributes? {\n        get {\n            #if swift(>=5.0)\n            return try? get(key) { $0 }\n            #else\n            return (try? get(key) { $0 }).flatMap { $0 }\n            #endif\n        }\n    }\n\n    // MARK:\n\n    public func remove(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws {\n        var query = options.query(ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)\n        query[AttributeAccount] = key\n\n        let status = SecItemDelete(query as CFDictionary)\n        if status != errSecSuccess && status != errSecItemNotFound {\n            throw securityError(status: status)\n        }\n    }\n\n    public func removeAll() throws {\n        var query = options.query()\n        #if !os(iOS) && !os(watchOS) && !os(tvOS)\n        query[MatchLimit] = MatchLimitAll\n        #endif\n\n        let status = SecItemDelete(query as CFDictionary)\n        if status != errSecSuccess && status != errSecItemNotFound {\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public func contains(_ key: String, withoutAuthenticationUI: Bool = false) throws -> Bool {\n        var query = options.query()\n        query[AttributeAccount] = key\n\n        if withoutAuthenticationUI {\n            #if os(iOS) || os(watchOS) || os(tvOS)\n            if #available(iOS 9.0, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                } else {\n                    query[UseAuthenticationUI] = UseAuthenticationUIFail\n                }\n            } else {\n                query[UseNoAuthenticationUI] = kCFBooleanTrue\n            }\n            #else\n            if #available(OSX 10.11, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                } else {\n                    query[UseAuthenticationUI] = UseAuthenticationUIFail\n                }\n            } else if #available(OSX 10.10, *) {\n                query[UseNoAuthenticationUI] = kCFBooleanTrue\n            }\n            #endif\n        } else {\n            if #available(iOS 9.0, OSX 10.11, *) {\n                if let authenticationUI = options.authenticationUI {\n                    query[UseAuthenticationUI] = authenticationUI.rawValue\n                }\n            }\n        }\n        \n        let status = SecItemCopyMatching(query as CFDictionary, nil)\n        switch status {\n        case errSecSuccess:\n                return true\n        case errSecInteractionNotAllowed:\n            if withoutAuthenticationUI {\n                return true\n            }\n            return false\n        case errSecItemNotFound:\n            return false\n        default:\n            throw securityError(status: status)\n        }\n    }\n\n    // MARK:\n\n    public class func allKeys(_ itemClass: ItemClass) -> [(String, String)] {\n        var query = [String: Any]()\n        query[Class] = itemClass.rawValue\n        query[AttributeSynchronizable] = SynchronizableAny\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return prettify(itemClass: itemClass, items: items).map {\n                    switch itemClass {\n                    case .genericPassword:\n                        return (($0[\"service\"] ?? \"\") as! String, ($0[\"key\"] ?? \"\") as! String)\n                    case .internetPassword:\n                        return (($0[\"server\"] ?? \"\") as! String, ($0[\"key\"] ?? \"\") as! String)\n                    }\n                }\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    public func allKeys() -> [String] {\n        let allItems = type(of: self).prettify(itemClass: itemClass, items: items())\n        let filter: ([String: Any]) -> String? = { $0[\"key\"] as? String }\n\n        #if swift(>=4.1)\n            return allItems.compactMap(filter)\n        #else\n            return allItems.flatMap(filter)\n        #endif\n    }\n\n    public class func allItems(_ itemClass: ItemClass) -> [[String: Any]] {\n        var query = [String: Any]()\n        query[Class] = itemClass.rawValue\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n        #if os(iOS) || os(watchOS) || os(tvOS)\n        query[ReturnData] = kCFBooleanTrue\n        #endif\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return prettify(itemClass: itemClass, items: items)\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    public func allItems() -> [[String: Any]] {\n        return type(of: self).prettify(itemClass: itemClass, items: items())\n    }\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func getSharedPassword(_ completion: @escaping (_ account: String?, _ password: String?, _ error: Error?) -> () = { account, password, error -> () in }) {\n        if let domain = server.host {\n            type(of: self).requestSharedWebCredential(domain: domain, account: nil) { (credentials, error) -> () in\n                if let credential = credentials.first {\n                    let account = credential[\"account\"]\n                    let password = credential[\"password\"]\n                    completion(account, password, error)\n                } else {\n                    completion(nil, nil, error)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(nil, nil, error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func getSharedPassword(_ account: String, completion: @escaping (_ password: String?, _ error: Error?) -> () = { password, error -> () in }) {\n        if let domain = server.host {\n            type(of: self).requestSharedWebCredential(domain: domain, account: account) { (credentials, error) -> () in\n                if let credential = credentials.first {\n                    if let password = credential[\"password\"] {\n                        completion(password, error)\n                    } else {\n                        completion(nil, error)\n                    }\n                } else {\n                    completion(nil, error)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(nil, error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func setSharedPassword(_ password: String, account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        setSharedPassword(password as String?, account: account, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    fileprivate func setSharedPassword(_ password: String?, account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        if let domain = server.host {\n            SecAddSharedWebCredential(domain as CFString, account as CFString, password as CFString?) { error -> () in\n                if let error = error {\n                    completion(error.error)\n                } else {\n                    completion(nil)\n                }\n            }\n        } else {\n            let error = securityError(status: Status.param.rawValue)\n            completion(error)\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public func removeSharedPassword(_ account: String, completion: @escaping (_ error: Error?) -> () = { e -> () in }) {\n        setSharedPassword(nil, account: account, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(_ completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: nil, account: nil, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(domain: String, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: domain, account: nil, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    public class func requestSharedWebCredential(domain: String, account: String, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> () = { credentials, error -> () in }) {\n        requestSharedWebCredential(domain: Optional(domain), account: Optional(account)!, completion: completion)\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    @available(iOS 8.0, *)\n    fileprivate class func requestSharedWebCredential(domain: String?, account: String?, completion: @escaping (_ credentials: [[String: String]], _ error: Error?) -> ()) {\n        SecRequestSharedWebCredential(domain as CFString?, account as CFString?) { (credentials, error) -> () in\n            var remoteError: NSError?\n            if let error = error {\n                remoteError = error.error\n                if remoteError?.code != Int(errSecItemNotFound) {\n                    print(\"error:[\\(remoteError!.code)] \\(remoteError!.localizedDescription)\")\n                }\n            }\n            if let credentials = credentials {\n                let credentials = (credentials as NSArray).map { credentials -> [String: String] in\n                    var credential = [String: String]()\n                    if let credentials = credentials as? [String: String] {\n                        if let server = credentials[AttributeServer] {\n                            credential[\"server\"] = server\n                        }\n                        if let account = credentials[AttributeAccount] {\n                            credential[\"account\"] = account\n                        }\n                        if let password = credentials[SharedPassword] {\n                            credential[\"password\"] = password\n                        }\n                    }\n                    return credential\n                }\n                completion(credentials, remoteError)\n            } else {\n                completion([], remoteError)\n            }\n        }\n    }\n    #endif\n\n    #if os(iOS) && !targetEnvironment(macCatalyst)\n    /**\n     @abstract Returns a randomly generated password.\n     @return String password in the form xxx-xxx-xxx-xxx where x is taken from the sets \"abcdefghkmnopqrstuvwxy\", \"ABCDEFGHJKLMNPQRSTUVWXYZ\", \"3456789\" with at least one character from each set being present.\n     */\n    @available(iOS 8.0, *)\n    public class func generatePassword() -> String {\n        return SecCreateSharedWebCredentialPassword()! as String\n    }\n    #endif\n\n    // MARK:\n\n    fileprivate func items() -> [[String: Any]] {\n        var query = options.query()\n        query[MatchLimit] = MatchLimitAll\n        query[ReturnAttributes] = kCFBooleanTrue\n        #if os(iOS) || os(watchOS) || os(tvOS)\n        query[ReturnData] = kCFBooleanTrue\n        #endif\n\n        var result: AnyObject?\n        let status = SecItemCopyMatching(query as CFDictionary, &result)\n\n        switch status {\n        case errSecSuccess:\n            if let items = result as? [[String: Any]] {\n                return items\n            }\n        case errSecItemNotFound:\n            return []\n        default: ()\n        }\n\n        securityError(status: status)\n        return []\n    }\n\n    fileprivate class func prettify(itemClass: ItemClass, items: [[String: Any]]) -> [[String: Any]] {\n        let items = items.map { attributes -> [String: Any] in\n            var item = [String: Any]()\n\n            item[\"class\"] = itemClass.description\n            \n            if let accessGroup = attributes[AttributeAccessGroup] as? String {\n                item[\"accessGroup\"] = accessGroup\n            }\n\n            switch itemClass {\n            case .genericPassword:\n                if let service = attributes[AttributeService] as? String {\n                    item[\"service\"] = service\n                }\n            case .internetPassword:\n                if let server = attributes[AttributeServer] as? String {\n                    item[\"server\"] = server\n                }\n                if let proto = attributes[AttributeProtocol] as? String {\n                    if let protocolType = ProtocolType(rawValue: proto) {\n                        item[\"protocol\"] = protocolType.description\n                    }\n                }\n                if let auth = attributes[AttributeAuthenticationType] as? String {\n                    if let authenticationType = AuthenticationType(rawValue: auth) {\n                        item[\"authenticationType\"] = authenticationType.description\n                    }\n                }\n            }\n\n            if let key = attributes[AttributeAccount] as? String {\n                item[\"key\"] = key\n            }\n            if let data = attributes[ValueData] as? Data {\n                if let text = String(data: data, encoding: .utf8) {\n                    item[\"value\"] = text\n                } else  {\n                    item[\"value\"] = data\n                }\n            }\n\n            if let accessible = attributes[AttributeAccessible] as? String {\n                if let accessibility = Accessibility(rawValue: accessible) {\n                    item[\"accessibility\"] = accessibility.description\n                }\n            }\n            if let synchronizable = attributes[AttributeSynchronizable] as? Bool {\n                item[\"synchronizable\"] = synchronizable ? \"true\" : \"false\"\n            }\n\n            return item\n        }\n        return items\n    }\n\n    // MARK:\n\n    @discardableResult\n    fileprivate class func securityError(status: OSStatus) -> Error {\n        let error = Status(status: status)\n        if error != .userCanceled {\n            print(\"OSStatus error:[\\(error.errorCode)] \\(error.description)\")\n        }\n\n        return error\n    }\n\n    @discardableResult\n    fileprivate func securityError(status: OSStatus) -> Error {\n        return type(of: self).securityError(status: status)\n    }\n}\n\nstruct Options {\n    var itemClass: ItemClass = .genericPassword\n\n    var service: String = \"\"\n    var accessGroup: String? = nil\n\n    var server: URL!\n    var protocolType: ProtocolType!\n    var authenticationType: AuthenticationType = .default\n\n    var accessibility: Accessibility = .afterFirstUnlock\n    var authenticationPolicy: AuthenticationPolicy?\n\n    var synchronizable: Bool = false\n\n    var label: String?\n    var comment: String?\n\n    var authenticationPrompt: String?\n    var authenticationUI: AuthenticationUI?\n    var authenticationContext: AnyObject?\n\n    var attributes = [String: Any]()\n}\n\n/** Class Key Constant */\nprivate let Class = String(kSecClass)\n\n/** Attribute Key Constants */\nprivate let AttributeAccessible = String(kSecAttrAccessible)\n\n@available(iOS 8.0, OSX 10.10, *)\nprivate let AttributeAccessControl = String(kSecAttrAccessControl)\n\nprivate let AttributeAccessGroup = String(kSecAttrAccessGroup)\nprivate let AttributeSynchronizable = String(kSecAttrSynchronizable)\nprivate let AttributeCreationDate = String(kSecAttrCreationDate)\nprivate let AttributeModificationDate = String(kSecAttrModificationDate)\nprivate let AttributeDescription = String(kSecAttrDescription)\nprivate let AttributeComment = String(kSecAttrComment)\nprivate let AttributeCreator = String(kSecAttrCreator)\nprivate let AttributeType = String(kSecAttrType)\nprivate let AttributeLabel = String(kSecAttrLabel)\nprivate let AttributeIsInvisible = String(kSecAttrIsInvisible)\nprivate let AttributeIsNegative = String(kSecAttrIsNegative)\nprivate let AttributeAccount = String(kSecAttrAccount)\nprivate let AttributeService = String(kSecAttrService)\nprivate let AttributeGeneric = String(kSecAttrGeneric)\nprivate let AttributeSecurityDomain = String(kSecAttrSecurityDomain)\nprivate let AttributeServer = String(kSecAttrServer)\nprivate let AttributeProtocol = String(kSecAttrProtocol)\nprivate let AttributeAuthenticationType = String(kSecAttrAuthenticationType)\nprivate let AttributePort = String(kSecAttrPort)\nprivate let AttributePath = String(kSecAttrPath)\n\nprivate let SynchronizableAny = kSecAttrSynchronizableAny\n\n/** Search Constants */\nprivate let MatchLimit = String(kSecMatchLimit)\nprivate let MatchLimitOne = kSecMatchLimitOne\nprivate let MatchLimitAll = kSecMatchLimitAll\n\n/** Return Type Key Constants */\nprivate let ReturnData = String(kSecReturnData)\nprivate let ReturnAttributes = String(kSecReturnAttributes)\nprivate let ReturnRef = String(kSecReturnRef)\nprivate let ReturnPersistentRef = String(kSecReturnPersistentRef)\n\n/** Value Type Key Constants */\nprivate let ValueData = String(kSecValueData)\nprivate let ValueRef = String(kSecValueRef)\nprivate let ValuePersistentRef = String(kSecValuePersistentRef)\n\n/** Other Constants */\n@available(iOS 8.0, OSX 10.10, tvOS 8.0, *)\nprivate let UseOperationPrompt = String(kSecUseOperationPrompt)\n\n@available(iOS, introduced: 8.0, deprecated: 9.0, message: \"Use a UseAuthenticationUI instead.\")\n@available(OSX, introduced: 10.10, deprecated: 10.11, message: \"Use UseAuthenticationUI instead.\")\n@available(watchOS, introduced: 2.0, deprecated: 2.0, message: \"Use UseAuthenticationUI instead.\")\n@available(tvOS, introduced: 8.0, deprecated: 9.0, message: \"Use UseAuthenticationUI instead.\")\nprivate let UseNoAuthenticationUI = String(kSecUseNoAuthenticationUI)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUI = String(kSecUseAuthenticationUI)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationContext = String(kSecUseAuthenticationContext)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUIAllow = String(kSecUseAuthenticationUIAllow)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUIFail = String(kSecUseAuthenticationUIFail)\n\n@available(iOS 9.0, OSX 10.11, watchOS 2.0, tvOS 9.0, *)\nprivate let UseAuthenticationUISkip = String(kSecUseAuthenticationUISkip)\n\n#if os(iOS) && !targetEnvironment(macCatalyst)\n/** Credential Key Constants */\nprivate let SharedPassword = String(kSecSharedPassword)\n#endif\n\nextension Keychain: CustomStringConvertible, CustomDebugStringConvertible {\n    public var description: String {\n        let items = allItems()\n        if items.isEmpty {\n            return \"[]\"\n        }\n        var description = \"[\\n\"\n        for item in items {\n            description += \"  \"\n            description += \"\\(item)\\n\"\n        }\n        description += \"]\"\n        return description\n    }\n\n    public var debugDescription: String {\n        return \"\\(items())\"\n    }\n}\n\nextension Options {\n    func query(ignoringAttributeSynchronizable: Bool = true) -> [String: Any] {\n        var query = [String: Any]()\n\n        query[Class] = itemClass.rawValue\n        if let accessGroup = self.accessGroup {\n            query[AttributeAccessGroup] = accessGroup\n        }\n        if ignoringAttributeSynchronizable {\n            query[AttributeSynchronizable] = SynchronizableAny\n        } else {\n            query[AttributeSynchronizable] = synchronizable ? kCFBooleanTrue : kCFBooleanFalse\n        }\n\n        switch itemClass {\n        case .genericPassword:\n            query[AttributeService] = service\n        case .internetPassword:\n            query[AttributeServer] = server.host\n            query[AttributePort] = server.port\n            query[AttributeProtocol] = protocolType.rawValue\n            query[AttributeAuthenticationType] = authenticationType.rawValue\n        }\n\n        if #available(OSX 10.10, *) {\n            if authenticationPrompt != nil {\n                query[UseOperationPrompt] = authenticationPrompt\n            }\n        }\n\n        #if !os(watchOS)\n        if #available(iOS 9.0, OSX 10.11, *) {\n            if authenticationContext != nil {\n                query[UseAuthenticationContext] = authenticationContext\n            }\n        }\n        #endif\n\n        return query\n    }\n\n    func attributes(key: String?, value: Data) -> ([String: Any], Error?) {\n        var attributes: [String: Any]\n\n        if key != nil {\n            attributes = query()\n            attributes[AttributeAccount] = key\n        } else {\n            attributes = [String: Any]()\n        }\n\n        attributes[ValueData] = value\n\n        if label != nil {\n            attributes[AttributeLabel] = label\n        }\n        if comment != nil {\n            attributes[AttributeComment] = comment\n        }\n\n        if let policy = authenticationPolicy {\n            if #available(OSX 10.10, *) {\n                var error: Unmanaged<CFError>?\n                guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibility.rawValue as CFTypeRef, SecAccessControlCreateFlags(rawValue: CFOptionFlags(policy.rawValue)), &error) else {\n                    if let error = error?.takeUnretainedValue() {\n                        return (attributes, error.error)\n                    }\n\n                    return (attributes, Status.unexpectedError)\n                }\n                attributes[AttributeAccessControl] = accessControl\n            } else {\n                print(\"Unavailable 'Touch ID integration' on OS X versions prior to 10.10.\")\n            }\n        } else {\n            attributes[AttributeAccessible] = accessibility.rawValue\n        }\n\n        attributes[AttributeSynchronizable] = synchronizable ? kCFBooleanTrue : kCFBooleanFalse\n\n        return (attributes, nil)\n    }\n}\n\n// MARK:\n\nextension Attributes: CustomStringConvertible, CustomDebugStringConvertible {\n    public var description: String {\n        return \"\\(attributes)\"\n    }\n\n    public var debugDescription: String {\n        return description\n    }\n}\n\nextension ItemClass: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecClassGenericPassword):\n            self = .genericPassword\n        case String(kSecClassInternetPassword):\n            self = .internetPassword\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .genericPassword:\n            return String(kSecClassGenericPassword)\n        case .internetPassword:\n            return String(kSecClassInternetPassword)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .genericPassword:\n            return \"GenericPassword\"\n        case .internetPassword:\n            return \"InternetPassword\"\n        }\n    }\n}\n\nextension ProtocolType: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecAttrProtocolFTP):\n            self = .ftp\n        case String(kSecAttrProtocolFTPAccount):\n            self = .ftpAccount\n        case String(kSecAttrProtocolHTTP):\n            self = .http\n        case String(kSecAttrProtocolIRC):\n            self = .irc\n        case String(kSecAttrProtocolNNTP):\n            self = .nntp\n        case String(kSecAttrProtocolPOP3):\n            self = .pop3\n        case String(kSecAttrProtocolSMTP):\n            self = .smtp\n        case String(kSecAttrProtocolSOCKS):\n            self = .socks\n        case String(kSecAttrProtocolIMAP):\n            self = .imap\n        case String(kSecAttrProtocolLDAP):\n            self = .ldap\n        case String(kSecAttrProtocolAppleTalk):\n            self = .appleTalk\n        case String(kSecAttrProtocolAFP):\n            self = .afp\n        case String(kSecAttrProtocolTelnet):\n            self = .telnet\n        case String(kSecAttrProtocolSSH):\n            self = .ssh\n        case String(kSecAttrProtocolFTPS):\n            self = .ftps\n        case String(kSecAttrProtocolHTTPS):\n            self = .https\n        case String(kSecAttrProtocolHTTPProxy):\n            self = .httpProxy\n        case String(kSecAttrProtocolHTTPSProxy):\n            self = .httpsProxy\n        case String(kSecAttrProtocolFTPProxy):\n            self = .ftpProxy\n        case String(kSecAttrProtocolSMB):\n            self = .smb\n        case String(kSecAttrProtocolRTSP):\n            self = .rtsp\n        case String(kSecAttrProtocolRTSPProxy):\n            self = .rtspProxy\n        case String(kSecAttrProtocolDAAP):\n            self = .daap\n        case String(kSecAttrProtocolEPPC):\n            self = .eppc\n        case String(kSecAttrProtocolIPP):\n            self = .ipp\n        case String(kSecAttrProtocolNNTPS):\n            self = .nntps\n        case String(kSecAttrProtocolLDAPS):\n            self = .ldaps\n        case String(kSecAttrProtocolTelnetS):\n            self = .telnetS\n        case String(kSecAttrProtocolIMAPS):\n            self = .imaps\n        case String(kSecAttrProtocolIRCS):\n            self = .ircs\n        case String(kSecAttrProtocolPOP3S):\n            self = .pop3S\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .ftp:\n            return String(kSecAttrProtocolFTP)\n        case .ftpAccount:\n            return String(kSecAttrProtocolFTPAccount)\n        case .http:\n            return String(kSecAttrProtocolHTTP)\n        case .irc:\n            return String(kSecAttrProtocolIRC)\n        case .nntp:\n            return String(kSecAttrProtocolNNTP)\n        case .pop3:\n            return String(kSecAttrProtocolPOP3)\n        case .smtp:\n            return String(kSecAttrProtocolSMTP)\n        case .socks:\n            return String(kSecAttrProtocolSOCKS)\n        case .imap:\n            return String(kSecAttrProtocolIMAP)\n        case .ldap:\n            return String(kSecAttrProtocolLDAP)\n        case .appleTalk:\n            return String(kSecAttrProtocolAppleTalk)\n        case .afp:\n            return String(kSecAttrProtocolAFP)\n        case .telnet:\n            return String(kSecAttrProtocolTelnet)\n        case .ssh:\n            return String(kSecAttrProtocolSSH)\n        case .ftps:\n            return String(kSecAttrProtocolFTPS)\n        case .https:\n            return String(kSecAttrProtocolHTTPS)\n        case .httpProxy:\n            return String(kSecAttrProtocolHTTPProxy)\n        case .httpsProxy:\n            return String(kSecAttrProtocolHTTPSProxy)\n        case .ftpProxy:\n            return String(kSecAttrProtocolFTPProxy)\n        case .smb:\n            return String(kSecAttrProtocolSMB)\n        case .rtsp:\n            return String(kSecAttrProtocolRTSP)\n        case .rtspProxy:\n            return String(kSecAttrProtocolRTSPProxy)\n        case .daap:\n            return String(kSecAttrProtocolDAAP)\n        case .eppc:\n            return String(kSecAttrProtocolEPPC)\n        case .ipp:\n            return String(kSecAttrProtocolIPP)\n        case .nntps:\n            return String(kSecAttrProtocolNNTPS)\n        case .ldaps:\n            return String(kSecAttrProtocolLDAPS)\n        case .telnetS:\n            return String(kSecAttrProtocolTelnetS)\n        case .imaps:\n            return String(kSecAttrProtocolIMAPS)\n        case .ircs:\n            return String(kSecAttrProtocolIRCS)\n        case .pop3S:\n            return String(kSecAttrProtocolPOP3S)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .ftp:\n            return \"FTP\"\n        case .ftpAccount:\n            return \"FTPAccount\"\n        case .http:\n            return \"HTTP\"\n        case .irc:\n            return \"IRC\"\n        case .nntp:\n            return \"NNTP\"\n        case .pop3:\n            return \"POP3\"\n        case .smtp:\n            return \"SMTP\"\n        case .socks:\n            return \"SOCKS\"\n        case .imap:\n            return \"IMAP\"\n        case .ldap:\n            return \"LDAP\"\n        case .appleTalk:\n            return \"AppleTalk\"\n        case .afp:\n            return \"AFP\"\n        case .telnet:\n            return \"Telnet\"\n        case .ssh:\n            return \"SSH\"\n        case .ftps:\n            return \"FTPS\"\n        case .https:\n            return \"HTTPS\"\n        case .httpProxy:\n            return \"HTTPProxy\"\n        case .httpsProxy:\n            return \"HTTPSProxy\"\n        case .ftpProxy:\n            return \"FTPProxy\"\n        case .smb:\n            return \"SMB\"\n        case .rtsp:\n            return \"RTSP\"\n        case .rtspProxy:\n            return \"RTSPProxy\"\n        case .daap:\n            return \"DAAP\"\n        case .eppc:\n            return \"EPPC\"\n        case .ipp:\n            return \"IPP\"\n        case .nntps:\n            return \"NNTPS\"\n        case .ldaps:\n            return \"LDAPS\"\n        case .telnetS:\n            return \"TelnetS\"\n        case .imaps:\n            return \"IMAPS\"\n        case .ircs:\n            return \"IRCS\"\n        case .pop3S:\n            return \"POP3S\"\n        }\n    }\n}\n\nextension AuthenticationType: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        switch rawValue {\n        case String(kSecAttrAuthenticationTypeNTLM):\n            self = .ntlm\n        case String(kSecAttrAuthenticationTypeMSN):\n            self = .msn\n        case String(kSecAttrAuthenticationTypeDPA):\n            self = .dpa\n        case String(kSecAttrAuthenticationTypeRPA):\n            self = .rpa\n        case String(kSecAttrAuthenticationTypeHTTPBasic):\n            self = .httpBasic\n        case String(kSecAttrAuthenticationTypeHTTPDigest):\n            self = .httpDigest\n        case String(kSecAttrAuthenticationTypeHTMLForm):\n            self = .htmlForm\n        case String(kSecAttrAuthenticationTypeDefault):\n            self = .`default`\n        default:\n            return nil\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .ntlm:\n            return String(kSecAttrAuthenticationTypeNTLM)\n        case .msn:\n            return String(kSecAttrAuthenticationTypeMSN)\n        case .dpa:\n            return String(kSecAttrAuthenticationTypeDPA)\n        case .rpa:\n            return String(kSecAttrAuthenticationTypeRPA)\n        case .httpBasic:\n            return String(kSecAttrAuthenticationTypeHTTPBasic)\n        case .httpDigest:\n            return String(kSecAttrAuthenticationTypeHTTPDigest)\n        case .htmlForm:\n            return String(kSecAttrAuthenticationTypeHTMLForm)\n        case .`default`:\n            return String(kSecAttrAuthenticationTypeDefault)\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .ntlm:\n            return \"NTLM\"\n        case .msn:\n            return \"MSN\"\n        case .dpa:\n            return \"DPA\"\n        case .rpa:\n            return \"RPA\"\n        case .httpBasic:\n            return \"HTTPBasic\"\n        case .httpDigest:\n            return \"HTTPDigest\"\n        case .htmlForm:\n            return \"HTMLForm\"\n        case .`default`:\n            return \"Default\"\n        }\n    }\n}\n\nextension Accessibility: RawRepresentable, CustomStringConvertible {\n    public init?(rawValue: String) {\n        if #available(OSX 10.10, *) {\n            switch rawValue {\n            case String(kSecAttrAccessibleWhenUnlocked):\n                self = .whenUnlocked\n            case String(kSecAttrAccessibleAfterFirstUnlock):\n                self = .afterFirstUnlock\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlways):\n                self = .always\n            #endif\n            case String(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly):\n                self = .whenPasscodeSetThisDeviceOnly\n            case String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly):\n                self = .whenUnlockedThisDeviceOnly\n            case String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly):\n                self = .afterFirstUnlockThisDeviceOnly\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlwaysThisDeviceOnly):\n                self = .alwaysThisDeviceOnly\n            #endif\n            default:\n                return nil\n            }\n        } else {\n            switch rawValue {\n            case String(kSecAttrAccessibleWhenUnlocked):\n                self = .whenUnlocked\n            case String(kSecAttrAccessibleAfterFirstUnlock):\n                self = .afterFirstUnlock\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlways):\n                self = .always\n            #endif\n            case String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly):\n                self = .whenUnlockedThisDeviceOnly\n            case String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly):\n                self = .afterFirstUnlockThisDeviceOnly\n            #if !targetEnvironment(macCatalyst)\n            case String(kSecAttrAccessibleAlwaysThisDeviceOnly):\n                self = .alwaysThisDeviceOnly\n            #endif\n            default:\n                return nil\n            }\n        }\n    }\n\n    public var rawValue: String {\n        switch self {\n        case .whenUnlocked:\n            return String(kSecAttrAccessibleWhenUnlocked)\n        case .afterFirstUnlock:\n            return String(kSecAttrAccessibleAfterFirstUnlock)\n        #if !targetEnvironment(macCatalyst)\n        case .always:\n            return String(kSecAttrAccessibleAlways)\n        #endif\n        case .whenPasscodeSetThisDeviceOnly:\n            if #available(OSX 10.10, *) {\n                return String(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly)\n            } else {\n                fatalError(\"'Accessibility.WhenPasscodeSetThisDeviceOnly' is not available on this version of OS.\")\n            }\n        case .whenUnlockedThisDeviceOnly:\n            return String(kSecAttrAccessibleWhenUnlockedThisDeviceOnly)\n        case .afterFirstUnlockThisDeviceOnly:\n            return String(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly)\n        #if !targetEnvironment(macCatalyst)\n        case .alwaysThisDeviceOnly:\n            return String(kSecAttrAccessibleAlwaysThisDeviceOnly)\n        #endif\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .whenUnlocked:\n            return \"WhenUnlocked\"\n        case .afterFirstUnlock:\n            return \"AfterFirstUnlock\"\n        #if !targetEnvironment(macCatalyst)\n        case .always:\n            return \"Always\"\n        #endif\n        case .whenPasscodeSetThisDeviceOnly:\n            return \"WhenPasscodeSetThisDeviceOnly\"\n        case .whenUnlockedThisDeviceOnly:\n            return \"WhenUnlockedThisDeviceOnly\"\n        case .afterFirstUnlockThisDeviceOnly:\n            return \"AfterFirstUnlockThisDeviceOnly\"\n        #if !targetEnvironment(macCatalyst)\n        case .alwaysThisDeviceOnly:\n            return \"AlwaysThisDeviceOnly\"\n        #endif\n        }\n    }\n}\n\nextension CFError {\n    var error: NSError {\n        let domain = CFErrorGetDomain(self) as String\n        let code = CFErrorGetCode(self)\n        let userInfo = CFErrorCopyUserInfo(self) as! [String: Any]\n\n        return NSError(domain: domain, code: code, userInfo: userInfo)\n    }\n}\n\npublic enum Status: OSStatus, Error {\n    case success                            = 0\n    case unimplemented                      = -4\n    case diskFull                           = -34\n    case io                                 = -36\n    case opWr                               = -49\n    case param                              = -50\n    case wrPerm                             = -61\n    case allocate                           = -108\n    case userCanceled                       = -128\n    case badReq                             = -909\n    case internalComponent                  = -2070\n    case notAvailable                       = -25291\n    case readOnly                           = -25292\n    case authFailed                         = -25293\n    case noSuchKeychain                     = -25294\n    case invalidKeychain                    = -25295\n    case duplicateKeychain                  = -25296\n    case duplicateCallback                  = -25297\n    case invalidCallback                    = -25298\n    case duplicateItem                      = -25299\n    case itemNotFound                       = -25300\n    case bufferTooSmall                     = -25301\n    case dataTooLarge                       = -25302\n    case noSuchAttr                         = -25303\n    case invalidItemRef                     = -25304\n    case invalidSearchRef                   = -25305\n    case noSuchClass                        = -25306\n    case noDefaultKeychain                  = -25307\n    case interactionNotAllowed              = -25308\n    case readOnlyAttr                       = -25309\n    case wrongSecVersion                    = -25310\n    case keySizeNotAllowed                  = -25311\n    case noStorageModule                    = -25312\n    case noCertificateModule                = -25313\n    case noPolicyModule                     = -25314\n    case interactionRequired                = -25315\n    case dataNotAvailable                   = -25316\n    case dataNotModifiable                  = -25317\n    case createChainFailed                  = -25318\n    case invalidPrefsDomain                 = -25319\n    case inDarkWake                         = -25320\n    case aclNotSimple                       = -25240\n    case policyNotFound                     = -25241\n    case invalidTrustSetting                = -25242\n    case noAccessForItem                    = -25243\n    case invalidOwnerEdit                   = -25244\n    case trustNotAvailable                  = -25245\n    case unsupportedFormat                  = -25256\n    case unknownFormat                      = -25257\n    case keyIsSensitive                     = -25258\n    case multiplePrivKeys                   = -25259\n    case passphraseRequired                 = -25260\n    case invalidPasswordRef                 = -25261\n    case invalidTrustSettings               = -25262\n    case noTrustSettings                    = -25263\n    case pkcs12VerifyFailure                = -25264\n    case invalidCertificate                 = -26265\n    case notSigner                          = -26267\n    case policyDenied                       = -26270\n    case invalidKey                         = -26274\n    case decode                             = -26275\n    case `internal`                         = -26276\n    case unsupportedAlgorithm               = -26268\n    case unsupportedOperation               = -26271\n    case unsupportedPadding                 = -26273\n    case itemInvalidKey                     = -34000\n    case itemInvalidKeyType                 = -34001\n    case itemInvalidValue                   = -34002\n    case itemClassMissing                   = -34003\n    case itemMatchUnsupported               = -34004\n    case useItemListUnsupported             = -34005\n    case useKeychainUnsupported             = -34006\n    case useKeychainListUnsupported         = -34007\n    case returnDataUnsupported              = -34008\n    case returnAttributesUnsupported        = -34009\n    case returnRefUnsupported               = -34010\n    case returnPersitentRefUnsupported      = -34011\n    case valueRefUnsupported                = -34012\n    case valuePersistentRefUnsupported      = -34013\n    case returnMissingPointer               = -34014\n    case matchLimitUnsupported              = -34015\n    case itemIllegalQuery                   = -34016\n    case waitForCallback                    = -34017\n    case missingEntitlement                 = -34018\n    case upgradePending                     = -34019\n    case mpSignatureInvalid                 = -25327\n    case otrTooOld                          = -25328\n    case otrIDTooNew                        = -25329\n    case serviceNotAvailable                = -67585\n    case insufficientClientID               = -67586\n    case deviceReset                        = -67587\n    case deviceFailed                       = -67588\n    case appleAddAppACLSubject              = -67589\n    case applePublicKeyIncomplete           = -67590\n    case appleSignatureMismatch             = -67591\n    case appleInvalidKeyStartDate           = -67592\n    case appleInvalidKeyEndDate             = -67593\n    case conversionError                    = -67594\n    case appleSSLv2Rollback                 = -67595\n    case quotaExceeded                      = -67596\n    case fileTooBig                         = -67597\n    case invalidDatabaseBlob                = -67598\n    case invalidKeyBlob                     = -67599\n    case incompatibleDatabaseBlob           = -67600\n    case incompatibleKeyBlob                = -67601\n    case hostNameMismatch                   = -67602\n    case unknownCriticalExtensionFlag       = -67603\n    case noBasicConstraints                 = -67604\n    case noBasicConstraintsCA               = -67605\n    case invalidAuthorityKeyID              = -67606\n    case invalidSubjectKeyID                = -67607\n    case invalidKeyUsageForPolicy           = -67608\n    case invalidExtendedKeyUsage            = -67609\n    case invalidIDLinkage                   = -67610\n    case pathLengthConstraintExceeded       = -67611\n    case invalidRoot                        = -67612\n    case crlExpired                         = -67613\n    case crlNotValidYet                     = -67614\n    case crlNotFound                        = -67615\n    case crlServerDown                      = -67616\n    case crlBadURI                          = -67617\n    case unknownCertExtension               = -67618\n    case unknownCRLExtension                = -67619\n    case crlNotTrusted                      = -67620\n    case crlPolicyFailed                    = -67621\n    case idpFailure                         = -67622\n    case smimeEmailAddressesNotFound        = -67623\n    case smimeBadExtendedKeyUsage           = -67624\n    case smimeBadKeyUsage                   = -67625\n    case smimeKeyUsageNotCritical           = -67626\n    case smimeNoEmailAddress                = -67627\n    case smimeSubjAltNameNotCritical        = -67628\n    case sslBadExtendedKeyUsage             = -67629\n    case ocspBadResponse                    = -67630\n    case ocspBadRequest                     = -67631\n    case ocspUnavailable                    = -67632\n    case ocspStatusUnrecognized             = -67633\n    case endOfData                          = -67634\n    case incompleteCertRevocationCheck      = -67635\n    case networkFailure                     = -67636\n    case ocspNotTrustedToAnchor             = -67637\n    case recordModified                     = -67638\n    case ocspSignatureError                 = -67639\n    case ocspNoSigner                       = -67640\n    case ocspResponderMalformedReq          = -67641\n    case ocspResponderInternalError         = -67642\n    case ocspResponderTryLater              = -67643\n    case ocspResponderSignatureRequired     = -67644\n    case ocspResponderUnauthorized          = -67645\n    case ocspResponseNonceMismatch          = -67646\n    case codeSigningBadCertChainLength      = -67647\n    case codeSigningNoBasicConstraints      = -67648\n    case codeSigningBadPathLengthConstraint = -67649\n    case codeSigningNoExtendedKeyUsage      = -67650\n    case codeSigningDevelopment             = -67651\n    case resourceSignBadCertChainLength     = -67652\n    case resourceSignBadExtKeyUsage         = -67653\n    case trustSettingDeny                   = -67654\n    case invalidSubjectName                 = -67655\n    case unknownQualifiedCertStatement      = -67656\n    case mobileMeRequestQueued              = -67657\n    case mobileMeRequestRedirected          = -67658\n    case mobileMeServerError                = -67659\n    case mobileMeServerNotAvailable         = -67660\n    case mobileMeServerAlreadyExists        = -67661\n    case mobileMeServerServiceErr           = -67662\n    case mobileMeRequestAlreadyPending      = -67663\n    case mobileMeNoRequestPending           = -67664\n    case mobileMeCSRVerifyFailure           = -67665\n    case mobileMeFailedConsistencyCheck     = -67666\n    case notInitialized                     = -67667\n    case invalidHandleUsage                 = -67668\n    case pvcReferentNotFound                = -67669\n    case functionIntegrityFail              = -67670\n    case internalError                      = -67671\n    case memoryError                        = -67672\n    case invalidData                        = -67673\n    case mdsError                           = -67674\n    case invalidPointer                     = -67675\n    case selfCheckFailed                    = -67676\n    case functionFailed                     = -67677\n    case moduleManifestVerifyFailed         = -67678\n    case invalidGUID                        = -67679\n    case invalidHandle                      = -67680\n    case invalidDBList                      = -67681\n    case invalidPassthroughID               = -67682\n    case invalidNetworkAddress              = -67683\n    case crlAlreadySigned                   = -67684\n    case invalidNumberOfFields              = -67685\n    case verificationFailure                = -67686\n    case unknownTag                         = -67687\n    case invalidSignature                   = -67688\n    case invalidName                        = -67689\n    case invalidCertificateRef              = -67690\n    case invalidCertificateGroup            = -67691\n    case tagNotFound                        = -67692\n    case invalidQuery                       = -67693\n    case invalidValue                       = -67694\n    case callbackFailed                     = -67695\n    case aclDeleteFailed                    = -67696\n    case aclReplaceFailed                   = -67697\n    case aclAddFailed                       = -67698\n    case aclChangeFailed                    = -67699\n    case invalidAccessCredentials           = -67700\n    case invalidRecord                      = -67701\n    case invalidACL                         = -67702\n    case invalidSampleValue                 = -67703\n    case incompatibleVersion                = -67704\n    case privilegeNotGranted                = -67705\n    case invalidScope                       = -67706\n    case pvcAlreadyConfigured               = -67707\n    case invalidPVC                         = -67708\n    case emmLoadFailed                      = -67709\n    case emmUnloadFailed                    = -67710\n    case addinLoadFailed                    = -67711\n    case invalidKeyRef                      = -67712\n    case invalidKeyHierarchy                = -67713\n    case addinUnloadFailed                  = -67714\n    case libraryReferenceNotFound           = -67715\n    case invalidAddinFunctionTable          = -67716\n    case invalidServiceMask                 = -67717\n    case moduleNotLoaded                    = -67718\n    case invalidSubServiceID                = -67719\n    case attributeNotInContext              = -67720\n    case moduleManagerInitializeFailed      = -67721\n    case moduleManagerNotFound              = -67722\n    case eventNotificationCallbackNotFound  = -67723\n    case inputLengthError                   = -67724\n    case outputLengthError                  = -67725\n    case privilegeNotSupported              = -67726\n    case deviceError                        = -67727\n    case attachHandleBusy                   = -67728\n    case notLoggedIn                        = -67729\n    case algorithmMismatch                  = -67730\n    case keyUsageIncorrect                  = -67731\n    case keyBlobTypeIncorrect               = -67732\n    case keyHeaderInconsistent              = -67733\n    case unsupportedKeyFormat               = -67734\n    case unsupportedKeySize                 = -67735\n    case invalidKeyUsageMask                = -67736\n    case unsupportedKeyUsageMask            = -67737\n    case invalidKeyAttributeMask            = -67738\n    case unsupportedKeyAttributeMask        = -67739\n    case invalidKeyLabel                    = -67740\n    case unsupportedKeyLabel                = -67741\n    case invalidKeyFormat                   = -67742\n    case unsupportedVectorOfBuffers         = -67743\n    case invalidInputVector                 = -67744\n    case invalidOutputVector                = -67745\n    case invalidContext                     = -67746\n    case invalidAlgorithm                   = -67747\n    case invalidAttributeKey                = -67748\n    case missingAttributeKey                = -67749\n    case invalidAttributeInitVector         = -67750\n    case missingAttributeInitVector         = -67751\n    case invalidAttributeSalt               = -67752\n    case missingAttributeSalt               = -67753\n    case invalidAttributePadding            = -67754\n    case missingAttributePadding            = -67755\n    case invalidAttributeRandom             = -67756\n    case missingAttributeRandom             = -67757\n    case invalidAttributeSeed               = -67758\n    case missingAttributeSeed               = -67759\n    case invalidAttributePassphrase         = -67760\n    case missingAttributePassphrase         = -67761\n    case invalidAttributeKeyLength          = -67762\n    case missingAttributeKeyLength          = -67763\n    case invalidAttributeBlockSize          = -67764\n    case missingAttributeBlockSize          = -67765\n    case invalidAttributeOutputSize         = -67766\n    case missingAttributeOutputSize         = -67767\n    case invalidAttributeRounds             = -67768\n    case missingAttributeRounds             = -67769\n    case invalidAlgorithmParms              = -67770\n    case missingAlgorithmParms              = -67771\n    case invalidAttributeLabel              = -67772\n    case missingAttributeLabel              = -67773\n    case invalidAttributeKeyType            = -67774\n    case missingAttributeKeyType            = -67775\n    case invalidAttributeMode               = -67776\n    case missingAttributeMode               = -67777\n    case invalidAttributeEffectiveBits      = -67778\n    case missingAttributeEffectiveBits      = -67779\n    case invalidAttributeStartDate          = -67780\n    case missingAttributeStartDate          = -67781\n    case invalidAttributeEndDate            = -67782\n    case missingAttributeEndDate            = -67783\n    case invalidAttributeVersion            = -67784\n    case missingAttributeVersion            = -67785\n    case invalidAttributePrime              = -67786\n    case missingAttributePrime              = -67787\n    case invalidAttributeBase               = -67788\n    case missingAttributeBase               = -67789\n    case invalidAttributeSubprime           = -67790\n    case missingAttributeSubprime           = -67791\n    case invalidAttributeIterationCount     = -67792\n    case missingAttributeIterationCount     = -67793\n    case invalidAttributeDLDBHandle         = -67794\n    case missingAttributeDLDBHandle         = -67795\n    case invalidAttributeAccessCredentials  = -67796\n    case missingAttributeAccessCredentials  = -67797\n    case invalidAttributePublicKeyFormat    = -67798\n    case missingAttributePublicKeyFormat    = -67799\n    case invalidAttributePrivateKeyFormat   = -67800\n    case missingAttributePrivateKeyFormat   = -67801\n    case invalidAttributeSymmetricKeyFormat = -67802\n    case missingAttributeSymmetricKeyFormat = -67803\n    case invalidAttributeWrappedKeyFormat   = -67804\n    case missingAttributeWrappedKeyFormat   = -67805\n    case stagedOperationInProgress          = -67806\n    case stagedOperationNotStarted          = -67807\n    case verifyFailed                       = -67808\n    case querySizeUnknown                   = -67809\n    case blockSizeMismatch                  = -67810\n    case publicKeyInconsistent              = -67811\n    case deviceVerifyFailed                 = -67812\n    case invalidLoginName                   = -67813\n    case alreadyLoggedIn                    = -67814\n    case invalidDigestAlgorithm             = -67815\n    case invalidCRLGroup                    = -67816\n    case certificateCannotOperate           = -67817\n    case certificateExpired                 = -67818\n    case certificateNotValidYet             = -67819\n    case certificateRevoked                 = -67820\n    case certificateSuspended               = -67821\n    case insufficientCredentials            = -67822\n    case invalidAction                      = -67823\n    case invalidAuthority                   = -67824\n    case verifyActionFailed                 = -67825\n    case invalidCertAuthority               = -67826\n    case invaldCRLAuthority                 = -67827\n    case invalidCRLEncoding                 = -67828\n    case invalidCRLType                     = -67829\n    case invalidCRL                         = -67830\n    case invalidFormType                    = -67831\n    case invalidID                          = -67832\n    case invalidIdentifier                  = -67833\n    case invalidIndex                       = -67834\n    case invalidPolicyIdentifiers           = -67835\n    case invalidTimeString                  = -67836\n    case invalidReason                      = -67837\n    case invalidRequestInputs               = -67838\n    case invalidResponseVector              = -67839\n    case invalidStopOnPolicy                = -67840\n    case invalidTuple                       = -67841\n    case multipleValuesUnsupported          = -67842\n    case notTrusted                         = -67843\n    case noDefaultAuthority                 = -67844\n    case rejectedForm                       = -67845\n    case requestLost                        = -67846\n    case requestRejected                    = -67847\n    case unsupportedAddressType             = -67848\n    case unsupportedService                 = -67849\n    case invalidTupleGroup                  = -67850\n    case invalidBaseACLs                    = -67851\n    case invalidTupleCredendtials           = -67852\n    case invalidEncoding                    = -67853\n    case invalidValidityPeriod              = -67854\n    case invalidRequestor                   = -67855\n    case requestDescriptor                  = -67856\n    case invalidBundleInfo                  = -67857\n    case invalidCRLIndex                    = -67858\n    case noFieldValues                      = -67859\n    case unsupportedFieldFormat             = -67860\n    case unsupportedIndexInfo               = -67861\n    case unsupportedLocality                = -67862\n    case unsupportedNumAttributes           = -67863\n    case unsupportedNumIndexes              = -67864\n    case unsupportedNumRecordTypes          = -67865\n    case fieldSpecifiedMultiple             = -67866\n    case incompatibleFieldFormat            = -67867\n    case invalidParsingModule               = -67868\n    case databaseLocked                     = -67869\n    case datastoreIsOpen                    = -67870\n    case missingValue                       = -67871\n    case unsupportedQueryLimits             = -67872\n    case unsupportedNumSelectionPreds       = -67873\n    case unsupportedOperator                = -67874\n    case invalidDBLocation                  = -67875\n    case invalidAccessRequest               = -67876\n    case invalidIndexInfo                   = -67877\n    case invalidNewOwner                    = -67878\n    case invalidModifyMode                  = -67879\n    case missingRequiredExtension           = -67880\n    case extendedKeyUsageNotCritical        = -67881\n    case timestampMissing                   = -67882\n    case timestampInvalid                   = -67883\n    case timestampNotTrusted                = -67884\n    case timestampServiceNotAvailable       = -67885\n    case timestampBadAlg                    = -67886\n    case timestampBadRequest                = -67887\n    case timestampBadDataFormat             = -67888\n    case timestampTimeNotAvailable          = -67889\n    case timestampUnacceptedPolicy          = -67890\n    case timestampUnacceptedExtension       = -67891\n    case timestampAddInfoNotAvailable       = -67892\n    case timestampSystemFailure             = -67893\n    case signingTimeMissing                 = -67894\n    case timestampRejection                 = -67895\n    case timestampWaiting                   = -67896\n    case timestampRevocationWarning         = -67897\n    case timestampRevocationNotification    = -67898\n    case unexpectedError                    = -99999\n}\n\nextension Status: RawRepresentable, CustomStringConvertible {\n\n    public init(status: OSStatus) {\n        if let mappedStatus = Status(rawValue: status) {\n            self = mappedStatus\n        } else {\n            self = .unexpectedError\n        }\n    }\n\n    public var description: String {\n        switch self {\n        case .success:\n            return \"No error.\"\n        case .unimplemented:\n            return \"Function or operation not implemented.\"\n        case .diskFull:\n            return \"The disk is full.\"\n        case .io:\n            return \"I/O error (bummers)\"\n        case .opWr:\n            return \"file already open with with write permission\"\n        case .param:\n            return \"One or more parameters passed to a function were not valid.\"\n        case .wrPerm:\n            return \"write permissions error\"\n        case .allocate:\n            return \"Failed to allocate memory.\"\n        case .userCanceled:\n            return \"User canceled the operation.\"\n        case .badReq:\n            return \"Bad parameter or invalid state for operation.\"\n        case .internalComponent:\n            return \"\"\n        case .notAvailable:\n            return \"No keychain is available. You may need to restart your computer.\"\n        case .readOnly:\n            return \"This keychain cannot be modified.\"\n        case .authFailed:\n            return \"The user name or passphrase you entered is not correct.\"\n        case .noSuchKeychain:\n            return \"The specified keychain could not be found.\"\n        case .invalidKeychain:\n            return \"The specified keychain is not a valid keychain file.\"\n        case .duplicateKeychain:\n            return \"A keychain with the same name already exists.\"\n        case .duplicateCallback:\n            return \"The specified callback function is already installed.\"\n        case .invalidCallback:\n            return \"The specified callback function is not valid.\"\n        case .duplicateItem:\n            return \"The specified item already exists in the keychain.\"\n        case .itemNotFound:\n            return \"The specified item could not be found in the keychain.\"\n        case .bufferTooSmall:\n            return \"There is not enough memory available to use the specified item.\"\n        case .dataTooLarge:\n            return \"This item contains information which is too large or in a format that cannot be displayed.\"\n        case .noSuchAttr:\n            return \"The specified attribute does not exist.\"\n        case .invalidItemRef:\n            return \"The specified item is no longer valid. It may have been deleted from the keychain.\"\n        case .invalidSearchRef:\n            return \"Unable to search the current keychain.\"\n        case .noSuchClass:\n            return \"The specified item does not appear to be a valid keychain item.\"\n        case .noDefaultKeychain:\n            return \"A default keychain could not be found.\"\n        case .interactionNotAllowed:\n            return \"User interaction is not allowed.\"\n        case .readOnlyAttr:\n            return \"The specified attribute could not be modified.\"\n        case .wrongSecVersion:\n            return \"This keychain was created by a different version of the system software and cannot be opened.\"\n        case .keySizeNotAllowed:\n            return \"This item specifies a key size which is too large.\"\n        case .noStorageModule:\n            return \"A required component (data storage module) could not be loaded. You may need to restart your computer.\"\n        case .noCertificateModule:\n            return \"A required component (certificate module) could not be loaded. You may need to restart your computer.\"\n        case .noPolicyModule:\n            return \"A required component (policy module) could not be loaded. You may need to restart your computer.\"\n        case .interactionRequired:\n            return \"User interaction is required, but is currently not allowed.\"\n        case .dataNotAvailable:\n            return \"The contents of this item cannot be retrieved.\"\n        case .dataNotModifiable:\n            return \"The contents of this item cannot be modified.\"\n        case .createChainFailed:\n            return \"One or more certificates required to validate this certificate cannot be found.\"\n        case .invalidPrefsDomain:\n            return \"The specified preferences domain is not valid.\"\n        case .inDarkWake:\n            return \"In dark wake, no UI possible\"\n        case .aclNotSimple:\n            return \"The specified access control list is not in standard (simple) form.\"\n        case .policyNotFound:\n            return \"The specified policy cannot be found.\"\n        case .invalidTrustSetting:\n            return \"The specified trust setting is invalid.\"\n        case .noAccessForItem:\n            return \"The specified item has no access control.\"\n        case .invalidOwnerEdit:\n            return \"Invalid attempt to change the owner of this item.\"\n        case .trustNotAvailable:\n            return \"No trust results are available.\"\n        case .unsupportedFormat:\n            return \"Import/Export format unsupported.\"\n        case .unknownFormat:\n            return \"Unknown format in import.\"\n        case .keyIsSensitive:\n            return \"Key material must be wrapped for export.\"\n        case .multiplePrivKeys:\n            return \"An attempt was made to import multiple private keys.\"\n        case .passphraseRequired:\n            return \"Passphrase is required for import/export.\"\n        case .invalidPasswordRef:\n            return \"The password reference was invalid.\"\n        case .invalidTrustSettings:\n            return \"The Trust Settings Record was corrupted.\"\n        case .noTrustSettings:\n            return \"No Trust Settings were found.\"\n        case .pkcs12VerifyFailure:\n            return \"MAC verification failed during PKCS12 import (wrong password?)\"\n        case .invalidCertificate:\n            return \"This certificate could not be decoded.\"\n        case .notSigner:\n            return \"A certificate was not signed by its proposed parent.\"\n        case .policyDenied:\n            return \"The certificate chain was not trusted due to a policy not accepting it.\"\n        case .invalidKey:\n            return \"The provided key material was not valid.\"\n        case .decode:\n            return \"Unable to decode the provided data.\"\n        case .`internal`:\n            return \"An internal error occurred in the Security framework.\"\n        case .unsupportedAlgorithm:\n            return \"An unsupported algorithm was encountered.\"\n        case .unsupportedOperation:\n            return \"The operation you requested is not supported by this key.\"\n        case .unsupportedPadding:\n            return \"The padding you requested is not supported.\"\n        case .itemInvalidKey:\n            return \"A string key in dictionary is not one of the supported keys.\"\n        case .itemInvalidKeyType:\n            return \"A key in a dictionary is neither a CFStringRef nor a CFNumberRef.\"\n        case .itemInvalidValue:\n            return \"A value in a dictionary is an invalid (or unsupported) CF type.\"\n        case .itemClassMissing:\n            return \"No kSecItemClass key was specified in a dictionary.\"\n        case .itemMatchUnsupported:\n            return \"The caller passed one or more kSecMatch keys to a function which does not support matches.\"\n        case .useItemListUnsupported:\n            return \"The caller passed in a kSecUseItemList key to a function which does not support it.\"\n        case .useKeychainUnsupported:\n            return \"The caller passed in a kSecUseKeychain key to a function which does not support it.\"\n        case .useKeychainListUnsupported:\n            return \"The caller passed in a kSecUseKeychainList key to a function which does not support it.\"\n        case .returnDataUnsupported:\n            return \"The caller passed in a kSecReturnData key to a function which does not support it.\"\n        case .returnAttributesUnsupported:\n            return \"The caller passed in a kSecReturnAttributes key to a function which does not support it.\"\n        case .returnRefUnsupported:\n            return \"The caller passed in a kSecReturnRef key to a function which does not support it.\"\n        case .returnPersitentRefUnsupported:\n            return \"The caller passed in a kSecReturnPersistentRef key to a function which does not support it.\"\n        case .valueRefUnsupported:\n            return \"The caller passed in a kSecValueRef key to a function which does not support it.\"\n        case .valuePersistentRefUnsupported:\n            return \"The caller passed in a kSecValuePersistentRef key to a function which does not support it.\"\n        case .returnMissingPointer:\n            return \"The caller passed asked for something to be returned but did not pass in a result pointer.\"\n        case .matchLimitUnsupported:\n            return \"The caller passed in a kSecMatchLimit key to a call which does not support limits.\"\n        case .itemIllegalQuery:\n            return \"The caller passed in a query which contained too many keys.\"\n        case .waitForCallback:\n            return \"This operation is incomplete, until the callback is invoked (not an error).\"\n        case .missingEntitlement:\n            return \"Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.\"\n        case .upgradePending:\n            return \"Error returned if keychain database needs a schema migration but the device is locked, clients should wait for a device unlock notification and retry the command.\"\n        case .mpSignatureInvalid:\n            return \"Signature invalid on MP message\"\n        case .otrTooOld:\n            return \"Message is too old to use\"\n        case .otrIDTooNew:\n            return \"Key ID is too new to use! Message from the future?\"\n        case .serviceNotAvailable:\n            return \"The required service is not available.\"\n        case .insufficientClientID:\n            return \"The client ID is not correct.\"\n        case .deviceReset:\n            return \"A device reset has occurred.\"\n        case .deviceFailed:\n            return \"A device failure has occurred.\"\n        case .appleAddAppACLSubject:\n            return \"Adding an application ACL subject failed.\"\n        case .applePublicKeyIncomplete:\n            return \"The public key is incomplete.\"\n        case .appleSignatureMismatch:\n            return \"A signature mismatch has occurred.\"\n        case .appleInvalidKeyStartDate:\n            return \"The specified key has an invalid start date.\"\n        case .appleInvalidKeyEndDate:\n            return \"The specified key has an invalid end date.\"\n        case .conversionError:\n            return \"A conversion error has occurred.\"\n        case .appleSSLv2Rollback:\n            return \"A SSLv2 rollback error has occurred.\"\n        case .quotaExceeded:\n            return \"The quota was exceeded.\"\n        case .fileTooBig:\n            return \"The file is too big.\"\n        case .invalidDatabaseBlob:\n            return \"The specified database has an invalid blob.\"\n        case .invalidKeyBlob:\n            return \"The specified database has an invalid key blob.\"\n        case .incompatibleDatabaseBlob:\n            return \"The specified database has an incompatible blob.\"\n        case .incompatibleKeyBlob:\n            return \"The specified database has an incompatible key blob.\"\n        case .hostNameMismatch:\n            return \"A host name mismatch has occurred.\"\n        case .unknownCriticalExtensionFlag:\n            return \"There is an unknown critical extension flag.\"\n        case .noBasicConstraints:\n            return \"No basic constraints were found.\"\n        case .noBasicConstraintsCA:\n            return \"No basic CA constraints were found.\"\n        case .invalidAuthorityKeyID:\n            return \"The authority key ID is not valid.\"\n        case .invalidSubjectKeyID:\n            return \"The subject key ID is not valid.\"\n        case .invalidKeyUsageForPolicy:\n            return \"The key usage is not valid for the specified policy.\"\n        case .invalidExtendedKeyUsage:\n            return \"The extended key usage is not valid.\"\n        case .invalidIDLinkage:\n            return \"The ID linkage is not valid.\"\n        case .pathLengthConstraintExceeded:\n            return \"The path length constraint was exceeded.\"\n        case .invalidRoot:\n            return \"The root or anchor certificate is not valid.\"\n        case .crlExpired:\n            return \"The CRL has expired.\"\n        case .crlNotValidYet:\n            return \"The CRL is not yet valid.\"\n        case .crlNotFound:\n            return \"The CRL was not found.\"\n        case .crlServerDown:\n            return \"The CRL server is down.\"\n        case .crlBadURI:\n            return \"The CRL has a bad Uniform Resource Identifier.\"\n        case .unknownCertExtension:\n            return \"An unknown certificate extension was encountered.\"\n        case .unknownCRLExtension:\n            return \"An unknown CRL extension was encountered.\"\n        case .crlNotTrusted:\n            return \"The CRL is not trusted.\"\n        case .crlPolicyFailed:\n            return \"The CRL policy failed.\"\n        case .idpFailure:\n            return \"The issuing distribution point was not valid.\"\n        case .smimeEmailAddressesNotFound:\n            return \"An email address mismatch was encountered.\"\n        case .smimeBadExtendedKeyUsage:\n            return \"The appropriate extended key usage for SMIME was not found.\"\n        case .smimeBadKeyUsage:\n            return \"The key usage is not compatible with SMIME.\"\n        case .smimeKeyUsageNotCritical:\n            return \"The key usage extension is not marked as critical.\"\n        case .smimeNoEmailAddress:\n            return \"No email address was found in the certificate.\"\n        case .smimeSubjAltNameNotCritical:\n            return \"The subject alternative name extension is not marked as critical.\"\n        case .sslBadExtendedKeyUsage:\n            return \"The appropriate extended key usage for SSL was not found.\"\n        case .ocspBadResponse:\n            return \"The OCSP response was incorrect or could not be parsed.\"\n        case .ocspBadRequest:\n            return \"The OCSP request was incorrect or could not be parsed.\"\n        case .ocspUnavailable:\n            return \"OCSP service is unavailable.\"\n        case .ocspStatusUnrecognized:\n            return \"The OCSP server did not recognize this certificate.\"\n        case .endOfData:\n            return \"An end-of-data was detected.\"\n        case .incompleteCertRevocationCheck:\n            return \"An incomplete certificate revocation check occurred.\"\n        case .networkFailure:\n            return \"A network failure occurred.\"\n        case .ocspNotTrustedToAnchor:\n            return \"The OCSP response was not trusted to a root or anchor certificate.\"\n        case .recordModified:\n            return \"The record was modified.\"\n        case .ocspSignatureError:\n            return \"The OCSP response had an invalid signature.\"\n        case .ocspNoSigner:\n            return \"The OCSP response had no signer.\"\n        case .ocspResponderMalformedReq:\n            return \"The OCSP responder was given a malformed request.\"\n        case .ocspResponderInternalError:\n            return \"The OCSP responder encountered an internal error.\"\n        case .ocspResponderTryLater:\n            return \"The OCSP responder is busy, try again later.\"\n        case .ocspResponderSignatureRequired:\n            return \"The OCSP responder requires a signature.\"\n        case .ocspResponderUnauthorized:\n            return \"The OCSP responder rejected this request as unauthorized.\"\n        case .ocspResponseNonceMismatch:\n            return \"The OCSP response nonce did not match the request.\"\n        case .codeSigningBadCertChainLength:\n            return \"Code signing encountered an incorrect certificate chain length.\"\n        case .codeSigningNoBasicConstraints:\n            return \"Code signing found no basic constraints.\"\n        case .codeSigningBadPathLengthConstraint:\n            return \"Code signing encountered an incorrect path length constraint.\"\n        case .codeSigningNoExtendedKeyUsage:\n            return \"Code signing found no extended key usage.\"\n        case .codeSigningDevelopment:\n            return \"Code signing indicated use of a development-only certificate.\"\n        case .resourceSignBadCertChainLength:\n            return \"Resource signing has encountered an incorrect certificate chain length.\"\n        case .resourceSignBadExtKeyUsage:\n            return \"Resource signing has encountered an error in the extended key usage.\"\n        case .trustSettingDeny:\n            return \"The trust setting for this policy was set to Deny.\"\n        case .invalidSubjectName:\n            return \"An invalid certificate subject name was encountered.\"\n        case .unknownQualifiedCertStatement:\n            return \"An unknown qualified certificate statement was encountered.\"\n        case .mobileMeRequestQueued:\n            return \"The MobileMe request will be sent during the next connection.\"\n        case .mobileMeRequestRedirected:\n            return \"The MobileMe request was redirected.\"\n        case .mobileMeServerError:\n            return \"A MobileMe server error occurred.\"\n        case .mobileMeServerNotAvailable:\n            return \"The MobileMe server is not available.\"\n        case .mobileMeServerAlreadyExists:\n            return \"The MobileMe server reported that the item already exists.\"\n        case .mobileMeServerServiceErr:\n            return \"A MobileMe service error has occurred.\"\n        case .mobileMeRequestAlreadyPending:\n            return \"A MobileMe request is already pending.\"\n        case .mobileMeNoRequestPending:\n            return \"MobileMe has no request pending.\"\n        case .mobileMeCSRVerifyFailure:\n            return \"A MobileMe CSR verification failure has occurred.\"\n        case .mobileMeFailedConsistencyCheck:\n            return \"MobileMe has found a failed consistency check.\"\n        case .notInitialized:\n            return \"A function was called without initializing CSSM.\"\n        case .invalidHandleUsage:\n            return \"The CSSM handle does not match with the service type.\"\n        case .pvcReferentNotFound:\n            return \"A reference to the calling module was not found in the list of authorized callers.\"\n        case .functionIntegrityFail:\n            return \"A function address was not within the verified module.\"\n        case .internalError:\n            return \"An internal error has occurred.\"\n        case .memoryError:\n            return \"A memory error has occurred.\"\n        case .invalidData:\n            return \"Invalid data was encountered.\"\n        case .mdsError:\n            return \"A Module Directory Service error has occurred.\"\n        case .invalidPointer:\n            return \"An invalid pointer was encountered.\"\n        case .selfCheckFailed:\n            return \"Self-check has failed.\"\n        case .functionFailed:\n            return \"A function has failed.\"\n        case .moduleManifestVerifyFailed:\n            return \"A module manifest verification failure has occurred.\"\n        case .invalidGUID:\n            return \"An invalid GUID was encountered.\"\n        case .invalidHandle:\n            return \"An invalid handle was encountered.\"\n        case .invalidDBList:\n            return \"An invalid DB list was encountered.\"\n        case .invalidPassthroughID:\n            return \"An invalid passthrough ID was encountered.\"\n        case .invalidNetworkAddress:\n            return \"An invalid network address was encountered.\"\n        case .crlAlreadySigned:\n            return \"The certificate revocation list is already signed.\"\n        case .invalidNumberOfFields:\n            return \"An invalid number of fields were encountered.\"\n        case .verificationFailure:\n            return \"A verification failure occurred.\"\n        case .unknownTag:\n            return \"An unknown tag was encountered.\"\n        case .invalidSignature:\n            return \"An invalid signature was encountered.\"\n        case .invalidName:\n            return \"An invalid name was encountered.\"\n        case .invalidCertificateRef:\n            return \"An invalid certificate reference was encountered.\"\n        case .invalidCertificateGroup:\n            return \"An invalid certificate group was encountered.\"\n        case .tagNotFound:\n            return \"The specified tag was not found.\"\n        case .invalidQuery:\n            return \"The specified query was not valid.\"\n        case .invalidValue:\n            return \"An invalid value was detected.\"\n        case .callbackFailed:\n            return \"A callback has failed.\"\n        case .aclDeleteFailed:\n            return \"An ACL delete operation has failed.\"\n        case .aclReplaceFailed:\n            return \"An ACL replace operation has failed.\"\n        case .aclAddFailed:\n            return \"An ACL add operation has failed.\"\n        case .aclChangeFailed:\n            return \"An ACL change operation has failed.\"\n        case .invalidAccessCredentials:\n            return \"Invalid access credentials were encountered.\"\n        case .invalidRecord:\n            return \"An invalid record was encountered.\"\n        case .invalidACL:\n            return \"An invalid ACL was encountered.\"\n        case .invalidSampleValue:\n            return \"An invalid sample value was encountered.\"\n        case .incompatibleVersion:\n            return \"An incompatible version was encountered.\"\n        case .privilegeNotGranted:\n            return \"The privilege was not granted.\"\n        case .invalidScope:\n            return \"An invalid scope was encountered.\"\n        case .pvcAlreadyConfigured:\n            return \"The PVC is already configured.\"\n        case .invalidPVC:\n            return \"An invalid PVC was encountered.\"\n        case .emmLoadFailed:\n            return \"The EMM load has failed.\"\n        case .emmUnloadFailed:\n            return \"The EMM unload has failed.\"\n        case .addinLoadFailed:\n            return \"The add-in load operation has failed.\"\n        case .invalidKeyRef:\n            return \"An invalid key was encountered.\"\n        case .invalidKeyHierarchy:\n            return \"An invalid key hierarchy was encountered.\"\n        case .addinUnloadFailed:\n            return \"The add-in unload operation has failed.\"\n        case .libraryReferenceNotFound:\n            return \"A library reference was not found.\"\n        case .invalidAddinFunctionTable:\n            return \"An invalid add-in function table was encountered.\"\n        case .invalidServiceMask:\n            return \"An invalid service mask was encountered.\"\n        case .moduleNotLoaded:\n            return \"A module was not loaded.\"\n        case .invalidSubServiceID:\n            return \"An invalid subservice ID was encountered.\"\n        case .attributeNotInContext:\n            return \"An attribute was not in the context.\"\n        case .moduleManagerInitializeFailed:\n            return \"A module failed to initialize.\"\n        case .moduleManagerNotFound:\n            return \"A module was not found.\"\n        case .eventNotificationCallbackNotFound:\n            return \"An event notification callback was not found.\"\n        case .inputLengthError:\n            return \"An input length error was encountered.\"\n        case .outputLengthError:\n            return \"An output length error was encountered.\"\n        case .privilegeNotSupported:\n            return \"The privilege is not supported.\"\n        case .deviceError:\n            return \"A device error was encountered.\"\n        case .attachHandleBusy:\n            return \"The CSP handle was busy.\"\n        case .notLoggedIn:\n            return \"You are not logged in.\"\n        case .algorithmMismatch:\n            return \"An algorithm mismatch was encountered.\"\n        case .keyUsageIncorrect:\n            return \"The key usage is incorrect.\"\n        case .keyBlobTypeIncorrect:\n            return \"The key blob type is incorrect.\"\n        case .keyHeaderInconsistent:\n            return \"The key header is inconsistent.\"\n        case .unsupportedKeyFormat:\n            return \"The key header format is not supported.\"\n        case .unsupportedKeySize:\n            return \"The key size is not supported.\"\n        case .invalidKeyUsageMask:\n            return \"The key usage mask is not valid.\"\n        case .unsupportedKeyUsageMask:\n            return \"The key usage mask is not supported.\"\n        case .invalidKeyAttributeMask:\n            return \"The key attribute mask is not valid.\"\n        case .unsupportedKeyAttributeMask:\n            return \"The key attribute mask is not supported.\"\n        case .invalidKeyLabel:\n            return \"The key label is not valid.\"\n        case .unsupportedKeyLabel:\n            return \"The key label is not supported.\"\n        case .invalidKeyFormat:\n            return \"The key format is not valid.\"\n        case .unsupportedVectorOfBuffers:\n            return \"The vector of buffers is not supported.\"\n        case .invalidInputVector:\n            return \"The input vector is not valid.\"\n        case .invalidOutputVector:\n            return \"The output vector is not valid.\"\n        case .invalidContext:\n            return \"An invalid context was encountered.\"\n        case .invalidAlgorithm:\n            return \"An invalid algorithm was encountered.\"\n        case .invalidAttributeKey:\n            return \"A key attribute was not valid.\"\n        case .missingAttributeKey:\n            return \"A key attribute was missing.\"\n        case .invalidAttributeInitVector:\n            return \"An init vector attribute was not valid.\"\n        case .missingAttributeInitVector:\n            return \"An init vector attribute was missing.\"\n        case .invalidAttributeSalt:\n            return \"A salt attribute was not valid.\"\n        case .missingAttributeSalt:\n            return \"A salt attribute was missing.\"\n        case .invalidAttributePadding:\n            return \"A padding attribute was not valid.\"\n        case .missingAttributePadding:\n            return \"A padding attribute was missing.\"\n        case .invalidAttributeRandom:\n            return \"A random number attribute was not valid.\"\n        case .missingAttributeRandom:\n            return \"A random number attribute was missing.\"\n        case .invalidAttributeSeed:\n            return \"A seed attribute was not valid.\"\n        case .missingAttributeSeed:\n            return \"A seed attribute was missing.\"\n        case .invalidAttributePassphrase:\n            return \"A passphrase attribute was not valid.\"\n        case .missingAttributePassphrase:\n            return \"A passphrase attribute was missing.\"\n        case .invalidAttributeKeyLength:\n            return \"A key length attribute was not valid.\"\n        case .missingAttributeKeyLength:\n            return \"A key length attribute was missing.\"\n        case .invalidAttributeBlockSize:\n            return \"A block size attribute was not valid.\"\n        case .missingAttributeBlockSize:\n            return \"A block size attribute was missing.\"\n        case .invalidAttributeOutputSize:\n            return \"An output size attribute was not valid.\"\n        case .missingAttributeOutputSize:\n            return \"An output size attribute was missing.\"\n        case .invalidAttributeRounds:\n            return \"The number of rounds attribute was not valid.\"\n        case .missingAttributeRounds:\n            return \"The number of rounds attribute was missing.\"\n        case .invalidAlgorithmParms:\n            return \"An algorithm parameters attribute was not valid.\"\n        case .missingAlgorithmParms:\n            return \"An algorithm parameters attribute was missing.\"\n        case .invalidAttributeLabel:\n            return \"A label attribute was not valid.\"\n        case .missingAttributeLabel:\n            return \"A label attribute was missing.\"\n        case .invalidAttributeKeyType:\n            return \"A key type attribute was not valid.\"\n        case .missingAttributeKeyType:\n            return \"A key type attribute was missing.\"\n        case .invalidAttributeMode:\n            return \"A mode attribute was not valid.\"\n        case .missingAttributeMode:\n            return \"A mode attribute was missing.\"\n        case .invalidAttributeEffectiveBits:\n            return \"An effective bits attribute was not valid.\"\n        case .missingAttributeEffectiveBits:\n            return \"An effective bits attribute was missing.\"\n        case .invalidAttributeStartDate:\n            return \"A start date attribute was not valid.\"\n        case .missingAttributeStartDate:\n            return \"A start date attribute was missing.\"\n        case .invalidAttributeEndDate:\n            return \"An end date attribute was not valid.\"\n        case .missingAttributeEndDate:\n            return \"An end date attribute was missing.\"\n        case .invalidAttributeVersion:\n            return \"A version attribute was not valid.\"\n        case .missingAttributeVersion:\n            return \"A version attribute was missing.\"\n        case .invalidAttributePrime:\n            return \"A prime attribute was not valid.\"\n        case .missingAttributePrime:\n            return \"A prime attribute was missing.\"\n        case .invalidAttributeBase:\n            return \"A base attribute was not valid.\"\n        case .missingAttributeBase:\n            return \"A base attribute was missing.\"\n        case .invalidAttributeSubprime:\n            return \"A subprime attribute was not valid.\"\n        case .missingAttributeSubprime:\n            return \"A subprime attribute was missing.\"\n        case .invalidAttributeIterationCount:\n            return \"An iteration count attribute was not valid.\"\n        case .missingAttributeIterationCount:\n            return \"An iteration count attribute was missing.\"\n        case .invalidAttributeDLDBHandle:\n            return \"A database handle attribute was not valid.\"\n        case .missingAttributeDLDBHandle:\n            return \"A database handle attribute was missing.\"\n        case .invalidAttributeAccessCredentials:\n            return \"An access credentials attribute was not valid.\"\n        case .missingAttributeAccessCredentials:\n            return \"An access credentials attribute was missing.\"\n        case .invalidAttributePublicKeyFormat:\n            return \"A public key format attribute was not valid.\"\n        case .missingAttributePublicKeyFormat:\n            return \"A public key format attribute was missing.\"\n        case .invalidAttributePrivateKeyFormat:\n            return \"A private key format attribute was not valid.\"\n        case .missingAttributePrivateKeyFormat:\n            return \"A private key format attribute was missing.\"\n        case .invalidAttributeSymmetricKeyFormat:\n            return \"A symmetric key format attribute was not valid.\"\n        case .missingAttributeSymmetricKeyFormat:\n            return \"A symmetric key format attribute was missing.\"\n        case .invalidAttributeWrappedKeyFormat:\n            return \"A wrapped key format attribute was not valid.\"\n        case .missingAttributeWrappedKeyFormat:\n            return \"A wrapped key format attribute was missing.\"\n        case .stagedOperationInProgress:\n            return \"A staged operation is in progress.\"\n        case .stagedOperationNotStarted:\n            return \"A staged operation was not started.\"\n        case .verifyFailed:\n            return \"A cryptographic verification failure has occurred.\"\n        case .querySizeUnknown:\n            return \"The query size is unknown.\"\n        case .blockSizeMismatch:\n            return \"A block size mismatch occurred.\"\n        case .publicKeyInconsistent:\n            return \"The public key was inconsistent.\"\n        case .deviceVerifyFailed:\n            return \"A device verification failure has occurred.\"\n        case .invalidLoginName:\n            return \"An invalid login name was detected.\"\n        case .alreadyLoggedIn:\n            return \"The user is already logged in.\"\n        case .invalidDigestAlgorithm:\n            return \"An invalid digest algorithm was detected.\"\n        case .invalidCRLGroup:\n            return \"An invalid CRL group was detected.\"\n        case .certificateCannotOperate:\n            return \"The certificate cannot operate.\"\n        case .certificateExpired:\n            return \"An expired certificate was detected.\"\n        case .certificateNotValidYet:\n            return \"The certificate is not yet valid.\"\n        case .certificateRevoked:\n            return \"The certificate was revoked.\"\n        case .certificateSuspended:\n            return \"The certificate was suspended.\"\n        case .insufficientCredentials:\n            return \"Insufficient credentials were detected.\"\n        case .invalidAction:\n            return \"The action was not valid.\"\n        case .invalidAuthority:\n            return \"The authority was not valid.\"\n        case .verifyActionFailed:\n            return \"A verify action has failed.\"\n        case .invalidCertAuthority:\n            return \"The certificate authority was not valid.\"\n        case .invaldCRLAuthority:\n            return \"The CRL authority was not valid.\"\n        case .invalidCRLEncoding:\n            return \"The CRL encoding was not valid.\"\n        case .invalidCRLType:\n            return \"The CRL type was not valid.\"\n        case .invalidCRL:\n            return \"The CRL was not valid.\"\n        case .invalidFormType:\n            return \"The form type was not valid.\"\n        case .invalidID:\n            return \"The ID was not valid.\"\n        case .invalidIdentifier:\n            return \"The identifier was not valid.\"\n        case .invalidIndex:\n            return \"The index was not valid.\"\n        case .invalidPolicyIdentifiers:\n            return \"The policy identifiers are not valid.\"\n        case .invalidTimeString:\n            return \"The time specified was not valid.\"\n        case .invalidReason:\n            return \"The trust policy reason was not valid.\"\n        case .invalidRequestInputs:\n            return \"The request inputs are not valid.\"\n        case .invalidResponseVector:\n            return \"The response vector was not valid.\"\n        case .invalidStopOnPolicy:\n            return \"The stop-on policy was not valid.\"\n        case .invalidTuple:\n            return \"The tuple was not valid.\"\n        case .multipleValuesUnsupported:\n            return \"Multiple values are not supported.\"\n        case .notTrusted:\n            return \"The trust policy was not trusted.\"\n        case .noDefaultAuthority:\n            return \"No default authority was detected.\"\n        case .rejectedForm:\n            return \"The trust policy had a rejected form.\"\n        case .requestLost:\n            return \"The request was lost.\"\n        case .requestRejected:\n            return \"The request was rejected.\"\n        case .unsupportedAddressType:\n            return \"The address type is not supported.\"\n        case .unsupportedService:\n            return \"The service is not supported.\"\n        case .invalidTupleGroup:\n            return \"The tuple group was not valid.\"\n        case .invalidBaseACLs:\n            return \"The base ACLs are not valid.\"\n        case .invalidTupleCredendtials:\n            return \"The tuple credentials are not valid.\"\n        case .invalidEncoding:\n            return \"The encoding was not valid.\"\n        case .invalidValidityPeriod:\n            return \"The validity period was not valid.\"\n        case .invalidRequestor:\n            return \"The requestor was not valid.\"\n        case .requestDescriptor:\n            return \"The request descriptor was not valid.\"\n        case .invalidBundleInfo:\n            return \"The bundle information was not valid.\"\n        case .invalidCRLIndex:\n            return \"The CRL index was not valid.\"\n        case .noFieldValues:\n            return \"No field values were detected.\"\n        case .unsupportedFieldFormat:\n            return \"The field format is not supported.\"\n        case .unsupportedIndexInfo:\n            return \"The index information is not supported.\"\n        case .unsupportedLocality:\n            return \"The locality is not supported.\"\n        case .unsupportedNumAttributes:\n            return \"The number of attributes is not supported.\"\n        case .unsupportedNumIndexes:\n            return \"The number of indexes is not supported.\"\n        case .unsupportedNumRecordTypes:\n            return \"The number of record types is not supported.\"\n        case .fieldSpecifiedMultiple:\n            return \"Too many fields were specified.\"\n        case .incompatibleFieldFormat:\n            return \"The field format was incompatible.\"\n        case .invalidParsingModule:\n            return \"The parsing module was not valid.\"\n        case .databaseLocked:\n            return \"The database is locked.\"\n        case .datastoreIsOpen:\n            return \"The data store is open.\"\n        case .missingValue:\n            return \"A missing value was detected.\"\n        case .unsupportedQueryLimits:\n            return \"The query limits are not supported.\"\n        case .unsupportedNumSelectionPreds:\n            return \"The number of selection predicates is not supported.\"\n        case .unsupportedOperator:\n            return \"The operator is not supported.\"\n        case .invalidDBLocation:\n            return \"The database location is not valid.\"\n        case .invalidAccessRequest:\n            return \"The access request is not valid.\"\n        case .invalidIndexInfo:\n            return \"The index information is not valid.\"\n        case .invalidNewOwner:\n            return \"The new owner is not valid.\"\n        case .invalidModifyMode:\n            return \"The modify mode is not valid.\"\n        case .missingRequiredExtension:\n            return \"A required certificate extension is missing.\"\n        case .extendedKeyUsageNotCritical:\n            return \"The extended key usage extension was not marked critical.\"\n        case .timestampMissing:\n            return \"A timestamp was expected but was not found.\"\n        case .timestampInvalid:\n            return \"The timestamp was not valid.\"\n        case .timestampNotTrusted:\n            return \"The timestamp was not trusted.\"\n        case .timestampServiceNotAvailable:\n            return \"The timestamp service is not available.\"\n        case .timestampBadAlg:\n            return \"An unrecognized or unsupported Algorithm Identifier in timestamp.\"\n        case .timestampBadRequest:\n            return \"The timestamp transaction is not permitted or supported.\"\n        case .timestampBadDataFormat:\n            return \"The timestamp data submitted has the wrong format.\"\n        case .timestampTimeNotAvailable:\n            return \"The time source for the Timestamp Authority is not available.\"\n        case .timestampUnacceptedPolicy:\n            return \"The requested policy is not supported by the Timestamp Authority.\"\n        case .timestampUnacceptedExtension:\n            return \"The requested extension is not supported by the Timestamp Authority.\"\n        case .timestampAddInfoNotAvailable:\n            return \"The additional information requested is not available.\"\n        case .timestampSystemFailure:\n            return \"The timestamp request cannot be handled due to system failure.\"\n        case .signingTimeMissing:\n            return \"A signing time was expected but was not found.\"\n        case .timestampRejection:\n            return \"A timestamp transaction was rejected.\"\n        case .timestampWaiting:\n            return \"A timestamp transaction is waiting.\"\n        case .timestampRevocationWarning:\n            return \"A timestamp authority revocation warning was issued.\"\n        case .timestampRevocationNotification:\n            return \"A timestamp authority revocation notification was issued.\"\n        case .unexpectedError:\n            return \"Unexpected error has occurred.\"\n        }\n    }\n}\n\nextension Status: CustomNSError {\n    public static let errorDomain = KeychainAccessErrorDomain\n\n    public var errorCode: Int {\n        return Int(rawValue)\n    }\n\n    public var errorUserInfo: [String : Any] {\n        return [NSLocalizedDescriptionKey: description]\n    }\n}\n"
  },
  {
    "path": "External/SymbolPicker/.gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)\n*.xcscmblueprint\n*.xccheckout\n\n## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)\nbuild/\nDerivedData/\n*.moved-aside\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n# *.xcodeproj\n#\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n# .swiftpm\n\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n#\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build/\n\n# Accio dependency management\nDependencies/\n.accio/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n\n.swiftpm/\n.DS_Store\n"
  },
  {
    "path": "External/SymbolPicker/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Yubo Qin & Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "External/SymbolPicker/Package.swift",
    "content": "// swift-tools-version:5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"SymbolPicker\",\n    defaultLocalization: \"en\",\n    platforms: [\n        .iOS(.v14),\n        .macOS(.v12),\n        .tvOS(.v15),\n        .watchOS(.v8),\n    ],\n    products: [\n        .library(\n            name: \"SymbolPicker\",\n            targets: [\"SymbolPicker\"]\n        ),\n    ],\n    dependencies: [\n    ],\n    targets: [\n        .target(\n            name: \"SymbolPicker\",\n            dependencies: [],\n            path: \"Sources/SymbolPicker\",\n            resources: [\n                .process(\"Resources\"),\n            ]\n        ),\n    ]\n)\n"
  },
  {
    "path": "External/SymbolPicker/README.md",
    "content": "# SymbolPicker\n\nA simple and cross-platform SFSymbol picker for SwiftUI\n\n![](https://img.shields.io/badge/License-MIT-green)\n![](https://img.shields.io/badge/Platform-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS-blue)\n\n## Features\n\nSymbolPicker provides a simple and cross-platform interface for picking a SFSymbol with search functionality that is backported to iOS 14. SymbolPicker is implemented with SwiftUI and supports iOS, macOS, tvOS and watchOS platforms.\n\n![](/Screenshots/demo.png)\n\n## Usage\n\n### Requirements\n\n* iOS 14.0+ / macOS 12.0+ / tvOS 15.0+ / watchOS 8.0+\n* Xcode 13.0+\n* Swift 5.0+\n\n### Installation\n\nSymbolPicker is available as a Swift Package. Add this repo to your project through Xcode GUI or `Package.swift`.\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/xnth97/SymbolPicker.git\", .upToNextMajor(from: \"1.1.0\"))\n]\n```\n\n### Example\n\nIt is suggested to use SymbolPicker within a `sheet`.\n\n```swift\nimport SwiftUI\nimport SymbolPicker\n\nstruct ContentView: View {\n    @State private var iconPickerPresented = false\n    @State private var icon = \"pencil\"\n\n    var body: some View {\n        Button(action: {\n            iconPickerPresented = true\n        }) {\n            HStack {\n                Image(systemName: icon)\n                Text(icon)\n            }\n        }\n        .sheet(isPresented: $iconPickerPresented) {\n            SymbolPicker(symbol: $icon)\n        }\n    }\n}\n```\n\n## TODO\n\n- [ ] Categories support\n- [x] Multiplatform support\n- [ ] Inline UI\n- [ ] Codegen from latest SF Symbols\n\n## License\n\nSymbolPicker is available under the MIT license. See the [LICENSE](LICENSE) file for more info.\n"
  },
  {
    "path": "External/SymbolPicker/Sources/SymbolPicker/Resources/en.lproj/Localizable.strings",
    "content": "\"search_placeholder\" = \"Search\";\n\"cancel\" = \"Cancel\";\n\"sf_symbol_picker\" = \"Select a symbol\";\n\"done\" = \"Done\";\n"
  },
  {
    "path": "External/SymbolPicker/Sources/SymbolPicker/Resources/sfsymbols.txt",
    "content": "square.and.arrow.up\nsquare.and.arrow.up.fill\nsquare.and.arrow.up.circle\nsquare.and.arrow.up.circle.fill\nsquare.and.arrow.up.trianglebadge.exclamationmark\nsquare.and.arrow.down\nsquare.and.arrow.down.fill\nsquare.and.arrow.up.on.square\nsquare.and.arrow.up.on.square.fill\nsquare.and.arrow.down.on.square\nsquare.and.arrow.down.on.square.fill\nrectangle.portrait.and.arrow.right\nrectangle.portrait.and.arrow.right.fill\npencil\npencil.circle\npencil.circle.fill\npencil.slash\nsquare.and.pencil\nrectangle.and.pencil.and.ellipsis\nscribble\nscribble.variable\nhighlighter\npencil.and.outline\npencil.tip\npencil.tip.crop.circle\npencil.tip.crop.circle.badge.plus\npencil.tip.crop.circle.badge.minus\npencil.tip.crop.circle.badge.arrow.forward\nlasso\nlasso.and.sparkles\ntrash\ntrash.fill\ntrash.circle\ntrash.circle.fill\ntrash.square\ntrash.square.fill\ntrash.slash\ntrash.slash.fill\ntrash.slash.circle\ntrash.slash.circle.fill\ntrash.slash.square\ntrash.slash.square.fill\nfolder\nfolder.fill\nfolder.circle\nfolder.circle.fill\nfolder.badge.plus\nfolder.fill.badge.plus\nfolder.badge.minus\nfolder.fill.badge.minus\nfolder.badge.questionmark\nfolder.fill.badge.questionmark\nfolder.badge.person.crop\nfolder.fill.badge.person.crop\nsquare.grid.3x1.folder.badge.plus\nsquare.grid.3x1.folder.fill.badge.plus\nfolder.badge.gearshape\nfolder.fill.badge.gearshape\nplus.rectangle.on.folder\nplus.rectangle.on.folder.fill\nquestionmark.folder\nquestionmark.folder.fill\npaperplane\npaperplane.fill\npaperplane.circle\npaperplane.circle.fill\ntray\ntray.fill\ntray.circle\ntray.circle.fill\ntray.and.arrow.up\ntray.and.arrow.up.fill\ntray.and.arrow.down\ntray.and.arrow.down.fill\ntray.2\ntray.2.fill\ntray.full\ntray.full.fill\nexternaldrive\nexternaldrive.fill\nexternaldrive.badge.plus\nexternaldrive.fill.badge.plus\nexternaldrive.badge.minus\nexternaldrive.fill.badge.minus\nexternaldrive.badge.checkmark\nexternaldrive.fill.badge.checkmark\nexternaldrive.badge.xmark\nexternaldrive.fill.badge.xmark\nexternaldrive.badge.person.crop\nexternaldrive.fill.badge.person.crop\nexternaldrive.badge.icloud\nexternaldrive.fill.badge.icloud\nexternaldrive.badge.wifi\nexternaldrive.fill.badge.wifi\nexternaldrive.badge.timemachine\nexternaldrive.fill.badge.timemachine\ninternaldrive\ninternaldrive.fill\nopticaldiscdrive\nopticaldiscdrive.fill\nexternaldrive.connected.to.line.below\nexternaldrive.connected.to.line.below.fill\narchivebox\narchivebox.fill\narchivebox.circle\narchivebox.circle.fill\nxmark.bin\nxmark.bin.fill\nxmark.bin.circle\nxmark.bin.circle.fill\narrow.up.bin\narrow.up.bin.fill\ndoc\ndoc.fill\ndoc.circle\ndoc.circle.fill\ndoc.badge.plus\ndoc.fill.badge.plus\ndoc.badge.gearshape\ndoc.badge.gearshape.fill\ndoc.badge.ellipsis\ndoc.fill.badge.ellipsis\nlock.doc\nlock.doc.fill\narrow.up.doc\narrow.up.doc.fill\narrow.down.doc\narrow.down.doc.fill\ndoc.text\ndoc.text.fill\ndoc.zipper\ndoc.on.doc\ndoc.on.doc.fill\ndoc.on.clipboard\narrow.right.doc.on.clipboard\narrow.up.doc.on.clipboard\narrow.triangle.2.circlepath.doc.on.clipboard\ndoc.on.clipboard.fill\ndoc.richtext\ndoc.richtext.fill\ndoc.plaintext\ndoc.plaintext.fill\ndoc.append\ndoc.append.fill\ndoc.text.below.ecg\ndoc.text.below.ecg.fill\nchart.bar.doc.horizontal\nchart.bar.doc.horizontal.fill\nlist.bullet.rectangle.portrait\nlist.bullet.rectangle.portrait.fill\ndoc.text.magnifyingglass\nlist.bullet.rectangle\nlist.bullet.rectangle.fill\nlist.dash.header.rectangle\nterminal\nterminal.fill\nnote\nnote.text\nnote.text.badge.plus\ncalendar\ncalendar.circle\ncalendar.circle.fill\ncalendar.badge.plus\ncalendar.badge.minus\ncalendar.badge.clock\ncalendar.badge.exclamationmark\ncalendar.day.timeline.left\ncalendar.day.timeline.right\ncalendar.day.timeline.leading\ncalendar.day.timeline.trailing\narrowshape.turn.up.left\narrowshape.turn.up.left.fill\narrowshape.turn.up.left.circle\narrowshape.turn.up.left.circle.fill\narrowshape.turn.up.backward\narrowshape.turn.up.backward.fill\narrowshape.turn.up.backward.circle\narrowshape.turn.up.backward.circle.fill\narrowshape.turn.up.right\narrowshape.turn.up.right.fill\narrowshape.turn.up.right.circle\narrowshape.turn.up.right.circle.fill\narrowshape.turn.up.forward\narrowshape.turn.up.forward.fill\narrowshape.turn.up.forward.circle\narrowshape.turn.up.forward.circle.fill\narrowshape.turn.up.left.2\narrowshape.turn.up.left.2.fill\narrowshape.turn.up.left.2.circle\narrowshape.turn.up.left.2.circle.fill\narrowshape.turn.up.backward.2\narrowshape.turn.up.backward.2.fill\narrowshape.turn.up.backward.2.circle\narrowshape.turn.up.backward.2.circle.fill\narrowshape.zigzag.right\narrowshape.zigzag.right.fill\narrowshape.zigzag.forward\narrowshape.zigzag.forward.fill\narrowshape.bounce.right\narrowshape.bounce.right.fill\narrowshape.bounce.forward\narrowshape.bounce.forward.fill\nbook\nbook.fill\nbook.circle\nbook.circle.fill\nbooks.vertical\nbooks.vertical.fill\nbooks.vertical.circle\nbooks.vertical.circle.fill\nbook.closed\nbook.closed.fill\nbook.closed.circle\nbook.closed.circle.fill\ncharacter.book.closed\ncharacter.book.closed.fill\ntext.book.closed\ntext.book.closed.fill\nmenucard\nmenucard.fill\ngreetingcard\ngreetingcard.fill\nmagazine\nmagazine.fill\nnewspaper\nnewspaper.fill\nnewspaper.circle\nnewspaper.circle.fill\nheart.text.square\nheart.text.square.fill\nsquare.text.square\nsquare.text.square.fill\ndoc.text.image\ndoc.text.image.fill\nbookmark\nbookmark.fill\nbookmark.circle\nbookmark.circle.fill\nbookmark.square\nbookmark.square.fill\nbookmark.slash\nbookmark.slash.fill\nrosette\ngraduationcap\ngraduationcap.fill\ngraduationcap.circle\ngraduationcap.circle.fill\nticket\nticket.fill\npaperclip\npaperclip.circle\npaperclip.circle.fill\npaperclip.badge.ellipsis\nrectangle.and.paperclip\nrectangle.dashed.and.paperclip\nlink\nlink.circle\nlink.circle.fill\nlink.badge.plus\npersonalhotspot\npersonalhotspot.circle\npersonalhotspot.circle.fill\nlineweight\nperson\nperson.fill\nperson.fill.turn.right\nperson.fill.turn.down\nperson.fill.turn.left\nperson.fill.checkmark\nperson.fill.xmark\nperson.fill.questionmark\nperson.circle\nperson.circle.fill\nperson.badge.plus\nperson.fill.badge.plus\nperson.badge.minus\nperson.fill.badge.minus\nperson.badge.clock\nperson.badge.clock.fill\nshareplay\nshareplay.slash\nrectangle.inset.filled.and.person.filled\nperson.and.arrow.left.and.arrow.right\nperson.fill.and.arrow.left.and.arrow.right\nperson.2\nperson.2.fill\nperson.2.circle\nperson.2.circle.fill\nperson.wave.2\nperson.wave.2.fill\nperson.2.wave.2\nperson.2.wave.2.fill\nperson.3\nperson.3.fill\nperson.3.sequence\nperson.3.sequence.fill\nlanyardcard\nlanyardcard.fill\nperson.crop.circle\nperson.crop.circle.fill\nperson.crop.circle.badge.plus\nperson.crop.circle.fill.badge.plus\nperson.crop.circle.badge.minus\nperson.crop.circle.fill.badge.minus\nperson.crop.circle.badge.checkmark\nperson.crop.circle.fill.badge.checkmark\nperson.crop.circle.badge.xmark\nperson.crop.circle.fill.badge.xmark\nperson.crop.circle.badge.questionmark\nperson.crop.circle.badge.questionmark.fill\nperson.crop.circle.badge.exclamationmark\nperson.crop.circle.badge.exclamationmark.fill\nperson.crop.circle.badge.moon\nperson.crop.circle.badge.moon.fill\nperson.crop.circle.badge.clock\nperson.crop.circle.badge.clock.fill\nperson.crop.circle.badge\nperson.crop.circle.badge.fill\nperson.crop.square\nperson.crop.square.fill\nperson.crop.artframe\nphoto.artframe\nperson.crop.rectangle.stack\nperson.crop.rectangle.stack.fill\nperson.2.crop.square.stack\nperson.2.crop.square.stack.fill\nperson.crop.rectangle\nperson.crop.rectangle.fill\narrow.up.and.person.rectangle.portrait\narrow.up.and.person.rectangle.turn.right\narrow.up.and.person.rectangle.turn.left\nperson.crop.square.filled.and.at.rectangle\nperson.crop.square.filled.and.at.rectangle.fill\nsquare.and.at.rectangle\nsquare.and.at.rectangle.fill\nperson.text.rectangle\nperson.text.rectangle.fill\ncommand\ncommand.circle\ncommand.circle.fill\ncommand.square\ncommand.square.fill\noption\nalt\nclear\nclear.fill\ndelete.left\ndelete.left.fill\ndelete.backward\ndelete.backward.fill\ndelete.right\ndelete.right.fill\ndelete.forward\ndelete.forward.fill\nshift\nshift.fill\ncapslock\ncapslock.fill\nescape\nrestart\nrestart.circle\nrestart.circle.fill\nsleep\nsleep.circle\nsleep.circle.fill\nwake\nwake.circle\nwake.circle.fill\npower\npower.circle\npower.circle.fill\npower.dotted\ntogglepower\npoweron\npoweroff\npowersleep\ndirectcurrent\nalternatingcurrent\npeacesign\ndot.arrowtriangles.up.right.down.left.circle\nglobe\nglobe.badge.chevron.backward\nnetwork\nnetwork.badge.shield.half.filled\nglobe.americas\nglobe.americas.fill\nglobe.europe.africa\nglobe.europe.africa.fill\nglobe.asia.australia\nglobe.asia.australia.fill\nsun.min\nsun.min.fill\nsun.max\nsun.max.fill\nsun.max.circle\nsun.max.circle.fill\nsunrise\nsunrise.fill\nsunset\nsunset.fill\nsun.and.horizon\nsun.and.horizon.fill\nsun.dust\nsun.dust.fill\nsun.haze\nsun.haze.fill\nmoon\nmoon.fill\nmoon.circle\nmoon.circle.fill\nzzz\nmoon.zzz\nmoon.zzz.fill\nsparkle\nsparkles\nmoon.stars\nmoon.stars.fill\ncloud\ncloud.fill\ncloud.drizzle\ncloud.drizzle.fill\ncloud.rain\ncloud.rain.fill\ncloud.heavyrain\ncloud.heavyrain.fill\ncloud.fog\ncloud.fog.fill\ncloud.hail\ncloud.hail.fill\ncloud.snow\ncloud.snow.fill\ncloud.sleet\ncloud.sleet.fill\ncloud.bolt\ncloud.bolt.fill\ncloud.bolt.rain\ncloud.bolt.rain.fill\ncloud.sun\ncloud.sun.fill\ncloud.sun.rain\ncloud.sun.rain.fill\ncloud.sun.bolt\ncloud.sun.bolt.fill\ncloud.moon\ncloud.moon.fill\ncloud.moon.rain\ncloud.moon.rain.fill\ncloud.moon.bolt\ncloud.moon.bolt.fill\nsmoke\nsmoke.fill\nwind\nwind.snow\nsnowflake\nsnowflake.circle\nsnowflake.circle.fill\ntornado\ntropicalstorm\nhurricane\nthermometer.sun\nthermometer.sun.fill\nthermometer.snowflake\nthermometer\naqi.low\naqi.medium\naqi.high\nhumidity\nhumidity.fill\numbrella\numbrella.fill\nflame\nflame.fill\nflame.circle\nflame.circle.fill\nlight.min\nlight.max\nrays\nslowmo\ntimelapse\ncursorarrow.rays\ncursorarrow\ncursorarrow.square\ncursorarrow.and.square.on.square.dashed\ncursorarrow.click\ncursorarrow.click.2\ncontextualmenu.and.cursorarrow\nfilemenu.and.cursorarrow\nfilemenu.and.selection\ndot.circle.and.hand.point.up.left.fill\ndot.circle.and.cursorarrow\ncursorarrow.motionlines\ncursorarrow.motionlines.click\ncursorarrow.click.badge.clock\nkeyboard\nkeyboard.fill\nkeyboard.badge.ellipsis\nkeyboard.chevron.compact.down\nkeyboard.chevron.compact.left\nkeyboard.onehanded.left\nkeyboard.onehanded.right\nrectangle.3.group\nrectangle.3.group.fill\nsquare.grid.3x2\nsquare.grid.3x2.fill\nrectangle.grid.3x2\nrectangle.grid.3x2.fill\nsquare.grid.2x2\nsquare.grid.2x2.fill\nrectangle.grid.2x2\nrectangle.grid.2x2.fill\nsquare.grid.3x1.below.line.grid.1x2\nsquare.grid.3x1.below.line.grid.1x2.fill\nsquare.grid.4x3.fill\nrectangle.grid.1x2\nrectangle.grid.1x2.fill\ncircle.grid.2x2\ncircle.grid.2x2.fill\ncircle.grid.3x3\ncircle.grid.3x3.fill\ncircle.grid.3x3.circle\ncircle.grid.3x3.circle.fill\nsquare.grid.3x3\nsquare.grid.3x3.fill\nsquare.grid.3x3.topleft.filled\nsquare.grid.3x3.topmiddle.filled\nsquare.grid.3x3.topright.filled\nsquare.grid.3x3.middleleft.filled\nsquare.grid.3x3.middle.filled\nsquare.grid.3x3.middleright.filled\nsquare.grid.3x3.bottomleft.filled\nsquare.grid.3x3.bottommiddle.filled\nsquare.grid.3x3.bottomright.filled\ncircle.hexagongrid\ncircle.hexagongrid.fill\ncircle.hexagongrid.circle\ncircle.hexagongrid.circle.fill\ncircle.hexagonpath\ncircle.hexagonpath.fill\ncircle.grid.cross\ncircle.grid.cross.fill\ncircle.grid.cross.left.filled\ncircle.grid.cross.up.filled\ncircle.grid.cross.right.filled\ncircle.grid.cross.down.filled\nseal\nseal.fill\ncheckmark.seal\ncheckmark.seal.fill\nxmark.seal\nxmark.seal.fill\nexclamationmark.triangle\nexclamationmark.triangle.fill\ndrop\ndrop.fill\ndrop.circle\ndrop.circle.fill\ndrop.triangle\ndrop.triangle.fill\nplay\nplay.fill\nplay.circle\nplay.circle.fill\nplay.square\nplay.square.fill\nplay.rectangle\nplay.rectangle.fill\nplay.slash\nplay.slash.fill\npause\npause.fill\npause.circle\npause.circle.fill\npause.rectangle\npause.rectangle.fill\nstop\nstop.fill\nstop.circle\nstop.circle.fill\nrecord.circle\nrecord.circle.fill\nplaypause\nplaypause.fill\nbackward\nbackward.fill\nbackward.circle\nbackward.circle.fill\nforward\nforward.fill\nforward.circle\nforward.circle.fill\nbackward.end\nbackward.end.fill\nforward.end\nforward.end.fill\nbackward.end.alt\nbackward.end.alt.fill\nforward.end.alt\nforward.end.alt.fill\nbackward.frame\nbackward.frame.fill\nforward.frame\nforward.frame.fill\neject\neject.fill\neject.circle\neject.circle.fill\nmount\nmount.fill\nmemories\nmemories.badge.plus\nmemories.badge.minus\nshuffle\nshuffle.circle\nshuffle.circle.fill\nrepeat\nrepeat.circle\nrepeat.circle.fill\nrepeat.1\nrepeat.1.circle\nrepeat.1.circle.fill\ninfinity\ninfinity.circle\ninfinity.circle.fill\nmegaphone\nmegaphone.fill\nspeaker\nspeaker.fill\nspeaker.circle\nspeaker.circle.fill\nspeaker.slash\nspeaker.slash.fill\nspeaker.slash.circle\nspeaker.slash.circle.fill\nspeaker.zzz\nspeaker.zzz.fill\nspeaker.wave.1\nspeaker.wave.1.fill\nspeaker.wave.2\nspeaker.wave.2.fill\nspeaker.wave.2.circle\nspeaker.wave.2.circle.fill\nspeaker.wave.3\nspeaker.wave.3.fill\nspeaker.badge.exclamationmark\nspeaker.badge.exclamationmark.fill\nbadge.plus.radiowaves.right\nbadge.plus.radiowaves.forward\nmusic.note\nmusic.note.list\nmusic.quarternote.3\nmusic.mic\nmusic.mic.circle\nmusic.mic.circle.fill\narrow.rectanglepath\ngoforward\ngobackward\ngoforward.5\ngobackward.5\ngoforward.10\ngobackward.10\ngoforward.15\ngobackward.15\ngoforward.30\ngobackward.30\ngoforward.45\ngobackward.45\ngoforward.60\ngobackward.60\ngoforward.75\ngobackward.75\ngoforward.90\ngobackward.90\ngoforward.plus\ngobackward.minus\nswift\nmagnifyingglass\nmagnifyingglass.circle\nmagnifyingglass.circle.fill\nplus.magnifyingglass\nminus.magnifyingglass\n1.magnifyingglass\narrow.up.left.and.down.right.magnifyingglass\ntext.magnifyingglass\nsparkle.magnifyingglass\nlocation.magnifyingglass\nloupe\nmic\nmic.fill\nmic.circle\nmic.circle.fill\nmic.square\nmic.square.fill\nmic.slash\nmic.slash.fill\nmic.slash.circle\nmic.slash.circle.fill\nmic.badge.plus\nmic.fill.badge.plus\nline.diagonal\nline.diagonal.arrow\ncircle\ncircle.fill\ncircle.slash\ncircle.slash.fill\ncircle.lefthalf.filled\ncircle.righthalf.filled\ncircle.tophalf.filled\ncircle.bottomhalf.filled\ncircle.inset.filled\nsmallcircle.filled.circle\nsmallcircle.filled.circle.fill\ncircle.dashed\ncircle.dashed.inset.filled\ncircle.dotted\ncirclebadge\ncirclebadge.fill\ncirclebadge.2\ncirclebadge.2.fill\nsmallcircle.circle\nsmallcircle.circle.fill\ntarget\ncapsule\ncapsule.fill\ncapsule.lefthalf.filled\ncapsule.righthalf.filled\ncapsule.tophalf.filled\ncapsule.bottomhalf.filled\ncapsule.inset.filled\ncapsule.portrait\ncapsule.portrait.fill\ncapsule.portrait.lefthalf.filled\ncapsule.portrait.righthalf.filled\ncapsule.portrait.tophalf.filled\ncapsule.portrait.bottomhalf.filled\ncapsule.portrait.inset.filled\noval\noval.fill\noval.lefthalf.filled\noval.righthalf.filled\noval.tophalf.filled\noval.bottomhalf.filled\noval.inset.filled\noval.portrait\noval.portrait.fill\noval.portrait.lefthalf.filled\noval.portrait.righthalf.filled\noval.portrait.tophalf.filled\noval.portrait.bottomhalf.filled\noval.portrait.inset.filled\nplaceholdertext.fill\nsquare\nsquare.fill\nsquare.slash\nsquare.slash.fill\nsquare.lefthalf.filled\nsquare.righthalf.filled\nsquare.tophalf.filled\nsquare.bottomhalf.filled\nsquare.inset.filled\nsquare.split.2x1\nsquare.split.2x1.fill\nsquare.split.1x2\nsquare.split.1x2.fill\nsquare.split.2x2\nsquare.split.2x2.fill\nsquare.split.diagonal.2x2\nsquare.split.diagonal.2x2.fill\nsquare.split.diagonal\nsquare.split.diagonal.fill\ndot.square\ndot.square.fill\ncircle.square\ncircle.square.fill\nsquare.dashed\nsquare.dashed.inset.filled\nplus.square.dashed\nquestionmark.square.dashed\nsquare.on.square\nsquare.fill.on.square.fill\nsquare.filled.on.square\nhand.raised.square.on.square\nhand.raised.square.on.square.fill\nsparkles.square.filled.on.square\nsquare.on.square.dashed\nplus.square.on.square\nplus.square.fill.on.square.fill\nsquare.on.circle\nsquare.fill.on.circle.fill\nr.square.on.square\nr.square.on.square.fill\nj.square.on.square\nj.square.on.square.fill\nh.square.on.square\nh.square.on.square.fill\nsquare.stack\nsquare.stack.fill\nsquareshape\nsquareshape.fill\nsquareshape.dashed.squareshape\nsquareshape.squareshape.dashed\ndot.squareshape\ndot.squareshape.fill\napp\napp.fill\nrectangle\nrectangle.fill\nrectangle.slash\nrectangle.slash.fill\nrectangle.lefthalf.filled\nrectangle.righthalf.filled\nrectangle.leadinghalf.filled\nrectangle.trailinghalf.filled\nrectangle.tophalf.filled\nrectangle.bottomhalf.filled\nrectangle.split.2x1\nrectangle.split.2x1.fill\nrectangle.split.2x1.slash\nrectangle.split.2x1.slash.fill\nrectangle.split.1x2\nrectangle.split.1x2.fill\nrectangle.split.3x1\nrectangle.split.3x1.fill\nrectangle.split.2x2\nrectangle.split.2x2.fill\ntablecells\ntablecells.fill\ntablecells.badge.ellipsis\ntablecells.fill.badge.ellipsis\nrectangle.split.3x3\nrectangle.inset.filled\nrectangle.tophalf.inset.filled\nrectangle.bottomhalf.inset.filled\nrectangle.lefthalf.inset.filled\nrectangle.righthalf.inset.filled\nrectangle.leadinghalf.inset.filled\nrectangle.trailinghalf.inset.filled\nrectangle.lefthalf.inset.filled.arrow.left\nrectangle.righthalf.inset.filled.arrow.right\nrectangle.leadinghalf.inset.filled.arrow.leading\nrectangle.trailinghalf.inset.filled.arrow.trailing\nrectangle.topthird.inset.filled\nrectangle.bottomthird.inset.filled\nrectangle.leftthird.inset.filled\nrectangle.rightthird.inset.filled\nrectangle.leadingthird.inset.filled\nrectangle.trailingthird.inset.filled\nrectangle.center.inset.filled\nrectangle.center.inset.filled.badge.plus\nrectangle.inset.topleft.filled\nrectangle.inset.topright.filled\nrectangle.inset.topleading.filled\nrectangle.inset.toptrailing.filled\nrectangle.inset.bottomleft.filled\nrectangle.inset.bottomright.filled\nrectangle.inset.bottomleading.filled\nrectangle.inset.bottomtrailing.filled\nrectangle.on.rectangle\nrectangle.fill.on.rectangle.fill\nrectangle.on.rectangle.circle\nrectangle.on.rectangle.circle.fill\nrectangle.on.rectangle.square\nrectangle.on.rectangle.square.fill\nrectangle.inset.filled.on.rectangle\nrectangle.on.rectangle.slash\nrectangle.on.rectangle.slash.fill\nrectangle.on.rectangle.slash.circle\nrectangle.on.rectangle.slash.circle.fill\nplay.rectangle.on.rectangle\nplay.rectangle.on.rectangle.fill\nplay.rectangle.on.rectangle.circle\nplay.rectangle.on.rectangle.circle.fill\nplus.rectangle.on.rectangle\nplus.rectangle.fill.on.rectangle.fill\nrectangle.portrait\nrectangle.portrait.fill\nrectangle.portrait.slash\nrectangle.portrait.slash.fill\nrectangle.portrait.lefthalf.filled\nrectangle.portrait.righthalf.filled\nrectangle.portrait.tophalf.filled\nrectangle.portrait.bottomhalf.filled\nrectangle.portrait.inset.filled\nrectangle.portrait.tophalf.inset.filled\nrectangle.portrait.bottomhalf.inset.filled\nrectangle.portrait.lefthalf.inset.filled\nrectangle.portrait.righthalf.inset.filled\nrectangle.portrait.leadinghalf.inset.filled\nrectangle.portrait.trailinghalf.inset.filled\nrectangle.portrait.topthird.inset.filled\nrectangle.portrait.bottomthird.inset.filled\nrectangle.portrait.leftthird.inset.filled\nrectangle.portrait.rightthird.inset.filled\nrectangle.portrait.leadingthird.inset.filled\nrectangle.portrait.trailingthird.inset.filled\nrectangle.portrait.center.inset.filled\nrectangle.portrait.topleft.inset.filled\nrectangle.portrait.topright.inset.filled\nrectangle.portrait.topleading.inset.filled\nrectangle.portrait.toptrailing.inset.filled\nrectangle.portrait.bottomleft.inset.filled\nrectangle.portrait.bottomright.inset.filled\nrectangle.portrait.bottomleading.inset.filled\nrectangle.portrait.bottomtrailing.inset.filled\nrectangle.portrait.on.rectangle.portrait\nrectangle.portrait.on.rectangle.portrait.fill\nrectangle.portrait.on.rectangle.portrait.slash\nrectangle.portrait.on.rectangle.portrait.slash.fill\nrectangle.portrait.split.2x1\nrectangle.portrait.split.2x1.fill\nrectangle.portrait.split.2x1.slash\nrectangle.portrait.split.2x1.slash.fill\ntriangle\ntriangle.fill\ntriangle.lefthalf.filled\ntriangle.righthalf.filled\ntriangle.tophalf.filled\ntriangle.bottomhalf.filled\ntriangle.inset.filled\ndiamond\ndiamond.fill\ndiamond.circle\ndiamond.circle.fill\ndiamond.lefthalf.filled\ndiamond.righthalf.filled\ndiamond.tophalf.filled\ndiamond.bottomhalf.filled\ndiamond.inset.filled\noctagon\noctagon.fill\noctagon.lefthalf.filled\noctagon.righthalf.filled\noctagon.tophalf.filled\noctagon.bottomhalf.filled\nhexagon\nhexagon.fill\nhexagon.lefthalf.filled\nhexagon.righthalf.filled\nhexagon.tophalf.filled\nhexagon.bottomhalf.filled\npentagon\npentagon.fill\npentagon.lefthalf.filled\npentagon.righthalf.filled\npentagon.tophalf.filled\npentagon.bottomhalf.filled\nsuit.heart\nsuit.heart.fill\nsuit.club\nsuit.club.fill\nsuit.spade\nsuit.spade.fill\nsuit.diamond\nsuit.diamond.fill\nheart\nheart.fill\nheart.circle\nheart.circle.fill\nheart.square\nheart.square.fill\nheart.rectangle\nheart.rectangle.fill\nheart.slash\nheart.slash.fill\nheart.slash.circle\nheart.slash.circle.fill\nbolt.heart\nbolt.heart.fill\narrow.up.heart\narrow.up.heart.fill\narrow.down.heart\narrow.down.heart.fill\narrow.clockwise.heart\narrow.clockwise.heart.fill\nrhombus\nrhombus.fill\nstar\nstar.fill\nstar.leadinghalf.filled\nstar.circle\nstar.circle.fill\nstar.square\nstar.square.fill\nstar.slash\nstar.slash.fill\nline.horizontal.star.fill.line.horizontal\nflag\nflag.fill\nflag.circle\nflag.circle.fill\nflag.square\nflag.square.fill\nflag.slash\nflag.slash.fill\nflag.slash.circle\nflag.slash.circle.fill\nflag.badge.ellipsis\nflag.badge.ellipsis.fill\nflag.2.crossed\nflag.2.crossed.fill\nflag.filled.and.flag.crossed\nflag.and.flag.filled.crossed\nlocation\nlocation.fill\nlocation.circle\nlocation.circle.fill\nlocation.square\nlocation.square.fill\nlocation.slash\nlocation.slash.fill\nlocation.north\nlocation.north.fill\nlocation.north.circle\nlocation.north.circle.fill\nlocation.north.line\nlocation.north.line.fill\nsensor.tag.radiowaves.forward\nsensor.tag.radiowaves.forward.fill\nairtag.radiowaves.forward\nairtag.radiowaves.forward.fill\nairtag\nairtag.fill\nbell\nbell.fill\nbell.circle\nbell.circle.fill\nbell.square\nbell.square.fill\nbell.slash\nbell.slash.fill\nbell.slash.circle\nbell.slash.circle.fill\nbell.and.waveform\nbell.and.waveform.fill\nbell.badge\nbell.badge.fill\nbell.badge.circle\nbell.badge.circle.fill\ntag\ntag.fill\ntag.circle\ntag.circle.fill\ntag.square\ntag.square.fill\ntag.slash\ntag.slash.fill\nbolt\nbolt.fill\nbolt.circle\nbolt.circle.fill\nbolt.square\nbolt.square.fill\nbolt.ring.closed\nbolt.shield\nbolt.shield.fill\nbolt.slash\nbolt.slash.fill\nbolt.slash.circle\nbolt.slash.circle.fill\nbolt.badge.a\nbolt.badge.a.fill\nbolt.horizontal\nbolt.horizontal.fill\nbolt.horizontal.circle\nbolt.horizontal.circle.fill\neye\neye.fill\neye.circle\neye.circle.fill\neye.square\neye.square.fill\neye.slash\neye.slash.fill\neye.slash.circle\neye.slash.circle.fill\neye.trianglebadge.exclamationmark\neye.trianglebadge.exclamationmark.fill\ntshirt\ntshirt.fill\neyes\neyes.inverse\neyebrow\nnose\nnose.fill\nmustache\nmustache.fill\nmouth\nmouth.fill\neyeglasses\nfacemask\nfacemask.fill\nbrain.head.profile\nbrain\nicloud\nicloud.fill\nicloud.circle\nicloud.circle.fill\nicloud.square\nicloud.square.fill\nicloud.slash\nicloud.slash.fill\nexclamationmark.icloud\nexclamationmark.icloud.fill\ncheckmark.icloud\ncheckmark.icloud.fill\nxmark.icloud\nxmark.icloud.fill\nlink.icloud\nlink.icloud.fill\nbolt.horizontal.icloud\nbolt.horizontal.icloud.fill\nperson.icloud\nperson.icloud.fill\nlock.icloud\nlock.icloud.fill\nkey.icloud\nkey.icloud.fill\narrow.clockwise.icloud\narrow.clockwise.icloud.fill\narrow.counterclockwise.icloud\narrow.counterclockwise.icloud.fill\nicloud.and.arrow.down\nicloud.and.arrow.down.fill\nicloud.and.arrow.up\nicloud.and.arrow.up.fill\nflashlight.off.fill\nflashlight.on.fill\ncamera\ncamera.fill\ncamera.circle\ncamera.circle.fill\ncamera.shutter.button\ncamera.shutter.button.fill\ncamera.badge.ellipsis\ncamera.fill.badge.ellipsis\narrow.triangle.2.circlepath.camera\narrow.triangle.2.circlepath.camera.fill\ncamera.on.rectangle\ncamera.on.rectangle.fill\nmessage\nmessage.fill\nmessage.circle\nmessage.circle.fill\nmessage.and.waveform\nmessage.and.waveform.fill\narrow.up.message\narrow.up.message.fill\nplus.message\nplus.message.fill\nbubble.right\nbubble.right.fill\nbubble.right.circle\nbubble.right.circle.fill\nbubble.left\nbubble.left.fill\nbubble.left.circle\nbubble.left.circle.fill\nexclamationmark.bubble\nexclamationmark.bubble.fill\nexclamationmark.bubble.circle\nexclamationmark.bubble.circle.fill\nquote.opening\nquote.closing\nquote.bubble\nquote.bubble.fill\nstar.bubble\nstar.bubble.fill\ncharacter.bubble\ncharacter.bubble.fill\ntext.bubble\ntext.bubble.fill\ncaptions.bubble\ncaptions.bubble.fill\nplus.bubble\nplus.bubble.fill\ncheckmark.bubble\ncheckmark.bubble.fill\nrectangle.3.group.bubble.left\nrectangle.3.group.bubble.left.fill\nellipsis.bubble\nellipsis.bubble.fill\nellipsis.vertical.bubble\nellipsis.vertical.bubble.fill\nphone.bubble.left\nphone.bubble.left.fill\nvideo.bubble.left\nvideo.bubble.left.fill\nbubble.middle.bottom\nbubble.middle.bottom.fill\nbubble.middle.top\nbubble.middle.top.fill\nbubble.left.and.bubble.right\nbubble.left.and.bubble.right.fill\nbubble.left.and.exclamationmark.bubble.right\nbubble.left.and.exclamationmark.bubble.right.fill\nphone\nphone.fill\nphone.circle\nphone.circle.fill\nphone.badge.plus\nphone.fill.badge.plus\nphone.connection\nphone.fill.connection\nphone.and.waveform\nphone.and.waveform.fill\nphone.arrow.up.right\nphone.fill.arrow.up.right\nphone.arrow.down.left\nphone.fill.arrow.down.left\nphone.arrow.right\nphone.fill.arrow.right\nphone.down\nphone.down.fill\nphone.down.circle\nphone.down.circle.fill\nteletype\nteletype.circle\nteletype.circle.fill\nteletype.answer\nteletype.answer.circle\nteletype.answer.circle.fill\nvideo\nvideo.fill\nvideo.circle\nvideo.circle.fill\nvideo.square\nvideo.square.fill\nvideo.slash\nvideo.slash.fill\nvideo.badge.plus\nvideo.fill.badge.plus\nvideo.badge.checkmark\nvideo.fill.badge.checkmark\nvideo.badge.ellipsis\nvideo.fill.badge.ellipsis\nvideo.and.waveform\nvideo.and.waveform.fill\narrow.up.right.video\narrow.up.right.video.fill\narrow.down.left.video\narrow.down.left.video.fill\nquestionmark.video\nquestionmark.video.fill\nenvelope\nenvelope.fill\nenvelope.circle\nenvelope.circle.fill\nenvelope.arrow.triangle.branch\nenvelope.arrow.triangle.branch.fill\nenvelope.open\nenvelope.open.fill\nenvelope.badge\nenvelope.badge.fill\nenvelope.badge.shield.half.filled\nenvelope.badge.shield.half.filled.fill\nmail.stack\nmail.stack.fill\nmail\nmail.fill\nmail.and.text.magnifyingglass\nrectangle.and.text.magnifyingglass\narrow.up.right.and.arrow.down.left.rectangle\narrow.up.right.and.arrow.down.left.rectangle.fill\ngear\ngear.circle\ngear.circle.fill\ngear.badge.checkmark\ngear.badge.xmark\ngear.badge.questionmark\ngearshape\ngearshape.fill\ngearshape.circle\ngearshape.circle.fill\ngearshape.2\ngearshape.2.fill\nsignature\nline.3.crossed.swirl.circle\nline.3.crossed.swirl.circle.fill\nscissors\nscissors.circle\nscissors.circle.fill\nscissors.badge.ellipsis\nellipsis\nellipsis.circle\nellipsis.circle.fill\nellipsis.rectangle\nellipsis.rectangle.fill\nbag\nbag.fill\nbag.circle\nbag.circle.fill\nbag.badge.plus\nbag.fill.badge.plus\nbag.badge.minus\nbag.fill.badge.minus\ncart\ncart.fill\ncart.circle\ncart.circle.fill\ncart.badge.plus\ncart.fill.badge.plus\ncart.badge.minus\ncart.fill.badge.minus\ncreditcard\ncreditcard.fill\ncreditcard.circle\ncreditcard.circle.fill\ncreditcard.and.123\ncreditcard.trianglebadge.exclamationmark\ngiftcard\ngiftcard.fill\nwallet.pass\nwallet.pass.fill\nwand.and.rays\nwand.and.rays.inverse\nwand.and.stars\nwand.and.stars.inverse\ncrop\ncrop.rotate\ndial.min\ndial.min.fill\ndial.max\ndial.max.fill\ngyroscope\nnosign\ngauge\ngauge.badge.plus\ngauge.badge.minus\nspeedometer\nbarometer\nmetronome\nmetronome.fill\namplifier\ndice\ndice.fill\ndie.face.1\ndie.face.1.fill\ndie.face.2\ndie.face.2.fill\ndie.face.3\ndie.face.3.fill\ndie.face.4\ndie.face.4.fill\ndie.face.5\ndie.face.5.fill\ndie.face.6\ndie.face.6.fill\nsquare.grid.3x3.square\npianokeys\npianokeys.inverse\ntuningfork\npaintbrush\npaintbrush.fill\npaintbrush.pointed\npaintbrush.pointed.fill\nbandage\nbandage.fill\nruler\nruler.fill\nlevel\nlevel.fill\nlines.measurement.horizontal\nwrench\nwrench.fill\nhammer\nhammer.fill\nhammer.circle\nhammer.circle.fill\nscrewdriver\nscrewdriver.fill\neyedropper\neyedropper.halffull\neyedropper.full\nwrench.and.screwdriver\nwrench.and.screwdriver.fill\napplescript\napplescript.fill\nscroll\nscroll.fill\nstethoscope\nstethoscope.circle\nstethoscope.circle.fill\nprinter\nprinter.fill\nprinter.filled.and.paper\nprinter.dotmatrix\nprinter.dotmatrix.fill\nprinter.dotmatrix.filled.and.paper\nscanner\nscanner.fill\nfaxmachine\nbriefcase\nbriefcase.fill\nbriefcase.circle\nbriefcase.circle.fill\ncase\ncase.fill\nlatch.2.case\nlatch.2.case.fill\ncross.case\ncross.case.fill\nsuitcase\nsuitcase.fill\nsuitcase.cart\nsuitcase.cart.fill\ntheatermasks\ntheatermasks.fill\ntheatermasks.circle\ntheatermasks.circle.fill\npuzzlepiece.extension\npuzzlepiece.extension.fill\npuzzlepiece\npuzzlepiece.fill\nhomekit\nhouse\nhouse.fill\nhouse.circle\nhouse.circle.fill\nmusic.note.house\nmusic.note.house.fill\nbuilding.columns\nbuilding.columns.fill\nbuilding.columns.circle\nbuilding.columns.circle.fill\nsignpost.left\nsignpost.left.fill\nsignpost.right\nsignpost.right.fill\nsquare.split.bottomrightquarter\nsquare.split.bottomrightquarter.fill\nbuilding\nbuilding.fill\nbuilding.2\nbuilding.2.fill\nbuilding.2.crop.circle\nbuilding.2.crop.circle.fill\nlock\nlock.fill\nlock.circle\nlock.circle.fill\nlock.square\nlock.square.fill\nlock.square.stack\nlock.square.stack.fill\nlock.rectangle\nlock.rectangle.fill\nlock.rectangle.stack\nlock.rectangle.stack.fill\nlock.rectangle.on.rectangle\nlock.rectangle.on.rectangle.fill\nlock.shield\nlock.shield.fill\nlock.slash\nlock.slash.fill\nlock.open\nlock.open.fill\nlock.rotation\nlock.rotation.open\nkey\nkey.fill\nwifi\nwifi.circle\nwifi.circle.fill\nwifi.square\nwifi.square.fill\nwifi.slash\nwifi.exclamationmark\npin\npin.fill\npin.circle\npin.circle.fill\npin.square\npin.square.fill\npin.slash\npin.slash.fill\nmappin\nmappin.circle\nmappin.circle.fill\nmappin.square\nmappin.square.fill\nmappin.slash\nmappin.slash.circle\nmappin.slash.circle.fill\nmappin.and.ellipse\nmap\nmap.fill\nmap.circle\nmap.circle.fill\nsafari\nsafari.fill\nmove.3d\nscale.3d\nrotate.3d\ntorus\nrotate.left\nrotate.left.fill\nrotate.right\nrotate.right.fill\nselection.pin.in.out\npowerplug\npowerplug.fill\ntimeline.selection\ncpu\ncpu.fill\nmemorychip\nmemorychip.fill\nopticaldisc\ndisplay\nlock.display\nlock.open.display\ndisplay.and.arrow.down\ndisplay.trianglebadge.exclamationmark\ndisplay.2\ndesktopcomputer\nlock.desktopcomputer\nlock.open.desktopcomputer\ndesktopcomputer.and.arrow.down\ndesktopcomputer.trianglebadge.exclamationmark\npc\nmacpro.gen1\nmacpro.gen1.fill\nmacpro.gen2\nmacpro.gen2.fill\nmacpro.gen3\nmacpro.gen3.fill\nmacpro.gen3.server\nserver.rack\nxserve\nlaptopcomputer\nlock.laptopcomputer\nlock.open.laptopcomputer\nlaptopcomputer.and.arrow.down\nlaptopcomputer.trianglebadge.exclamationmark\nlaptopcomputer.and.iphone\nipad.and.iphone\nmacmini\nmacmini.fill\nairport.express\nairport.extreme\nairport.extreme.tower\nipod\nipodshuffle.gen1\nipodshuffle.gen2\nipodshuffle.gen3\nipodshuffle.gen4\nipodtouch\nipodtouch.slash\nipodtouch.landscape\nflipphone\ncandybarphone\niphone.homebutton\niphone.homebutton.circle\niphone.homebutton.circle.fill\niphone.homebutton.landscape\niphone.homebutton.radiowaves.left.and.right\niphone.homebutton.radiowaves.left.and.right.circle\niphone.homebutton.radiowaves.left.and.right.circle.fill\niphone.homebutton.slash\niphone.homebutton.slash.circle\niphone.homebutton.slash.circle.fill\niphone.homebutton.badge.play\niphone\niphone.circle\niphone.circle.fill\niphone.landscape\niphone.radiowaves.left.and.right\niphone.radiowaves.left.and.right.circle\niphone.radiowaves.left.and.right.circle.fill\niphone.slash\niphone.slash.circle\niphone.slash.circle.fill\niphone.badge.play\nlock.iphone\nlock.open.iphone\niphone.and.arrow.forward\narrow.turn.up.forward.iphone\narrow.turn.up.forward.iphone.fill\niphone.rear.camera\napps.iphone\napps.iphone.badge.plus\napps.iphone.landscape\nplatter.filled.top.iphone\nplatter.filled.bottom.iphone\nplatter.filled.top.and.arrow.up.iphone\nplatter.filled.bottom.and.arrow.down.iphone\nplatter.2.filled.iphone\nplatter.2.filled.iphone.landscape\niphone.smartbatterycase.gen2\niphone.smartbatterycase.gen1\nipad.homebutton\nipad.homebutton.badge.play\nipad.homebutton.landscape\nipad.homebutton.landscape.badge.play\nipad\nipad.badge.play\nlock.ipad\nlock.open.ipad\nipad.and.arrow.forward\nipad.landscape\nipad.landscape.badge.play\nipad.rear.camera\napps.ipad\napps.ipad.landscape\nplatter.2.filled.ipad\nplatter.2.filled.ipad.landscape\napplepencil\nmagicmouse\nmagicmouse.fill\ncomputermouse\ncomputermouse.fill\napplewatch\napplewatch.watchface\nexclamationmark.applewatch\nlock.applewatch\nlock.open.applewatch\napplewatch.radiowaves.left.and.right\napplewatch.slash\napplewatch.side.right\nwatchface.applewatch.case\napplewatch.case.inset.filled\nplatter.filled.top.applewatch.case\nplatter.filled.bottom.applewatch.case\nplatter.top.applewatch.case\nplatter.bottom.applewatch.case\ndigitalcrown.arrow.clockwise\ndigitalcrown.arrow.clockwise.fill\ndigitalcrown.arrow.counterclockwise\ndigitalcrown.arrow.counterclockwise.fill\ndigitalcrown.press\ndigitalcrown.press.fill\ndigitalcrown.horizontal.arrow.clockwise\ndigitalcrown.horizontal.arrow.clockwise.fill\ndigitalcrown.horizontal.arrow.counterclockwise\ndigitalcrown.horizontal.arrow.counterclockwise.fill\ndigitalcrown.horizontal.press\ndigitalcrown.horizontal.press.fill\nairpodsmax\nbeats.headphones\nheadphones\nheadphones.circle\nheadphones.circle.fill\nearbuds\nearbuds.case\nearbuds.case.fill\nearpods\nairpods\nairpod.right\nairpod.left\nairpods.chargingcase\nairpods.chargingcase.fill\nairpods.chargingcase.wireless\nairpods.chargingcase.wireless.fill\nairpodspro\nairpodpro.right\nairpodpro.left\nairpodspro.chargingcase.wireless\nairpodspro.chargingcase.wireless.fill\nairpods.gen3\nairpod.gen3.right\nairpod.gen3.left\nairpods.gen3.chargingcase.wireless\nairpods.gen3.chargingcase.wireless.fill\nbeats.earphones\nbeats.powerbeatspro\nbeats.powerbeatspro.right\nbeats.powerbeatspro.left\nbeats.powerbeats\nbeats.powerbeats3\nbeats.studiobuds\nbeats.studiobud.left\nbeats.studiobud.right\nbeats.studiobuds.chargingcase\nbeats.studiobuds.chargingcase.fill\nbeats.fit.pro\nbeats.fit.pro.left\nbeats.fit.pro.right\nbeats.fit.pro.chargingcase\nbeats.fit.pro.chargingcase.fill\nbeats.powerbeatspro.chargingcase\nbeats.powerbeatspro.chargingcase.fill\nhomepodmini\nhomepodmini.fill\nhomepodmini.2\nhomepodmini.2.fill\nhomepod.and.homepodmini\nhomepod.and.homepodmini.fill\nhifispeaker.and.homepodmini\nhifispeaker.and.homepodmini.fill\nhomepod\nhomepod.fill\nhomepod.2\nhomepod.2.fill\nhifispeaker.and.homepod\nhifispeaker.and.homepod.fill\nhifispeaker\nhifispeaker.fill\nhifispeaker.2\nhifispeaker.2.fill\nappletv\nappletv.fill\nhomepod.and.appletv\nhomepod.and.appletv.fill\nhomepodmini.and.appletv\nhomepodmini.and.appletv.fill\nhifispeaker.and.appletv\nhifispeaker.and.appletv.fill\nappletvremote.gen1\nappletvremote.gen1.fill\nappletvremote.gen2\nappletvremote.gen2.fill\nappletvremote.gen3\nappletvremote.gen3.fill\nappletvremote.gen4\nappletvremote.gen4.fill\nmagsafe.batterypack\nmagsafe.batterypack.fill\nmediastick\ncable.connector\ncable.connector.horizontal\nradio\nradio.fill\ntv\ntv.fill\ntv.inset.filled\ntv.circle\ntv.circle.fill\nsparkles.tv\nsparkles.tv.fill\n4k.tv\n4k.tv.fill\nmusic.note.tv\nmusic.note.tv.fill\nplay.tv\nplay.tv.fill\nphoto.tv\ntv.and.hifispeaker.fill\ntv.and.mediabox\nairplayvideo\nairplayvideo.circle\nairplayvideo.circle.fill\nairplayvideo.badge.exclamationmark\nairplayaudio\nairplayaudio.circle\nairplayaudio.circle.fill\nairplayaudio.badge.exclamationmark\ndot.radiowaves.left.and.right\ndot.radiowaves.right\ndot.radiowaves.forward\nwave.3.left\nwave.3.left.circle\nwave.3.left.circle.fill\nwave.3.backward\nwave.3.backward.circle\nwave.3.backward.circle.fill\nwave.3.right\nwave.3.right.circle\nwave.3.right.circle.fill\nwave.3.forward\nwave.3.forward.circle\nwave.3.forward.circle.fill\ndot.radiowaves.up.forward\nantenna.radiowaves.left.and.right\nantenna.radiowaves.left.and.right.slash\nantenna.radiowaves.left.and.right.circle\nantenna.radiowaves.left.and.right.circle.fill\npip\npip.fill\npip.exit\npip.enter\npip.swap\npip.remove\nrectangle.arrowtriangle.2.outward\nrectangle.arrowtriangle.2.inward\nrectangle.portrait.arrowtriangle.2.outward\nrectangle.portrait.arrowtriangle.2.inward\nrectangle.2.swap\nguitars\nguitars.fill\nairplane\nairplane.circle\nairplane.circle.fill\nairplane.arrival\nairplane.departure\ncar\ncar.fill\ncar.circle\ncar.circle.fill\nbolt.car\nbolt.car.fill\nbolt.car.circle\nbolt.car.circle.fill\ncar.2\ncar.2.fill\nbus\nbus.fill\nbus.doubledecker\nbus.doubledecker.fill\ntram\ntram.fill\ntram.circle\ntram.circle.fill\ntram.fill.tunnel\ncablecar\ncablecar.fill\nferry\nferry.fill\ncar.ferry\ncar.ferry.fill\ntrain.side.front.car\ntrain.side.middle.car\ntrain.side.rear.car\nbicycle\nbicycle.circle\nbicycle.circle.fill\nscooter\nparkingsign\nparkingsign.circle\nparkingsign.circle.fill\nfuelpump\nfuelpump.fill\nfuelpump.circle\nfuelpump.circle.fill\nfanblades\nfanblades.fill\nbed.double\nbed.double.fill\nbed.double.circle\nbed.double.circle.fill\nlungs\nlungs.fill\nallergens\npills\npills.fill\npills.circle\npills.circle.fill\ntesttube.2\nivfluid.bag\nivfluid.bag.fill\ncross.vial\ncross.vial.fill\ncross\ncross.fill\ncross.circle\ncross.circle.fill\nhare\nhare.fill\ntortoise\ntortoise.fill\npawprint\npawprint.fill\npawprint.circle\npawprint.circle.fill\nant\nant.fill\nant.circle\nant.circle.fill\nladybug\nladybug.fill\nleaf\nleaf.fill\nleaf.circle\nleaf.circle.fill\nleaf.arrow.triangle.circlepath\nfilm\nfilm.fill\nfilm.circle\nfilm.circle.fill\nsportscourt\nsportscourt.fill\nface.smiling\nface.smiling.fill\nface.dashed\nface.dashed.fill\ncrown\ncrown.fill\ncomb\ncomb.fill\nqrcode\nbarcode\nviewfinder\nviewfinder.circle\nviewfinder.circle.fill\nbarcode.viewfinder\nqrcode.viewfinder\nplus.viewfinder\ncamera.viewfinder\nfaceid\ndoc.viewfinder\ndoc.viewfinder.fill\nlocation.viewfinder\nlocation.fill.viewfinder\nperson.fill.viewfinder\ntext.viewfinder\ndot.viewfinder\ndot.circle.viewfinder\nphoto\nphoto.fill\nphoto.circle\nphoto.circle.fill\ntext.below.photo\ntext.below.photo.fill\ncheckerboard.rectangle\ncamera.metering.center.weighted.average\ncamera.metering.center.weighted\ncamera.metering.matrix\ncamera.metering.multispot\ncamera.metering.none\ncamera.metering.partial\ncamera.metering.spot\ncamera.metering.unknown\ncamera.aperture\nrectangle.dashed\nrectangle.dashed.badge.record\nrectangle.badge.plus\nrectangle.fill.badge.plus\nrectangle.badge.minus\nrectangle.fill.badge.minus\nrectangle.badge.checkmark\nrectangle.fill.badge.checkmark\nrectangle.badge.xmark\nrectangle.fill.badge.xmark\nrectangle.badge.person.crop\nrectangle.fill.badge.person.crop\nphoto.on.rectangle\nphoto.fill.on.rectangle.fill\nrectangle.on.rectangle.angled\nrectangle.fill.on.rectangle.angled.fill\nphoto.on.rectangle.angled\nrectangle.stack\nrectangle.stack.fill\nrectangle.stack.badge.plus\nrectangle.stack.fill.badge.plus\nrectangle.stack.badge.minus\nrectangle.stack.fill.badge.minus\nrectangle.stack.badge.person.crop\nrectangle.stack.badge.person.crop.fill\nrectangle.stack.badge.play\nrectangle.stack.badge.play.fill\nsparkles.rectangle.stack\nsparkles.rectangle.stack.fill\nsidebar.left\nsidebar.right\nsidebar.leading\nsidebar.trailing\nsidebar.squares.left\nsidebar.squares.right\nsidebar.squares.leading\nsidebar.squares.trailing\nmacwindow\nmacwindow.badge.plus\nslider.horizontal.2.rectangle.and.arrow.triangle.2.circlepath\ndock.rectangle\ndock.arrow.up.rectangle\ndock.arrow.down.rectangle\nmenubar.rectangle\nmenubar.dock.rectangle\nmenubar.dock.rectangle.badge.record\nmenubar.arrow.up.rectangle\nmenubar.arrow.down.rectangle\nmacwindow.on.rectangle\ntext.and.command.macwindow\nkeyboard.macwindow\nuiwindow.split.2x1\nmosaic\nmosaic.fill\nsquares.below.rectangle\nrectangle.split.3x3.fill\nsquare.on.square.squareshape.controlhandles\nsquareshape.controlhandles.on.squareshape.controlhandles\npano\npano.fill\ncircle.grid.2x1\ncircle.grid.2x1.fill\ncircle.grid.2x1.left.filled\ncircle.grid.2x1.right.filled\nsquare.and.line.vertical.and.square\nsquare.fill.and.line.vertical.and.square.fill\nsquare.filled.and.line.vertical.and.square\nsquare.and.line.vertical.and.square.filled\nflowchart\nflowchart.fill\nrectangle.connected.to.line.below\nalign.horizontal.left\nalign.horizontal.left.fill\nalign.horizontal.center\nalign.horizontal.center.fill\nalign.horizontal.right\nalign.horizontal.right.fill\nalign.vertical.top\nalign.vertical.top.fill\nalign.vertical.center\nalign.vertical.center.fill\nalign.vertical.bottom\nalign.vertical.bottom.fill\nshield\nshield.fill\nshield.lefthalf.filled\nshield.righthalf.filled\nshield.slash\nshield.slash.fill\nshield.lefthalf.filled.slash\ncheckerboard.shield\nswitch.2\npoint.topleft.down.curvedto.point.bottomright.up\npoint.topleft.down.curvedto.point.bottomright.up.fill\npoint.topleft.down.curvedto.point.filled.bottomright.up\npoint.filled.topleft.down.curvedto.point.bottomright.up\napp.connected.to.app.below.fill\nslider.horizontal.3\nslider.horizontal.below.rectangle\nslider.horizontal.below.square.filled.and.square\nslider.vertical.3\ncube\ncube.fill\ncube.transparent\ncube.transparent.fill\nshippingbox\nshippingbox.fill\nshippingbox.circle\nshippingbox.circle.fill\narkit\narkit.badge.xmark\ncone\ncone.fill\npyramid\npyramid.fill\nsquare.stack.3d.down.right\nsquare.stack.3d.down.right.fill\nsquare.stack.3d.down.forward\nsquare.stack.3d.down.forward.fill\nsquare.stack.3d.up\nsquare.stack.3d.up.fill\nsquare.stack.3d.up.slash\nsquare.stack.3d.up.slash.fill\nsquare.stack.3d.up.badge.a\nsquare.stack.3d.up.badge.a.fill\nsquare.stack.3d.forward.dottedline\nsquare.stack.3d.forward.dottedline.fill\nlivephoto\nlivephoto.slash\nlivephoto.badge.a\nlivephoto.play\nscope\nhelm\nclock\nclock.fill\nclock.circle\nclock.circle.fill\nclock.badge.checkmark\nclock.badge.checkmark.fill\nclock.badge.exclamationmark\nclock.badge.exclamationmark.fill\ndeskclock\ndeskclock.fill\nalarm\nalarm.fill\nstopwatch\nstopwatch.fill\nchart.xyaxis.line\ntimer\ntimer.square\nclock.arrow.circlepath\nexclamationmark.arrow.circlepath\nclock.arrow.2.circlepath\ngamecontroller\ngamecontroller.fill\nl.joystick\nl.joystick.fill\nr.joystick\nr.joystick.fill\nl.joystick.press.down\nl.joystick.press.down.fill\nr.joystick.press.down\nr.joystick.press.down.fill\nl.joystick.tilt.left\nl.joystick.tilt.left.fill\nl.joystick.tilt.right\nl.joystick.tilt.right.fill\nl.joystick.tilt.up\nl.joystick.tilt.up.fill\nl.joystick.tilt.down\nl.joystick.tilt.down.fill\nr.joystick.tilt.left\nr.joystick.tilt.left.fill\nr.joystick.tilt.right\nr.joystick.tilt.right.fill\nr.joystick.tilt.up\nr.joystick.tilt.up.fill\nr.joystick.tilt.down\nr.joystick.tilt.down.fill\ndpad\ndpad.fill\ndpad.left.filled\ndpad.up.filled\ndpad.right.filled\ndpad.down.filled\ncircle.circle\ncircle.circle.fill\nsquare.circle\nsquare.circle.fill\ntriangle.circle\ntriangle.circle.fill\nrectangle.roundedtop\nrectangle.roundedtop.fill\nrectangle.roundedbottom\nrectangle.roundedbottom.fill\nl.rectangle.roundedbottom\nl.rectangle.roundedbottom.fill\nl1.rectangle.roundedbottom\nl1.rectangle.roundedbottom.fill\nl2.rectangle.roundedtop\nl2.rectangle.roundedtop.fill\nr.rectangle.roundedbottom\nr.rectangle.roundedbottom.fill\nr1.rectangle.roundedbottom\nr1.rectangle.roundedbottom.fill\nr2.rectangle.roundedtop\nr2.rectangle.roundedtop.fill\nlb.rectangle.roundedbottom\nlb.rectangle.roundedbottom.fill\nrb.rectangle.roundedbottom\nrb.rectangle.roundedbottom.fill\nlt.rectangle.roundedtop\nlt.rectangle.roundedtop.fill\nrt.rectangle.roundedtop\nrt.rectangle.roundedtop.fill\nzl.rectangle.roundedtop\nzl.rectangle.roundedtop.fill\nzr.rectangle.roundedtop\nzr.rectangle.roundedtop.fill\nlogo.playstation\nlogo.xbox\npaintpalette\npaintpalette.fill\ncup.and.saucer\ncup.and.saucer.fill\ntakeoutbag.and.cup.and.straw\ntakeoutbag.and.cup.and.straw.fill\nfork.knife\nfork.knife.circle\nfork.knife.circle.fill\nfigure.walk\nfigure.walk.circle\nfigure.walk.circle.fill\nfigure.walk.diamond\nfigure.walk.diamond.fill\nfigure.stand\nfigure.stand.line.dotted.figure.stand\nfigure.wave\nfigure.wave.circle\nfigure.wave.circle.fill\nfigure.roll\near\near.badge.checkmark\near.trianglebadge.exclamationmark\near.and.waveform\near.fill\nhearingdevice.ear\nhand.raised\nhand.raised.fill\nhand.raised.circle\nhand.raised.circle.fill\nhand.raised.square\nhand.raised.square.fill\nhand.raised.slash\nhand.raised.slash.fill\nhand.thumbsup\nhand.thumbsup.fill\nhand.thumbsup.circle\nhand.thumbsup.circle.fill\nhand.thumbsdown\nhand.thumbsdown.fill\nhand.thumbsdown.circle\nhand.thumbsdown.circle.fill\nhand.point.up.left\nhand.point.up.left.fill\nhand.draw\nhand.draw.fill\nhand.tap\nhand.tap.fill\nrectangle.and.hand.point.up.left\nrectangle.and.hand.point.up.left.fill\nrectangle.filled.and.hand.point.up.left\nrectangle.and.hand.point.up.left.filled\nhand.point.left\nhand.point.left.fill\nhand.point.right\nhand.point.right.fill\nhand.point.up\nhand.point.up.fill\nhand.point.up.braille\nhand.point.up.braille.fill\nhand.point.down\nhand.point.down.fill\nhand.wave\nhand.wave.fill\nhands.clap\nhands.clap.fill\nhands.sparkles\nhands.sparkles.fill\nrectangle.compress.vertical\nrectangle.expand.vertical\nrectangle.and.arrow.up.right.and.arrow.down.left\nrectangle.and.arrow.up.right.and.arrow.down.left.slash\nsquare.2.stack.3d\nsquare.2.stack.3d.top.filled\nsquare.2.stack.3d.bottom.filled\nsquare.3.layers.3d.down.right\nsquare.3.layers.3d.down.right.slash\nsquare.3.layers.3d.down.left\nsquare.3.layers.3d.down.left.slash\nsquare.3.layers.3d.down.forward\nsquare.3.layers.3d.down.backward\nsquare.3.stack.3d\nsquare.3.stack.3d.slash\nsquare.3.stack.3d.top.filled\nsquare.3.stack.3d.middle.filled\nsquare.3.stack.3d.bottom.filled\ncylinder\ncylinder.fill\ncylinder.split.1x2\ncylinder.split.1x2.fill\nchart.bar\nchart.bar.fill\nchart.pie\nchart.pie.fill\nchart.bar.xaxis\nchart.line.uptrend.xyaxis\nchart.line.uptrend.xyaxis.circle\nchart.line.uptrend.xyaxis.circle.fill\ndot.squareshape.split.2x2\nsquareshape.split.2x2.dotted\nsquareshape.split.2x2\nsquareshape.split.3x3\nburst\nburst.fill\nwaveform.path.ecg\nwaveform.path.ecg.rectangle\nwaveform.path.ecg.rectangle.fill\nwaveform.path\nwaveform.path.badge.plus\nwaveform.path.badge.minus\npoint.3.connected.trianglepath.dotted\npoint.3.filled.connected.trianglepath.dotted\nwaveform\nwaveform.circle\nwaveform.circle.fill\nwaveform.badge.plus\nwaveform.badge.minus\nwaveform.badge.exclamationmark\nwaveform.and.magnifyingglass\nwaveform.and.mic\nstaroflife\nstaroflife.fill\nstaroflife.circle\nstaroflife.circle.fill\nsimcard\nsimcard.fill\nsimcard.2\nsimcard.2.fill\nsdcard\nsdcard.fill\nesim\nesim.fill\ntouchid\nbonjour\natom\nscalemass\nscalemass.fill\ngift\ngift.fill\ngift.circle\ngift.circle.fill\nplus.app\nplus.app.fill\narrow.down.app\narrow.down.app.fill\narrow.up.forward.app\narrow.up.forward.app.fill\nxmark.app\nxmark.app.fill\nquestionmark.app\nquestionmark.app.fill\napp.badge\napp.badge.fill\napp.badge.checkmark\napp.badge.checkmark.fill\napp.dashed\nquestionmark.app.dashed\nappclip\napp.gift\napp.gift.fill\nstudentdesk\nhourglass\nhourglass.circle\nhourglass.circle.fill\nhourglass.badge.plus\nhourglass.bottomhalf.filled\nhourglass.tophalf.filled\nbanknote\nbanknote.fill\nparagraphsign\npurchased\npurchased.circle\npurchased.circle.fill\nperspective\ncircle.and.line.horizontal\ncircle.and.line.horizontal.fill\ntrapezoid.and.line.vertical\ntrapezoid.and.line.vertical.fill\ntrapezoid.and.line.horizontal\ntrapezoid.and.line.horizontal.fill\naspectratio\naspectratio.fill\ncamera.filters\nskew\narrow.left.and.right.righttriangle.left.righttriangle.right\narrow.left.and.right.righttriangle.left.righttriangle.right.fill\narrow.up.and.down.righttriangle.up.righttriangle.down\narrow.up.and.down.righttriangle.up.righttriangle.down.fill\narrowtriangle.left.and.line.vertical.and.arrowtriangle.right\narrowtriangle.left.and.line.vertical.and.arrowtriangle.right.fill\narrowtriangle.right.and.line.vertical.and.arrowtriangle.left\narrowtriangle.right.and.line.vertical.and.arrowtriangle.left.fill\ngrid\ngrid.circle\ngrid.circle.fill\nburn\nlifepreserver\nlifepreserver.fill\nrecordingtape\nbinoculars\nbinoculars.fill\nbattery.100\nbattery.75\nbattery.50\nbattery.25\nbattery.0\nbattery.100.bolt\nminus.plus.batteryblock\nminus.plus.batteryblock.fill\nbolt.batteryblock\nbolt.batteryblock.fill\nlightbulb\nlightbulb.fill\nlightbulb.circle\nlightbulb.circle.fill\nlightbulb.slash\nlightbulb.slash.fill\nfibrechannel\nchecklist\nsquare.fill.text.grid.1x2\nlist.dash\nlist.bullet\nlist.bullet.circle\nlist.bullet.circle.fill\nlist.triangle\nlist.bullet.indent\nlist.number\nlist.star\nincrease.indent\ndecrease.indent\ndecrease.quotelevel\nincrease.quotelevel\nlist.bullet.below.rectangle\ntext.badge.plus\ntext.badge.minus\ntext.badge.checkmark\ntext.badge.xmark\ntext.badge.star\ntext.insert\ntext.append\ntext.quote\ntext.alignleft\ntext.aligncenter\ntext.alignright\ntext.justify\ntext.justify.left\ntext.justify.right\ntext.justify.leading\ntext.justify.trailing\ntext.redaction\nlist.and.film\nline.3.horizontal\nline.3.horizontal.decrease\nline.3.horizontal.decrease.circle\nline.3.horizontal.decrease.circle.fill\nline.3.horizontal.circle\nline.3.horizontal.circle.fill\nline.2.horizontal.decrease.circle\nline.2.horizontal.decrease.circle.fill\ncharacter\ntextformat.size.smaller\ntextformat.size.larger\ntextformat.size\ntextformat\ntextformat.alt\ntextformat.superscript\ntextformat.subscript\nabc\ntextformat.abc\ntextformat.abc.dottedunderline\nbold\nitalic\nunderline\nstrikethrough\nshadow\nbold.italic.underline\nbold.underline\nview.2d\nview.3d\ncharacter.cursor.ibeam\nfx\nf.cursive\nf.cursive.circle\nf.cursive.circle.fill\nk\nsum\npercent\nfunction\nfn\ntextformat.123\n123.rectangle\n123.rectangle.fill\ncharacter.textbox\na.magnify\ninfo\ninfo.circle\ninfo.circle.fill\nat\nat.circle\nat.circle.fill\nat.badge.plus\nat.badge.minus\nquestionmark\nquestionmark.circle\nquestionmark.circle.fill\nquestionmark.square\nquestionmark.square.fill\nquestionmark.diamond\nquestionmark.diamond.fill\nexclamationmark\nexclamationmark.2\nexclamationmark.3\nexclamationmark.circle\nexclamationmark.circle.fill\nexclamationmark.square\nexclamationmark.square.fill\nexclamationmark.octagon\nexclamationmark.octagon.fill\nexclamationmark.shield\nexclamationmark.shield.fill\nplus\nplus.circle\nplus.circle.fill\nplus.square\nplus.square.fill\nplus.rectangle\nplus.rectangle.fill\nplus.rectangle.portrait\nplus.rectangle.portrait.fill\nplus.diamond\nplus.diamond.fill\nminus\nminus.circle\nminus.circle.fill\nminus.square\nminus.square.fill\nminus.rectangle\nminus.rectangle.fill\nminus.rectangle.portrait\nminus.rectangle.portrait.fill\nminus.diamond\nminus.diamond.fill\nplusminus\nplusminus.circle\nplusminus.circle.fill\nplus.forwardslash.minus\nminus.forwardslash.plus\nmultiply\nmultiply.circle\nmultiply.circle.fill\nmultiply.square\nmultiply.square.fill\nxmark.rectangle\nxmark.rectangle.fill\nxmark.rectangle.portrait\nxmark.rectangle.portrait.fill\nxmark.diamond\nxmark.diamond.fill\nxmark.shield\nxmark.shield.fill\nxmark.octagon\nxmark.octagon.fill\ndivide\ndivide.circle\ndivide.circle.fill\ndivide.square\ndivide.square.fill\nequal\nequal.circle\nequal.circle.fill\nequal.square\nequal.square.fill\nlessthan\nlessthan.circle\nlessthan.circle.fill\nlessthan.square\nlessthan.square.fill\ngreaterthan\ngreaterthan.circle\ngreaterthan.circle.fill\ngreaterthan.square\ngreaterthan.square.fill\nchevron.left.forwardslash.chevron.right\nparentheses\ncurlybraces\ncurlybraces.square\ncurlybraces.square.fill\nellipsis.curlybraces\nnumber\nnumber.circle\nnumber.circle.fill\nnumber.square\nnumber.square.fill\nx.squareroot\nxmark\nxmark.circle\nxmark.circle.fill\nxmark.square\nxmark.square.fill\ncheckmark\ncheckmark.circle\ncheckmark.circle.fill\ncheckmark.circle.trianglebadge.exclamationmark\ncheckmark.square\ncheckmark.square.fill\ncheckmark.rectangle\ncheckmark.rectangle.fill\ncheckmark.rectangle.portrait\ncheckmark.rectangle.portrait.fill\ncheckmark.diamond\ncheckmark.diamond.fill\ncheckmark.shield\ncheckmark.shield.fill\nchevron.left\nchevron.left.circle\nchevron.left.circle.fill\nchevron.left.square\nchevron.left.square.fill\nchevron.backward\nchevron.backward.circle\nchevron.backward.circle.fill\nchevron.backward.square\nchevron.backward.square.fill\nchevron.right\nchevron.right.circle\nchevron.right.circle.fill\nchevron.right.square\nchevron.right.square.fill\nchevron.forward\nchevron.forward.circle\nchevron.forward.circle.fill\nchevron.forward.square\nchevron.forward.square.fill\nchevron.left.2\nchevron.backward.2\nchevron.right.2\nchevron.forward.2\nchevron.up\nchevron.up.circle\nchevron.up.circle.fill\nchevron.up.square\nchevron.up.square.fill\nchevron.down\nchevron.down.circle\nchevron.down.circle.fill\nchevron.down.square\nchevron.down.square.fill\ncontrol\nprojective\nchevron.up.chevron.down\nchevron.compact.up\nchevron.compact.down\nchevron.compact.left\nchevron.compact.right\narrow.left\narrow.left.circle\narrow.left.circle.fill\narrow.left.square\narrow.left.square.fill\narrow.backward\narrow.backward.circle\narrow.backward.circle.fill\narrow.backward.square\narrow.backward.square.fill\narrow.right\narrow.right.circle\narrow.right.circle.fill\narrow.right.square\narrow.right.square.fill\narrow.forward\narrow.forward.circle\narrow.forward.circle.fill\narrow.forward.square\narrow.forward.square.fill\narrow.up\narrow.up.circle\narrow.up.circle.fill\narrow.up.square\narrow.up.square.fill\narrow.down\narrow.down.circle\narrow.down.circle.fill\narrow.down.square\narrow.down.square.fill\narrow.up.left\narrow.up.left.circle\narrow.up.left.circle.fill\narrow.up.left.square\narrow.up.left.square.fill\narrow.up.backward\narrow.up.backward.circle\narrow.up.backward.circle.fill\narrow.up.backward.square\narrow.up.backward.square.fill\narrow.up.right\narrow.up.right.circle\narrow.up.right.circle.fill\narrow.up.right.square\narrow.up.right.square.fill\narrow.up.forward\narrow.up.forward.circle\narrow.up.forward.circle.fill\narrow.up.forward.square\narrow.up.forward.square.fill\narrow.down.left\narrow.down.left.circle\narrow.down.left.circle.fill\narrow.down.left.square\narrow.down.left.square.fill\narrow.down.backward\narrow.down.backward.circle\narrow.down.backward.circle.fill\narrow.down.backward.square\narrow.down.backward.square.fill\narrow.down.right\narrow.down.right.circle\narrow.down.right.circle.fill\narrow.down.right.square\narrow.down.right.square.fill\narrow.down.forward\narrow.down.forward.circle\narrow.down.forward.circle.fill\narrow.down.forward.square\narrow.down.forward.square.fill\narrow.left.arrow.right\narrow.left.arrow.right.circle\narrow.left.arrow.right.circle.fill\narrow.left.arrow.right.square\narrow.left.arrow.right.square.fill\narrow.up.arrow.down\narrow.up.arrow.down.circle\narrow.up.arrow.down.circle.fill\narrow.up.arrow.down.square\narrow.up.arrow.down.square.fill\narrow.turn.down.left\narrow.turn.up.left\narrow.turn.down.right\narrow.turn.up.right\narrow.turn.right.up\narrow.turn.left.up\narrow.turn.right.down\narrow.turn.left.down\narrow.uturn.left\narrow.uturn.left.circle\narrow.uturn.left.circle.fill\narrow.uturn.left.circle.badge.ellipsis\narrow.uturn.left.square\narrow.uturn.left.square.fill\narrow.uturn.backward\narrow.uturn.backward.circle\narrow.uturn.backward.circle.fill\narrow.uturn.backward.circle.badge.ellipsis\narrow.uturn.backward.square\narrow.uturn.backward.square.fill\narrow.uturn.right\narrow.uturn.right.circle\narrow.uturn.right.circle.fill\narrow.uturn.right.square\narrow.uturn.right.square.fill\narrow.uturn.forward\narrow.uturn.forward.circle\narrow.uturn.forward.circle.fill\narrow.uturn.forward.square\narrow.uturn.forward.square.fill\narrow.uturn.up\narrow.uturn.up.circle\narrow.uturn.up.circle.fill\narrow.uturn.up.square\narrow.uturn.up.square.fill\narrow.uturn.down\narrow.uturn.down.circle\narrow.uturn.down.circle.fill\narrow.uturn.down.square\narrow.uturn.down.square.fill\narrow.up.and.down.and.arrow.left.and.right\narrow.up.left.and.down.right.and.arrow.up.right.and.down.left\narrow.left.and.right\narrow.left.and.right.circle\narrow.left.and.right.circle.fill\narrow.left.and.right.square\narrow.left.and.right.square.fill\narrow.up.and.down\narrow.up.and.down.circle\narrow.up.and.down.circle.fill\narrow.up.and.down.square\narrow.up.and.down.square.fill\narrow.up.to.line\narrow.up.to.line.compact\narrow.up.to.line.circle\narrow.up.to.line.circle.fill\narrow.down.to.line\narrow.down.to.line.compact\narrow.down.to.line.circle\narrow.down.to.line.circle.fill\narrow.left.to.line\narrow.left.to.line.compact\narrow.left.to.line.circle\narrow.left.to.line.circle.fill\narrow.backward.to.line\narrow.backward.to.line.circle\narrow.backward.to.line.circle.fill\narrow.right.to.line\narrow.right.to.line.compact\narrow.right.to.line.circle\narrow.right.to.line.circle.fill\narrow.forward.to.line\narrow.forward.to.line.circle\narrow.forward.to.line.circle.fill\narrow.clockwise\narrow.clockwise.circle\narrow.clockwise.circle.fill\narrow.counterclockwise\narrow.counterclockwise.circle\narrow.counterclockwise.circle.fill\narrow.up.left.and.arrow.down.right\narrow.up.left.and.arrow.down.right.circle\narrow.up.left.and.arrow.down.right.circle.fill\narrow.up.backward.and.arrow.down.forward\narrow.up.backward.and.arrow.down.forward.circle\narrow.up.backward.and.arrow.down.forward.circle.fill\narrow.down.right.and.arrow.up.left\narrow.down.right.and.arrow.up.left.circle\narrow.down.right.and.arrow.up.left.circle.fill\narrow.down.forward.and.arrow.up.backward\narrow.down.forward.and.arrow.up.backward.circle\narrow.down.forward.and.arrow.up.backward.circle.fill\nreturn\nreturn.left\nreturn.right\narrow.2.squarepath\narrow.triangle.2.circlepath\narrow.triangle.2.circlepath.circle\narrow.triangle.2.circlepath.circle.fill\nexclamationmark.arrow.triangle.2.circlepath\narrow.triangle.capsulepath\narrow.3.trianglepath\narrow.triangle.turn.up.right.diamond\narrow.triangle.turn.up.right.diamond.fill\narrow.triangle.turn.up.right.circle\narrow.triangle.turn.up.right.circle.fill\narrow.triangle.merge\narrow.triangle.swap\narrow.triangle.branch\narrow.triangle.pull\narrowtriangle.left\narrowtriangle.left.fill\narrowtriangle.left.circle\narrowtriangle.left.circle.fill\narrowtriangle.left.square\narrowtriangle.left.square.fill\narrowtriangle.backward\narrowtriangle.backward.fill\narrowtriangle.backward.circle\narrowtriangle.backward.circle.fill\narrowtriangle.backward.square\narrowtriangle.backward.square.fill\narrowtriangle.right\narrowtriangle.right.fill\narrowtriangle.right.circle\narrowtriangle.right.circle.fill\narrowtriangle.right.square\narrowtriangle.right.square.fill\narrowtriangle.forward\narrowtriangle.forward.fill\narrowtriangle.forward.circle\narrowtriangle.forward.circle.fill\narrowtriangle.forward.square\narrowtriangle.forward.square.fill\narrowtriangle.up\narrowtriangle.up.fill\narrowtriangle.up.circle\narrowtriangle.up.circle.fill\narrowtriangle.up.square\narrowtriangle.up.square.fill\narrowtriangle.down\narrowtriangle.down.fill\narrowtriangle.down.circle\narrowtriangle.down.circle.fill\narrowtriangle.down.square\narrowtriangle.down.square.fill\nslash.circle\nslash.circle.fill\nasterisk\nasterisk.circle\nasterisk.circle.fill\na.circle\na.circle.fill\na.square\na.square.fill\nb.circle\nb.circle.fill\nb.square\nb.square.fill\nc.circle\nc.circle.fill\nc.square\nc.square.fill\nd.circle\nd.circle.fill\nd.square\nd.square.fill\ne.circle\ne.circle.fill\ne.square\ne.square.fill\nf.circle\nf.circle.fill\nf.square\nf.square.fill\ng.circle\ng.circle.fill\ng.square\ng.square.fill\nh.circle\nh.circle.fill\nh.square\nh.square.fill\ni.circle\ni.circle.fill\ni.square\ni.square.fill\nj.circle\nj.circle.fill\nj.square\nj.square.fill\nk.circle\nk.circle.fill\nk.square\nk.square.fill\nl.circle\nl.circle.fill\nl.square\nl.square.fill\nm.circle\nm.circle.fill\nm.square\nm.square.fill\nn.circle\nn.circle.fill\nn.square\nn.square.fill\no.circle\no.circle.fill\no.square\no.square.fill\np.circle\np.circle.fill\np.square\np.square.fill\nq.circle\nq.circle.fill\nq.square\nq.square.fill\nr.circle\nr.circle.fill\nr.square\nr.square.fill\ns.circle\ns.circle.fill\ns.square\ns.square.fill\nt.circle\nt.circle.fill\nt.square\nt.square.fill\nu.circle\nu.circle.fill\nu.square\nu.square.fill\nv.circle\nv.circle.fill\nv.square\nv.square.fill\nw.circle\nw.circle.fill\nw.square\nw.square.fill\nx.circle\nx.circle.fill\nx.square\nx.square.fill\ny.circle\ny.circle.fill\ny.square\ny.square.fill\nz.circle\nz.circle.fill\nz.square\nz.square.fill\ndollarsign.circle\ndollarsign.circle.fill\ndollarsign.square\ndollarsign.square.fill\ncentsign.circle\ncentsign.circle.fill\ncentsign.square\ncentsign.square.fill\nyensign.circle\nyensign.circle.fill\nyensign.square\nyensign.square.fill\nsterlingsign.circle\nsterlingsign.circle.fill\nsterlingsign.square\nsterlingsign.square.fill\nfrancsign.circle\nfrancsign.circle.fill\nfrancsign.square\nfrancsign.square.fill\nflorinsign.circle\nflorinsign.circle.fill\nflorinsign.square\nflorinsign.square.fill\nturkishlirasign.circle\nturkishlirasign.circle.fill\nturkishlirasign.square\nturkishlirasign.square.fill\nrublesign.circle\nrublesign.circle.fill\nrublesign.square\nrublesign.square.fill\neurosign.circle\neurosign.circle.fill\neurosign.square\neurosign.square.fill\ndongsign.circle\ndongsign.circle.fill\ndongsign.square\ndongsign.square.fill\nindianrupeesign.circle\nindianrupeesign.circle.fill\nindianrupeesign.square\nindianrupeesign.square.fill\ntengesign.circle\ntengesign.circle.fill\ntengesign.square\ntengesign.square.fill\npesetasign.circle\npesetasign.circle.fill\npesetasign.square\npesetasign.square.fill\npesosign.circle\npesosign.circle.fill\npesosign.square\npesosign.square.fill\nkipsign.circle\nkipsign.circle.fill\nkipsign.square\nkipsign.square.fill\nwonsign.circle\nwonsign.circle.fill\nwonsign.square\nwonsign.square.fill\nlirasign.circle\nlirasign.circle.fill\nlirasign.square\nlirasign.square.fill\naustralsign.circle\naustralsign.circle.fill\naustralsign.square\naustralsign.square.fill\nhryvniasign.circle\nhryvniasign.circle.fill\nhryvniasign.square\nhryvniasign.square.fill\nnairasign.circle\nnairasign.circle.fill\nnairasign.square\nnairasign.square.fill\nguaranisign.circle\nguaranisign.circle.fill\nguaranisign.square\nguaranisign.square.fill\ncoloncurrencysign.circle\ncoloncurrencysign.circle.fill\ncoloncurrencysign.square\ncoloncurrencysign.square.fill\ncedisign.circle\ncedisign.circle.fill\ncedisign.square\ncedisign.square.fill\ncruzeirosign.circle\ncruzeirosign.circle.fill\ncruzeirosign.square\ncruzeirosign.square.fill\ntugriksign.circle\ntugriksign.circle.fill\ntugriksign.square\ntugriksign.square.fill\nmillsign.circle\nmillsign.circle.fill\nmillsign.square\nmillsign.square.fill\nshekelsign.circle\nshekelsign.circle.fill\nshekelsign.square\nshekelsign.square.fill\nmanatsign.circle\nmanatsign.circle.fill\nmanatsign.square\nmanatsign.square.fill\nrupeesign.circle\nrupeesign.circle.fill\nrupeesign.square\nrupeesign.square.fill\nbahtsign.circle\nbahtsign.circle.fill\nbahtsign.square\nbahtsign.square.fill\nlarisign.circle\nlarisign.circle.fill\nlarisign.square\nlarisign.square.fill\nbitcoinsign.circle\nbitcoinsign.circle.fill\nbitcoinsign.square\nbitcoinsign.square.fill\nbrazilianrealsign.circle\nbrazilianrealsign.circle.fill\nbrazilianrealsign.square\nbrazilianrealsign.square.fill\n0.circle\n0.circle.fill\n0.square\n0.square.fill\n1.circle\n1.circle.fill\n1.square\n1.square.fill\n2.circle\n2.circle.fill\n2.square\n2.square.fill\n3.circle\n3.circle.fill\n3.square\n3.square.fill\n4.circle\n4.circle.fill\n4.square\n4.square.fill\n4.alt.circle\n4.alt.circle.fill\n4.alt.square\n4.alt.square.fill\n5.circle\n5.circle.fill\n5.square\n5.square.fill\n6.circle\n6.circle.fill\n6.square\n6.square.fill\n6.alt.circle\n6.alt.circle.fill\n6.alt.square\n6.alt.square.fill\n7.circle\n7.circle.fill\n7.square\n7.square.fill\n8.circle\n8.circle.fill\n8.square\n8.square.fill\n9.circle\n9.circle.fill\n9.square\n9.square.fill\n9.alt.circle\n9.alt.circle.fill\n9.alt.square\n9.alt.square.fill\n00.circle\n00.circle.fill\n00.square\n00.square.fill\n01.circle\n01.circle.fill\n01.square\n01.square.fill\n02.circle\n02.circle.fill\n02.square\n02.square.fill\n03.circle\n03.circle.fill\n03.square\n03.square.fill\n04.circle\n04.circle.fill\n04.square\n04.square.fill\n05.circle\n05.circle.fill\n05.square\n05.square.fill\n06.circle\n06.circle.fill\n06.square\n06.square.fill\n07.circle\n07.circle.fill\n07.square\n07.square.fill\n08.circle\n08.circle.fill\n08.square\n08.square.fill\n09.circle\n09.circle.fill\n09.square\n09.square.fill\n10.circle\n10.circle.fill\n10.square\n10.square.fill\n11.circle\n11.circle.fill\n11.square\n11.square.fill\n12.circle\n12.circle.fill\n12.square\n12.square.fill\n13.circle\n13.circle.fill\n13.square\n13.square.fill\n14.circle\n14.circle.fill\n14.square\n14.square.fill\n15.circle\n15.circle.fill\n15.square\n15.square.fill\n16.circle\n16.circle.fill\n16.square\n16.square.fill\n17.circle\n17.circle.fill\n17.square\n17.square.fill\n18.circle\n18.circle.fill\n18.square\n18.square.fill\n19.circle\n19.circle.fill\n19.square\n19.square.fill\n20.circle\n20.circle.fill\n20.square\n20.square.fill\n21.circle\n21.circle.fill\n21.square\n21.square.fill\n22.circle\n22.circle.fill\n22.square\n22.square.fill\n23.circle\n23.circle.fill\n23.square\n23.square.fill\n24.circle\n24.circle.fill\n24.square\n24.square.fill\n25.circle\n25.circle.fill\n25.square\n25.square.fill\n26.circle\n26.circle.fill\n26.square\n26.square.fill\n27.circle\n27.circle.fill\n27.square\n27.square.fill\n28.circle\n28.circle.fill\n28.square\n28.square.fill\n29.circle\n29.circle.fill\n29.square\n29.square.fill\n30.circle\n30.circle.fill\n30.square\n30.square.fill\n31.circle\n31.circle.fill\n31.square\n31.square.fill\n32.circle\n32.circle.fill\n32.square\n32.square.fill\n33.circle\n33.circle.fill\n33.square\n33.square.fill\n34.circle\n34.circle.fill\n34.square\n34.square.fill\n35.circle\n35.circle.fill\n35.square\n35.square.fill\n36.circle\n36.circle.fill\n36.square\n36.square.fill\n37.circle\n37.circle.fill\n37.square\n37.square.fill\n38.circle\n38.circle.fill\n38.square\n38.square.fill\n39.circle\n39.circle.fill\n39.square\n39.square.fill\n40.circle\n40.circle.fill\n40.square\n40.square.fill\n41.circle\n41.circle.fill\n41.square\n41.square.fill\n42.circle\n42.circle.fill\n42.square\n42.square.fill\n43.circle\n43.circle.fill\n43.square\n43.square.fill\n44.circle\n44.circle.fill\n44.square\n44.square.fill\n45.circle\n45.circle.fill\n45.square\n45.square.fill\n46.circle\n46.circle.fill\n46.square\n46.square.fill\n47.circle\n47.circle.fill\n47.square\n47.square.fill\n48.circle\n48.circle.fill\n48.square\n48.square.fill\n49.circle\n49.circle.fill\n49.square\n49.square.fill\n50.circle\n50.circle.fill\n50.square\n50.square.fill\napplelogo"
  },
  {
    "path": "External/SymbolPicker/Sources/SymbolPicker/Resources/zh_CN.lproj/Localizable.strings",
    "content": "\"search_placeholder\" = \"搜索\";\n\"cancel\" = \"取消\";\n\"sf_symbol_picker\" = \"选择符号\";\n\"done\" = \"确定\";\n"
  },
  {
    "path": "External/SymbolPicker/Sources/SymbolPicker/SymbolPicker.swift",
    "content": "//\n//  SymbolPicker.swift\n//  SymbolPicker\n//\n//  Created by Yubo Qin on 2/14/22.\n//\n\nimport SwiftUI\n\n#if os(macOS)\nimport AppKit\ntypealias PlatformColor = NSColor\n#else\nimport UIKit\ntypealias PlatformColor = UIColor\n#endif\n\npublic struct SymbolPicker: View {\n\n    // MARK: - Static consts\n\n    private static let symbols: [String] = {\n        guard let path = Bundle.module.path(forResource: \"sfsymbols\", ofType: \"txt\"),\n              let content = try? String(contentsOfFile: path)\n        else {\n            return []\n        }\n        return content\n            .split(separator: \"\\n\")\n            .map { String($0) }\n    }()\n\n    private static var gridDimension: CGFloat {\n        #if os(iOS)\n            return 64\n        #elseif os(tvOS)\n            return 128\n        #elseif os(macOS)\n            return 30\n        #else\n            return 48\n        #endif\n    }\n\n    private static var symbolSize: CGFloat {\n        #if os(iOS)\n            return 24\n        #elseif os(tvOS)\n            return 48\n        #elseif os(macOS)\n            return 14\n        #else\n            return 24\n        #endif\n    }\n\n    private static var symbolCornerRadius: CGFloat {\n        #if os(iOS)\n            return 8\n        #elseif os(tvOS)\n            return 12\n        #elseif os(macOS)\n            return 4\n        #else\n            return 8\n        #endif\n    }\n\n    private static var systemGray5: Color {\n        dynamicColor(\n            light: .init(red: 0.9, green: 0.9, blue: 0.92, alpha: 1.0),\n            dark: .init(red: 0.17, green: 0.17, blue: 0.18, alpha: 1.0)\n        )\n    }\n\n    private static var systemBackground: Color {\n        dynamicColor(\n            light: .init(red: 1, green: 1, blue: 1, alpha: 1.0),\n            dark: .init(red: 0, green: 0, blue: 0, alpha: 1.0)\n        )\n    }\n\n    private static var secondarySystemBackground: Color {\n        dynamicColor(\n            light: .init(red: 0.95, green: 0.95, blue: 1, alpha: 1.0),\n            dark: .init(red: 0, green: 0, blue: 0, alpha: 1.0)\n        )\n    }\n\n    // MARK: - Properties\n\n    @Binding public var symbol: String\n    @State private var searchText = \"\"\n    @Environment(\\.presentationMode) private var presentationMode\n\n    // MARK: - Public Init\n\n    public init(symbol: Binding<String>) {\n        _symbol = symbol\n    }\n\n    // MARK: - View Components\n\n    @ViewBuilder\n    private var searchableSymbolGrid: some View {\n        #if os(iOS)\n            if #available(iOS 15.0, *) {\n                symbolGrid\n                    .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))\n            } else {\n                VStack {\n                    TextField(LocalizedString(\"search_placeholder\"), text: $searchText)\n                        .padding(8)\n                        .padding(.horizontal, 8)\n                        .background(Self.systemGray5)\n                        .cornerRadius(8.0)\n                        .padding(.horizontal, 16.0)\n                        .autocapitalization(.none)\n                        .disableAutocorrection(true)\n                    symbolGrid\n                        .padding()\n                }\n            }\n        #elseif os(tvOS)\n            symbolGrid\n                .searchable(text: $searchText, placement: .automatic)\n        #elseif os(macOS)\n            VStack(spacing: 10) {\n                TextField(LocalizedString(\"search_placeholder\"), text: $searchText)\n                    .disableAutocorrection(true)\n                symbolGrid\n            }\n        #else\n        symbolGrid\n            .searchable(text: $searchText, placement: .automatic)\n        #endif\n    }\n\n    private var symbolGrid: some View {\n        ScrollView {\n            LazyVGrid(columns: [GridItem(.adaptive(minimum: Self.gridDimension, maximum: Self.gridDimension))]) {\n                ForEach(Self.symbols.filter { searchText.isEmpty ? true : $0.localizedCaseInsensitiveContains(searchText) }, id: \\.self) { thisSymbol in\n                    Button(action: {\n                        symbol = thisSymbol\n\n                        // Dismiss sheet. macOS will have done button\n                        #if !os(macOS)\n                        presentationMode.wrappedValue.dismiss()\n                        #endif\n                    }) {\n                        if thisSymbol == symbol {\n                            Image(systemName: thisSymbol)\n                                .font(.system(size: Self.symbolSize))\n                                .frame(maxWidth: .infinity, minHeight: Self.gridDimension)\n                            #if !os(tvOS)\n                                .background(Color.accentColor)\n                            #else\n                                .background(Color.gray.opacity(0.3))\n                            #endif\n                                .cornerRadius(Self.symbolCornerRadius)\n                                .foregroundColor(.white)\n                        } else {\n                            Image(systemName: thisSymbol)\n                                .font(.system(size: Self.symbolSize))\n                                .frame(maxWidth: .infinity, minHeight: Self.gridDimension)\n                                .background(Self.systemBackground)\n                                .cornerRadius(Self.symbolCornerRadius)\n                                .foregroundColor(.primary)\n                        }\n                    }\n                    .buttonStyle(PlainButtonStyle())\n                }\n            }\n        }\n    }\n\n    public var body: some View {\n        #if !os(macOS)\n            NavigationView {\n                ZStack {\n                    Self.secondarySystemBackground.edgesIgnoringSafeArea(.all)\n                    searchableSymbolGrid\n                }\n                #if os(iOS)\n                .navigationBarTitleDisplayMode(.inline)\n                #endif\n                .toolbar {\n                    ToolbarItem(placement: .cancellationAction) {\n                        Button(LocalizedString(\"cancel\")) {\n                            presentationMode.wrappedValue.dismiss()\n                        }\n                    }\n                }\n            }\n            .navigationViewStyle(StackNavigationViewStyle())\n        #else\n            VStack(alignment: .leading, spacing: 10) {\n                Text(LocalizedString(\"sf_symbol_picker\"))\n                    .font(.headline)\n                Divider()\n                searchableSymbolGrid\n                    .frame(maxWidth: .infinity, maxHeight: .infinity)\n                Divider()\n                HStack {\n                    Button {\n                        symbol = \"\"\n                        presentationMode.wrappedValue.dismiss()\n                    } label: {\n                        Text(LocalizedString(\"cancel\"))\n                    }\n                    .keyboardShortcut(.cancelAction)\n                    Spacer()\n                    Button {\n                        presentationMode.wrappedValue.dismiss()\n                    } label: {\n                        Text(LocalizedString(\"done\"))\n                    }\n                }\n            }\n            .padding()\n            .frame(width: 520, height: 300, alignment: .center)\n        #endif\n    }\n\n    // MARK: - Private helpers\n\n    private static func dynamicColor(light: PlatformColor, dark: PlatformColor) -> Color {\n        #if os(iOS)\n            let color = PlatformColor { $0.userInterfaceStyle == .dark ? dark : light }\n            if #available(iOS 15.0, *) {\n                return Color(uiColor: color)\n            } else {\n                return Color(color)\n            }\n        #elseif os(tvOS)\n            let color = PlatformColor { $0.userInterfaceStyle == .dark ? dark : light }\n            return Color(uiColor: color)\n        #elseif os(macOS)\n            let color = PlatformColor(name: nil) { $0.name == .darkAqua ? dark : light }\n            if #available(macOS 12.0, *) {\n                return Color(nsColor: color)\n            } else {\n                return Color(color)\n            }\n        #else\n            return Color(uiColor: dark)\n        #endif\n    }\n\n}\n\nprivate func LocalizedString(_ key: String) -> String {\n    NSLocalizedString(key, bundle: .module, comment: \"\")\n}\n\nstruct SymbolPicker_Previews: PreviewProvider {\n    @State static var symbol: String = \"square.and.arrow.up\"\n\n    static var previews: some View {\n        Group {\n            SymbolPicker(symbol: Self.$symbol)\n            SymbolPicker(symbol: Self.$symbol)\n                .preferredColorScheme(.dark)\n        }\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# ActionBee\n\nActionBee is a programmable pasteboard action trigger.\n\n![Screenshot](./Resources/Demo/ScreenshotMain.png)\n![Screenshot](./Resources/Demo/ScreenshotModule.png)\n\n## Preview Video\n\nIt can be used to clean your URL in text. To see code or import this module, check out [here](./Resources/ModuleSample/Module%20Export%20-%20Link%20Cleaner/).\n\n![Clean URL](./Resources/Demo/Demo%20Link%20Cleaner.gif)\n\nWith Universal Control and iCloud Pasteboard, link cleaner will work across devices.\n\n![Clean URL Across Devices](./Resources/Demo/Demo%20Link%20Cleaner%20Across%20Devices.gif)\n\nIt can also be used to run the formator as follows. To see code or import this module, check out [here](./Resources/ModuleSample/Module%20Export%20-%20Multiline%20Init%20Formatter/).\n\n![Format Code](./Resources/Demo/Demo%20Multiline%20Formatter.gif)\n\n## Action Module\n\nWe encourage you to develop an action module yourself. To see how a module gets to work, create one and check out the source. It is well documented inside the code.\n\nGenerically speaking, we pass your pasteboard data in the process's environment and spawn your module that is compiled as binary. At the end, we read back a recipe from stdout where you can define what to do.\n\n## Warning\n\nThis app itself does not require access to your data or an internet connection, but the module you install may do. We do **not** use any sandbox to protect your data or privacy. **Only import modules come with source code and exam each line yourself before compiling or executing them.**\n\n## Contributor\n\nMade with love by [@Lakr233](https://twitter.com/@Lakr233), thanks to all my lovely friends for testing and being with me day and night.\n\n## One More Thing\n\nIf you are looking for an Android alternative (which was made for cleaning URL), checkout [Tarnhelm](https://github.com/lz233/Tarnhelm) by [@lz__233](https://twitter.com/lz__233).\n\nIf you are looking for a great pasteboard manager, checkout [PasteNow](https://apps.apple.com/cn/app/pastenow-instant-clipboard/id1552536109) by [@tualatrix](https://twitter.com/tualatrix). I also recommend [Raycast](https://www.raycast.com/)'s built-in pasteboard manager if you are not a heavy user of it.\n\n## License\n\nGenerically speaking, we do not hold responsibility for anything that happened on your computer, nor your data or privacy.\n\n[License](./LICENSE)\n\n---\n\nCopyright © 2022 Lakr Aream. All Rights Reserved.\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    [[NSBundle.mainBundle infoDictionary] setValue: @{ @\"NSAllowsArbitraryLoads\" : @YES }\n                                            forKey:@\"NSAppTransportSecurity\"];\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/compile.sh",
    "content": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" \\\n        2>/dev/null | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\" \\\n    1>/dev/null 2>/dev/null\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/launch.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/CleanerRule.swift",
    "content": "//\n//  DomainRule.swift\n//\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport Foundation\n\nlet cleaners: [CleanerRule] = [\n    Twitter(),\n    BiliBili(), B23TV(),\n]\n\nprotocol CleanerRule {\n    func isPotentialCandidate(original url: URL) -> Bool\n    func process(original url: URL) -> URL?\n}\n\nextension URL {\n    func deletingAllQueryParameters() -> URL? {\n        guard var components = URLComponents(\n            url: self,\n            resolvingAgainstBaseURL: false\n        ) else {\n            return nil\n        }\n\n        components.queryItems = []\n\n        guard let newUrl = components.url else { return nil }\n\n        var str = newUrl.absoluteString\n        if str.hasSuffix(\"?\") { str.removeLast() }\n\n        return URL(string: str)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/Rule+BiliBili.swift",
    "content": "//\n//  File.swift\n//\n//\n//  Created by Lakr Aream on 2022/8/18.\n//\n\nimport Foundation\n\nclass BiliBili: CleanerRule {\n    func isPotentialCandidate(original url: URL) -> Bool {\n        url.host?.lowercased().contains(\"www.bilibili.com\") ?? false\n    }\n\n    func process(original url: URL) -> URL? {\n        guard url.deletingLastPathComponent().lastPathComponent == \"video\",\n              let result = url.deletingAllQueryParameters()\n        else {\n            return nil\n        }\n        return result\n    }\n}\n\nclass B23TV: CleanerRule {\n    func isPotentialCandidate(original url: URL) -> Bool {\n        url.host?.lowercased().contains(\"b23.tv\") ?? false\n    }\n\n    func process(original url: URL) -> URL? {\n        var comps = URLComponents(url: url, resolvingAgainstBaseURL: false)\n//        comps?.scheme = \"https\"\n        guard let requestUrl = comps?.url else {\n            return nil\n        }\n        let sem = DispatchSemaphore(value: 0)\n        var cleanResult: URL?\n        DispatchQueue.global().async {\n            var request = URLRequest(\n                url: requestUrl,\n                cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,\n                timeoutInterval: 6\n            )\n            request.addValue(\n                \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36\",\n                forHTTPHeaderField: \"user-agent\"\n            )\n            URLSession.shared.dataTask(with: request) { _, resp, _ in\n                defer { sem.signal() }\n                guard let resp = resp as? HTTPURLResponse else {\n                    return\n                }\n                cleanResult = resp.url?.deletingAllQueryParameters()\n            }\n            .resume()\n        }\n        sem.wait()\n        return cleanResult\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/Rule+Twitter.swift",
    "content": "//\n//  CleanerRule+Twitter.swift\n//\n//\n//  Created by Lakr Aream on 2022/8/17.\n//\n\nimport Foundation\n\nclass Twitter: CleanerRule {\n    func isPotentialCandidate(original url: URL) -> Bool {\n        url.host?.lowercased().contains(\"twitter.com\") ?? false\n    }\n\n    func process(original url: URL) -> URL? {\n        guard url.deletingLastPathComponent().lastPathComponent == \"status\",\n              let result = url.deletingAllQueryParameters()\n        else {\n            return nil\n        }\n        return result\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\nimport Cocoa\n\npublic enum ActionBee {\n    \n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {        \n        let text = event.pasteboardContent\n        let types: NSTextCheckingResult.CheckingType = .link\n        let detector = try? NSDataDetector(types: types.rawValue)\n        guard let detect = detector else {\n            completion(.none)\n        }\n        let matches = detect.matches(\n            in: text,\n            options: .reportCompletion,\n            range: NSMakeRange(0, text.count)\n        )\n        \n        var stringComps: [StringComps] = [\n            .init(isLink: false, messgae: \"\")\n        ]\n        \n        guard !matches.isEmpty else {\n            completion(.none)\n        }\n        \n        // lazy man slow process but it works~\n        for idx in 0 ..< text.count {\n            let char = text[idx]\n            var isLink = false\n            for match in matches {\n                if match.range.contains(idx) {\n                    isLink = true\n                    break\n                }\n            }\n            if stringComps[stringComps.count - 1].isLink == isLink {\n                stringComps[stringComps.count - 1].messgae += String(char)\n            } else {\n                stringComps.append(.init(isLink: isLink, messgae: String(char)))\n            }\n        }\n        \n        var processed = false\n        stringComps = stringComps.map { comps -> StringComps in\n            if !comps.isLink { return comps }\n            guard let url = URL(string: comps.messgae) else {\n                return comps\n            }\n            for cleaner in cleaners {\n                if cleaner.isPotentialCandidate(original: url),\n                   let newUrl = cleaner.process(original: url)\n                {\n                    processed = true\n                    return .init(isLink: comps.isLink, messgae: newUrl.absoluteString)\n                }\n            }\n            return comps\n        }\n        \n        let newText = stringComps\n            .map(\\.messgae)\n            .joined()\n        \n        guard processed else {\n            completion(.none)\n        }\n        \n        let result = RecipeData(\n            postAction: .overwrite,\n            postContent: newText,\n            continueQueue: true\n        )\n        completion(result)\n    }\n    \n    struct StringComps {\n        var isLink: Bool\n        var messgae: String\n    }\n    \n}\n\nextension StringProtocol {\n    subscript(offset: Int) -> Character { self[index(startIndex, offsetBy: offset)] }\n    subscript(range: Range<Int>) -> SubSequence {\n        let startIndex = index(self.startIndex, offsetBy: range.lowerBound)\n        return self[startIndex..<index(startIndex, offsetBy: range.count)]\n    }\n    subscript(range: ClosedRange<Int>) -> SubSequence {\n        let startIndex = index(self.startIndex, offsetBy: range.lowerBound)\n        return self[startIndex..<index(startIndex, offsetBy: range.count)]\n    }\n    subscript(range: PartialRangeFrom<Int>) -> SubSequence { self[index(startIndex, offsetBy: range.lowerBound)...] }\n    subscript(range: PartialRangeThrough<Int>) -> SubSequence { self[...index(startIndex, offsetBy: range.upperBound)] }\n    subscript(range: PartialRangeUpTo<Int>) -> SubSequence { self[..<index(startIndex, offsetBy: range.upperBound)] }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/compile.sh",
    "content": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" \\\n        2>/dev/null | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\" \\\n    1>/dev/null 2>/dev/null\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/launch.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\n\n/*\n\n ⚠️\n\n Only changes within the current directory will be committed to the compiler,\n     other modifications outside Source dir will be ignored when build.\n\n You can add any package dependencies in Package.swift, process your need, and\n     build us a recipe.\n\n */\n\npublic enum ActionBee {\n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {\n        guard event.pasteboardContent.hasPrefix(\"init(\"),\n              event.pasteboardContent.hasSuffix(\")\")\n        else {\n            completion(.none)\n        }\n        \n        var payload = event.pasteboardContent\n        payload.removeFirst(\"init(\".count)\n        payload.removeLast(\")\".count)\n        payload = payload\n            .components(separatedBy: \",\")\n            .joined(separator: \",\\n\")\n        \n        payload = \"init(\\n\\(payload)\\n)\"\n        \n        completion(RecipeData(\n            postAction: .overwrite,\n            postContent: payload,\n            continueQueue: false\n        ))\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/compile.sh",
    "content": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" \\\n        2>/dev/null | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\" \\\n    1>/dev/null 2>/dev/null\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/launch.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Quick SFImage/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\nimport Cocoa\n\n/*\n\n ⚠️\n\n Only changes within the current directory will be committed to the compiler,\n     other modifications outside Source dir will be ignored when build.\n\n You can add any package dependencies in Package.swift, process your need, and\n     build us a recipe.\n\n */\n\npublic enum ActionBee {\n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {\n\n        let text = event.pasteboardContent\n        \n        if #available(macOS 11.0, *) {\n            if NSImage(systemSymbolName: text, accessibilityDescription: nil) != nil {\n                completion(.init(\n                    postAction: .overwrite,\n                    postContent: \"Image(systemName: \\\"\\(event.pasteboardContent)\\\")\",\n                    continueQueue: false\n                ))\n            }\n        }\n        \n        completion(.none)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/compile.sh",
    "content": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" \\\n        2>/dev/null | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\" \\\n    1>/dev/null 2>/dev/null\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/.supplement/launch.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleSample/Module Export - Speak Dictionary/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\n\n/*\n\n ⚠️\n\n Only changes within the current directory will be committed to the compiler,\n     other modifications outside Source dir will be ignored when build.\n\n You can add any package dependencies in Package.swift, process your need, and\n     build us a recipe.\n\n */\n\npublic enum ActionBee {\n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {\n        completion(RecipeData(\n           postAction: .speak,\n           postContent: event.pasteboardContent,\n           continueQueue: false\n       ))\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/.templates",
    "content": ""
  },
  {
    "path": "Resources/ModuleTemplate/Executable/ActionBeeModule.exec",
    "content": ""
  },
  {
    "path": "Resources/ModuleTemplate/Executable/Put your binary here",
    "content": ""
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\n\n/*\n\n ⚠️\n\nYou are in charge to put result binary at designated location.\n\n*/\n\npublic enum ActionBee {\n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {\n        // do your workflow here, but avoid changing the pasteboard\n\n        let appName = event.focusAppID\n        let appID = event.focusAppID\n        let content = event.pasteboardContent\n\n        print(\n            \"\"\"\n            ====================\n            \\(appName ?? \"unknown app\") - \\(appID ?? \"unknown app id\")\n            \\(content)\n            ====================\n            \"\"\"\n        )\n\n        // after your work is done, return the recipe and tell parent to do the job\n        // return nil if failed to process\n        let result = RecipeData(\n            postAction: .speak,\n            postContent: \"Hello World\",\n            continueQueue: false\n        )\n        completion(result)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/ExecutableSwift/compile.command",
    "content": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/\n\necho \"[*] starting build at $(pwd)...\"\n\necho \"[*] cleaning build...\"\n\nrm -rf ActionBeeModule.exec || true\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" \\\n        2>/dev/null | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\" \\\n    1>/dev/null 2>/dev/null\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\nmv ./.build/cli ./ActionBeeModule.exec\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/.eslintrc.js",
    "content": "module.exports = require('@innei/eslint-config-ts')\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/.gitignore",
    "content": "node_modules\npnpm-lock.yaml\ndist\nyarn.lock\npackage-lock.json\n.DS_Store\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/.supplement/compile.sh",
    "content": "#!/bin/zsh\n\n# this compiler script is designed to issue result to ./dist/index.js\n\nexport PATH=$PATH:/opt/homebrew/bin:/usr/local/bin\n\nif ! [ -x \"$(command -v npm)\" ]; then\n  echo '[E] npm is not installed.' >&2\n  exit 1\nfi\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    echo \"[E] malformed project architecture\"\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf dist || true\n\necho \"[*] install dependencies...\"\n\nnpm i\n\necho \"[*] compile...\"\n\nnpm run build\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/package.json",
    "content": "{\n  \"name\": \"action.bee.source.module.src\",\n  \"version\": \"0.0.0\",\n  \"description\": \"ActionBee Module Source Using Node\",\n  \"main\": \"./dist/index.js\",\n  \"scripts\": {\n    \"build\": \"ncc build src/index.ts -o dist\"\n  },\n  \"keywords\": [],\n  \"author\": \"Innei\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@types/node\": \"18.7.8\",\n    \"@vercel/ncc\": \"0.34.0\",\n    \"typescript\": \"4.7.4\"\n  }\n}"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/src/global.d.ts",
    "content": "declare global {\n  export interface ActionBeeMessageEvent {\n    focusAppID?: string\n    focusAppName?: string\n    pasteboardContent: string\n  }\n\n  export type ActionBeeAction = 'none' | 'overwrite' | 'speak'\n}\nexport {}\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/src/index.ts",
    "content": "// ActionBee - Node Module Template\n\n// ⚠️ please put compiled your src into ./dist/index.js\n\nfunction finalizeResult(\n  action: ActionBeeAction,\n  content: string,\n  continueQueue: boolean,\n) {\n  const result = {\n    postAction: action, // none, overwrite, speak\n    postContent: content, // your content to post\n    continueQueue,\n  }\n  const base64 = Buffer.from(JSON.stringify(result)).toString('base64')\n  process.stderr.write(`\\nActionBee-Result-Recipe://${base64}`)\n  process.exit(0)\n}\n\nfunction moduleMain() {\n  const messageFromEnv = process.env['Communicator_Message']\n\n  if (!messageFromEnv) {\n    process.stderr.write('ActionBee-Error: No message found')\n    return\n  }\n\n  const toString = Buffer.from(messageFromEnv, 'base64').toString()\n  const event: ActionBeeMessageEvent = JSON.parse(toString)\n\n  console.log(event.focusAppID) // optional\n  console.log(event.focusAppName) // optional\n  console.log(event.pasteboardContent) // string\n\n  finalizeResult('overwrite', 'Hello World', false)\n}\n\nmoduleMain()\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceNode/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2017\",\n    \"module\": \"CommonJS\",\n    \"declaration\": false,\n    \"allowJs\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"baseUrl\": \"./src\",\n    \"resolveJsonModule\": true,\n    \"strict\": true,\n    \"esModuleInterop\": true\n  }\n}"
  },
  {
    "path": "Resources/ModuleTemplate/SourcePython/main.py",
    "content": "#!/usr/bin/env python3\n\nimport base64\nimport json\nimport os\nfrom sys import stderr\n\n\n# Write your code inside SolutionMain() function.\n\n\nclass PasteboardEvent:\n    def __init__(self, focusAppID, focusAppName, pasteboardContent):\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n\n\nclass ActionBeeRecipe:\n    def __init__(self, postAction, postContent, continueQueue):\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n\n    def finalizeAndSend(self):\n        message = json.dumps(self.__dict__)\n        b64msg = base64.b64encode(message.encode('utf-8'))\n        finalmsg = \"\\nActionBee-Result-Recipe://\" + b64msg.decode('utf-8')\n        print(finalmsg, file=stderr)\n        exit(0)\n\n\ndef SolutionMain(event: PasteboardEvent) -> ActionBeeRecipe:\n    print(event.focusAppID)\n    print(event.focusAppName)\n    print(event.pasteboardContent)\n\n    return ActionBeeRecipe(\n        postAction=\"none\",  # none, overwrite, speak\n        postContent=event.pasteboardContent,\n        continueQueue=True\n    )\n\n\nif __name__ == '__main__':\n    raw_event = base64.b64decode(\n        os.environ['Communicator_Message']).decode('utf-8')\n    json_object = json.loads(raw_event)\n    event = PasteboardEvent(\n        json_object['focusAppID'],\n        json_object['focusAppName'],\n        json_object['pasteboardContent']\n    )\n    recipe = SolutionMain(event)\n    recipe.finalizeAndSend()\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.gitignore",
    "content": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n*.ipa\n*.lcov\n*.lock\n*.log\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*.pid\n*.pid.lock\n*.seed\n*.swp\n*.tgz\n*.tsbuildinfo\n*.xccheckout\n*.xcscmblueprint\n*.xcuserstate\n*~.nib\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.build\n.bundle\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.idea\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.parcel-cache\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.swiftpm\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/build-state.yml\n.yarn/cache\n.yarn/unplugged\n/*.gcno\nArtifacts/\nCI\nCI-Pods.tar\nCarthage/Build\nCarthage/Build/\nDerivedData\nDerivedData/\nIcon\nNetwork Trash Folder\nPipeline/Dockers/Buildtime/\nPodfile.lock\nPods/\nTemporary Items\nartifacts/\nbower_components\nbuild/\nbuild/Release\ncoverage\ndefault.profraw\ndist\ndockerbuild\ndockermnt\nfastlane/Preview.html\nfastlane/report.xml\nfastlane/screenshots/**/*.png\nfastlane/test_output\niOSInjectionProject/\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nprofile\nproject.xcworkspace\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntemp/\ntemps/\nweb_modules/\nxcuserdata\nxcuserdata/\nyarn-debug.log*\nyarn-error.log*\n\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
    "content": "//\n//  main.swift\n//  CommandLineBridge\n//\n//  Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Definition\nimport Foundation\nimport Source\n\nguard let data = Communicator.retrieveParentData() else {\n    fatalError(\"unable to receive argument data\")\n}\n\nguard let argument = ArgumentData.retrieve(withData: data) else {\n    fatalError(\"unable to receive argument object\")\n}\n\nprivate let defaultRecipe: RecipeData = .init(\n    postAction: .none,\n    postContent: \"\",\n    continueQueue: true\n)\n\nlet completion: ((RecipeData?) -> Never) = { recipe in\n    guard let recipe = recipe else {\n        Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n        fatalError(\"malformed program flow\")\n    }\n    guard let recipeBase64String = recipe.compileBase64() else {\n        fatalError(\"failed to compile recipe data\")\n    }\n    Communicator.sendRecipeDataAndExit(recipeBase64String)\n    fatalError(\"malformed program flow\")\n}\n\ndo {\n    try ActionBee.solutionMain(event: argument, completion: completion)\n} catch {\n    print(error.localizedDescription)\n    Communicator.sendRecipeDataAndExit(defaultRecipe.compileBase64()!)\n    fatalError(\"malformed program flow\")\n}\n\nCFRunLoopRun()\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t50307AB928A75EA500598724 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50307AB828A75EA500598724 /* main.swift */; };\n\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */ = {isa = PBXBuildFile; productRef = 50307AC028A8AF0E00598724 /* Communicator */; };\n\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BD828A8AF7D00882579 /* Source */; };\n\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */ = {isa = PBXBuildFile; productRef = 50628BDA28A8CD2300882579 /* Definition */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t50307AB328A75EA500598724 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t50307AB528A75EA500598724 /* CommandLineBridge */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = CommandLineBridge; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50307AB828A75EA500598724 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50307AB228A75EA500598724 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AC128A8AF0E00598724 /* Communicator in Frameworks */,\n\t\t\t\t50628BD928A8AF7D00882579 /* Source in Frameworks */,\n\t\t\t\t50628BDB28A8CD2300882579 /* Definition in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t50307AAC28A75EA500598724 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB728A75EA500598724 /* CommandLineBridge */,\n\t\t\t\t50307AB628A75EA500598724 /* Products */,\n\t\t\t\t50307ABF28A8AF0B00598724 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB628A75EA500598724 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB528A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307AB728A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50307AB828A75EA500598724 /* main.swift */,\n\t\t\t);\n\t\t\tpath = CommandLineBridge;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50307ABF28A8AF0B00598724 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50307AB428A75EA500598724 /* CommandLineBridge */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50307AB128A75EA500598724 /* Sources */,\n\t\t\t\t50307AB228A75EA500598724 /* Frameworks */,\n\t\t\t\t50307AB328A75EA500598724 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = CommandLineBridge;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50307AC028A8AF0E00598724 /* Communicator */,\n\t\t\t\t50628BD828A8AF7D00882579 /* Source */,\n\t\t\t\t50628BDA28A8CD2300882579 /* Definition */,\n\t\t\t);\n\t\t\tproductName = CommandLineBridge;\n\t\t\tproductReference = 50307AB528A75EA500598724 /* CommandLineBridge */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50307AAD28A75EA500598724 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1340;\n\t\t\t\tLastUpgradeCheck = 1400;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50307AB428A75EA500598724 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 50307AAC28A75EA500598724;\n\t\t\tproductRefGroup = 50307AB628A75EA500598724 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50307AB428A75EA500598724 /* CommandLineBridge */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50307AB128A75EA500598724 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50307AB928A75EA500598724 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50307ABA28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABB28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50307ABD28A75EA500598724 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50307ABE28A75EA500598724 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50307AB028A75EA500598724 /* Build configuration list for PBXProject \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABA28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABB28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50307ABC28A75EA500598724 /* Build configuration list for PBXNativeTarget \"CommandLineBridge\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50307ABD28A75EA500598724 /* Debug */,\n\t\t\t\t50307ABE28A75EA500598724 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t50307AC028A8AF0E00598724 /* Communicator */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Communicator;\n\t\t};\n\t\t50628BD828A8AF7D00882579 /* Source */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Source;\n\t\t};\n\t\t50628BDA28A8CD2300882579 /* Definition */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Definition;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50307AAD28A75EA500598724 /* Project object */;\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1400\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50307AB428A75EA500598724\"\n               BuildableName = \"CommandLineBridge\"\n               BlueprintName = \"CommandLineBridge\"\n               ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"Communicator_Message\"\n            value = \"eyJmb2N1c0FwcElEIjoiY29tLmFwcGxlLmR0Llhjb2RlIiwicGFzdGVib2FyZENvbnRlbnQiOiJIZWxsbyBXb3JsZCIsImZvY3VzQXBwTmFtZSI6Ilhjb2RlIn0=\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50307AB428A75EA500598724\"\n            BuildableName = \"CommandLineBridge\"\n            BlueprintName = \"CommandLineBridge\"\n            ReferencedContainer = \"container:CommandLineBridge.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Communicator/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Communicator/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Communicator\",\n    products: [\n        .library(name: \"Communicator\", targets: [\"Communicator\"]),\n    ],\n    targets: [\n        .target(name: \"Communicator\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Communicator/Sources/Communicator/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Communicator/Sources/Communicator/Communicator.m",
    "content": "//\n//  Communicator.m\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData;\n\n__attribute__((constructor)) void communicator_constructor(void) {\n    NSString *message = [NSProcessInfo.processInfo.environment valueForKey:@\"Communicator_Message\"];\n    if (message.length <= 0) { return; }\n    \n    NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:NULL];\n    if (data == NULL || data.length <= 0) { return; }\n    \n    argumentData = data;\n}\n\n@implementation Communicator\n\n+ (NSData*)retrieveParentData {\n    return argumentData;\n}\n\n+ (void)sendRecipeDataAndExit:(NSString*)base64String {\n    NSLog(@\"\\nActionBee-Result-Recipe://%@\", base64String);\n    exit(0);\n}\n\n@end\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
    "content": "//\n//  Communicator.h\n//  \n//\n//  Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Communicator : NSObject\n\n+ (NSData* _Nullable )retrieveParentData;\n+ (void)sendRecipeDataAndExit:(NSString* _Nonnull)base64String;\n\n@end\n\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Definition/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Definition/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Definition\",\n    products: [\n        .library(name: \"Definition\", targets: [\"Definition\"]),\n    ],\n    targets: [\n        .target(name: \"Definition\", dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/Definition/Sources/Definition/Definition.swift",
    "content": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: Codable {\n    public let focusAppID: String?\n    public let focusAppName: String?\n    public let pasteboardContent: String\n\n    public init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {\n        self.focusAppID = focusAppID\n        self.focusAppName = focusAppName\n        self.pasteboardContent = pasteboardContent\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> ArgumentData? {\n        try? decoder.decode(ArgumentData.self, from: data)\n    }\n}\n\npublic struct RecipeData: Codable {\n    public let postAction: PostAction\n    public let postContent: String\n    public let continueQueue: Bool\n\n    public enum PostAction: String, Codable {\n        case overwrite\n        case speak\n        case none\n    }\n\n    public init(postAction: PostAction, postContent: String, continueQueue: Bool) {\n        self.postAction = postAction\n        self.postContent = postContent\n        self.continueQueue = continueQueue\n    }\n\n    public func compileBase64() -> String? {\n        (try? encoder.encode(self))?.base64EncodedString()\n    }\n\n    public static func retrieve(withData data: Data) -> Self? {\n        try? decoder.decode(Self.self, from: data)\n    }\n}\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/compile.sh",
    "content": "#!/bin/zsh\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho \"[*] starting build at $(pwd)...\"\n\nif [ ! -f .action ]; then\n    echo \"[E] malformed project architecture\"\n    exit 1\nfi\n\necho \"[*] cleaning build...\"\n\nrm -rf .build || true\nmkdir .build\n\necho \"[*] looking for target binary...\"\n\nBUILT_PRODUCTS_DIR=$(\n    xcodebuild \\\n        clean build \\\n        -configuration Release \\\n        -workspace ./App.xcworkspace \\\n        -scheme CommandLineBridge \\\n        -showBuildSettings \\\n        CODE_SIGNING_ALLOWED=\"NO\" | grep -m 1 \"BUILT_PRODUCTS_DIR\" | grep -oEi \"\\/.*\"\n)\n\nBINARY_LOCATION=\"$BUILT_PRODUCTS_DIR/CommandLineBridge\"\n\n# remove the binary\nrm -f \"$BINARY_LOCATION\" || true\n\necho \"[*] building binary to $BUILT_PRODUCTS_DIR...\"\n\nxcodebuild \\\n    clean build \\\n    -configuration Release \\\n    -workspace ./App.xcworkspace \\\n    -scheme CommandLineBridge \\\n    CODE_SIGNING_ALLOWED=\"NO\"\n\n# check if the binary exists\nif [ ! -f \"$BINARY_LOCATION\" ]; then\n    echo \"[E] failed to emit binary at $BINARY_LOCATION\"\n    exit 1\nfi\n\necho \"[*] copying binary...\"\n\ncp \"$BINARY_LOCATION\" .build/cli\n\necho \"[*] signing binary...\"\nchmod +x .build/cli\ncodesign -s - --deep --force .build/cli 1>/dev/null 2>/dev/null\n\necho \"[+] completed compile\"\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/.supplement/launch.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/App.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Source\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Definition\">\n   </FileRef>\n   <FileRef\n      location = \"group:.supplement/Communicator\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/Source/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/Source/Package.swift",
    "content": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"Source\",\n    products: [\n        .library(name: \"Source\", targets: [\"Source\"]),\n    ],\n    dependencies: [\n        .package(name: \"Definition\", path: \"./.supplement/Definition\"),\n    ],\n    targets: [\n        .target(name: \"Source\", dependencies: [\"Definition\"]),\n    ]\n)\n"
  },
  {
    "path": "Resources/ModuleTemplate/SourceSwift/Source/Sources/Source/Source.swift",
    "content": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\n\n/*\n\n ⚠️\n\n Only changes within the current directory will be committed to the compiler,\n     other modifications outside ./Source/Sources dir will be ignored when build.\n\n */\n\npublic enum ActionBee {\n    public static func solutionMain(event: ArgumentData, completion: @escaping (RecipeData?) -> Never) throws {\n        // do your workflow here, but avoid changing the pasteboard\n\n        let appName = event.focusAppID\n        let appID = event.focusAppID\n        let content = event.pasteboardContent\n\n        print(\n            \"\"\"\n            ====================\n            \\(appName ?? \"unknown app\") - \\(appID ?? \"unknown app id\")\n            \\(content)\n            ====================\n            \"\"\"\n        )\n\n        // after your work is done, return the recipe and tell parent to do the job\n        // return nil if failed to process\n        let result = RecipeData(\n            postAction: .speak,\n            postContent: \"Hello World\",\n            continueQueue: false\n        )\n        completion(result)\n    }\n}\n"
  },
  {
    "path": "Resources/Scripts/NewlineDeduplicate.swift",
    "content": "import Foundation\n\nguard CommandLine.arguments.count == 2 else { exit(-1) }\n\nlet url = URL(fileURLWithPath: CommandLine.arguments[1])\n\nguard var str = try? String(contentsOf: url) else { exit(-1) }\n\nwhile str.contains(\"\\n\\n\\n\") {\n    str = str.replacingOccurrences(of: \"\\n\\n\\n\", with: \"\\n\\n\")\n}\n\ntry str.write(to: url, atomically: true, encoding: .utf8)"
  },
  {
    "path": "Resources/Scripts/PackTemplates.sh",
    "content": "#!/bin/bash\n\nset -ex\n\ncd \"$(dirname \"$0\")\"/../ModuleTemplate\nSOURCE_DIR=\"$(pwd)\"\n\nTARGET_DIR=\"../../App/Action/Action/Backend/Action/ActionTemplates\"\ncd \"$TARGET_DIR\"\nTARGET_DIR=\"$(pwd)\"\n\nFLAG_FILE=\".templates\"\nPATH_EXTENSION=\"ActionTemplatePackage\"\n\nif [ ! -f \"$SOURCE_DIR/$FLAG_FILE\" ]; then\n    echo \"malformed project structure\"\n    exit 1\nfi\n\nif [ ! -f \"$TARGET_DIR/$FLAG_FILE\" ]; then\n    echo \"malformed project structure\"\n    exit 1\nfi\n\necho \"[*] Cleaning up old templates...\"\ncd \"$TARGET_DIR\"\nrm -rf ./*\n\necho \"[*] Cleaning up dirty templates...\"\ncd \"$SOURCE_DIR\"\nfind \"$SOURCE_DIR\" -name \".DS_Store\" -delete\nfind \"$SOURCE_DIR\" -name \"._*\" -delete\ngit clean -fdx\n\necho \"[*] Packaging templates...\"\ncd \"$SOURCE_DIR\"\nfor TEMPLATE_ITEM in *\ndo\n    echo \"[*] Packaging $TEMPLATE_ITEM...\"\n    cd \"$SOURCE_DIR/$TEMPLATE_ITEM\" || continue\n    tar -cvf \"$TARGET_DIR/$TEMPLATE_ITEM.$PATH_EXTENSION\" .\ndone\n\necho \"[*] Done\""
  },
  {
    "path": "Resources/Scripts/UpdateGitHub.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"\ncd ../../\n\n# check if .root file exists\nif [ ! -f .root ]; then\n    echo \"malformed project structure, missing .root file\"\n    exit 1\nfi\n\nORIG_DIR=$(pwd)\nTARGET_DIR=\"/Users/qaq/Bootstrap/GitHub/ActionBee\"\n\n# check if ORIG_DIR has prefix \nif [[ $ORIG_DIR != \"/Users/qaq/Bootstrap/\"* ]]; then\n    echo \"this script is used to sync commit on @Lakr233 device, do not run it!\"\n    exit 1\nfi\n\n# check if target exists\nif [ ! -d $TARGET_DIR ]; then\n    echo \"target directory $TARGET_DIR does not exist\"\n    exit 1\nfi\n# check if file target/.root exists\nif [ ! -f $TARGET_DIR/.root ]; then\n    echo \"target directory $TARGET_DIR is not target project\"\n    exit 1\nfi\n\necho \"Syncing from $ORIG_DIR to $TARGET_DIR\"\n\n# check if git repo at ORIG_DIR has uncommitted changes\nif [ -n \"$(git status --porcelain)\" ]; then\n    echo \"git repo at $ORIG_DIR has uncommitted changes\"\n    exit 1\nfi\n\n# clean our project first\ngit clean -fdx\n\n# remove everything at target\nrm -rf $TARGET_DIR/* # not .file at root\n\n# copy over\ncp -r $ORIG_DIR/* $TARGET_DIR\n\nPROHIBIT_FILE_LIST=(\n    \"Resources/Design\"\n)\n\n# remove prohibited files\nfor file in \"${PROHIBIT_FILE_LIST[@]}\"; do\n    echo \"removing $TARGET_DIR/$file\"\n    rm -rf \"${TARGET_DIR:?}/$file\"\ndone\n\nfind $TARGET_DIR/External -name \".git\" -delete\n\n# get current commit hash\nCOMMIT_HASH=$(git rev-parse --short HEAD)\n\ncd $TARGET_DIR\ngit add .\ngit commit -m \"Sync Update - $COMMIT_HASH\"\n\necho \"\"\necho \"======= Sync Update - $COMMIT_HASH =======\"\necho \"To push to remote, run following command:\"\necho \"\"\necho \"  cd $TARGET_DIR && git push origin master\"\necho \"\"\necho \"==========================================\"\necho \"\"\n\n# done\n"
  },
  {
    "path": "Resources/Scripts/UpdateLicenses.sh",
    "content": "#!/bin/bash\n\nset -ex\n\ncd \"$(dirname \"$0\")\"\nCURR_DIR=\"$(pwd)\"\ncd ../../\nSOURCE_DIR=\"$(pwd)\"\n\nif [ ! -f \"$SOURCE_DIR/App/Action/Action/Application/License.txt\" ]; then\n    echo \"License.txt not found in App/Action/Action/Application\"\n    exit 1\nfi\n\ncat \"$SOURCE_DIR/LICENSE\" > \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n\n# for every LICENSE inside External\nfor dir in \"$SOURCE_DIR\"/External/*; do\n    if [ -d \"$dir\" ]; then\n        if [ -f \"$dir/LICENSE\" ]; then\n            echo \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n            echo \"==========\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n            echo \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n            echo \"$(basename \"$dir\")\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n            cat \"$dir/LICENSE\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n            echo \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n        fi\n    fi\ndone\n\necho \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\necho \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\necho \"==========\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\necho \"\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\nTIME=$(date +%Y-%m-%d)\necho \"Updated: $TIME\" >> \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n\nswift \"$CURR_DIR/NewlineDeduplicate.swift\" \"$SOURCE_DIR/App/Action/Action/Application/License.txt\"\n\necho \"Done\""
  }
]