From 90d41d13f2b0cee495c656ab61c312b71fe3850e Mon Sep 17 00:00:00 2001 From: KIM CHAN HEE <85754295+chanhihi@users.noreply.github.com> Date: Tue, 22 Aug 2023 18:51:55 +0900 Subject: [PATCH] =?UTF-8?q?Revert=20"test:=20cicd=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=ED=95=B4=EB=B4=85?= =?UTF-8?q?=EB=8B=88=EB=8B=A4."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-drafter-config.yml | 23 - .github/workflows/Deployment.yml | 58 -- .github/workflows/Release.yml | 35 - .github/workflows/swift.yml | 43 -- .gitignore | 99 --- .tuist-version | 1 - Box42.xcodeproj/project.pbxproj | 607 +++++------------- .../xcshareddata/swiftpm/Package.resolved | 16 - .../UserInterfaceState.xcuserstate | Bin 0 -> 94938 bytes .../UserInterfaceState.xcuserstate | Bin 55554 -> 0 bytes .../xcshareddata/xcschemes/Box42.xcscheme | 8 +- .../xcdebugger/Breakpoints_v2.xcbkptlist | 72 +++ .../xcschemes/xcschememanagement.plist | 22 + .../Box/BoxBaseContainerViewController.swift | 129 ---- Box42/Box/View/BoxBaseSplitView.swift | 20 - Box42/Box/View/BoxButtonViewGroup.swift | 92 --- Box42/Box/View/BoxContentsViewGroup.swift | 75 --- Box42/CPU/CPU.swift | 71 ++ Box42/Extensions/Double.swift | 12 - Box42/Extensions/NSImage.swift | 30 - Box42/Extensions/NSScreen.swift | 16 - Box42/Extensions/String.swift | 21 - .../BoxFunctionViewController.swift | 42 -- .../View/BoxFunctionButtonView.swift | 31 - .../View/BoxFunctionViewGroup.swift | 75 --- Box42/FunctionButton/View/PinButtonView.swift | 31 - .../View/PreferenceButtonView.swift | 30 - .../FunctionButton/View/QuitButtonView.swift | 31 - Box42/FunctionButton/View/TopDivider.swift | 28 - Box42/Login/LoginViewController.swift | 44 -- Box42/Main/BoxController.swift | 205 ++++++ Box42/Main/BoxModel.swift | 27 + Box42/Main/BoxView.swift | 12 + Box42/Main/BoxViewController.swift | 63 -- Box42/Main/keyDown+BoxViewController.swift | 33 - Box42/Menubar/MenubarController.swift | 39 ++ Box42/Menubar/MenubarModel.swift | 27 +- Box42/Menubar/MenubarView.swift | 31 + Box42/Menubar/MenubarViewController.swift | 133 ---- Box42/Menubar/MenubarViewModel.swift | 75 --- Box42/Preferences/Accessibility.swift | 23 - Box42/Preferences/Hotkey.swift | 38 -- Box42/Preferences/Icon.swift | 19 - Box42/Preferences/PreferencesView.swift | 9 - .../PreferencesViewController.swift | 152 ----- .../{Resources => Resource}/AppDelegate.swift | 57 +- .../42box3/42box_1.imageset/42box_1.png | Bin .../42box3/42box_1.imageset/Contents.json | 0 .../42box3/42box_2.imageset/42box_2.png | Bin .../42box3/42box_2.imageset/Contents.json | 0 .../42box3/42box_3.imageset/42box_3.png | Bin .../42box3/42box_3.imageset/Contents.json | 0 .../42box3/42box_4.imageset/42box_4.png | Bin .../42box3/42box_4.imageset/Contents.json | 0 .../Assets.xcassets/42box3/Contents.json | 0 .../42box_logo 1.imageset/42box_logo.svg | 0 .../42box_logo 1.imageset/Contents.json | 0 .../42box_logo.imageset/42box_logo.png | Bin .../42box_logo.imageset/Contents.json | 0 .../42box_oc1.imageset/42box_opend_black.png | Bin .../42box_oc1.imageset/Contents.json | 0 .../42box_oc2.imageset/42box_closed_black.png | Bin .../42box_oc2.imageset/Contents.json | 0 .../42flip/42flip_01.imageset/42flip_01.png | Bin .../42flip/42flip_01.imageset/Contents.json | 0 .../42flip/42flip_010.imageset/42flip_010.png | Bin .../42flip/42flip_010.imageset/Contents.json | 0 .../42flip/42flip_011.imageset/42flip_011.png | Bin .../42flip/42flip_011.imageset/Contents.json | 0 .../42flip/42flip_02.imageset/42flip_02.png | Bin .../42flip/42flip_02.imageset/Contents.json | 0 .../42flip/42flip_03.imageset/42flip_03.png | Bin .../42flip/42flip_03.imageset/Contents.json | 0 .../42flip/42flip_04.imageset/42flip_04.png | Bin .../42flip/42flip_04.imageset/Contents.json | 0 .../42flip/42flip_05.imageset/42flip_05.png | Bin .../42flip/42flip_05.imageset/Contents.json | 0 .../42flip/42flip_06.imageset/42flip_06.png | Bin .../42flip/42flip_06.imageset/Contents.json | 0 .../42flip/42flip_07.imageset/42flip_07.png | Bin .../42flip/42flip_07.imageset/Contents.json | 0 .../42flip/42flip_08.imageset/42flip_08.png | Bin .../42flip/42flip_08.imageset/Contents.json | 0 .../42flip/42flip_09.imageset/42flip_09.png | Bin .../42flip/42flip_09.imageset/Contents.json | 0 .../42pack_icon/42flip/42flip/Contents.json | 0 .../42pack_icon/42flip/Contents.json | 0 .../Assets.xcassets/42pack_icon/Contents.json | 0 .../42pack_icon/cat/Contents.json | 0 .../cat/cat_page0.imageset/Contents.json | 0 .../cat/cat_page0.imageset/cat0.png | Bin .../cat/cat_page1.imageset/Contents.json | 0 .../cat/cat_page1.imageset/cat1.png | Bin .../cat/cat_page2.imageset/Contents.json | 0 .../cat/cat_page2.imageset/cat2.png | Bin .../cat/cat_page3.imageset/Contents.json | 0 .../cat/cat_page3.imageset/cat3.png | Bin .../cat/cat_page4.imageset/Contents.json | 0 .../cat/cat_page4.imageset/cat4.png | Bin .../42pack_icon/gam/Contents.json | 0 .../gam/gam_1.imageset/Contents.json | 0 .../42pack_icon/gam/gam_1.imageset/gam_1.png | Bin .../gam/gam_2.imageset/Contents.json | 0 .../42pack_icon/gam/gam_2.imageset/gam_2.png | Bin .../gam/gam_3.imageset/Contents.json | 0 .../42pack_icon/gam/gam_3.imageset/gam_3.png | Bin .../gam/gam_4.imageset/Contents.json | 0 .../42pack_icon/gam/gam_4.imageset/gam_4.png | Bin .../gam/gam_5.imageset/Contents.json | 0 .../42pack_icon/gam/gam_5.imageset/gam_5.png | Bin .../42pack_icon/gon/Contents.json | 0 .../gon/gon_1.imageset/Contents.json | 0 .../42pack_icon/gon/gon_1.imageset/gon_1.png | Bin .../gon/gon_2.imageset/Contents.json | 0 .../42pack_icon/gon/gon_2.imageset/gon_2.png | Bin .../gon/gon_3.imageset/Contents.json | 0 .../42pack_icon/gon/gon_3.imageset/gon_3.png | Bin .../gon/gon_4.imageset/Contents.json | 0 .../42pack_icon/gon/gon_4.imageset/gon_4.png | Bin .../gon/gon_5.imageset/Contents.json | 0 .../42pack_icon/gon/gon_5.imageset/gon_5.png | Bin .../42pack_icon/gun/Contents.json | 0 .../gun/gun_1.imageset/Contents.json | 0 .../42pack_icon/gun/gun_1.imageset/gun_1.png | Bin .../gun/gun_2.imageset/Contents.json | 0 .../42pack_icon/gun/gun_2.imageset/gun_2.png | Bin .../gun/gun_3.imageset/Contents.json | 0 .../42pack_icon/gun/gun_3.imageset/gun_3.png | Bin .../gun/gun_4.imageset/Contents.json | 0 .../42pack_icon/gun/gun_4.imageset/gun_4.png | Bin .../gun/gun_5.imageset/Contents.json | 0 .../42pack_icon/gun/gun_5.imageset/gun_5.png | Bin .../42pack_icon/lee/Contents.json | 0 .../lee/lee_1.imageset/Contents.json | 0 .../42pack_icon/lee/lee_1.imageset/lee_1.png | Bin .../lee/lee_2.imageset/Contents.json | 0 .../42pack_icon/lee/lee_2.imageset/lee_2.png | Bin .../lee/lee_3.imageset/Contents.json | 0 .../42pack_icon/lee/lee_3.imageset/lee_3.png | Bin .../lee/lee_4.imageset/Contents.json | 0 .../42pack_icon/lee/lee_4.imageset/lee_4.png | Bin .../lee/lee_5.imageset/Contents.json | 0 .../42pack_icon/lee/lee_5.imageset/lee_5.png | Bin .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/1024.png | Bin .../AppIcon.appiconset/128.png | Bin .../Assets.xcassets/AppIcon.appiconset/16.png | Bin .../AppIcon.appiconset/256.png | Bin .../Assets.xcassets/AppIcon.appiconset/32.png | Bin .../AppIcon.appiconset/512.png | Bin .../Assets.xcassets/AppIcon.appiconset/64.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/AppIcons/Contents.json | 0 .../AppIcons/appstore.imageset/Contents.json | 0 .../AppIcons/appstore.imageset/appstore.png | Bin .../AppIcons/playstore.imageset/Contents.json | 0 .../AppIcons/playstore.imageset/playstore.png | Bin .../Assets.xcassets/Contents.json | 0 .../Box42.entitlements | 2 - .../Box42.xcdatamodeld/.xccurrentversion | 0 .../Box42.xcdatamodel/contents | 4 + Box42/{System => Resource}/EventMonitor.swift | 14 +- Box42/Resource/Info.plist | 11 + Box42/Resource/Main.storyboard | 227 +++++++ .../Assets.xcassets/Icons/Contents.json | 6 - .../arrow.clockwise.imageset/Contents.json | 21 - .../arrow.clockwise@2x.png | Bin 1114 -> 0 bytes .../Icons/arrow.left.imageset/Contents.json | 21 - .../arrow.left.imageset/arrow.left@2x.png | Bin 677 -> 0 bytes .../Icons/arrow.right.imageset/Contents.json | 21 - .../arrow.right.imageset/arrow.right@2x.png | Bin 633 -> 0 bytes .../Icons/doc.on.doc.imageset/Contents.json | 21 - .../doc.on.doc.imageset/doc.on.doc@2x.png | Bin 1301 -> 0 bytes .../Icons/ellipsis.imageset/Contents.json | 21 - .../Icons/ellipsis.imageset/ellipsis@2x.png | Bin 459 -> 0 bytes .../figure.skating.imageset/Contents.json | 21 - .../figure.skating@2x.png | Bin 1333 -> 0 bytes .../Contents.json | 21 - .../figure.snowboarding@2x.png | Bin 1277 -> 0 bytes .../figure.surfing.imageset/Contents.json | 21 - .../figure.surfing@2x.png | Bin 1570 -> 0 bytes .../Icons/minus.imageset/Contents.json | 21 - .../Icons/minus.imageset/minus@2x.png | Bin 212 -> 0 bytes .../Icons/pin.fill.imageset/Contents.json | 21 - .../Icons/pin.fill.imageset/pin.fill@2x.png | Bin 890 -> 0 bytes .../Icons/pin.imageset/Contents.json | 21 - .../Icons/pin.imageset/pin@2x.png | Bin 986 -> 0 bytes .../Icons/plus.imageset/Contents.json | 21 - .../Icons/plus.imageset/plus@2x.png | Bin 354 -> 0 bytes .../Icons/shippingbox.imageset/Contents.json | 21 - .../shippingbox.imageset/shippingbox@2x.png | Bin 1530 -> 0 bytes .../sidebar.leading.imageset/Contents.json | 21 - .../sidebar.leading@2x.png | Bin 681 -> 0 bytes .../Box42.xcdatamodel/contents | 4 - Box42/Resources/ExportOptions.plist | 14 - Box42/Resources/Info.plist | 58 -- Box42/Resources/Main.storyboard | 495 -------------- Box42/Resources/sh/brewInGoinfre.sh | 63 -- Box42/Resources/sh/cleanCache.sh | 157 ----- Box42/Resources/sh/exportMacOSInfo.sh | 1 - Box42/Resources/sh/importMacOSInfo.sh | 1 - Box42/Resources/sh/keyMapping.sh | 146 ----- Box42/Resources/sh/nodeInstall.sh | 69 -- Box42/Scripts/AppleScripts+ShowMessage.swift | 42 -- Box42/Scripts/Scripts.swift | 25 - Box42/Shared/BoxSizeManager.swift | 34 - Box42/Shared/Constants.swift | 17 - Box42/Shared/StateManager.swift | 68 -- Box42/System/CPU.swift | 65 -- Box42/System/Storage.swift | 129 ---- Box42/System/StorageConfig.swift | 44 -- Box42/Toolbar/ToolbarViewController.swift | 57 -- Box42/Toolbar/View/BoxToolbarViewGroup.swift | 31 - Box42/Toolbar/View/DisplayURLInToolbar.swift | 33 - Box42/Toolbar/View/GoBackInToolbar.swift | 31 - Box42/Toolbar/View/GoForwardInToolbar.swift | 31 - .../Toolbar/View/GoHomePageViaToolbar().swift | 31 - .../Toolbar/View/RefreshPageViaToolbar.swift | 31 - Box42/Toolbar/View/SideBarLeading.swift | 31 - Box42/UI/HoverButton.swift | 46 -- Box42/UI/MovableContainerView.swift | 24 - Box42/URL/URLModel.swift | 36 ++ Box42/Web/WebViewController.swift | 53 ++ Box42/Web/WebViewModel.swift | 20 + Box42/WebView/URL/URLModel.swift | 43 -- Box42/WebView/WebView.swift | 42 -- Box42/WebView/WebViewController.swift | 75 --- Box42/WebView/WebViewManager.swift | 23 - Box42/WebView/WebViewModel.swift | 74 --- Box42/Window/BoxWindowController.swift | 138 ---- Package.swift | 28 - Project.swift | 43 -- README.md | 2 +- Tuist/Dependencies.swift | 17 - 234 files changed, 1058 insertions(+), 4577 deletions(-) delete mode 100644 .github/release-drafter-config.yml delete mode 100644 .github/workflows/Deployment.yml delete mode 100644 .github/workflows/Release.yml delete mode 100644 .github/workflows/swift.yml delete mode 100644 .tuist-version delete mode 100644 Box42.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Box42.xcodeproj/project.xcworkspace/xcuserdata/chan.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Box42.xcodeproj/project.xcworkspace/xcuserdata/daskim.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Box42/Box/BoxBaseContainerViewController.swift delete mode 100644 Box42/Box/View/BoxBaseSplitView.swift delete mode 100644 Box42/Box/View/BoxButtonViewGroup.swift delete mode 100644 Box42/Box/View/BoxContentsViewGroup.swift create mode 100644 Box42/CPU/CPU.swift delete mode 100644 Box42/Extensions/Double.swift delete mode 100644 Box42/Extensions/NSImage.swift delete mode 100644 Box42/Extensions/NSScreen.swift delete mode 100644 Box42/Extensions/String.swift delete mode 100644 Box42/FunctionButton/BoxFunctionViewController.swift delete mode 100644 Box42/FunctionButton/View/BoxFunctionButtonView.swift delete mode 100644 Box42/FunctionButton/View/BoxFunctionViewGroup.swift delete mode 100644 Box42/FunctionButton/View/PinButtonView.swift delete mode 100644 Box42/FunctionButton/View/PreferenceButtonView.swift delete mode 100644 Box42/FunctionButton/View/QuitButtonView.swift delete mode 100644 Box42/FunctionButton/View/TopDivider.swift delete mode 100644 Box42/Login/LoginViewController.swift create mode 100644 Box42/Main/BoxController.swift create mode 100644 Box42/Main/BoxModel.swift create mode 100644 Box42/Main/BoxView.swift delete mode 100644 Box42/Main/BoxViewController.swift delete mode 100644 Box42/Main/keyDown+BoxViewController.swift create mode 100644 Box42/Menubar/MenubarController.swift create mode 100644 Box42/Menubar/MenubarView.swift delete mode 100644 Box42/Menubar/MenubarViewController.swift delete mode 100644 Box42/Menubar/MenubarViewModel.swift delete mode 100644 Box42/Preferences/Accessibility.swift delete mode 100644 Box42/Preferences/Hotkey.swift delete mode 100644 Box42/Preferences/Icon.swift delete mode 100644 Box42/Preferences/PreferencesView.swift delete mode 100644 Box42/Preferences/PreferencesViewController.swift rename Box42/{Resources => Resource}/AppDelegate.swift (79%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_1.imageset/42box_1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_2.imageset/42box_2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_3.imageset/42box_3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_4.imageset/42box_4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/42box_4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box3/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_logo 1.imageset/42box_logo.svg (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_logo 1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_logo.imageset/42box_logo.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_logo.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_oc1.imageset/42box_opend_black.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_oc1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_oc2.imageset/42box_closed_black.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42box_oc2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/42flip/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/1024.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/128.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/16.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/256.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/32.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/512.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/64.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcons/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcons/appstore.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcons/appstore.imageset/appstore.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcons/playstore.imageset/Contents.json (100%) rename Box42/{Resources => Resource}/Assets.xcassets/AppIcons/playstore.imageset/playstore.png (100%) rename Box42/{Resources => Resource}/Assets.xcassets/Contents.json (100%) rename Box42/{Resources => Resource}/Box42.entitlements (86%) rename Box42/{Resources => Resource}/Box42.xcdatamodeld/.xccurrentversion (100%) create mode 100644 Box42/Resource/Box42.xcdatamodeld/Box42.xcdatamodel/contents rename Box42/{System => Resource}/EventMonitor.swift (64%) create mode 100644 Box42/Resource/Info.plist create mode 100644 Box42/Resource/Main.storyboard delete mode 100644 Box42/Resources/Assets.xcassets/Icons/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/arrow.clockwise@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/arrow.left@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/arrow.right@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/doc.on.doc@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/ellipsis@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/figure.skating@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/figure.snowboarding@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/figure.surfing@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/minus.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/minus.imageset/minus@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/pin.fill@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/pin.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/pin.imageset/pin@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/plus.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/plus.imageset/plus@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/shippingbox@2x.png delete mode 100644 Box42/Resources/Assets.xcassets/Icons/sidebar.leading.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/Icons/sidebar.leading.imageset/sidebar.leading@2x.png delete mode 100644 Box42/Resources/Box42.xcdatamodeld/Box42.xcdatamodel/contents delete mode 100644 Box42/Resources/ExportOptions.plist delete mode 100644 Box42/Resources/Info.plist delete mode 100644 Box42/Resources/Main.storyboard delete mode 100644 Box42/Resources/sh/brewInGoinfre.sh delete mode 100755 Box42/Resources/sh/cleanCache.sh delete mode 100644 Box42/Resources/sh/exportMacOSInfo.sh delete mode 100644 Box42/Resources/sh/importMacOSInfo.sh delete mode 100644 Box42/Resources/sh/keyMapping.sh delete mode 100644 Box42/Resources/sh/nodeInstall.sh delete mode 100644 Box42/Scripts/AppleScripts+ShowMessage.swift delete mode 100644 Box42/Scripts/Scripts.swift delete mode 100644 Box42/Shared/BoxSizeManager.swift delete mode 100644 Box42/Shared/Constants.swift delete mode 100644 Box42/Shared/StateManager.swift delete mode 100644 Box42/System/CPU.swift delete mode 100644 Box42/System/Storage.swift delete mode 100644 Box42/System/StorageConfig.swift delete mode 100644 Box42/Toolbar/ToolbarViewController.swift delete mode 100644 Box42/Toolbar/View/BoxToolbarViewGroup.swift delete mode 100644 Box42/Toolbar/View/DisplayURLInToolbar.swift delete mode 100644 Box42/Toolbar/View/GoBackInToolbar.swift delete mode 100644 Box42/Toolbar/View/GoForwardInToolbar.swift delete mode 100644 Box42/Toolbar/View/GoHomePageViaToolbar().swift delete mode 100644 Box42/Toolbar/View/RefreshPageViaToolbar.swift delete mode 100644 Box42/Toolbar/View/SideBarLeading.swift delete mode 100644 Box42/UI/HoverButton.swift delete mode 100644 Box42/UI/MovableContainerView.swift create mode 100644 Box42/URL/URLModel.swift create mode 100644 Box42/Web/WebViewController.swift create mode 100644 Box42/Web/WebViewModel.swift delete mode 100644 Box42/WebView/URL/URLModel.swift delete mode 100644 Box42/WebView/WebView.swift delete mode 100644 Box42/WebView/WebViewController.swift delete mode 100644 Box42/WebView/WebViewManager.swift delete mode 100644 Box42/WebView/WebViewModel.swift delete mode 100644 Box42/Window/BoxWindowController.swift delete mode 100644 Package.swift delete mode 100644 Project.swift delete mode 100644 Tuist/Dependencies.swift diff --git a/.github/release-drafter-config.yml b/.github/release-drafter-config.yml deleted file mode 100644 index e2d8534..0000000 --- a/.github/release-drafter-config.yml +++ /dev/null @@ -1,23 +0,0 @@ -name-template: "v$NEXT_MINOR_VERSION 🌈" -tag-template: "v$NEXT_MINOR_VERSION" -categories: - - title: "πŸš€ Features" - labels: - - "✨ Enhancement" - - "βš’ Refactor" - - title: "πŸ› Bug Fixes" - labels: - - "🐞 Bug" -exclude-labels: - - "πŸ“„ Documentation" - - "🌐 DevOps" - - "πŸ’„ UI/UX" - - "πŸ› Structure" - - "πŸ’– Question" - - "β˜‚οΈ Umbrella" -change-template: "- $TITLE (#$NUMBER)" -change-title-escapes: '\<*_&' -template: | - ## Changes - - $CHANGES diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml deleted file mode 100644 index 0c92aba..0000000 --- a/.github/workflows/Deployment.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Author by chanhihi -# Date 2023.08.09 - -name: Deployment - -on: - push: - branches: - - main-ci-cd-test - # - main - -jobs: - build: - name: Deploy on macOS 11 - runs-on: macos-11 - env: - XCODE_VERSION: "12.4.0" - SWIFT_VERSION: "5.3" - XCODE_PROJECT: "Box42.xcodeproj" - XCODE_SCHEME: "Box42" - XCODE_ARCHIVE_PATH: "Box42.xcarchive" - XCODE_EXPORT_PATH: "./artifacts" - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set Xcode version - run: sudo xcode-select -s '/Applications/Xcode_12.4.0.app/Contents/Developer' - - - name: Set SDK version - run: echo 'SDKROOT=/Applications/Xcode_12.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk' >> $GITHUB_ENV - - - name: setup-swift - uses: swift-actions/setup-swift@v1 - with: - swift-version: $SWIFT_VERSION - - - name: Build - run: | - mkdir Sources && - mv Box42 Sources/Box42 && - swift build - - - name: Archive - run: | - mv Sources/Box42/Resources/ExportOptions.plist . && - xcodebuild archive -project $XCODE_PROJECT -scheme $XCODE_SCHEME -archivePath $XCODE_ARCHIVE_PATH - - - name: Distribute - run: | - mkdir -p artifacts && - xcodebuild -exportArchive -archivePath "$XCODE_ARCHIVE_PATH" -exportOptionsPlist ExportOptions.plist -exportPath "$XCODE_EXPORT_PATH" - - - name: Upload Box42-Artifacts - uses: actions/upload-artifact@v2 - with: - name: Box42-${{ github.ref_name }} - path: $XCODE_EXPORT_PATH diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml deleted file mode 100644 index 4eb9421..0000000 --- a/.github/workflows/Release.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Author by chanhihi -# Date 2023.08.22 - -name: Release Drafter - -on: - pull_request: - branches: - - main-ci-cd-test - types: - - closed - -jobs: - update_release_draft: - runs-on: ubuntu-latest - steps: - - name: Tag - if: success() - id: tag_version - uses: mathieudutour/github-tag-action@v6.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - - - name: Create a GitHub release - uses: ncipollo/release-action@v1 - with: - tag: ${{ steps.tag_version.outputs.new_tag }} - name: Release ${{ steps.tag_version.outputs.new_tag }} - body: ${{ steps.tag_version.outputs.changelog }} - - - uses: release-drafter/release-drafter@v5 - with: - config-name: release-drafter-config.yml - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml deleted file mode 100644 index 976d883..0000000 --- a/.github/workflows/swift.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Author by chanhihi -# Date 2023.08.09 - -name: Swift Build - -on: - push: - branches: - - feat/* - - fix/* - - refactor/* - - pull_request: - branches: - - cluster_develop - -jobs: - build: - name: Swift 5.3 on macOS 11 - runs-on: macos-11 - env: - XCODE_VERSION: "12.4.0" - SWIFT_VERSION: "5.3" - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set Xcode version - run: sudo xcode-select -s '/Applications/Xcode_12.4.0.app/Contents/Developer' - - - name: Set SDK version - run: echo 'SDKROOT=/Applications/Xcode_12.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk' >> $GITHUB_ENV - - - name: setup-swift - uses: swift-actions/setup-swift@v1 - with: - swift-version: ${{ env.SWIFT_VERSION }} - - - name: Build - run: | - mkdir Sources && - mv Box42 Sources/Box42 && - swift build diff --git a/.gitignore b/.gitignore index ed7c9da..dd2592e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,101 +1,2 @@ -### Swift ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## User settings -xcuserdata/ - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) -*.xcscmblueprint -*.xccheckout - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) -build/ -DerivedData/ -*.moved-aside -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 - -## Obj-C/Swift specific -*.hmap - -## App packaging -*.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -# Package.resolved -# *.xcodeproj -# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata -# hence it is not needed unless you have added a package configuration file to your project -# .swiftpm - -.build/ - -# CocoaPods -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# Pods/ -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace - -# Carthage -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build/ - -# Accio dependency management -Dependencies/ -.accio/ - -# fastlane -# It is recommended to not store the screenshots in the git repo. -# Instead, use fastlane to re-generate the screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output - -# Code Injection -# After new code Injection tools there's a generated folder /iOSInjectionProject -# https://github.com/johnno1962/injectionforxcode - -iOSInjectionProject/ - -### Xcode ### - -## Xcode 8 and earlier - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcodeproj/project.xcworkspace/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno -**/xcshareddata/WorkspaceSettings.xcsettings - .DS_Store Box42/.DS_Store -.prettierrc -.swift-format \ No newline at end of file diff --git a/.tuist-version b/.tuist-version deleted file mode 100644 index 8912835..0000000 --- a/.tuist-version +++ /dev/null @@ -1 +0,0 @@ -3.22.0 \ No newline at end of file diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index 54be299..5cdc368 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -3,542 +3,251 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ - DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BB22A5099F900FF0AA3 /* AppDelegate.swift */; }; - DE018BB82A5099F900FF0AA3 /* Box42.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DE018BB62A5099F900FF0AA3 /* Box42.xcdatamodeld */; }; - DE018BDD2A509AEB00FF0AA3 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BDC2A509AEB00FF0AA3 /* EventMonitor.swift */; }; - DE018BE02A509B0600FF0AA3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE018BDF2A509B0600FF0AA3 /* Assets.xcassets */; }; - DE018BE42A509B1700FF0AA3 /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BE32A509B1700FF0AA3 /* CPU.swift */; }; - DE018BE72A509B1E00FF0AA3 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BE62A509B1E00FF0AA3 /* WebViewController.swift */; }; - DE018BEA2A509B2100FF0AA3 /* WebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BE92A509B2100FF0AA3 /* WebViewModel.swift */; }; - DE018BED2A509B2600FF0AA3 /* URLModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BEC2A509B2600FF0AA3 /* URLModel.swift */; }; - DE018BF02A509B2F00FF0AA3 /* MenubarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BEF2A509B2F00FF0AA3 /* MenubarViewController.swift */; }; - DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE018BF22A509B3300FF0AA3 /* MenubarModel.swift */; }; - DE018C032A509B5D00FF0AA3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE018C022A509B5D00FF0AA3 /* Main.storyboard */; }; - DE0A915D2A8E348D00D1D6F1 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = DE0A915C2A8E348D00D1D6F1 /* SnapKit */; }; - DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91622A8E6A5400D1D6F1 /* Constants.swift */; }; - DE0A91672A8E6CA700D1D6F1 /* WebViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91662A8E6CA700D1D6F1 /* WebViewManager.swift */; }; - DE0A916D2A8E7DD700D1D6F1 /* HoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A916C2A8E7DD700D1D6F1 /* HoverButton.swift */; }; - DE0A91782A8F014F00D1D6F1 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91772A8F014F00D1D6F1 /* WebView.swift */; }; - DE0A917B2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A917A2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift */; }; - DE0A917F2A8F865400D1D6F1 /* BoxToolbarViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A917E2A8F865400D1D6F1 /* BoxToolbarViewGroup.swift */; }; - DE0A91832A8F889000D1D6F1 /* GoHomePageViaToolbar().swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91822A8F889000D1D6F1 /* GoHomePageViaToolbar().swift */; }; - DE0A91862A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91852A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift */; }; - DE0A918A2A8F88A900D1D6F1 /* GoForwardInToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91892A8F88A900D1D6F1 /* GoForwardInToolbar.swift */; }; - DE0A918D2A8F88BC00D1D6F1 /* GoBackInToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A918C2A8F88BC00D1D6F1 /* GoBackInToolbar.swift */; }; - DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A918F2A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift */; }; - DE0A91982A8F977F00D1D6F1 /* ToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */; }; - DE0A91A72A8FC66600D1D6F1 /* SideBarLeading.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0A91A62A8FC66600D1D6F1 /* SideBarLeading.swift */; }; - DE1F1A142A8B506600A88DD8 /* importMacOSInfo.sh in Resources */ = {isa = PBXBuildFile; fileRef = DE1F1A112A8B506600A88DD8 /* importMacOSInfo.sh */; }; - DE1F1A152A8B506600A88DD8 /* exportMacOSInfo.sh in Resources */ = {isa = PBXBuildFile; fileRef = DE1F1A122A8B506600A88DD8 /* exportMacOSInfo.sh */; }; - DE1F1A162A8B506600A88DD8 /* keyMapping.sh in Resources */ = {isa = PBXBuildFile; fileRef = DE1F1A132A8B506600A88DD8 /* keyMapping.sh */; }; - DE1F1A1C2A8B50C500A88DD8 /* BoxBaseContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A192A8B50C500A88DD8 /* BoxBaseContainerViewController.swift */; }; - DE1F1A1D2A8B50C500A88DD8 /* BoxContentsViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A1A2A8B50C500A88DD8 /* BoxContentsViewGroup.swift */; }; - DE1F1A1E2A8B50C500A88DD8 /* BoxButtonViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A1B2A8B50C500A88DD8 /* BoxButtonViewGroup.swift */; }; - DE1F1A262A8B50D500A88DD8 /* BoxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A232A8B50D500A88DD8 /* BoxViewController.swift */; }; - DE1F1A292A8B50E200A88DD8 /* BoxSizeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A282A8B50E200A88DD8 /* BoxSizeManager.swift */; }; - DE1F1A2E2A8BCC9800A88DD8 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A2D2A8BCC9800A88DD8 /* Storage.swift */; }; - DE1F1A312A8BD68F00A88DD8 /* Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A302A8BD68F00A88DD8 /* Double.swift */; }; - DE1F1A362A8BDDDF00A88DD8 /* StorageConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1F1A352A8BDDDF00A88DD8 /* StorageConfig.swift */; }; - DE24E6352A8FE02A00E29F5D /* MovableContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE24E6342A8FE02A00E29F5D /* MovableContainerView.swift */; }; - DE24E6382A8FE10400E29F5D /* BoxBaseSplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE24E6372A8FE10300E29F5D /* BoxBaseSplitView.swift */; }; - DE24E63B2A8FE93900E29F5D /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE24E63A2A8FE93900E29F5D /* NSImage.swift */; }; - DE2AD3292A824EEB00002D51 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE2AD3282A824EEB00002D51 /* Accessibility.swift */; }; - DE4407FA2A923E860091937A /* BoxFunctionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4407F92A923E860091937A /* BoxFunctionViewController.swift */; }; - DE4407FE2A923EA90091937A /* PreferenceButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4407FD2A923EA90091937A /* PreferenceButtonView.swift */; }; - DE4408022A923EB60091937A /* PinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408012A923EB60091937A /* PinButtonView.swift */; }; - DE4408052A923EC00091937A /* QuitButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408042A923EC00091937A /* QuitButtonView.swift */; }; - DE4408082A9240300091937A /* BoxFunctionButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408072A9240300091937A /* BoxFunctionButtonView.swift */; }; - DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE44080B2A924B520091937A /* BoxFunctionViewGroup.swift */; }; - DE4408152A92750D0091937A /* keyDown+BoxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408142A92750D0091937A /* keyDown+BoxViewController.swift */; }; - DE44081D2A928F760091937A /* TopDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE44081C2A928F760091937A /* TopDivider.swift */; }; - DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA502A82580400713683 /* MenubarViewModel.swift */; }; - DE77BA562A82637900713683 /* StateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA552A82637900713683 /* StateManager.swift */; }; - DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */; }; - DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */; }; - DE874F542A591F1400FC3B77 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F532A591F1400FC3B77 /* PreferencesView.swift */; }; - DE874F572A591F2500FC3B77 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F562A591F2500FC3B77 /* Icon.swift */; }; - DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F5E2A5935CC00FC3B77 /* String.swift */; }; - DEB862D42A85124500278FCD /* cleanCache.sh in Resources */ = {isa = PBXBuildFile; fileRef = DEB862D32A85124500278FCD /* cleanCache.sh */; }; - DEB862D92A852C4500278FCD /* brewInGoinfre.sh in Resources */ = {isa = PBXBuildFile; fileRef = DEB862D82A852C4500278FCD /* brewInGoinfre.sh */; }; - DEB862DC2A85347400278FCD /* Scripts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB862DB2A85347400278FCD /* Scripts.swift */; }; - DEB862EB2A853F7F00278FCD /* BoxWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB862E92A853F7F00278FCD /* BoxWindowController.swift */; }; - DEF749322A85657600D987C8 /* NSScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF749312A85657600D987C8 /* NSScreen.swift */; }; + 6450C99B29C1D5A3001D429E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C99A29C1D5A3001D429E /* AppDelegate.swift */; }; + 6450C9A029C1D5A3001D429E /* Box42.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 6450C99E29C1D5A3001D429E /* Box42.xcdatamodeld */; }; + 6450C9A229C1D5A5001D429E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6450C9A129C1D5A5001D429E /* Assets.xcassets */; }; + 6450C9BD29C32972001D429E /* BoxController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9BB29C32972001D429E /* BoxController.swift */; }; + 6450C9BE29C32972001D429E /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9BC29C32972001D429E /* EventMonitor.swift */; }; + 6450C9C429C32A90001D429E /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9C329C32A90001D429E /* WebViewController.swift */; }; + 6450C9C729C32AAC001D429E /* URLModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9C629C32AAC001D429E /* URLModel.swift */; }; + 6450C9CA29C32D63001D429E /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9C929C32D63001D429E /* CPU.swift */; }; + 6450C9CD29C32DBB001D429E /* MenubarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9CC29C32DBB001D429E /* MenubarModel.swift */; }; + 6450C9CF29C32E34001D429E /* BoxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9CE29C32E34001D429E /* BoxModel.swift */; }; + 6450C9D129C330C3001D429E /* MenubarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9D029C330C3001D429E /* MenubarController.swift */; }; + 6450C9D329C33105001D429E /* MenubarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6450C9D229C33105001D429E /* MenubarView.swift */; }; + 64DF818A29C3B88B000B32F4 /* BoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF818929C3B88B000B32F4 /* BoxView.swift */; }; + 64DF818C29C4AA85000B32F4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 64DF818B29C4AA85000B32F4 /* Main.storyboard */; }; + 64DF818F29C61033000B32F4 /* WebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF818E29C61033000B32F4 /* WebViewModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - DE018BAF2A5099F900FF0AA3 /* Box42.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Box42.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DE018BB22A5099F900FF0AA3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - DE018BB72A5099F900FF0AA3 /* Box42.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Box42.xcdatamodel; sourceTree = ""; }; - DE018BBE2A5099FA00FF0AA3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DE018BDC2A509AEB00FF0AA3 /* EventMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = ""; }; - DE018BDF2A509B0600FF0AA3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - DE018BE32A509B1700FF0AA3 /* CPU.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = ""; }; - DE018BE62A509B1E00FF0AA3 /* WebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; - DE018BE92A509B2100FF0AA3 /* WebViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewModel.swift; sourceTree = ""; }; - DE018BEC2A509B2600FF0AA3 /* URLModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLModel.swift; sourceTree = ""; }; - DE018BEF2A509B2F00FF0AA3 /* MenubarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenubarViewController.swift; sourceTree = ""; }; - DE018BF22A509B3300FF0AA3 /* MenubarModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenubarModel.swift; sourceTree = ""; }; - DE018C022A509B5D00FF0AA3 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; - DE018C192A509DBA00FF0AA3 /* Box42.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Box42.entitlements; sourceTree = ""; }; - DE0A91622A8E6A5400D1D6F1 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - DE0A91662A8E6CA700D1D6F1 /* WebViewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewManager.swift; sourceTree = ""; }; - DE0A916C2A8E7DD700D1D6F1 /* HoverButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoverButton.swift; sourceTree = ""; }; - DE0A91772A8F014F00D1D6F1 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; - DE0A917A2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppleScripts+ShowMessage.swift"; sourceTree = ""; }; - DE0A917E2A8F865400D1D6F1 /* BoxToolbarViewGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxToolbarViewGroup.swift; sourceTree = ""; }; - DE0A91822A8F889000D1D6F1 /* GoHomePageViaToolbar().swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GoHomePageViaToolbar().swift"; sourceTree = ""; }; - DE0A91852A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshPageViaToolbar.swift; sourceTree = ""; }; - DE0A91892A8F88A900D1D6F1 /* GoForwardInToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoForwardInToolbar.swift; sourceTree = ""; }; - DE0A918C2A8F88BC00D1D6F1 /* GoBackInToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoBackInToolbar.swift; sourceTree = ""; }; - DE0A918F2A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayURLInToolbar.swift; sourceTree = ""; }; - DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarViewController.swift; sourceTree = ""; }; - DE0A91A62A8FC66600D1D6F1 /* SideBarLeading.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideBarLeading.swift; sourceTree = ""; }; - DE1F1A112A8B506600A88DD8 /* importMacOSInfo.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = importMacOSInfo.sh; sourceTree = ""; }; - DE1F1A122A8B506600A88DD8 /* exportMacOSInfo.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = exportMacOSInfo.sh; sourceTree = ""; }; - DE1F1A132A8B506600A88DD8 /* keyMapping.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = keyMapping.sh; sourceTree = ""; }; - DE1F1A192A8B50C500A88DD8 /* BoxBaseContainerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BoxBaseContainerViewController.swift; path = Box/BoxBaseContainerViewController.swift; sourceTree = ""; }; - DE1F1A1A2A8B50C500A88DD8 /* BoxContentsViewGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoxContentsViewGroup.swift; sourceTree = ""; }; - DE1F1A1B2A8B50C500A88DD8 /* BoxButtonViewGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoxButtonViewGroup.swift; sourceTree = ""; }; - DE1F1A232A8B50D500A88DD8 /* BoxViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BoxViewController.swift; path = Main/BoxViewController.swift; sourceTree = ""; }; - DE1F1A282A8B50E200A88DD8 /* BoxSizeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoxSizeManager.swift; sourceTree = ""; }; - DE1F1A2D2A8BCC9800A88DD8 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; - DE1F1A302A8BD68F00A88DD8 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Double.swift; sourceTree = ""; }; - DE1F1A352A8BDDDF00A88DD8 /* StorageConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageConfig.swift; sourceTree = ""; }; - DE24E6342A8FE02A00E29F5D /* MovableContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovableContainerView.swift; sourceTree = ""; }; - DE24E6372A8FE10300E29F5D /* BoxBaseSplitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxBaseSplitView.swift; sourceTree = ""; }; - DE24E63A2A8FE93900E29F5D /* NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = ""; }; - DE2AD3282A824EEB00002D51 /* Accessibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Accessibility.swift; sourceTree = ""; }; - DE4407F92A923E860091937A /* BoxFunctionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxFunctionViewController.swift; sourceTree = ""; }; - DE4407FD2A923EA90091937A /* PreferenceButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceButtonView.swift; sourceTree = ""; }; - DE4408012A923EB60091937A /* PinButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PinButtonView.swift; sourceTree = ""; }; - DE4408042A923EC00091937A /* QuitButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuitButtonView.swift; sourceTree = ""; }; - DE4408072A9240300091937A /* BoxFunctionButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxFunctionButtonView.swift; sourceTree = ""; }; - DE44080B2A924B520091937A /* BoxFunctionViewGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxFunctionViewGroup.swift; sourceTree = ""; }; - DE4408142A92750D0091937A /* keyDown+BoxViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "keyDown+BoxViewController.swift"; path = "Main/keyDown+BoxViewController.swift"; sourceTree = ""; }; - DE44081C2A928F760091937A /* TopDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopDivider.swift; sourceTree = ""; }; - DE77BA502A82580400713683 /* MenubarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarViewModel.swift; sourceTree = ""; }; - DE77BA552A82637900713683 /* StateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateManager.swift; sourceTree = ""; }; - DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; - DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hotkey.swift; sourceTree = ""; }; - DE874F532A591F1400FC3B77 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; - DE874F562A591F2500FC3B77 /* Icon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; - DE874F5E2A5935CC00FC3B77 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; - DEB862D32A85124500278FCD /* cleanCache.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = cleanCache.sh; sourceTree = ""; }; - DEB862D82A852C4500278FCD /* brewInGoinfre.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = brewInGoinfre.sh; sourceTree = ""; }; - DEB862DB2A85347400278FCD /* Scripts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Scripts.swift; path = Box42/Scripts/Scripts.swift; sourceTree = SOURCE_ROOT; }; - DEB862E92A853F7F00278FCD /* BoxWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxWindowController.swift; sourceTree = ""; }; - DEF7492E2A85603700D987C8 /* nodeInstall.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = nodeInstall.sh; sourceTree = ""; }; - DEF749312A85657600D987C8 /* NSScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSScreen.swift; sourceTree = ""; }; + 6450C99729C1D5A3001D429E /* Box42.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Box42.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6450C99A29C1D5A3001D429E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6450C99F29C1D5A3001D429E /* Box42.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Box42.xcdatamodel; sourceTree = ""; }; + 6450C9A129C1D5A5001D429E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6450C9A629C1D5A5001D429E /* Box42.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Box42.entitlements; sourceTree = ""; }; + 6450C9B429C2343D001D429E /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 6450C9BB29C32972001D429E /* BoxController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoxController.swift; sourceTree = ""; }; + 6450C9BC29C32972001D429E /* EventMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = ""; }; + 6450C9C329C32A90001D429E /* WebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; + 6450C9C629C32AAC001D429E /* URLModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLModel.swift; sourceTree = ""; }; + 6450C9C929C32D63001D429E /* CPU.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = ""; }; + 6450C9CC29C32DBB001D429E /* MenubarModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarModel.swift; sourceTree = ""; }; + 6450C9CE29C32E34001D429E /* BoxModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxModel.swift; sourceTree = ""; }; + 6450C9D029C330C3001D429E /* MenubarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarController.swift; sourceTree = ""; }; + 6450C9D229C33105001D429E /* MenubarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarView.swift; sourceTree = ""; }; + 64DF818929C3B88B000B32F4 /* BoxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxView.swift; sourceTree = ""; }; + 64DF818B29C4AA85000B32F4 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 64DF818E29C61033000B32F4 /* WebViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewModel.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - DE018BAC2A5099F900FF0AA3 /* Frameworks */ = { + 6450C99429C1D5A3001D429E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DE0A915D2A8E348D00D1D6F1 /* SnapKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - DE018BA62A5099F900FF0AA3 = { + 6450C98E29C1D5A3001D429E = { isa = PBXGroup; children = ( - DE018BB12A5099F900FF0AA3 /* Box42 */, - DE018BB02A5099F900FF0AA3 /* Products */, - DE17AF722A834A1600325BF4 /* Frameworks */, + 6450C99929C1D5A3001D429E /* Box42 */, + 6450C99829C1D5A3001D429E /* Products */, + 6450C9B329C2343D001D429E /* Frameworks */, ); sourceTree = ""; }; - DE018BB02A5099F900FF0AA3 /* Products */ = { + 6450C99829C1D5A3001D429E /* Products */ = { isa = PBXGroup; children = ( - DE018BAF2A5099F900FF0AA3 /* Box42.app */, + 6450C99729C1D5A3001D429E /* Box42.app */, ); name = Products; sourceTree = ""; }; - DE018BB12A5099F900FF0AA3 /* Box42 */ = { + 6450C99929C1D5A3001D429E /* Box42 */ = { isa = PBXGroup; children = ( - DE0A916B2A8E7DC700D1D6F1 /* UI */, - DE1F1A202A8B50CA00A88DD8 /* Main */, - DEF749302A85655E00D987C8 /* Extensions */, - DEB862E82A853F6800278FCD /* Window */, - DEB862D22A8511D600278FCD /* Scripts */, - DE77BA542A82636500713683 /* Shared */, - DE874F512A591EC600FC3B77 /* Preferences */, - DE018C0C2A509BDF00FF0AA3 /* Resources */, - DE018C062A509B9000FF0AA3 /* System */, - DE018C082A509BB500FF0AA3 /* WebView */, - DE0A917D2A8F864300D1D6F1 /* Toolbar */, - DE4407F82A923E5B0091937A /* FunctionButton */, - DE1F1A182A8B50BB00A88DD8 /* Box */, - DE018C0E2A509C0C00FF0AA3 /* Menubar */, + 6450C9CB29C32DB1001D429E /* Menubar */, + 6450C9C529C32AAC001D429E /* URL */, + 6450C9C829C32D54001D429E /* CPU */, + 6450C9C229C32A90001D429E /* Web */, + 6450C9BF29C3299F001D429E /* Resource */, + 6450C9BA29C32972001D429E /* Main */, ); path = Box42; sourceTree = ""; }; - DE018C062A509B9000FF0AA3 /* System */ = { - isa = PBXGroup; - children = ( - DE018BDC2A509AEB00FF0AA3 /* EventMonitor.swift */, - DE018BE32A509B1700FF0AA3 /* CPU.swift */, - DE1F1A2D2A8BCC9800A88DD8 /* Storage.swift */, - DE1F1A352A8BDDDF00A88DD8 /* StorageConfig.swift */, - ); - path = System; - sourceTree = ""; - }; - DE018C082A509BB500FF0AA3 /* WebView */ = { - isa = PBXGroup; - children = ( - DE018C0B2A509BC100FF0AA3 /* URL */, - DE0A91662A8E6CA700D1D6F1 /* WebViewManager.swift */, - DE018BE92A509B2100FF0AA3 /* WebViewModel.swift */, - DE018BE62A509B1E00FF0AA3 /* WebViewController.swift */, - DE0A91772A8F014F00D1D6F1 /* WebView.swift */, - ); - path = WebView; - sourceTree = ""; - }; - DE018C0B2A509BC100FF0AA3 /* URL */ = { - isa = PBXGroup; - children = ( - DE018BEC2A509B2600FF0AA3 /* URLModel.swift */, - ); - path = URL; - sourceTree = ""; - }; - DE018C0C2A509BDF00FF0AA3 /* Resources */ = { - isa = PBXGroup; - children = ( - DEB862DE2A85348600278FCD /* sh */, - DE018C192A509DBA00FF0AA3 /* Box42.entitlements */, - DE018BB22A5099F900FF0AA3 /* AppDelegate.swift */, - DE018BDF2A509B0600FF0AA3 /* Assets.xcassets */, - DE018BBE2A5099FA00FF0AA3 /* Info.plist */, - DE018C022A509B5D00FF0AA3 /* Main.storyboard */, - DE018BB62A5099F900FF0AA3 /* Box42.xcdatamodeld */, - ); - path = Resources; - sourceTree = ""; - }; - DE018C0E2A509C0C00FF0AA3 /* Menubar */ = { - isa = PBXGroup; - children = ( - DE018BEF2A509B2F00FF0AA3 /* MenubarViewController.swift */, - DE018BF22A509B3300FF0AA3 /* MenubarModel.swift */, - DE77BA502A82580400713683 /* MenubarViewModel.swift */, - ); - path = Menubar; - sourceTree = ""; - }; - DE0A916B2A8E7DC700D1D6F1 /* UI */ = { - isa = PBXGroup; - children = ( - DE0A916C2A8E7DD700D1D6F1 /* HoverButton.swift */, - DE24E6342A8FE02A00E29F5D /* MovableContainerView.swift */, - ); - path = UI; - sourceTree = ""; - }; - DE0A917D2A8F864300D1D6F1 /* Toolbar */ = { - isa = PBXGroup; - children = ( - DE0A919E2A8FA15300D1D6F1 /* View */, - DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */, - ); - path = Toolbar; - sourceTree = ""; - }; - DE0A919E2A8FA15300D1D6F1 /* View */ = { - isa = PBXGroup; - children = ( - DE0A91A62A8FC66600D1D6F1 /* SideBarLeading.swift */, - DE0A91822A8F889000D1D6F1 /* GoHomePageViaToolbar().swift */, - DE0A918F2A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift */, - DE0A918C2A8F88BC00D1D6F1 /* GoBackInToolbar.swift */, - DE0A91892A8F88A900D1D6F1 /* GoForwardInToolbar.swift */, - DE0A91852A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift */, - DE0A917E2A8F865400D1D6F1 /* BoxToolbarViewGroup.swift */, - ); - path = View; - sourceTree = ""; - }; - DE17AF722A834A1600325BF4 /* Frameworks */ = { + 6450C9B329C2343D001D429E /* Frameworks */ = { isa = PBXGroup; children = ( + 6450C9B429C2343D001D429E /* WebKit.framework */, ); name = Frameworks; sourceTree = ""; }; - DE1F1A182A8B50BB00A88DD8 /* Box */ = { - isa = PBXGroup; - children = ( - DE4408202A9297EE0091937A /* View */, - DE1F1A192A8B50C500A88DD8 /* BoxBaseContainerViewController.swift */, - ); - name = Box; - sourceTree = ""; - }; - DE1F1A202A8B50CA00A88DD8 /* Main */ = { - isa = PBXGroup; - children = ( - DE1F1A232A8B50D500A88DD8 /* BoxViewController.swift */, - DE4408142A92750D0091937A /* keyDown+BoxViewController.swift */, - ); - name = Main; - sourceTree = ""; - }; - DE4407F82A923E5B0091937A /* FunctionButton */ = { - isa = PBXGroup; - children = ( - DE4407FC2A923E920091937A /* View */, - DE4407F92A923E860091937A /* BoxFunctionViewController.swift */, - ); - path = FunctionButton; - sourceTree = ""; - }; - DE4407FC2A923E920091937A /* View */ = { + 6450C9BA29C32972001D429E /* Main */ = { isa = PBXGroup; children = ( - DE44081C2A928F760091937A /* TopDivider.swift */, - DE4407FD2A923EA90091937A /* PreferenceButtonView.swift */, - DE4408012A923EB60091937A /* PinButtonView.swift */, - DE4408042A923EC00091937A /* QuitButtonView.swift */, - DE4408072A9240300091937A /* BoxFunctionButtonView.swift */, - DE44080B2A924B520091937A /* BoxFunctionViewGroup.swift */, + 6450C9BB29C32972001D429E /* BoxController.swift */, + 6450C9CE29C32E34001D429E /* BoxModel.swift */, + 64DF818929C3B88B000B32F4 /* BoxView.swift */, ); - path = View; + path = Main; sourceTree = ""; }; - DE4408202A9297EE0091937A /* View */ = { + 6450C9BF29C3299F001D429E /* Resource */ = { isa = PBXGroup; children = ( - DE1F1A1B2A8B50C500A88DD8 /* BoxButtonViewGroup.swift */, - DE1F1A1A2A8B50C500A88DD8 /* BoxContentsViewGroup.swift */, - DE24E6372A8FE10300E29F5D /* BoxBaseSplitView.swift */, - ); - name = View; - path = Box/View; + 6450C99A29C1D5A3001D429E /* AppDelegate.swift */, + 6450C9BC29C32972001D429E /* EventMonitor.swift */, + 6450C9A129C1D5A5001D429E /* Assets.xcassets */, + 64DF818B29C4AA85000B32F4 /* Main.storyboard */, + 6450C9A629C1D5A5001D429E /* Box42.entitlements */, + 6450C99E29C1D5A3001D429E /* Box42.xcdatamodeld */, + ); + path = Resource; sourceTree = ""; }; - DE77BA542A82636500713683 /* Shared */ = { + 6450C9C229C32A90001D429E /* Web */ = { isa = PBXGroup; children = ( - DE1F1A282A8B50E200A88DD8 /* BoxSizeManager.swift */, - DE77BA552A82637900713683 /* StateManager.swift */, - DE0A91622A8E6A5400D1D6F1 /* Constants.swift */, + 6450C9C329C32A90001D429E /* WebViewController.swift */, + 64DF818E29C61033000B32F4 /* WebViewModel.swift */, ); - path = Shared; + path = Web; sourceTree = ""; }; - DE874F512A591EC600FC3B77 /* Preferences */ = { + 6450C9C529C32AAC001D429E /* URL */ = { isa = PBXGroup; children = ( - DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */, - DE874F532A591F1400FC3B77 /* PreferencesView.swift */, - DE874F562A591F2500FC3B77 /* Icon.swift */, - DE2AD3282A824EEB00002D51 /* Accessibility.swift */, - DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */, + 6450C9C629C32AAC001D429E /* URLModel.swift */, ); - path = Preferences; - sourceTree = ""; - }; - DEB862D22A8511D600278FCD /* Scripts */ = { - isa = PBXGroup; - children = ( - DEB862DB2A85347400278FCD /* Scripts.swift */, - DE0A917A2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift */, - ); - path = Scripts; - sourceTree = ""; - }; - DEB862DE2A85348600278FCD /* sh */ = { - isa = PBXGroup; - children = ( - DE1F1A122A8B506600A88DD8 /* exportMacOSInfo.sh */, - DE1F1A112A8B506600A88DD8 /* importMacOSInfo.sh */, - DE1F1A132A8B506600A88DD8 /* keyMapping.sh */, - DEB862D32A85124500278FCD /* cleanCache.sh */, - DEB862D82A852C4500278FCD /* brewInGoinfre.sh */, - DEF7492E2A85603700D987C8 /* nodeInstall.sh */, - ); - path = sh; + path = URL; sourceTree = ""; }; - DEB862E82A853F6800278FCD /* Window */ = { + 6450C9C829C32D54001D429E /* CPU */ = { isa = PBXGroup; children = ( - DEB862E92A853F7F00278FCD /* BoxWindowController.swift */, + 6450C9C929C32D63001D429E /* CPU.swift */, ); - path = Window; + path = CPU; sourceTree = ""; }; - DEF749302A85655E00D987C8 /* Extensions */ = { + 6450C9CB29C32DB1001D429E /* Menubar */ = { isa = PBXGroup; children = ( - DE874F5E2A5935CC00FC3B77 /* String.swift */, - DEF749312A85657600D987C8 /* NSScreen.swift */, - DE1F1A302A8BD68F00A88DD8 /* Double.swift */, - DE24E63A2A8FE93900E29F5D /* NSImage.swift */, + 6450C9CC29C32DBB001D429E /* MenubarModel.swift */, + 6450C9D029C330C3001D429E /* MenubarController.swift */, + 6450C9D229C33105001D429E /* MenubarView.swift */, ); - path = Extensions; + path = Menubar; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - DE018BAE2A5099F900FF0AA3 /* Box42 */ = { + 6450C99629C1D5A3001D429E /* Box42 */ = { isa = PBXNativeTarget; - buildConfigurationList = DE018BC22A5099FA00FF0AA3 /* Build configuration list for PBXNativeTarget "Box42" */; + buildConfigurationList = 6450C9A929C1D5A5001D429E /* Build configuration list for PBXNativeTarget "Box42" */; buildPhases = ( - DE018BAB2A5099F900FF0AA3 /* Sources */, - DE018BAC2A5099F900FF0AA3 /* Frameworks */, - DE018BAD2A5099F900FF0AA3 /* Resources */, + 6450C99329C1D5A3001D429E /* Sources */, + 6450C99429C1D5A3001D429E /* Frameworks */, + 6450C99529C1D5A3001D429E /* Resources */, ); buildRules = ( ); dependencies = ( ); name = Box42; - packageProductDependencies = ( - DE0A915C2A8E348D00D1D6F1 /* SnapKit */, - ); productName = Box42; - productReference = DE018BAF2A5099F900FF0AA3 /* Box42.app */; + productReference = 6450C99729C1D5A3001D429E /* Box42.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - DE018BA72A5099F900FF0AA3 /* Project object */ = { + 6450C98F29C1D5A3001D429E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1230; - LastUpgradeCheck = 1230; + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1400; + LastUpgradeCheck = 1400; TargetAttributes = { - DE018BAE2A5099F900FF0AA3 = { - CreatedOnToolsVersion = 12.3; + 6450C99629C1D5A3001D429E = { + CreatedOnToolsVersion = 14.0.1; }; }; }; - buildConfigurationList = DE018BAA2A5099F900FF0AA3 /* Build configuration list for PBXProject "Box42" */; - compatibilityVersion = "Xcode 9.3"; + buildConfigurationList = 6450C99229C1D5A3001D429E /* Build configuration list for PBXProject "Box42" */; + compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = DE018BA62A5099F900FF0AA3; - packageReferences = ( - DE0A915B2A8E348D00D1D6F1 /* XCRemoteSwiftPackageReference "SnapKit" */, - ); - productRefGroup = DE018BB02A5099F900FF0AA3 /* Products */; + mainGroup = 6450C98E29C1D5A3001D429E; + productRefGroup = 6450C99829C1D5A3001D429E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - DE018BAE2A5099F900FF0AA3 /* Box42 */, + 6450C99629C1D5A3001D429E /* Box42 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DE018BAD2A5099F900FF0AA3 /* Resources */ = { + 6450C99529C1D5A3001D429E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DE1F1A142A8B506600A88DD8 /* importMacOSInfo.sh in Resources */, - DE018C032A509B5D00FF0AA3 /* Main.storyboard in Resources */, - DE1F1A152A8B506600A88DD8 /* exportMacOSInfo.sh in Resources */, - DE1F1A162A8B506600A88DD8 /* keyMapping.sh in Resources */, - DEB862D42A85124500278FCD /* cleanCache.sh in Resources */, - DEB862D92A852C4500278FCD /* brewInGoinfre.sh in Resources */, - DE018BE02A509B0600FF0AA3 /* Assets.xcassets in Resources */, + 6450C9A229C1D5A5001D429E /* Assets.xcassets in Resources */, + 64DF818C29C4AA85000B32F4 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - DE018BAB2A5099F900FF0AA3 /* Sources */ = { + 6450C99329C1D5A3001D429E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DE0A91A72A8FC66600D1D6F1 /* SideBarLeading.swift in Sources */, - DE0A917B2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift in Sources */, - DE1F1A262A8B50D500A88DD8 /* BoxViewController.swift in Sources */, - DE018BB82A5099F900FF0AA3 /* Box42.xcdatamodeld in Sources */, - DE874F542A591F1400FC3B77 /* PreferencesView.swift in Sources */, - DE0A91982A8F977F00D1D6F1 /* ToolbarViewController.swift in Sources */, - DE4408082A9240300091937A /* BoxFunctionButtonView.swift in Sources */, - DE77BA562A82637900713683 /* StateManager.swift in Sources */, - DE1F1A1C2A8B50C500A88DD8 /* BoxBaseContainerViewController.swift in Sources */, - DE018BE72A509B1E00FF0AA3 /* WebViewController.swift in Sources */, - DE4407FA2A923E860091937A /* BoxFunctionViewController.swift in Sources */, - DE4407FE2A923EA90091937A /* PreferenceButtonView.swift in Sources */, - DEF749322A85657600D987C8 /* NSScreen.swift in Sources */, - DE018BF02A509B2F00FF0AA3 /* MenubarViewController.swift in Sources */, - DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */, - DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */, - DE018BE42A509B1700FF0AA3 /* CPU.swift in Sources */, - DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */, - DE0A91862A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift in Sources */, - DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */, - DE0A91832A8F889000D1D6F1 /* GoHomePageViaToolbar().swift in Sources */, - DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */, - DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */, - DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */, - DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */, - DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */, - DE24E63B2A8FE93900E29F5D /* NSImage.swift in Sources */, - DE0A916D2A8E7DD700D1D6F1 /* HoverButton.swift in Sources */, - DE4408022A923EB60091937A /* PinButtonView.swift in Sources */, - DE0A91672A8E6CA700D1D6F1 /* WebViewManager.swift in Sources */, - DE4408152A92750D0091937A /* keyDown+BoxViewController.swift in Sources */, - DE018BED2A509B2600FF0AA3 /* URLModel.swift in Sources */, - DE4408052A923EC00091937A /* QuitButtonView.swift in Sources */, - DE0A918A2A8F88A900D1D6F1 /* GoForwardInToolbar.swift in Sources */, - DE1F1A1E2A8B50C500A88DD8 /* BoxButtonViewGroup.swift in Sources */, - DEB862EB2A853F7F00278FCD /* BoxWindowController.swift in Sources */, - DE0A918D2A8F88BC00D1D6F1 /* GoBackInToolbar.swift in Sources */, - DE018BDD2A509AEB00FF0AA3 /* EventMonitor.swift in Sources */, - DE1F1A292A8B50E200A88DD8 /* BoxSizeManager.swift in Sources */, - DEB862DC2A85347400278FCD /* Scripts.swift in Sources */, - DE1F1A1D2A8B50C500A88DD8 /* BoxContentsViewGroup.swift in Sources */, - DE24E6352A8FE02A00E29F5D /* MovableContainerView.swift in Sources */, - DE1F1A362A8BDDDF00A88DD8 /* StorageConfig.swift in Sources */, - DE2AD3292A824EEB00002D51 /* Accessibility.swift in Sources */, - DE24E6382A8FE10400E29F5D /* BoxBaseSplitView.swift in Sources */, - DE44081D2A928F760091937A /* TopDivider.swift in Sources */, - DE874F572A591F2500FC3B77 /* Icon.swift in Sources */, - DE1F1A2E2A8BCC9800A88DD8 /* Storage.swift in Sources */, - DE0A91782A8F014F00D1D6F1 /* WebView.swift in Sources */, - DE1F1A312A8BD68F00A88DD8 /* Double.swift in Sources */, - DE0A917F2A8F865400D1D6F1 /* BoxToolbarViewGroup.swift in Sources */, - DE018BEA2A509B2100FF0AA3 /* WebViewModel.swift in Sources */, + 64DF818F29C61033000B32F4 /* WebViewModel.swift in Sources */, + 6450C9D129C330C3001D429E /* MenubarController.swift in Sources */, + 6450C9D329C33105001D429E /* MenubarView.swift in Sources */, + 6450C9CF29C32E34001D429E /* BoxModel.swift in Sources */, + 6450C9CD29C32DBB001D429E /* MenubarModel.swift in Sources */, + 6450C9A029C1D5A3001D429E /* Box42.xcdatamodeld in Sources */, + 6450C9C729C32AAC001D429E /* URLModel.swift in Sources */, + 6450C9CA29C32D63001D429E /* CPU.swift in Sources */, + 6450C9BD29C32972001D429E /* BoxController.swift in Sources */, + 64DF818A29C3B88B000B32F4 /* BoxView.swift in Sources */, + 6450C9BE29C32972001D429E /* EventMonitor.swift in Sources */, + 6450C9C429C32A90001D429E /* WebViewController.swift in Sources */, + 6450C99B29C1D5A3001D429E /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - DE018BC02A5099FA00FF0AA3 /* Debug */ = { + 6450C9A729C1D5A5001D429E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; @@ -582,7 +291,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -592,14 +301,13 @@ }; name = Debug; }; - DE018BC12A5099FA00FF0AA3 /* Release */ = { + 6450C9A829C1D5A5001D429E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; @@ -637,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.3; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -646,42 +354,64 @@ }; name = Release; }; - DE018BC32A5099FA00FF0AA3 /* Debug */ = { + 6450C9AA29C1D5A5001D429E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = Box42/Resources/Box42.entitlements; + CODE_SIGN_ENTITLEMENTS = Box42/Resource/Box42.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Box42/Resources/Info.plist; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8CB4B27BA3; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Box42/Resource/Info.plist; + INFOPLIST_KEY_LSUIElement = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = com.chanheki.Box42; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = chanheki.Box42; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; name = Debug; }; - DE018BC42A5099FA00FF0AA3 /* Release */ = { + 6450C9AB29C1D5A5001D429E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = Box42/Resources/Box42.entitlements; + CODE_SIGN_ENTITLEMENTS = Box42/Resource/Box42.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Box42/Resources/Info.plist; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8CB4B27BA3; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Box42/Resource/Info.plist; + INFOPLIST_KEY_LSUIElement = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = com.chanheki.Box42; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = chanheki.Box42; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; name = Release; @@ -689,57 +419,38 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - DE018BAA2A5099F900FF0AA3 /* Build configuration list for PBXProject "Box42" */ = { + 6450C99229C1D5A3001D429E /* Build configuration list for PBXProject "Box42" */ = { isa = XCConfigurationList; buildConfigurations = ( - DE018BC02A5099FA00FF0AA3 /* Debug */, - DE018BC12A5099FA00FF0AA3 /* Release */, + 6450C9A729C1D5A5001D429E /* Debug */, + 6450C9A829C1D5A5001D429E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DE018BC22A5099FA00FF0AA3 /* Build configuration list for PBXNativeTarget "Box42" */ = { + 6450C9A929C1D5A5001D429E /* Build configuration list for PBXNativeTarget "Box42" */ = { isa = XCConfigurationList; buildConfigurations = ( - DE018BC32A5099FA00FF0AA3 /* Debug */, - DE018BC42A5099FA00FF0AA3 /* Release */, + 6450C9AA29C1D5A5001D429E /* Debug */, + 6450C9AB29C1D5A5001D429E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ -/* Begin XCRemoteSwiftPackageReference section */ - DE0A915B2A8E348D00D1D6F1 /* XCRemoteSwiftPackageReference "SnapKit" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SnapKit/SnapKit.git"; - requirement = { - kind = exactVersion; - version = 5.6.0; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - DE0A915C2A8E348D00D1D6F1 /* SnapKit */ = { - isa = XCSwiftPackageProductDependency; - package = DE0A915B2A8E348D00D1D6F1 /* XCRemoteSwiftPackageReference "SnapKit" */; - productName = SnapKit; - }; -/* End XCSwiftPackageProductDependency section */ - /* Begin XCVersionGroup section */ - DE018BB62A5099F900FF0AA3 /* Box42.xcdatamodeld */ = { + 6450C99E29C1D5A3001D429E /* Box42.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - DE018BB72A5099F900FF0AA3 /* Box42.xcdatamodel */, + 6450C99F29C1D5A3001D429E /* Box42.xcdatamodel */, ); - currentVersion = DE018BB72A5099F900FF0AA3 /* Box42.xcdatamodel */; + currentVersion = 6450C99F29C1D5A3001D429E /* Box42.xcdatamodel */; path = Box42.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; /* End XCVersionGroup section */ }; - rootObject = DE018BA72A5099F900FF0AA3 /* Project object */; + rootObject = 6450C98F29C1D5A3001D429E /* Project object */; } diff --git a/Box42.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Box42.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 19d4e8c..0000000 --- a/Box42.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,16 +0,0 @@ -{ - "object": { - "pins": [ - { - "package": "SnapKit", - "repositoryURL": "https://github.com/SnapKit/SnapKit.git", - "state": { - "branch": null, - "revision": "f222cbdf325885926566172f6f5f06af95473158", - "version": "5.6.0" - } - } - ] - }, - "version": 1 -} diff --git a/Box42.xcodeproj/project.xcworkspace/xcuserdata/chan.xcuserdatad/UserInterfaceState.xcuserstate b/Box42.xcodeproj/project.xcworkspace/xcuserdata/chan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d80a4ee8039c6d373c7be87865d7302ead383320 GIT binary patch literal 94938 zcmeEv2VfLM+yCzD>|Wcw-Mzb9Xd+4%Qb{182!R9$gb)b5#gH5!kmN!xp^EH-1+e#y znt%ua3o6(Jv0}yE3wFgW_V#~f_ckOXL{xmg_xt{cce&e}KEHYT%*?JVD~(hqCceP& z9N`3xav~>j4$eKL%fe7qq%>SHwM$`D(cDt}Hla&(xN=ID@a%b^qUwl`gJYhr$NVRgvhZ`K_m=iy{7mTSYc<&wB$t`C>OrE-0_eq0)t&h_U8 za09tnTmg3ySIEuginwAf#LeMKxVc;@H;Qb-Ob&@-OKId9_1e6p5UJ3_HfT}&vP$uZ*XsNZ*hCMce$Ur zU$|en-?-noKX{JkdBO`k<(<6BYrM|4<=gS?`N{lreg=OMU&x2}Is80+J|E^Q`D(s~ zU&1ftPvKYar}C%qtNAtjIsCc&h5SYQW&Gv*)%;q%mapSC@Hg-|*k^`}yzq@A)72ANim7pZQ<-KZrye z#7VqFC9$LpX-nFX_M|iELI#pScgFNfsGSMv-x3Jjo|h$uu&X6p><5 zM#{v71{~yg$}|oLPz0Pp_6c& zaJh!f(46d_d@B%CM=7KR8Tg>0cvm@O0u#X?A!Ba{epg;HUjFkc7@3x!3(a^V!= z3}KaUo^ZafQP?EZ3!8;4!i~aB!p*`h!dBr{VY_gjaKG@7@UZZd@U-xZut#`BcvbjX z_(u3v*e`r1d@uYU{3!e+{4D$;{6Qt^pbGWUAdRJMXeW9cO{e|o06LHkq9@Y9bO_C$ zL+LO&g67f*bRwNeXVE#dgaTbjPo<~P)9D#>60i@X_izVog~ebN+pn1N~cPvNvBI^NUNmP z(i-VZ=`86y=~C%3X{~gPv_ZN-+9=&3ZIyOQk4sNTPfAZoPfO28d!%Qj=cMPQm!-F) zx1|rH52Y`pFQu=fZ>9axchYat?~XQ(wvKj=_KpsYV;mhF$2vMWj&mIE=;nxX^l_v( z208{gvK+%5CpiiovmHf_Vn@g^$5G;#>nL^1bIf;y9Sa>NJC-|6cbwrk*KwZX3dfa> zs~lH5);ek(n;i9yTOGGKo^U+rc*^m#;~B>u$Fq*-9M3ymaJ=Yv)$xvFuj3=f$BwTY zUpu~WeCznd@vAf7jBy5?vCcNmw$66W_RbE@W1JnG$2)sEPjL2fCOMOx{hb4x1D%7M zS)%@A9p_CeA4-X^F`<9&M%x_I=^y$?fl01t#iNg zJLmV#ADq9qh|B46xpbG$)y~!4)yI|MN_F*h^>d}U(p~*s16%`LgIpP|k*;jlSXZ8F zifgKCnrpgihO5{WaxHhA;#%P{T;N*iI@NWW>vY!{u2rtHTo<}7a$VuN(pBeL=UVUD z;=0lGulxScuGd_zyY{-?b$#mE=laa`x$8UE_ioLt zyM1oIJK&CS2i>vmHtx3WcJ7YuuI_H`-tIVes=KedpL?)-h>0?%&+Mdjg&qPtX(VY2#_@ zY3FJ0>EJoW)6LVae6Foyc!#pEABR$!kT+difo@cIS zfv4J2<5}!k;yKx~++%pabDHOL&uY&a&qbb#J(qi~^VE7ad2aOF#}`{f_yU*+Evq6i9AT#8%qD1PNQ<#?sD(naZ^ z^i~p;B&DB{rlc$Vl_5%oGE^C+WGXqzG-bLnLz$@*Dj}s*nWu!6N@anvP+6obR?bz< zQ_fc|P%cz1QZ805Q7%<3Q?63hDeIN%l}*Y`%FW6x%5BOW$^*(SO<-No!c&XRvmA#r*_XfSO-VWYlydAyWyeZyPZ(nae z?*Q*$?=Wwsca(RuH^)21o9~_Ao#>t9o$M{}mU}C_VQ;0k+Pm0$vUj<6rT0|tY2G#7 zGrebdFY#XCz0!M)_ge2d?|Sc@-n+bad++hy>%Gr=zjudsr}shcqu$58Pk5j7?(x3l zecAh(_YLox-o4)Mygzw=_WthuL*-OnjZuSYtlCCxtF}|ys~yy1)#KI9Y8SPK8m}g( zebs(ynwqZmR|lwr)hsnz9i`@~)6`jNfm);%t8>*-wOp-G7pqIurRp+ug}PEbRXs<& zP`yOGLcLPGO1)m)px&TvRJW)%syC^(s@v2Z>VxWI>J#cS>K^qq^)2;n^*!}{^<(uD zjn{}KXjBt5NpomU&84|DkEUutEmmuzb<~d4x@$eOp4tgoFRhQ3qUC5~v|MehmZy!= z#%uZ71Z|==Nt>n>YO}Q>tyG(*RcR5eTC33(YNu!`w9B;1wJWqMwX3wNwYAzc+O^ts zTCH}ywne*9yG^@YyH~qUyIg-)Y}# zKj^$pbU~-Os7tzAZ>P7{JLt#g9ra`NPI?!;hu&LH(+B7$>KS^bK0+U*kJ0n=e0_>O zL!Ye|>BV}59@Z=M1$vFXR9~i_te>H;(pT$e>sRY*^=tHN_3QLny-wetZ_>Bvck1`( z_v;Vn59yEUkLyqAd-Rv|m-SclxAb@Q_wj6c^u)}QB};h*WB|3d#M{uO@1f42V||GED2{O9{G@L%Y^#(%wkqkoJ4M*mIzTm85BAM`)u zf7t(s|55*A{@wl;{V(}n_P^qP)&HjdE&pEsyZ-n5U;4lDf9?Oq|E+(&|2zNp0TK`b zG$00~fE-W)-hdj22?PV}0__9G1&$AN3v>_k2*d{x0s{gA1A_u51_lR)1Tq3c1H%HD zfvmvjKu%ynU}9iWpfa!^P!)&-sslBFg@HwZ#epS(rGaIERe{xkHGwk&X9X?`TpqY0 zaAn}CKy9Eda6@2g;MTxxf!hPy0^0*S0}ljt1s)6R4m=)sBJgBjPvD)v-oU$o_X6(+ zJ_vjm_$cso;G4j=f&GDBW8|1NF>PZy#dM459@8r(Ato^XSa=F6CGV}6MFF{lOg zpfBhT27)ocU@$h=CfGLEF4!^HHP|cIJD3to4Gs#P7#tDI4NeSB4NeQr3eFDB36=!s z2djh2f-8e(1Xl&m3Z5N2KX`HQ^58AOt-)J^w*_wxZVPS?-VwYrcvtZ5;QhgegHHsX z489P2G5AvOt>D|i_kte$>YkL?xPJ2oyhJ~kmXF*YeSIkr!1 zN^ELudhC$c;jtrP$HwNxPKliwJ2Q4xY$&!oc0p`S?2_2!u@Jj5_MF%YV=s@rBKDft zjj@|z>tk<^-4?q&_U_pGV|PvLQc+V@_B^L>UQXpS&d&uW=jO-H4=ssI!@p6za#EL~ zvcgEDj?+1xK@6de3ve+81#y!xus{oBXJ$RiVQ9mEqEg>PSXWb?HJ>hl>lecA23$g*9c>S;eK*;VM%} zjtmc1O&p&SDbV!sH5J3c71g1|)#F1&*saJ6GixZnXl|%HgoRpPFF0U*LVI_G?YmZc8b}QS^!U!totO=#nOU8#P!&Nw3sy%X(ODl@Qi?H%` z)~AfBs=|sAtgWItGc>!VB)eix7?bCR%24GG6*nYrW3|xghg}%!hRYu0LEIQF@n%is zPUHr2L%0lXC^wADvF%IwY*XoFfyo*%BMDhjbo zY~%~8N+aQlyiiGDq$Xk&T%g6ZmOq;IKrsbcYHR7o)sz;^&k2X;AE?f*r(ctN*$AMj zIk-56)|8eNhpG)u!m&@T94LJW<(;P>S36; zEL>8crC3Q#_>_dIS{UjPg*7FiF`;s7$br#rwJmwfNM-l8e`{@tj%#kXVt8p;D1QmA zg!0CN933pPh(38$VP?w8uc>6q;^2{LlBPgQI=p@j%bR$hQ)xxv^7z6^T$%C3)$wCW zBSq%0m;(@*m>tjBm_63~YAwwJSqJ<{*4$9_BBXZB^<`Crs!AHh-(Iy9 zTqT!S%Y}{OYPkhQ7o+R*Ts6|_8g3!Ch+E94^=zak)A4Urs0``P!jQokosHuQv>O)3 zEoRFrj=fdkLh7F|F@m%xp=fSlMS|V0NWzHH>X9|G&8Kri^Gg$kh8L$KN8iU3mR7Kj zj0&|@ZW(tnx12j=n#E@-3d=)NtdF6{#N2!&Vs-fQiYdAIV@*S+Jv6|r z6(?)H7%uUdb0T; zwQGj;A*E~DaQjKBohH$Kl5T$J+cjfo^ry6jpE8>LWM#*a`!)QOP*7f2G&VmvXX8T= zlN2UoR90ppn4XC9-v14KIus7=X}pTtzyye^xwYIi+_l_wTrF3} zt>e~n*BiZ!I3wOjFcOU@R@6i0mx#2})N-Ijs3o8q><68XL;!$Y6FDyYB;@B3` zWLGRKjg%scQ4(lgN?GBOa7}gAViYQvLjcosZeEJH=uC+wK5QqXf3KLtYk|+@|-DT-pB2z>?|GlbS6=E;E&-u^2hR>_~ZEF`ObV7zAN92 z@6Pw&d-5mnz4+dI93Rgo@QK`6d@|pMPvOqw`||zxG-I+c)tGL~GzyGDqsRyuB}S<+ z-zYc2#sVW^)EJA5CB`yixzW>DVSsTevZ&LIRmK`tWq*DEKad~9pU4m9hwvHvP<|Mn z$!GDy`4Rj`KARuKkLGjuF?=pRme1qI@#Fb?egZ$yILlaP+-2-BJ~Vy>UIV@x@B@I) z1-=^iHNamB{O!O$1N?`;{{qAhq#KY-Ak%;>0CEP9D}meyTqNu{Ah%_}H2E0|HB<^Syp4vX>frDjF5 z3bb*5yCST{8V-29<6)z#sO z__>YO{iS9fQ1+Z+_u;QAeNCa<+U#Ft)>c)ZjriNO9h$;iXBLjev7EnMxV`KTG2z#n zH7qR9#{TUZCWmGx;Hwo>)ti+pF3@(gTFHM2p={Kj)+YXDvr|j|@!TAG_HQ?9IJrQZ z(CVGBm6lgR4_NcYM$y!6ggJz8@|H(Wx2u`gtfyd06 zPAkyvZnba!eGBOj)aNO)KWMZX(`tWOL-?Ob0neFLtS-<-{p~7Rvm)^?o8_PRPo(C9 z;MQcUOurQW8vg+*-~8+R8~mI6Tm0MnJN#b$UH(1(edBE79OGQ$JmY-h0^>sCBI9D? zl6w9_OZnzM<@cdoVI%(qD&LnzmG3K!>(Iu~->5yReE$o|_peO({>`{7s(cd;m2bim z!d}MZ#uer(UF)i)L{(_wA|5VSOWej)wL~_qW)4Mk$(2FriLy%mqyT2Sx0o@ zGu9f{psr40P*=a!7&x8Tu(B(PLyJQPTXuBk`JH!sWoi9(IUUHcrp`|~qRwB}sGNgz zemi|vl88to-AH%RgY+aPkY1!Wi6ikO!B}rxZ)`AbFg6;SjCy0UvBkKto+MdFB&ik> zNjf6&rYI6`jUw@mqewjRNF*Z=iDaa4vyH^j42d~p40{>37+cL(I!58}_S{Y&lNb^w z8n@Mw$;R!6iNxt-mW9Nbh{SCSK_?*+w>PsIX%V}g5SeRXt^_f6=b>}h=_|+*hPg1Q zBnwCtiI8eiLl%-nWU+C#agTAYai4L&vBTJDJYeiH9;_!zqnJB|tRM!rk*q|_Jru>< zW5$!lQ~3GmqnP^_Fn2z~+y%zNHs&s7n7f2r%3j7J#-rvdU2CTidv4c~YZ>OQF?QFI z>x{<_6Lagy4Ho7$Am*Mx1lbntgQ!;LAxTjqr_ZkNW^$_qzO4wpXAYg!PJbtPkb&7f=gYPW{zPAy4_%hx^@Ud6Aw%DH856Q<2dLJ2Y z*OE_+cMcPJpOddF=zWRM+sla8H%RW@ZAR|&4o`L-d=Rt!k^Ev|?`Oo`2ZzoZZK1#m zGGb34f*?>q6ePhRI0cvB7CgpB#>d7d#;3+U<1^!P;|t?Uv9KrTf{$FvZ4_b< zdtXPfx8L{)yWijV`6%{|Jobdnh&`c;@l6zaLU+WT(1Y8>UdFd5Z?jjrcDy~a2|^NL zPe?Srs}+)s?+*`qLSG>r@gwvjy77atwod5Jy=wf3=xgSnq2oFa>Ci;b6EcKM6MMoi z#NIE6J)uA5{IOYHyM?2Ki41$Ag&bjwkSmN8@`Q21cp+byVEktMZu|i}2Rsiv0bT%} z0xtqD)eDoN5S(Vod%`RZ-75|YgTT8ji4S=1Q560QC@f>`lz$=WFwJi486|EM|vha7NF$8$^ z&of*gT+IM@p>UCKv2clSsc@Naxp0MWrEnGSI`BT={lEu+j{!aid@S&7fNu+YyLw@5 z6oa)w9f#Vla6Q9ddmDotf$z)|VBotP1>wH{!rK@K(SzE-2H_p15GdS5E)niB9s&Ls z>n&Y7&c?uc;FL&$1G8Uj1V=*2xyQ2KFNk;icJ>Nk0SD4KqRxt2)_ZJ97QB$ zMj6VJG3*6=A7iWehGbET&NOvWHzJa{fKRQZ9^m^P9wMnqeTXTlF+}!5L{dLPWLisz zRBRed+tLmu5NUe`#Qq3G>SsVqI}{M<@iY#BNITOmv@7jKyVD-DCq04oq6oWzzz+ic zMBoPlkHuvGk3|gwJ`?z?dKz!hMw)E#XWEwmakve{kv0%>jso$>1CeGT5NQ_hBWxg! zJOmJJ7>=dm7!31(&#tB8fgg34Fq}lEG8j%~FdW?~4DFf<=xhsvg$#pZ4g-U8X*HL) znU>OdbUrPk<+Or^X(e4it7ruHvA|=i#{rM6&If)1@DqWb1pH*+rvN{7Gp&gNaS2^Y zm(i2Cjr0@-#c4JaX8>Oa{A}PCFjigle-Dq{Fc8`@@#a;97Diq2(T~=1GbZuBA!L!B z!+?7(@Y8MJUcdy)X8Mf{rpxJ-47OJQKeLvixHjuBVS6pDLl6?3)-s{8fPrv5BZMb4 zBZN9B?>r>22|uUx^d>HG9oMj-0=^jd&^of4-a@w;?*Tst_)4Setn8uDLC!BK zEW>C|t>FRgA1SS5;ierM9QcNb@Xxi1n?EWhq1iU;?i*WGz`WF72*b&qR>P$1iC;wJ{o5~6hkvg zi$dtViYAE1xQzIm(vrE=od@r+#!eIMx?Z3!TLj=GMgVZD(;>&+&haMwm@%QZ=-c!i zx|hC7-=pu-59o*VBj9U*UkLmn;1>hG1o)-Eqi%6B@XLWerJjBgUHhL$nb6m4<*%?; z{z{t(t@^*W=$i*J|EI%`=^uz&kptd{u4PfcwJcI@7kdE@Oi9Eyl!k)QnHD{wg6mn7 zfj_lY^a6j{;jL%UC$fN2qKg5xo=-gsvU7A5 znNLdWCUzHlh&{y<#9m@=F;0vZQT9F)__KgN8~Ag8M*?;p@aF@60q_?Be^I>{^-hVY zVqc~yis+pJ{$d-5mjQpZr75mGio_!?4vEY|C5{CC5*vxkMJ1wpioJlpl*#4zhDdbS zQ=KnPWJpAD;__M%#fd8p6N%HrnHCafFeF~dKvlqycvW*G#&zs$(MAqW>M`B#Vo0bw$9i9!;cSHRcXkVM87h2*VAA^9&rk~y$MBoCWyNHPx=<;6?c3$;Yx zw^;88O39w=tHo;=C=pmU)ruHCe)D01a-F!r0_F7#l(#TgZDgR_+8mU^v36xQino}2 zTD+NI@wQen**Uh0yHHRU?-1`4?-K78?-B2%Vex)(hqzOG0QhadZwLMk;8B#h3;4TD zLH!=!?*;xo;P2loK4>v(@lk%CxZ9+X=+XjyhYiVH1_Js~i%vdu6qNr0D4AnRd>#0m zHYk~AOMF}C!Ct^WV0>%7Atc+{bN->od|M()Vh`4ep8)^RVM6kA(eiGI=-mSTVTLYr zZvp>E3y^%(uIvZ#mlg$Y@i*~zCU~Rt`Xt+;h&${h9{VB@;CDAj&5|fN5z&pLX2~VF zfqxwMCs?anlaM8^q_ey&OUMmUZnU9Ntklk2J5pP=cAjpfcXp0WQZJ*QMN@;;qB}Jra;BmEo3_Py(Pl4YD{Aa*_ z4*VCue+m3o_0qy9AeUN7mt>k-qTXTP_ZwzZAn-pOCE-V&giB{LIHC$-JBTF|G}cQO z2n*N?cqHIxYG&^UNBg)6>2isgQ6w~@d{-->8RanD#L~4AGowh?G3y`m6HDtD7+Z1_ zYx`_mZIZTFNZibj_%lP|I)=nUI*6rPrTZ8XZNKw*ATtHMH8j?nIb06J*Z0!a* zlBDqkhQ$|wIBe4R3d7>7QZjo1aUx%`-Vuv_8z1jT?=mdz1>&xi@ORJQ2^7*t(x(iI zA0rlt%&@pm`V5Ey#M@k=5I0#e!q?{B%f>Az+hQ(qdbsK2ZUd8)Sdhc>4i;L|lJFayaYwu( z5s~Uh0CHTdBMAt)a}Ot?+L7u=LvT6zGNg7!q>A4#s`*F@EZnZ?L`Q}RN5>EbN9I62 zl(1~)7~#lgXdLOtc8qe2cH}t5IC33h9eIv%j`2Xc1L*;zCy*0>^a9cwNF0!OAlQ{e zAW54Y6QXFG!tLj}F`tQJrehY6WE+hs#yCT@JSHR!NdNz9hc~oxw8DSFO>&qX8?0}zEocNnO$ zk$#MG??cXgXqxC))e#r4Ki_vsE#`sC}U<@Eg1tzmFO(0W_%05S44tKo7 z0QE8u`)~{g+E&&(UMH8b7m#trqvjh*J~8%Gzw3CPtxH6Cey!sJAQKLgpM2u@%vzWG z*t(pE!iwVyQ&^eQOjyzB-p)guO}v?o{f-~3MfyEkq*GhVZnyL|r;~y5cgG)2&dEE8 zQ*ctJ=#-oeAk%@&05TH@@{0l>Cjlu0G8;${km7o$%L1iS5qwUS+vwC8C_^?|DK&lq zQo%qOJ_^bs4@&2;2uf!sAakOu!ih4^dS@4BSM~x@0%WfBj<7sKON~yqv$r!If$2mU zVP35hWd!swAC92o?Bnc<$a1DIL8lA_9cMo#k|V2XK_u^Rk5*;ZccRl0cbulUQ;CRl z_A>!p-VD%omJ!bJh)Cy1XSQ>cbF?$ZImVgm9P7+;jssE!Bm$%wNDYvMKo$W(*0%%* zvc6^Y&ip7MCp#Wyf{t@KL*&UeB3B@pjLJEu9fjn-0LfAY$$3DQ+mI}0kgSkKvKNq3 znEA|nM@V|?*{*ReVt~ZSG-{nVnQ)kZJlVN|0dhG5AY73ILF67vio#9+# z(nsfNMjx4P*=aDb=hQ=j@jU0142k@H?BM&Z;t?*npit#b#EOAZr;4>})VFnox?@KS^!UC$Ii7S(=mJaFeB zJ(@6U=Tpu-78svlV7vmsc&NZ78@?|&_cAcP?0m)fs`EAH>&`cvZ#v&{zU_Pm$W=hD z27*GvH9%1Ky$(n%kUAjifUK`~z8eMOhn9ob`6&bA^)?vMk8C-J$>yV2{1>qJBf}z! zLmO-?VsLQ_r}sst*(JC{#G(uBo*Qdj5)kve=s(}y?Q**?;-=2!VOXq3EK2K;NAo|n z#G~!1{H~yhL01gJ;1*^aL%?9P&LK^>t`4s52twB}u8yu_U7cLVxsG>rc6D)ebs?f| z0&+8uTYzi@f@|+KAh!eA24p*sJL+9MED*YSyW(6JQtV1(AiUEC;XOch0(pQ*jJuAa z@W`Xkbt0nBH5kZUQ53q+-L>8|jErF~Aa|p2fxRJf-eSXJlq-iJ5mnK9Yh9S;zQd!6 zu5qpj42k0z67NSOx+XH_yrTuGsK-8nF`0%*8MUkIdS|*$vS3-jVEG`DM%P5fr*|}? zs&#P+*RQUyDEV^4CE0YsH8mxWH*qeIxCpw-**n6r zqdnOdyDnw0yadSewJsE+UN}rxUgg4=8?<`4)-vt-MFy+u7_44u1}mLUuq(UXwb8=j z4GfE~w35lrag*yVhQ*s*x45>tZgt(}y4|(SwcT}x>rNoA0eKzB8$eJLehbLkK;8j@ z4w83)yjSnKJBr2oT|3wz1g>2Si|^Z5{0PWr>>L6hpC85IzktO(42#bK`M|~^I=$Ar zUgUPM7myDz$d$bz5);~XiX$X*B7p@El7UFAo)crx$SoT;1KFRou*zqx*Q{o&@^Jo6!Z z1>|cW-vId*$bKN-0r?)t4?s|KK&d5ZvzuDDbUQH&pc@P4aw~2xke_X2{)T}7su|5C z5D@557XqH!exweEHjUcu_J~b)2Oz&hvFS$p&w6(!X#{%#LEkyj6!wnjRHL)*?(Xi1 z=ydl0@_ViO1R#GL9y;Ce?j*#QI|13Zz#;o~CnNh7_?Fl=Z%2>0)7%40P`djgC;k?0^0L=YsSYg6mKJBJO#7!c4AZI_eh&c~V?S@+!& z+!H}?g5Y8uZY>tfJ=Hyfo$+31wk&*er@%* zu>Xz|*5b|E4Jz@*hy?bA*GAwI^Y~156HUV6q8hyIpcpT~Ft0Yi-|X+j=JEXv*K%0+ zwtkMVTT<=ODszYNZUA?=y8;9+2yEB3djUg&#^^#@`wABOCWV}E^q|n0_AhyOz`J$q zxqBhbHXeq6G}kVDse1*NxZb_YeX@JG`xFp-AOt`Ng3xBY+i-(>rTbJ6+JTS;!ekI| z?@psrKHaMgyyO7{e}Oi+)tPGT?6~}@q6BsqO?;U-hU}=!_(;QDB#mo3$Eq#npPVY# zaK_)^Re7ORW$ZsWCb^-?R=ReXRZrW0a)MoJJu*Y+-B-G=M?uPcmHTS|PH-dk{K+a100?K{ytKP9Piy!tpE?L+D)Z-hhYb>~?Q**Q0yAulq*#P41fk zkJ{+Z$VzVz;t-Df)gZ)!kN`p|!=-9n1jJ4TWOu0GhAuzue6n^!4K1viWL+yTjcw%` zURZ?ljdwL!_iAKkP6)FtU!yC+iz=unN>^1}4!Zm))s|qhH#Y1Qt ztpdC~W_GA5yBK$gmCh-}^JxpTSXNj@8Qy+_7bArZR5*PYCJI&MvAdWs6^ok)6;B9P z=CH$bqvd2q*UdfLj&<&P-S@fg2cauqz^`xuE+O{=oa)}?e$f4pw4Ys6RfUUxVPP5j z7^%d4Y=vbYbOWI~dIXj&i%U)J*Sk|(N^;`z-kp}E^iAvCsbAm3<;%^R1Kf|gAHy34 zCKZ;|gzDUnax3hzA7^EQ(6i-I();v{mSU%W+DhNcOdnXbEU|Ydv%chh>AgGkNlab7 z++O(4xu56EYfG^2*+a+HRI@Yd*mNB@Wpnznxa9OctkH=L*?I{_YjZZp&rpAc^n?( zcvR z-GXGM3CXs&5c>5&>?ie0W9uL_jje+|>4-~fHFCGXeo5b66^=|`FAk1<BbILV_h_TVY@gxF%30z!zbhxxc3qWl5rVL4k4R_oBewZSvb zGv8C@Dfd)(!XQiqVLAviK_~#B5QL%wAgZ!PbXvnSr!rK;^-D>&M)P14Ews|lFw?ik z8EBHe1spB4GR!hFm?%w7VHEQaFgnFbeo{mEDQRqeQxKXh<8-B!0cBof2dqIUsR-q` zl=PHCWH`ghfZ}m9Lux;4P+W?&ZW{L>3ZFAQ=e8*Rd(QV-m}@l`7Gowec4j#(+`(N6tg!o z%--VJ3IfWz;XlLdcF#_v+$hpC5@_7(-6)HoK+{Z`5jvxkv&r)Sg7ranz2{*B>!Y5> z7+4pu5jq7W84y;Olp8=;c>t1*}(l=xAo;R)Zi_G*LS@~%e zaY;>0vxrL?qfhBcC|uZe?6vYNG4n7ImXeNCg4NQ;B*V>fd|>5R){rAD35iQwvIW1C zWRvJMspAtX$MOUHXq=-_4N<&)?!n89t~2jV!%ayZ3^=a!d;2>AoCd6Xv*0aWs8mTU_$EtHxfi~xF*V&*)9A4$7$S-^4 zHn=`yRn}x(_Q`%ZAjil-ITnO9Ae;%pSs&rq5?aMXeon~aiv z!_U?eTT^A+Zo-mE>*!>>hVr0f8O6ocT@#UEHC0t8y+@B&ZY2LV(}MB3&4yB1YTxis zbQZ}%RsmsgeyR} z5`?R+mxs#3BG!Y zriNM9(Zx3X$$}Z)A2+q(`3&pRx+bLCIX%D0|QXHQWGsl%rj9bK@vxCl)h*%c9XV;;LD zGZ*hEt|~3EE^iI>w{o2%=dF_q<=Ju(29Qc7BUqWRy{RJ`lb{BK&HKKL*#F|l8oJvmi! z4YGbYA|q?t0>X`T@aVdDSdDeJ68FgE~L8y0jcuM`3y8bo(|uyk!D}+d#M# z1QZDF{kKVW=ZuHm`SjTrhgUs^jXX;}TRsOd*R+v&h1GLGxCeyWtqz`tY)eM6xvhZ{ z$rs6&alv)+#qwAgC9CZwlI~b1UoKxEBgF3n;VuyFHU{S7{nk^9*wp1B$O^QW;?fA- z*27lt0g4%!9K9JDZ`~bZ5?Kq4b@IA{Mz2m@&#gGVv7|dU>O~ zNv`Ks{7E`&q&XS~=SNjBbJB!^pW3L}BHw5+di%jG^46vgZkM+;eQ>9IH=`#wP!H6~ zIM}<`>Q8APNiC7Of`(s*R^iRnp(=}}+I8-bA3{5)yi0{;IH2oHns$a?u< z`4Rb1`7sb41>rRi_JQyjt1rFf5)V|AQC(eCI=iMi6gh}27H9+iEbn;pnq0gzb8cy6 z^X$D^&TifFeSrL$e5*hk(sJqp4K3X49T4_{@E!;s9q~a{x*j~p zO3#A_S&73Z3JN~&{*^&il97)peUuahMVj|P_yB|t&HU>437r}*-C6iO6PZ>i+Llq~ zn1)~R&Rn!RM<-waD`%iGNI4ONk3skZgiozmu=(+{q@=zL6Oz;~`q954%0=x#&r(J< zo0(DO%zS=eX2vMEv+a5%R~f71Su^tm2w#Hml|3^Pl!?kDWwJ5_gs(wBW$RlIz60UM zBR?~in2m66i`-z@GA(v zf$%#Be*oox@<0ht0Vv(1oW|`^&QMkgJ`VOE1Q)q z@+zPTP#N&pTPF4Xhl~a&{_b7(Hb3qBsQ9a(*nJOBuhrh$QPNem0aY6$UFA;Y-WDWX zE6qyG~x>HagMQtY(nT+y$PIm5SdyPG$Jlu3}A5(TWeek66RMQ806ckZv zm1ltlYnA7L#y=lOSC!Y4*MYVH+7@U#pzYTyZz^voZ!7Nr?Eo|$ z=wP5jSbhKBNruWt%BRSGl#i89fF1+1W1X^3`3&f>Ks&JkIbg|XNzyw)k|7F%HgLXG zeqx+%zw({(y*ya?5$JJ1j|bYBaXQ-NdgW*37v)#wH|2MrU4eE3+8t<5puJdQkCYXm zx$VG<@>YZGz+5$6*THPhtKbu_7if>a!uGsA zqu$>j;x+mh9YpW3-s2CRQ*Re@P7@kr3U7BWo^pM?w}-c<_XKOC6M-fHO^%MVH{P4z zP4p&tlY#aDngTQxXg{C>j^s#N-AijWxC5IF?hrP(89@8~rNPZYDa||FJHk5>C^F}C zp#9DKe^J`=qUmUzcdR$hI}YeTpo4&-*vDq!uSt8}Dce{lcRtW8pu>TV0GbUn=g7~@f@U*Q(`;szu$fs3bmU)} znNt{~S9lGeqkxV!vmTbT=RKWeJj08ObPUj3HVdsud)~9X=cDt?dye;9?|Fb{ed9sj zbiz9C1>Ot27Xh6F6bG@2jeRw0sWsd}ZjtwL)22_y{gcaQS@2UvBoeBQpyvQBLHMC@ z6>F_3@(Z+)f7@-)O7V48@e_|obW^i>Ol{G7y%!IJ-ss)ny}`TDyUAPc-R#}sy%FeS zpi_WO1v(Arbf7bUBEV;D^xo{f#k+s1V+=_|0`S`_3|Cp7&KszRTX!fvSXr(I)myC^; zd!XT+hs?G%cGv{`Deu!wgd^{>UX1Cf^*#r5PObL^py=;Kt8Hj;Wg*^0X$?~}qRIP; z_f>4;T&s-|Twc^1j`)o_D?b{?ep==Kb9JMRZcXVUt=0v;t^l zqe)$0PO3E?-+On}dVc^~j)OQeJ|QI;BPr(>loo|6tlxiOzyAs}-0b&18^V@5s1g+q zDB7qB-Wya=l~jl7R9&hY@CDn@& zCj(s$^c0{gfSv(#Rcj#qp8%$Mj15e5xT>8F7j%<1)I{&A>(wMRS?!~uq_7g`sX$KydO9L;Tzu21o)*uppU=ig$3?6+K|um4 z^@o_rf$E^9jT@p4WsO6TU`?%x-0`d?L|h$dkwCmUxZmP9GmxgKp*e&4B+p4q?U&fk-nyWUR&$!xJXW26dWD*&j#J00 z`9RMBimc@Vpck!IC#sXw$tq&&5};QDtpmEbX}e}x?K<~}+-Ge$j7=r1EL4tv8#5Ud zi3$es((?} zHLONZDo`uc1!@)0OMzYn^m07NPpwfGVn`ESu0XG1VDE@tk%GLO?EDD@S((`r#*Qz@ z&&tUfHX(a#Zo%lRsVybQnv$1+25mb*r)DKg%FfRonv*pii(zG$lutbwDW8fo=1P;j zuvKixdCcXAo|yx|o>p*BYFfXBXixPtb#==nK2S7q zT-#97MOIB#LoP*WPQ}r%>JH}S<6517Hy}jVYRL~3)l{J``p+75wR#w(^2q@#JRC|n+oS38u2;v>-> z#WNg7;#mlPoGpD|*l%HRT)3hP``aku)(qU~o0!HTeAz_Z%%<)ZpjbLe2JFdg)_~e{ zb-Ri_uV!FV?@{kn?*qC8@InoGi#Swq?QNB6I&53xymSbYTOO+asMsAG5INqe%% zq_qy1XVn*3Yo1e|S5c6-73l3ix35!QQeReI0eUCUJwQKhO0(Xy7UOLNI=|BK83^oiu=0typ&tFtJr@C8&y~oX|LhmTs zPZ3v%uGh#QbJs+~+)R;>Q#u<1C6**$Sb3<7d7%@`BJq0_`qqmxQIfLaa^gazq3Sus zONuILiWe5mFDWXUJEvmK;-zKt!$su@rduh#0t3PE#_oinHKiENgLaJKnxg6mmNmPk zB-)m_IMX=u|MLxr6we=oH;sfNi<6S$`$St;U078TsvcBWRo*ux&ctn;nIf_b+hI-fGlC8ImM9#t3&Z~kD~C<%i%wY!jCKz-hn8r zJ~RsR!j()R`#%N5XrGQ^u{F~CAHbp|6Mm|Ghf(tCKJ_#8bM*`LOZ6-DYxNuTTXjFs zyMW#e6kR6w0$x8w?+3aA=uV&y0NquuesAsiRex50QGew&s=woIbow9$8TZEnL+PVH zp9IRbqtmC4Zbv`z+tD={MJ7!F`cPD4(lp%itLd7Ly?{Op6on`DZlvou!fu?N1=8c?)s&V*T-oOFX=oa z-rAL}=Zvwd?yV(Y5!_2!JnjLe&*08atqYUZ@lJ+Wc8FX~sG_8LuAL)Q!#yPRT3@Z7 zmZqg^{j~wwKy8qAqBa=lvp~@@^gK`$=w1Z+63~}{qA-W8daYi|u+XVxX~VS<+(s>% zq4RYcoo@quALs`RogW@W=f8l?$qb!n5Wo%RrgorBXXu=v&D3V#T?zC}pl`8vJhL`k zCzCZa^qJ&HE7s;PbcTSwQ>&E#-FukmoUc_Nw1}>iHdiQae>UO*oU$FPYS z`FLeOchJD8y`jCSy`{YkNTx&)L22zm zeNee(2PIe$y5_B$;TjBrW$LT-%#3JnIk^=~fXY4kV3;kl;k*OfR?O@;O&i~2gDvn1WFjK^IrLa>>D4j=i^81S2WpZKWRT}zW`nlDXJi9>$Kmr-!%ld z4x$f4ztMG)H4c-k@wQLg?$bi|8V&8C$6%sqp*2TBci>3qIOBna5Fy>8`?$mnx~wa@ zS66jS$9BYk7z8mE#5N$d1+m=*GDZ*JF*v*QSTe@g3SxUap&||N^2x0XG{+or{8>PJ zqs>2^%syb;pSd9c4ZMJ zP)WGTtkSyr)f!K`EEeJ4s3>c+jze>temsaB(0+>%S9({yo8EmYJ3Iix$}37hJO(Ky zpNGD$!V>&`^2yn`!^c`y=Hb~nS*Ghw@2Q`FF1`Z}MlwWYTJyq`u;;|rh0`WKyu`QiJ>;hs}5W9icy-~aRo2}`~AFz>kGRG&< zxK+&5jV(bNQ+~q%9>dYZV|Q+lSxDTU7m|}dF+0n0RoHoln0fpEdEVUoku~Lo=%Xnt zw)QGjE~#SI?b-zmGYd*SoPzRj8t^va!m{WF8*7S&n+0@kJTW7(a2hB3t;HP+{_%TATuj>LiX_Ntnqe##+rFL@{=&=7|DzY zlrb6OM`umQ&K*%ODQi4)GT4d7n~5_`Up)gYb2N8in~!josyfAW8e3`ZoI3gBjQsqp z3BxibWaNw;Q7~-mm^=jB_=1eQyzF7be~^!a)jh)E#gjN~4QakavU{wj<4OMKB<%~g!nMnFt%#C7zA z`XYU?wjab)5K}l!w!XM&i1fQ6l-H{jI*gY1KdI7-n6o{|Mrg zTK#7br!}qm536d7Zy3;|>WWac>9GAvwfl$<&(vh+K}5&fC;9Lym0F(z#2K|d7l^Z( z)b8_Iwa+{_bSG31sw(*_p*ud^hdN5*nqz!zabJTk=!^BCih|NbA&9fr`P%u~`#OMF z1mYYJ=Q4u^3;Y;gQ(?L)7gt+Ho<;JD=3_D=Ks6}ATMtjGGF0nG2 z`PemA%?fUso>gEE)$zVAI8@s2$P8##m$0)ICT% zQ6gW)o$TxFi<^|2k6!Xnov$~ZIcAv@eF?s#1BE36Ubx;hN_c&!Eud1;o9!P@OG@k$ zhkrBsrlm^T0A`sF_imXvvJ^GaklmY+zENo2@@0cqQR^EGV%Qis6RTx< zo~3eGYO$R>&o_+=Zt{)ujrZmICio`$Ciy1&rue3UxB$c|5K)e+2C)Xjg&-~haWRNX zHgVm2Gq{buS-t|_NxnkgY_1!+iNvL7<`kEKcru8~K|BS-6=?DtIIT32RaRP3iXo;L zgkl8(SZD3oF7pB{*!XdFWHO$UfUztrLe}~L9p{q@t4a&mX?RVFu%##5Ibo&Dz_Tgv zu)Lz`nyS#$hRhi4)3^q6vpS3FXjU_>mZGXqb!d_`D-+E>D7+t-(lR{5vMdh66e@9Z zbya`!>)bFd8WT~|tbEM7KWj{3(a>;senx3kQey8Ud$?S!E%nUgg)6mt)k5g_HbHi5ZbM*&Nh`p-D+887Ya0+NY*~Ev-Q+g9j2Y2^AO8{z>Vur9yZcyO_-VGO%Oxhhz!QOrlEXcv z3;O<<7Cf~JJ3j?ufT|{RsSa08=@OpJ42}^W_y5?t52z@v{_+2J7k2ClY!g96u`7sl z?9vn!MG-|&5$S?}fW7V5dx^aR_FiHvvA5V_BgRD2OffN6?$bed5uZ6+s?64Wv$M+ zX2VAA{sArPwrbb0Q&{INJ)(N|8xU15V|aS{J5{Pyv$J<7zP8f4o_P)j#&{P$gPmhi zo2r{^`bG|qk55cw2{3m8QGR))F3r81)_b(@ zG*vKFG*w#9OlGFarYa`ANy|yRr3fYP;)P@FT)IUD^-=-}O^j3a8rGBZQXi>q{YX?; zR1TxVir*?URBhchzm2J?NvEv4eUMW@hd_3Eb_Ky9CVP{EvQ{Tbx0b9t6OdVI3Q#Is z{H}R&q2kFw?S!3F*fqRc_kNZ(%pjrBmj6sNXFJtAkqp~vLAMB+!7@K7OZ1Fj#3VA-$= z2C?`{UKizsy{IATiN?ZH_=zylRrC;%B9rG<#)+w7j#wd9i8W%K*edpjL*k4$C(bjG z&1G>#+!UXPFU9xb50#CovZ|WOUZqv(RqiSuRd-doDnpf{8m=0rGN~r1rl_W=W~t_= z=BXB_UQ=yRT~>XmdZ_wV^}Xtm>UY&s)ic#!YPH%{Evd_^8>ri>1J%LmFm*5W0QC^{ zQ1uA)SoJLRJoQrb7WGc`N%a}^E%gWL&(!zS57d9zs4ZPutt#4Q#1;L2(f`>PWzB1r zBbXfyI|meB`{Y0-ZoR_}hh1VK=~Mo)?rQcp9OMk1{p3D}*Bur*yy0-bytiB|YnHIX zlr>9b&9Y79&Z)y4-gG#k4p)A@qmObOdbzAw!3q3c^VNla-q$HTi|??1{tz+op@#qY zLy@_omG7Sa@X1~r)tNtOIaE1oIezh5aod|yau&Dim6;GX+9fX6#jmB8ze_~8F*1UM^ID6b+4yTf7V0ZJl)zX!EWU18pSi1xNH&jZwfUgXjRYr8a zSeaifmD%|J``Ouxp9Hk~$&wO&gRl5ChoW=iE&op*;OLV$xH*(|P|h&3x%-ruZEX?r z1#GQaTTysy*4k)owHmFYEvGH7tsrZ*$(rr5W{0fVDQkAgn%%Ny&t`2UEkC5Lt*W&Z z4FuQd*uCxJT%w#UpXJ-MrK!F$c~l?9Kxd9L50H(uYpcA#$m<+sCVQsqDG4Gr#Lveo zfC7Wk=(0D zSIUjGYgBqomL<58#MZ?(x%s&{WkP&qj~;7R+q(Bm{F~719EYWoHWy&yxAFwa!`|d)lh4sja20t##4X(bmTseh1Dod4Qsj@6pmnBD8a^f|q zmhu&2N8phunIpT!jYwrrqRfe|yj1+B@=PAjLh({mZfd$^Mg?W!I?KnHRgOu=S*qk? z#Y>u>ZtSmgB=d0gWM$S3Epwdnj8n(#xU7_tSFJG=uR%GjwcIf-^+=$$m6peOsjPVEDT)3;-Zvt##*M_$V@s5N3qt=CTUZ+c%e;}HJ9_Xsj}wn ze_V=dKiZ+%3~eTNqZ!7cY>pAilU|%9XD2d|A)6*?lr>jn&6V!<(w4GkWwYnJ)|YDq zL(NgsQI*GMJ8)XWv(C!%8Hocqp<%yfo#B6gWxRytVbz@7c8#Pe4u%@F>eg@6w0R33 zzgBHK1a%Ax?;aV|H)dd5VshHhVL2m4k2g)3URbVth048@Co}q*ALHo6tp4jOR;*;X z4%18dPP4NqR8HMq7KHf`S>?ph9Hy7~O4(a?TH6VV)#@on7s;dAcB(>Sb;o~EKsbv# z)nsw!XzP)Jow|?{ynj(f6lJ(pri^-#%$`!%py8`5%rcFYWtv3t{ZZJ=&HYtZ7$Dk( zvap9z=X!;nUf!?1V5@d4=xc9YkW=SZUC{rnI|Es;wX()GkwFnrh3(qE%EBxYs4UZ@ zFgPUiU#u*N1v@EiQm?Rcm#+U}!3-AcW?xXTVqrv&p0B!Gfbg5ma=q;HD;D{0wy$J{GlFn4~zym_wH6WW3W z3tii1v^W3h+J4SS^MB+oVoi(fH_%0w3}l-(UrDtb_L)!ZorJq+Bf2mN#aLkyv&1~H z*nCQ#Ctl|cv~n6>C~k>6;zRMN_}P3SZ_i15EtQL^zRF+KQ5B(zQuS30Pz~l}eu`?Q zYOZRbYN=|g>X7P`>MhkJ)iu>;oWwuj1m1>|cPDidwU^po-I|m55OuUVS)H!VQV&

v&m+4VU*1_S0r*FxhrBzPoijL?KI^$XOecZc8YeYta(S)+>|x%%9>mJ(yn%fcBXcg zGDPn^S@XWExvi|hP;@vzc#-jpzza&r%;Y&)j?t9w{E)bu(Y-RmGB|4GTfc`AjCoX5 zj5#jl+H__HSF_B2MJhj@lT`Fbpk>b4z&NJqRu1`kC63B9FWoDNziw$4X%}mkXqRf2 zag?%LyMpdNLc3bKrf(dN>vK&zBe}1+$Xfy^R)Te0yeet+6_dKNIzkMkldoNe3t8Q(d2EY(sI3W2~O60 zsFd(Q(JeFWW^S4FOD%pr-qP!~YPUUCFH4;$s6e}2>0-)6yTz3*e)GB4OOlb1nPIu9 zr`@gHW4SL`cIh%XEzs^&)}h?J{D)6PSi9DK?Gfc*{|)T{?LqA!?O`n^H=oHGuF-!X zYwpRKFJ;YF{6duW7`vYa+LQcncS~7wp8+tO?EGLluXK)@tV%hx>CR))=AS$>&zYI5 z^g@mxm7gGDdSc~CTk}KYsk~N3%trw;U`h$GO%rxizW`eGBAPQCg02 zB3pEx$t_t*H-9phdl$-07!F#MBR%tN32O~6X|E~0{j&CL?G-HtvR})Z2eRg&todex z_PX{4wW9ws#P>U;O5ZCLGEao81kCnXJiCf=F2TBsW~cA^+?)}KOj#dqIreYCr#i)r zU?y;7dq__oZ7qf4AIrHIl?h7WL1dOGI&@ZA%lw{o+?gdS?4Has-I%ZKY47lqx%oCQ zPk{IJ3h?yy@=j{uVR`Qp%f-7gPpNx)d-78e{3g}-S2!87X6p;>*GjhTX}{EdrM)j} zev&mm%bH(g&957@53~OyuJ{5Bh%gJF{eC9`g`N^E+ zLq%tF_5bNJY>zy%&HaVHt&F8C%emvLoc8_4Gt7TFJ+b<(X^>oom*r{jxhl)*C$qwOmSW3RSOC*EP?iVWIjBp1(O%zm^N-H*(Ey%q=>N z)MbSdJPjpJVq>wA(W849qp&(A=Yi%YXb7-~1)T^incc zQo@VxnX_sx{cmm}4G{4ngBwYc#7ePCToX6MJK|mOp13VO7GH}8;v4aZn@1W|6_uUJ zkz>xibNr8&G9;Z>23d&b3 zs8FHg44_iwQfB}&EWb>gSKi*qy-k;{QPD98$yuX|@?pIlR<&%N#29NboOQL7WYmjvSj|b*1x?Pq$Ib3s+Y;2IK*lRh-dEtspf%Sq7 zmnXRcQF4%KIsM^!3|DaYVb~WhBXMNL>@%gV;C%k8Yn3a1u@Z;MoO`o3dG*DPjkUJc zt^!A=f*LhSTFbd+sn)WduhnKPE|m)^)`_)y+wurXY6c@$T#^`q=Mo>6k&&6}GC0vC zNtptrrAx!oGniNh%jY!zr{72|dFrB}yGw9tg3IX4;S{GlFXfV(>5`Dh5QOYRm)w-p z9Lq}Ma$MpvTr!8}Dq&1|=&Z5i}pM}*e+jmtzy0*`1Z+^|%i5u&b*~D~BWT{HNu9+-VRlW}EC^POv zSZD1kdfJAACJr8zHs=Rn%!fES4+a(MTIf7=UOI1`kIq-;r}NhZ$P!oB?PQ6)go7-x zm(ag-t)+uw$_k^OtUJ_-QPjt;p<`zrw(l4)9kKw8DX`K?& zv;JkxET^K%*dgD4Q?ugX9aPNY-z=z%EGd1-{^hmdYm>1tMORj=T`N?_B>MTfj0=7e z7Z=bqF)ocm4f81oU-HpCi{B|aZ3)fJ99n#5!&-PB9Y2P>T^FtEtLvwW(e>92&<)hZ z>IUiJbc1Dyy|{}k)sdyTvg9gD^<=5OEH#j&hO*R1mKtx@C5Y3yBweyDMVG1@qD#}I z>xSx*WvK}#=Te|71<6vdEQQF@ce3=mTuvpI;~+CgskqjBI*}ANJU!QZXl=P`)Fd#G z{R%(6F_b}GsX6@Qt}=p;!K&6@?6uqqvYdcbD>^ST?{yil(698HE=7M(eyTDWi4*5s z#+fN2-@3-J|KhYvUvgi`{I>O!&o#^PIqTczL0SoA?>BI~XE{;gUWrn)(rg^{7foLj zp$r3K&Yz6u?o!a%T&$;0*3uK>%msuglRt40B!w}Bqf&>`%NS7LBQfIdF zoXqq@%Q3ssu>HDcC1!+WaF093jt9scih91%HF{;58{P7~b%lX8x~sCpkDgfvcj|8F z-sh@|u2A=m?xyZt-7VdFvc#^dlPrbFQfFD}B1>I2>2B-p=sw`zkGQ8Vh09VmS)v^N z<6GsHewi)O-qPbOx8luxo4tVLwN7j-+zaMKE}smryr#t8!mDYF(s*6?`ZC|NtV!z+ zPft+#Km>y!i+<3K-GzA&tDTLtPu$mi!{AQc*SZI~hqBaNmLg=S$9mnj;xvP+q@MI# z^PnmRB{LmzidJ8A(q?DfLV44?RdUZZcr=&nQsb?!ShDtuII&UptL``5@4CmjC$bbN zOXFl|hAeH8r9GyA_jS*7f9n3y3sFt4(yR40dRx6lFX_wa%j+wsJoJ?~|FO=ZQs!EU zGO&_k4(0Go8FQfY^`d8TpWg>n%P|j3C>|%s_eqBNCU((Pndd)mU*=t9J*9u@jHRvd zlpNX=pRLMLv@9jc5_|VvvNTqf#+b&-QqnDb6@68GHR@=mx7R!9wR)XiuQ!O(93@+i zF1s?GS~-XqShDFTdph>O#a~CtZzC#SnwHmDawvC9OFmAj%uUff$y#Q~d$JTOOTA?& zPL>j6Daz!}FM1RoY?Mi?rPPwU`^DF5%XE>2kL|L!TqvmPfNXI zDPEQaXWF$D%{gSx5s4z3f17jSo+9End2cR)84DWEN&HaW%V5ls@~)@wfS0|4{a_x` zPvk-URG!WgJPNzrUc=+D+xbi^OT@8ccSe&o7lD*AN_exBJO3ZgUkQ|##o98(5KEOh z>N~|yA#1-X(1(eMrC+dos*Ap>Wdu-}zEaW@WjCS%eYld1Mzq!|eV)W+4Ij)^d&?=L zn`Me?>nsq~E0UI7o;CCC5sc)^8J=T3icYY8*XeucmEXwL_tZz~d+DR}z4d+c(fYpn ze)3Oc3OQS5`=ru~#ZHbLJNR^SzY{hid7vE%u9G;rN;T6a4bzb_m@+?M>GC3ZD zt2sP<>1X)us?;3iDH6W*Uo3?mC*-)Tc-O>dTwg53Jeb}!!plL@)d2p8En~Z zmg`q=p_uKU%y+o*C0d|gsca)JeecC@#npO^7@=Rsw_?7^O;Wa+iC-^Dle@0KKKp)AdMAxR%7 zN%~O#k^W=-C$cnKmgdURd|6shlBCP(rAn>m&_AWV1IiA{ElSK+w&RqK%#&5a_>6g^ z(?4bAxo;}V*O9{`B`30GeNj>@^B4Tvo#SJJt+I1`qJOIYL;pFY2r%y&4gSimaU;7%^&mce;DtTo z3tOzAow8Fi1nSFk?|!zjQ`=UwQ`^i2%Xn?VE_>)~=wt{h*<5$a66aH8_i2XiY6 z{HJuhd9j1Jk)^ZS3>%AfNLvltD!8*l+Ntc2&RKUz?2IqV>Ql-t>FxjBCH=p! zOFE+Ll4u_0Vl^L57*5dTDg>#+6|(wGWtYT1CA*}z3>TDL5)E@9-*8cuUU8CE!xh7I z_AqLD!!@SClrFJ{sSu?ce4Th<7vtLA!&LeTkl{VU9m~$?wz6}&@(+tzs&JQUJcdtY zi60|gTWI(~R5RQ&e90|Nek*}N9z_%1mAVolOV?%Tn-?}}4F5$fwcVcDEg^M;_qs~~HP1mS58jMC`b)%!PhSACBY^-VI%D^32 z`aqUGl%0?>q(CMx$k=f5=>GN$y7t5w=tYvO28e7t_{^3N+*ufaYmTL@@rLXdh+^e|%Y6la>PR1_gE!Wst*>b=B zhtno&m+E2cW!_+ok;(@9@E?{ipI;gK8DlKtyvm$kanc%}R$%O}oM0&z_FsIH%azt^ zrm>cH%bXV&V~v9>8>4b5^jBH>zGP$EYu;5Dlen;HOg5$%Q;kE6X|nW#EIpE?A7$w$ zSz;1a>&92XvPq3GZ&KD5&6mjj`^|KMrOaPSZKiiBPc}|APBBh3P7~FP(<@Ih&M?kY z9oF=ySf2-n&l_h;OT`FjY2~q;adJI0TbVqQnG%N&&FD6K=wM|8s6(Rp?q}H-?c-Az zjmq!0Wt)HRoq4R4`}##!Dnl|jzc-)S+gX-X&gF}Xv#zD|i_aIA8LwPj`>p8ensJ_S zzA~1ucQ0kkr1d(F^$Od1;{xMCr9uDh124b&X6;yuj7zu|VB{3%alVmL9P^`1e{%!G zxRM(n##P4Evh-Az_z`LA^?u_zT-aAw7`nk3rcDGDH2aSh{=EE@_F&-7w)IDkCW8B~1 z2aBwC$t=^3(_*DwGv9BL%h^~qpA*KDF{R!tFrMP#U#S<&Q#u&WIBe@~U(UPi;1a1^ zz5jM9hmXrws933T$rv&o*s0;9jO22uQ`ePe#Y;Wl$T+T|IX>)p*wFGuPxB*(iP;PV zQ|^-}cRhKQJSr?K*j&}n)NJL!Cw}FKJY-WF^T1)t{Q|q9ne{B#;cBL+9N;K?N)Q+ZQmzT+KC`i*`( zkkpDfIh;+kO?6H6O^x1Z+pc;04uKqg(MZfjlbB&?w5X`CV9RB60x$cPGVs7M;|1Y+ z`33v?dwF(n^9=U&b@T8H>fja_5bEdVAL`}N!ONpXpr@Bd|FKFYmFGx(JjNG>GLgv3 zMibJer2{DF)VX+2p%P@*@Ia>4sA}S7RlT54U+)fHK|yYQ9>GCw0e&sK+=2o;0^K@z z`uesA4rmd|57Nbq<*`-oW-fjn-s6?!dqxJD?3gA)S>7u&)GHvUgTGsFa4*kTz=I?M(y$9v71FL24W;+*-x;U zKDU`Umi<7fU4f~F$;rg1z`uD0_;25!RflF2Z{w4_DL;RufELUU zWJwSul#aQm>3n!@*<8fN%0E%H!+&De?^*oAZW29LRo&dAehj8LuS038hA7^GSaIHML^KrGe# z5P()_iw+1zM|1|yXH|ZG4DN@EPvmJ{|~R z?})x&z4pXw|5ONv`XEjR;&IrE?}X4c0&T!UN<#at5V~?8e>x*5Lr3lyx+`?#PUi;d zsv}>zAcUYJ9^r`)T-FqN+Ck6qdY0w3xX?F;2U@@jt;Y zQ@oKy7aR6cwhj_3~BkMG>PU8fa zFbPvI4Kpwcb1)CvK^qv!S#>*jqaRqdI&D_{C~kvxsD2M$;cNT|a$o%!{$g`b!3N~Y zkz6}cmLvVtu_nl~V^cH(b#f$kj{azaP;>(Ia%8=Z{V@>K#W4}dNJS=y$&uVSQU^!s z;5Zj6u^Y6z2XPoja11AK3TN;>?%+dwjJu$2j$hzQ+{Xia19DQM5}KeJvOv4l zcoQsJgStC8BLIO2K}UpvzTiarI1K>p<3#&7Q70$rwf3+D=;9?n%z4ffDN54Hzq zM>wG-YNHNZF%W|=7zs#13Wi`PsDpD3Mqo6?VIruL^Hk7I&eX|y9;lBqxpQ6y+RS+k zsGl?SbKZol*nwT3-JFl%1ZcOK6+xUeiL)kg)+ElFX`rvy90S%{a{_MSQ+$ql_)3Uc ztmwQ^piT7Al5p>TE_(PRM!jb5r|-fA|K?TE@jrG%(|3W z_fH{QX+u}q(3LiHr43yNfp&1ET-RZsEnLr`5ah!37U=Kw$alTXpw9KEb3N)@?++pB z6JveKtWTNsDYHK9Tc0xOlZX1`p+0$N;E8tVfFOim1NP!|yn%y4G^`5RrXg+9ur})8 zV?4yS_#TghXhb=U$XTNZ^h7V@gZeh2zKy7FBkJ3jHg8OuH*N-Zcz{?Md&3w0Xo=Qn z3v$>v3VqNQF&KbY#33GuNJc8sK>ut^UK(EpF*YHmP5i*JP3TumR)Dr_assDu7H{Di z$ZL~3_z={y$z6PgFYqOP!ms!pPw@}Q5?rf5PMT%Z%XVMdo1D* zk3=LR71OX07eOAISA!2&w)rS51AV*sG0-l}X_w}-OYzu^r_}|@fp4V zZPEN^{0i#R{3)IZ;ZXw(L7hCPlLvM3V4WU*2tX@z26geEE*`Xn2l09kuLs+J2l@BN zMlMERDqh28Y{ho$#BS^b?cwnT4&pG5;5rI%6V$_ldU#L|59;ATJv^v~2leov9v)wE zxNL*E2nGG2#T@Jd%eMGM2u~g8Yo4@)XB)Ib2T%`B>fuQ}Jo|vWdeSDIw23Ee;+c+2 z3FK%G3PlP7iZ+ymC>xgQ5`4i|6(#O(Pw?%^wZ1NxNb5BO0CFBPi7 z74^{&jnNctXb$4{@`4X&3$L!|h6waTFZ4z<`k_AtVi0H}uZdWT(;#o&^j~k<*PCU% zsh{@(&@SG@?oB&*(+=MBEAO{(4b;Q?9lVS8a2p@sJ|5y*P#f}S6 ze5jL8Gq6q{4|sw$@CimZh}nmn`>-AO#DjM983NkCCj;X#3+s@N_1K6lApbtQuovXt z=OEq$ar+eFCT@X#x3Uc8?AM&9dz8cg+C$Mhcd7wOBmh=5h2tNa813$KB zzjg=&@%s_KAG!CV|M<~={K&f>dG{mlehDDIez_QlF`zDf6R{ffA3tLE+k@9}2*mDp z6vuG|cR;*;#Op`AeqV!}`;l|M@A0P){*~YY^6lRM^dEon?N8tFC)fV;8-IVaLR&a_>*9{>0!_zyOTHDiC|XDV)W5Tm<*s;4|C<+d;tB_!W=w2ma!;R}EX#fjh`|OJ5Ls%Qk3_Km>z2w4@F#iMu8Jq$PQ7 znS&7+3-a93gh^P4wRjx|a2VvcpxW(Rv1E zV;-nS>%~|K>eBioh`lwjx4wjHAm^=b;ugqt>-+cxPe7hq6KflC+(tqLR6-4~jkalx zb|A-XLeL3a&<#D%3w=PJX_E=!ZIg=;7zN^OL*Cm=1UYCk1=Bzs+K`VnXF)t|E5aR= z*OuklF2e!5gAefuKEoFv_icX#{iN+v{Asx~(oW6)SAzres17I8L`!r;S9Axlx9bgZ z-Yy0MK%Z$xj@wND{iNMw5NA93db_!p5Bf~I?VyjeBhT$F;4-d)KGKdnw|ftF@Dc9f zb3DN_kn8p;*noVuC*SQWgSgws-OiTkcl~1g5_9+ zHQ0pR*bDkahc|E#hw&CJ;%!_5{i6eMcX$MH8Axn_8k7g?3M95bavDf%fv#wP=Adr` z1|bw-=nDFBU=*T3UIWQ%U^;03z&vcl4iH-)u?146z%wAGKw=6ckAXKpJb|}B+Xp@n zB8Z#?RfQJhC&&@CPzUuuOhL`yhc+0DGz`TUu>K(WU(giH#B9vN0;~fu1)aiKoCn)Z z&=p(d^T(=sTUyfO>TP7R23|{@$6k=}f*m|0zTl6>LCX=|cQn>Y^dYahGOj0WbK% zAH?3J7t%m(y9`4vMuP3L3%Tw>uDeVIF?S*7UFKjth_efEb|KeYsCSp$*bDkhmjfX7 zF2vsD7*60rkl(K4v1J(lPR7?l$6Hd;<7h*A%g8mXt9m2_V_)!pN_-UNO+aRv+8@P#E_yqL# z@O$_QKjSgTfB0WQbhAY{P>*hv;R@pJM$FyFcQ@kg)*e9!1+jM{=57NKk3^(kC^C_a zTujCS5N|i)?Y14euowGr5O0E9cRPtQcpo2tzTb_wyM2l;K-}FP;2V68NBBvI?sjO7 zNDRjckdN-43lX749kfM9bVfM3BN}l?Kr)7a_#=ovVi;(L2-+cnIz-TiBIrXAb1)Co zBZ7VsLEI6<9YO9R&f^l^2KkR5{)oFE?-9fsLCzz71$mF4&yzmU!v-4YK%6~%LI3E{ z8to8>5RmU4^pzgnz=Az`Ar}w>KRoNv`G|k zM-4_IQb7DsIT(kDAkR@#LHtp~A2kOnuo~n)ssJ0Y8E0_=oKF621kKaJ- zz3C^tX|vuEs=*$$;EMWa1UGoV3qA-2eWf>X_D%!!>OBm(ppWz(gYh8ey(fb{-kUz& zI}htYoV|&&_g3t{F6_nYcmwqR-f!Y4h`%>^?&FNMAV+=3K_8aua~ThWh$i3B^pj{U z=qJ(DL7$Iq0%DJD4o`T)7eNR`7`mc6s82NYh#m{#jwbGC@*PdCqv;ANLf7*Hgc^hB@ z3FT1{#5f=n8tXt#2ObCQJ@7h+eIT(9yn~N$7qtCA`pdwd@l1$VVvMZ@d+0z+vCgQCI`BXn z^aOFnMk5Bq8%w;g#2cFo>K8i{SzsHAoq<`P&av~b5X2ly%(2Ts?qk=0xMPok+{Ti_ zL9BC72+}Yg^o>FE@j(wj-Ut1P$9O749Q`7Wei3H}Ees(3I49Hub%<+*=AeJX`G9=K zwL~8fdmQ~DE*@j6c98ot0+Al|rd z@dJoEj=1B9JMIrq&%tUKQ3K?Aa4opN6%EiBP2mpOU@-9y?hfJ{{2KP-ef%jzd|h_~ZBB7*660-oi!DhvM1(;(x&tJOgnjkn@Cc zsDMf!{seNJ&;;Z;p#{7VfL3UW_8|6z{uqW_jKmlaZ-NPvF%86>K->xQu>qSwyb0tx zVJC<;fqW+%z#$v~@h6`AOEiF_w50Bw{+e@WVggE)%gI0bT?bOD!f z1;m~7HE7FZ6>LF{lZiFC3hY44$;6yY%*oCm&SdhO>v zsq~Fh@|(H@%drY;k&go)-c;gECEirxO+AfsAm^!bs%;Re1FVhC{#A)iAcF%oM) z9f#b-UqYmj@3i`8gr;xIQyP9w)@pW<_TiTn6Xh;;f)x+91+o&2WP1u>^L0x_qP z?{w;zPM=BlLsxW14^Z#)C`2O$#GM|C!AJnHr_%=M1$Yarb7*CFqBn+PG4_JEhm!Z9 zCvh5=aTCNp^bS4(c^�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 na3DSC&p-w#le67lj0++d&qhpv4f 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 @@ -44,7 +44,7 @@ runnableDebuggingMode = "0"> @@ -61,7 +61,7 @@ runnableDebuggingMode = "0"> diff --git a/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e33adfe --- /dev/null +++ b/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcschemes/xcschememanagement.plist b/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d631b0f --- /dev/null +++ b/Box42.xcodeproj/xcuserdata/chan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Box42.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 6450C99629C1D5A3001D429E + + primary + + + + + diff --git a/Box42/Box/BoxBaseContainerViewController.swift b/Box42/Box/BoxBaseContainerViewController.swift deleted file mode 100644 index 538078f..0000000 --- a/Box42/Box/BoxBaseContainerViewController.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// BoxBaseContainerViewController.swift -// Box42 -// -// Created by Chan on 2023/03/17. -// - -import Cocoa -import SnapKit - -class BoxBaseContainerViewController: NSViewController { - var splitView: BoxBaseSplitView! = BoxBaseSplitView() - var contentGroup: BoxContentsViewGroup! = BoxContentsViewGroup() - var toolbarGroup: BoxToolbarViewGroup! = BoxToolbarViewGroup() - var functionGroupVC: BoxFunctionViewController! = BoxFunctionViewController() - var buttonGroup: BoxButtonViewGroup! - var leftContainer: MovableContainerView! - - override func loadView() { - self.view = NSView() - self.view.addSubview(splitView) - splitView.delegate = self - - buttonGroup = BoxButtonViewGroupInit() - - leftContainerInit() - viewInit() - } - - func BoxButtonViewGroupInit() -> BoxButtonViewGroup { - let buttonGroup = BoxButtonViewGroup { sender in - self.clickBtn(sender: sender) - } - return buttonGroup - } - - func clickBtn(sender: NSButton) { - guard let clickCount = NSApp.currentEvent?.clickCount else { return } - if clickCount == 2 { - WebViewManager.shared.list[sender.title]!.reload() - print("Dobule Click") - } else if clickCount > 2 { - if let currentURL = WebViewManager.shared.hostingWebView?.url { - NSWorkspace.shared.open(currentURL) - } - print("Triple Click") - } else if clickCount < 2 { - contentGroup.removeAllSubviews() - contentGroup.showWebviews(sender) - } - } - - private func leftContainerInit() { - leftContainer = MovableContainerView() - leftContainer.addSubview(buttonGroup) - leftContainer.addSubview(toolbarGroup) - leftContainer.addSubview(functionGroupVC.view) - leftContainerAutolayout() - leftContainer.frame.size.width = BoxSizeManager.shared.windowButtonGroupSize.width - } - - private func leftContainerAutolayout() { - toolbarGroup.snp.makeConstraints { make in - make.top.equalTo(leftContainer).offset(Constants.UI.GroupAutolayout) - make.right.equalTo(leftContainer).offset(-Constants.UI.GroupAutolayout) - make.left.equalTo(leftContainer) - } - - buttonGroup.snp.makeConstraints { make in - make.top.equalTo(toolbarGroup.snp.bottom).offset(Constants.UI.GroupAutolayout) - make.right.equalTo(leftContainer).offset(-Constants.UI.GroupAutolayout) - make.left.equalTo(leftContainer) - } - - functionGroupVC.view.snp.makeConstraints { make in - make.top.equalTo(buttonGroup.snp.bottom).offset(Constants.UI.GroupAutolayout) - make.right.equalTo(leftContainer).offset(-Constants.UI.GroupAutolayout) - make.left.bottom.equalTo(leftContainer) - } - } - - func viewInit() { - self.boxViewSizeInit() - - splitView.addArrangedSubview(leftContainer) - splitView.addArrangedSubview(contentGroup) - self.view.addSubview(splitView) - - splitView.snp.makeConstraints { make in - make.top.equalTo(self.view).offset(Constants.UI.GroupAutolayout) - make.left.equalTo(self.view).offset(Constants.UI.GroupAutolayout) - make.right.equalTo(self.view).offset(-Constants.UI.GroupAutolayout) - make.bottom.equalTo(self.view).offset(-Constants.UI.GroupAutolayout) - } - } - - func boxViewSizeInit() { - self.view.frame.size.width = BoxSizeManager.shared.size.width - self.view.frame.size.height = BoxSizeManager.shared.size.height - } -} - -extension BoxBaseContainerViewController: NSSplitViewDelegate { - func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { - - if dividerIndex == 0 { - return 132 - } - return proposedMinimumPosition - } - - func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { - if dividerIndex == 0 { - return 200 - } - return proposedMaximumPosition - } - - func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) { - let dividerThickness = splitView.dividerThickness - let newWidth = splitView.frame.width - dividerThickness - - let leftWidth = leftContainer.frame.width - let contentWidth = newWidth - leftWidth - - leftContainer.frame = NSRect(x: 0, y: 0, width: leftWidth, height: splitView.bounds.height) - contentGroup.frame = NSRect(x: leftWidth + dividerThickness, y: 0, width: contentWidth, height: splitView.bounds.height) - } -} diff --git a/Box42/Box/View/BoxBaseSplitView.swift b/Box42/Box/View/BoxBaseSplitView.swift deleted file mode 100644 index 3def6e3..0000000 --- a/Box42/Box/View/BoxBaseSplitView.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// BoxBaseSplitView.swift -// Box42 -// -// Created by Chanhee Kim on 8/19/23. -// - -import AppKit - -class BoxBaseSplitView: NSSplitView { - init() { - super.init(frame: .zero) - self.isVertical = true - self.dividerStyle = .thick - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Box42/Box/View/BoxButtonViewGroup.swift b/Box42/Box/View/BoxButtonViewGroup.swift deleted file mode 100644 index 44a2299..0000000 --- a/Box42/Box/View/BoxButtonViewGroup.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// BoxButtonView.swift -// Box42 -// -// Created by Chanhee Kim on 8/11/23. -// - -import Cocoa -import SnapKit - -class BoxButtonViewGroup: NSView { - var boxVM: WebViewModel! = WebViewModel() - var pinSwitch : NSSwitch = NSSwitch() - var clickAction: ((NSButton) -> Void)? - var lastAddedButton: NSView? - var loginInfo: NSView? - - init(clickAction: @escaping (NSButton) -> Void) { - self.clickAction = clickAction - super.init(frame: BoxSizeManager.shared.buttonGroupSizeNSRect) - setupButtons() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func draw(_ dirtyRect: NSRect) { - // 뷰의 μ»€μŠ€ν…€ λ Œλ”λ§μ— μ‚¬μš©λ¨. - } - - private func setupButtons() { - for subview in self.subviews { - subview.removeFromSuperview() - } - - for (name, _) in boxVM.webViewURL.URLstring { - self.createButton(name) - } - } - @objc private func clickBtn(sender: NSButton) { - clickAction?(sender) - } - - private func createButton(_ title: String) { - let button: NSButton - - if title == "home" { - button = NSButton(title: "home", image: NSImage(imageLiteralResourceName: "42box_logo"), target: self, action: #selector(clickBtn(sender:))) - button.imagePosition = .imageOnly - button.isBordered = false - } else { - button = HoverButton() - button.title = title - - button.wantsLayer = true - button.contentTintColor = NSColor.black - button.layer?.borderColor = NSColor.black.cgColor - button.layer?.borderWidth = 1.0 - button.layer?.cornerRadius = 5.0 - button.layer?.opacity = 0.7 - } - super.addSubview(button) - - button.target = self - button.action = #selector(clickBtn(sender:)) - - let fontSize: CGFloat = 16.0 - button.font = NSFont.systemFont(ofSize: fontSize) - button.setButtonType(.momentaryLight) - button.translatesAutoresizingMaskIntoConstraints = false - - button.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.leading.equalToSuperview().offset(10) - make.trailing.equalToSuperview().offset(-10) - - if title == "home" { - make.height.equalTo(50) - } else { - make.height.equalTo(50) - } - - if let lastButton = lastAddedButton { - make.top.equalTo(lastButton.snp.bottom).offset(10) - } else { - make.top.equalToSuperview().offset(10) - } - } - lastAddedButton = button - } -} diff --git a/Box42/Box/View/BoxContentsViewGroup.swift b/Box42/Box/View/BoxContentsViewGroup.swift deleted file mode 100644 index 215d0ce..0000000 --- a/Box42/Box/View/BoxContentsViewGroup.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// BoxContentsViewGroup.swift -// Box42 -// -// Created by Chanhee Kim on 8/13/23. -// - -import WebKit -import SnapKit - -class BoxContentsViewGroup: NSView { - var webVC: WebViewController? - var preferencesVC = PreferencesViewController() - - init() { - webVC = WebViewController(nibName: nil, bundle: nil) - - super.init(frame: NSRect(x: 0, y: 0, width: BoxSizeManager.shared.size.width - BoxSizeManager.shared.buttonGroupSize.width, height: BoxSizeManager.shared.buttonGroupSize.height)) - - self.frame.size.width = BoxSizeManager.shared.size.width - BoxSizeManager.shared.buttonGroupSize.width - self.frame.size.height = BoxSizeManager.shared.size.height - - self.wantsLayer = true - self.addSubview(webVC!.view) - - webVC?.view.translatesAutoresizingMaskIntoConstraints = false - webVC?.view.snp.makeConstraints { make in - make.edges.equalTo(self) - } - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func draw(_ dirtyRect: NSRect) { - super.draw(dirtyRect) - // Drawing code here. - } - - func removeAllSubviews() { - for subview in self.subviews { - subview.removeFromSuperview() - } - } - - func showPreferences() { - self.addSubview(preferencesVC.view) - preferencesVC.viewDidAppear() - } - - func showWebviews(_ sender: NSButton) { - guard let currentWebview = WebViewManager.shared.list[sender.title] else { - print("No WebView found for title: \(sender.title)") - return - } - - WebViewManager.shared.hostingname = sender.title - WebViewManager.shared.hostingWebView = currentWebview - - self.addSubview(currentWebview) - - currentWebview.snp.makeConstraints { make in - make.edges.equalTo(self) - } - - if currentWebview.url == nil { - print("WebView for \(sender.title) has no content loaded.") - } - - currentWebview.viewDidMoveToSuperview() - currentWebview.becomeFirstResponder() - } - -} diff --git a/Box42/CPU/CPU.swift b/Box42/CPU/CPU.swift new file mode 100644 index 0000000..35b4e66 --- /dev/null +++ b/Box42/CPU/CPU.swift @@ -0,0 +1,71 @@ +// +// CPU.swift +// Run42SeoulPackage2 +// +// Created by Chan on 2023/02/23. +// Copyright Β© 2023 Run42. All rights reserved. +// + +import Foundation + +public class CPU { + var cpuTimer: Timer? = nil + var isShow: Bool = false + var usage: (value: Double, description: String) = (0.0, "") + + private let loadInfoCount: mach_msg_type_number_t! + private var loadPrevious = host_cpu_load_info() + + init() { + loadInfoCount = mach_msg_type_number_t(MemoryLayout.size / MemoryLayout.size) + } + + private func hostCPULoadInfo() -> host_cpu_load_info { + var size: mach_msg_type_number_t = loadInfoCount + let hostInfo = host_cpu_load_info_t.allocate(capacity: 1) + let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { + return host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, $0, &size) + } + let data = hostInfo.move() + hostInfo.deallocate() + return data + } + + public func usageCPU() { + let load = hostCPULoadInfo() + let userDiff = Double(load.cpu_ticks.0 - loadPrevious.cpu_ticks.0) + let sysDiff = Double(load.cpu_ticks.1 - loadPrevious.cpu_ticks.1) + let idleDiff = Double(load.cpu_ticks.2 - loadPrevious.cpu_ticks.2) + let niceDiff = Double(load.cpu_ticks.3 - loadPrevious.cpu_ticks.3) + loadPrevious = load + + let totalTicks = sysDiff + userDiff + idleDiff + niceDiff + let sys = 100.0 * sysDiff / totalTicks + let user = 100.0 * userDiff / totalTicks + + let value: Double = round((sys + user) * 10.0) / 10.0 + let description: String = (value >= 100.0) ? "100↑%" : ((value < 10.0 ? " " : "") + String(value)) + "% " + + self.usage = (value, description) + } + + public func isShowUsage() -> Bool { + if isShow == false { return false } + return true + } + + public func processCPU(_ statusBar: StatusBar) -> Bool { + cpuTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true, block: { _ in + self.usageCPU() + statusBar.interval = 0.02 * (100 - max(0.0, min(99.0, self.usage.value))) / 6 + statusBar.statusItem.button?.title = self.isShowUsage() ? self.usage.description : "" + }) + self.cpuTimer?.fire() + return true + } + + public func StopCPU() -> Bool { + self.cpuTimer?.invalidate() + return false + } +} diff --git a/Box42/Extensions/Double.swift b/Box42/Extensions/Double.swift deleted file mode 100644 index c539a74..0000000 --- a/Box42/Extensions/Double.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Double.swift -// Box42 -// -// Created by Chanhee Kim on 8/16/23. -// - -extension Double { - var roundedToTwoDecimalPlaces: Double { - return (self * 100).rounded() / 100 - } -} diff --git a/Box42/Extensions/NSImage.swift b/Box42/Extensions/NSImage.swift deleted file mode 100644 index 602020e..0000000 --- a/Box42/Extensions/NSImage.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// NSImage.swift -// Box42 -// -// Created by Chanhee Kim on 8/19/23. -// - -import Cocoa - -extension NSImage { - func resized(to newSize: CGSize) -> NSImage? { - if let bitmapRepresentation = NSBitmapImageRep( - bitmapDataPlanes: nil, pixelsWide: Int(newSize.width), pixelsHigh: Int(newSize.height), - bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, - colorSpaceName: NSColorSpaceName.deviceRGB, bytesPerRow: 0, bitsPerPixel: 0) { - - bitmapRepresentation.size = newSize - NSGraphicsContext.saveGraphicsState() - NSGraphicsContext.current = NSGraphicsContext(bitmapImageRep: bitmapRepresentation) - self.draw(in: NSRect(x: 0, y: 0, width: newSize.width, height: newSize.height), from: .zero, operation: .copy, fraction: 1.0) - NSGraphicsContext.restoreGraphicsState() - - let resizedImage = NSImage(size: newSize) - resizedImage.addRepresentation(bitmapRepresentation) - return resizedImage - } - - return nil - } -} diff --git a/Box42/Extensions/NSScreen.swift b/Box42/Extensions/NSScreen.swift deleted file mode 100644 index 778e4fd..0000000 --- a/Box42/Extensions/NSScreen.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// NSScreen.swift -// Box42 -// -// Created by Chanhee Kim on 8/11/23. -// - -import Cocoa - -extension NSScreen { - static let screenSize = NSScreen.main?.visibleFrame.size - static let screenWidth = screenSize!.width - static let screenHeight = screenSize!.height - static let halfOfScreen = (x: screenWidth / 2, y: screenHeight / 2) - static let customScreenSize = (x: CGFloat(900), y: screenHeight - 132) -} diff --git a/Box42/Extensions/String.swift b/Box42/Extensions/String.swift deleted file mode 100644 index f04a1ed..0000000 --- a/Box42/Extensions/String.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// String.swift -// Box42 -// -// Created by Chanhee Kim on 7/8/23. -// - -import Foundation - -extension String { - var escapedForJavaScript: String { - let allowedCharacters = CharacterSet(charactersIn: "\"\\") - return self.unicodeScalars.map { char -> String in - if allowedCharacters.contains(char) { - return String(char) - } else { - return String(format: "\\u%04x", char.value) - } - }.joined() - } -} diff --git a/Box42/FunctionButton/BoxFunctionViewController.swift b/Box42/FunctionButton/BoxFunctionViewController.swift deleted file mode 100644 index a2a482e..0000000 --- a/Box42/FunctionButton/BoxFunctionViewController.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// FunctionButtonViewController.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import Cocoa - -class BoxFunctionViewController: NSViewController { - override func loadView() { - let functionViewGroup = BoxFunctionViewGroup() - - functionViewGroup.preferenceAction = preference - functionViewGroup.pinAction = pin - functionViewGroup.quitAction = quit - functionViewGroup.boxAction = box - - self.view = functionViewGroup - } - - override func viewDidLoad() { - super.viewDidLoad() - } - - func preference() { - print("preference") - } - - func pin() { - print("pin") - } - - func quit() { - print("quit") - NSApplication.shared.terminate(self) - } - - func box() { - print("box") - } -} diff --git a/Box42/FunctionButton/View/BoxFunctionButtonView.swift b/Box42/FunctionButton/View/BoxFunctionButtonView.swift deleted file mode 100644 index 01eb568..0000000 --- a/Box42/FunctionButton/View/BoxFunctionButtonView.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// BoxFunctionButtonView.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import AppKit - -class BoxFunctionButtonView: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(BoxFunction) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func BoxFunction() { - callback?() - } -} diff --git a/Box42/FunctionButton/View/BoxFunctionViewGroup.swift b/Box42/FunctionButton/View/BoxFunctionViewGroup.swift deleted file mode 100644 index 9e5fa88..0000000 --- a/Box42/FunctionButton/View/BoxFunctionViewGroup.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// BoxFunctionViewGroup.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import AppKit -import SnapKit - -class BoxFunctionViewGroup: NSView { - lazy var preferenceButton: PreferenceButtonView! = PreferenceButtonView(image: NSImage(imageLiteralResourceName: "plus"), completion: { self.preferenceAction?() }) - lazy var pinButton: PinButtonView! = PinButtonView(image: NSImage(imageLiteralResourceName: "pin"), completion: { self.pinAction?() }) - lazy var quitButton: QuitButtonView! = QuitButtonView(image: NSImage(imageLiteralResourceName: "figure.snowboarding"), completion: { self.quitAction?() }) - lazy var boxButton: BoxFunctionButtonView! = BoxFunctionButtonView(image: NSImage(imageLiteralResourceName: "shippingbox"), completion: { self.boxAction?() }) - lazy var divider: NSBox! = TopDivider(completion: { self.dividerAction?() }) - - var preferenceAction: (() -> Void)? - var pinAction: (() -> Void)? - var quitAction: (() -> Void)? - var boxAction: (() -> Void)? - var dividerAction: (() -> Void)? - - override init(frame: NSRect) { - super.init(frame: frame) - setupViews() - setupConstraints() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - setupViews() - setupConstraints() - } - - private func setupViews() { - self.addSubview(preferenceButton) - self.addSubview(pinButton) - self.addSubview(quitButton) - self.addSubview(boxButton) - self.addSubview(divider) - } - - private func setupConstraints() { - divider.snp.makeConstraints { make in - make.top.equalToSuperview() - make.left.right.equalToSuperview() - } - - preferenceButton.snp.makeConstraints { make in - make.top.equalTo(divider).offset(10) - make.bottom.equalToSuperview() - make.left.equalToSuperview() - make.width.equalTo(pinButton) - } - - pinButton.snp.makeConstraints { make in - make.top.bottom.equalTo(preferenceButton) - make.left.equalTo(preferenceButton.snp.right).offset(10) - make.width.equalTo(quitButton) - } - - quitButton.snp.makeConstraints { make in - make.top.bottom.equalTo(preferenceButton) - make.left.equalTo(pinButton.snp.right).offset(10) - make.width.equalTo(boxButton) - } - - boxButton.snp.makeConstraints { make in - make.top.bottom.equalTo(preferenceButton) - make.left.equalTo(quitButton.snp.right).offset(10) - make.right.equalToSuperview() - } - } -} diff --git a/Box42/FunctionButton/View/PinButtonView.swift b/Box42/FunctionButton/View/PinButtonView.swift deleted file mode 100644 index a91036b..0000000 --- a/Box42/FunctionButton/View/PinButtonView.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// PinButtonView.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import AppKit - -class PinButtonView: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(pin) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func pin() { - callback?() - } -} diff --git a/Box42/FunctionButton/View/PreferenceButtonView.swift b/Box42/FunctionButton/View/PreferenceButtonView.swift deleted file mode 100644 index ffc8102..0000000 --- a/Box42/FunctionButton/View/PreferenceButtonView.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// PreferenceButtonView.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import AppKit - -class PreferenceButtonView: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(preference) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func preference() { - callback?() - } -} diff --git a/Box42/FunctionButton/View/QuitButtonView.swift b/Box42/FunctionButton/View/QuitButtonView.swift deleted file mode 100644 index aaf9259..0000000 --- a/Box42/FunctionButton/View/QuitButtonView.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// QuitButtonView.swift -// Box42 -// -// Created by Chanhee Kim on 8/20/23. -// - -import AppKit - -class QuitButtonView: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(QuitButton) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func QuitButton() { - callback?() - } -} diff --git a/Box42/FunctionButton/View/TopDivider.swift b/Box42/FunctionButton/View/TopDivider.swift deleted file mode 100644 index 81a39de..0000000 --- a/Box42/FunctionButton/View/TopDivider.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// TopDivider.swift -// Box42 -// -// Created by Chanhee Kim on 8/21/23. -// - -import AppKit - -class TopDivider: NSBox { - - private var callback: (() -> Void)? - - init(completion: @escaping () -> Void) { - super.init(frame: .zero) - self.title = "" - self.boxType = .separator - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func preference() { - callback?() - } -} diff --git a/Box42/Login/LoginViewController.swift b/Box42/Login/LoginViewController.swift deleted file mode 100644 index 6020ea4..0000000 --- a/Box42/Login/LoginViewController.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// LoginViewController.swift -// Box42 -// -// Created by Chanhee Kim on 8/13/23. -// - -import Cocoa - -class LoginViewController: NSViewController { - var loginContainerView: NSView = { - let loginView = NSView() - loginView.translatesAutoresizingMaskIntoConstraints = false - loginView.wantsLayer = true - loginView.layer?.backgroundColor = NSColor.gray.cgColor - return loginView - }() - - override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) { - super.init(nibName: nil, bundle: nil) // μ—¬κΈ°μ—μ„œ nibName을 nil둜 전달 - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func loadView() { - self.view = NSView() // κΈ°λ³Έ λ·° μ„€μ • - } - - override func viewDidLoad() { - super.viewDidLoad() - // Do view setup here. - view.addSubview(loginContainerView) - - // loginContainerViewκ°€ λ·° 컨트둀러의 전체 λ·° μ˜μ—­μ„ μ°¨μ§€ν•˜λ„λ‘ μ œμ•½ μΆ”κ°€ - NSLayoutConstraint.activate([ - loginContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - loginContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - loginContainerView.topAnchor.constraint(equalTo: view.topAnchor), - loginContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) - } -} diff --git a/Box42/Main/BoxController.swift b/Box42/Main/BoxController.swift new file mode 100644 index 0000000..39babf2 --- /dev/null +++ b/Box42/Main/BoxController.swift @@ -0,0 +1,205 @@ +// +// BoxViewController.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Cocoa +import AppKit +import WebKit + +class BoxController: NSViewController, WKScriptMessageHandler, WKUIDelegate, WKNavigationDelegate { + var ad = NSApplication.shared.delegate as? AppDelegate + let url = URLModel() + var wvc = WebViewController() + var topAnchorDistance: CGFloat = 0 + + @IBOutlet var divider: NSBox! + @IBOutlet weak var boxView: NSView! + @IBOutlet weak var buttonViewGroup: NSView! + @IBOutlet weak var hostingViewGroup: NSView! + @IBOutlet var pinSwitch: NSSwitch! + + private var webView: WKWebView! + private var buttonBoxGroup: NSView! + + override func viewDidLoad() { + super.viewDidLoad() + buttonBoxGroupInit() + boxViewSizeInit() + webViewInit() + wvc.loadWebViewInit() + configureButton() + } + + func createButton(_ title :String) { + let button = NSButton() + + button.title = title + button.setButtonType(.momentaryLight) + + button.translatesAutoresizingMaskIntoConstraints = false + button.action = #selector(self.clickBtn(sender:)) + + button.isBordered = true + button.bezelStyle = .roundRect + button.showsBorderOnlyWhileMouseInside = true + + buttonBoxGroup.addSubview(button) + + button.leadingAnchor.constraint(equalTo: buttonBoxGroup.leadingAnchor, constant: 20).isActive = true + button.topAnchor.constraint(equalTo: buttonBoxGroup.topAnchor, constant: topAnchorDistance).isActive = true + topAnchorDistance += 30 + button.trailingAnchor.constraint(equalTo: buttonBoxGroup.trailingAnchor, constant: -20).isActive = true + } + + func createHomeButton() { + let button = NSButton(title: "home", image: NSImage(imageLiteralResourceName: "42box_logo"), target: (Any).self, action: #selector(self.clickBtn(sender:))) + button.translatesAutoresizingMaskIntoConstraints = false + button.isBordered = false + button.imagePosition = .imageOnly + + buttonBoxGroup.addSubview(button) + + button.leadingAnchor.constraint(equalTo: buttonBoxGroup.leadingAnchor, constant: 20).isActive = true + button.topAnchor.constraint(equalTo: buttonBoxGroup.topAnchor, constant: topAnchorDistance).isActive = true + topAnchorDistance += 80 + button.trailingAnchor.constraint(equalTo: buttonBoxGroup.trailingAnchor, constant: -20).isActive = true + } + + func createQuitButton() { + let button = NSButton() + button.title = "Quit Box" + button.setButtonType(.momentaryLight) + + button.translatesAutoresizingMaskIntoConstraints = false + button.action = #selector(NSApplication.terminate(_:)) + button.isBordered = true + button.bezelStyle = .roundRect + button.showsBorderOnlyWhileMouseInside = true + + buttonBoxGroup.addSubview(button) + + button.leadingAnchor.constraint(equalTo: buttonBoxGroup.leadingAnchor, constant: 20).isActive = true + button.bottomAnchor.constraint(equalTo: buttonBoxGroup.bottomAnchor, constant: -10).isActive = true + button.trailingAnchor.constraint(equalTo: buttonBoxGroup.trailingAnchor, constant: -20).isActive = true + } + + func divide() { + divider.translatesAutoresizingMaskIntoConstraints = false + divider.bottomAnchor.constraint(equalTo: buttonBoxGroup.bottomAnchor, constant: -40).isActive = true + } + + func createPinButton() { + let button = NSButton() + button.title = "Pin Box" + button.setButtonType(.toggle) + button.contentTintColor = .orange + button.translatesAutoresizingMaskIntoConstraints = false + button.action = #selector(self.pin) + button.isBordered = true + button.bezelStyle = .roundRect + button.showsBorderOnlyWhileMouseInside = true + + buttonBoxGroup.addSubview(button) + + button.leadingAnchor.constraint(equalTo: buttonBoxGroup.leadingAnchor, constant: 20).isActive = true + button.bottomAnchor.constraint(equalTo: buttonBoxGroup.bottomAnchor, constant: -50).isActive = true + button.trailingAnchor.constraint(equalTo: buttonBoxGroup.trailingAnchor, constant: -20).isActive = true + } + + func configureButton() { + createHomeButton() + for i in 1.. 2{ + let rqURL = URLRequest(url: URLModel().URLdict[sender.title]!) + WebViewList.shared.list[sender.title]!.load(rqURL) + print("Triple Click") + } else if clickCount < 2{ + webView.removeFromSuperview() + hostingViewGroup.addSubview(WebViewList.shared.list[sender.title]!) + setAutoLayout(from: WebViewList.shared.list[sender.title]!, to: hostingViewGroup) + } + } + + @objc + func pin(_ sender: NSSwitch) { + ad?.boxStatus.isPin.toggle() + print(sender.state) + } + + func boxViewSizeInit() { + boxView.frame.size.width = BoxViewSize().size.width + boxView.frame.size.height = BoxViewSize().size.height + + hostingViewGroup.frame.size.width = BoxViewSize().size.width - BoxViewSize().buttonGroupSize.width + hostingViewGroup.frame.size.height = BoxViewSize().size.height + + buttonViewGroup.frame.size.width = BoxViewSize().buttonGroupSize.width + buttonViewGroup.frame.size.height = BoxViewSize().buttonGroupSize.height + } + + func buttonBoxGroupInit() { + buttonBoxGroup = NSView(frame: NSRect(x: 0, y: 0, width: BoxViewSize().buttonGroupSize.width, height: BoxViewSize().buttonGroupSize.height)) + buttonBoxGroup.frame.size.width = BoxViewSize().buttonGroupSize.width + buttonBoxGroup.frame.size.height = BoxViewSize().buttonGroupSize.height + buttonViewGroup.addSubview(buttonBoxGroup) + + setAutoLayout(from: buttonBoxGroup, to: buttonViewGroup) + } + + func webViewInit() { + webView = wvc.addWebView() + hostingViewGroup.addSubview(webView) + setAutoLayout(from: webView, to: hostingViewGroup) + let request = URLRequest(url: url.URLdict["home"]!) + DispatchQueue.main.async { + self.webView.load(request) + } + } + + public func setAutoLayout(from: NSView, to: NSView) { + from.translatesAutoresizingMaskIntoConstraints = false + to.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.init(item: from, attribute: .leading, relatedBy: .equal, toItem: to, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint.init(item: from, attribute: .trailing, relatedBy: .equal, toItem: to, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint.init(item: from, attribute: .top, relatedBy: .equal, toItem: to, attribute: .top, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint.init(item: from, attribute: .bottom, relatedBy: .equal, toItem: to, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true + view.layout() + } + + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print(message.name) + } +} + +extension BoxController { + static func freshController() -> BoxController { + let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil) + let identifier = NSStoryboard.SceneIdentifier("BoxController") + + guard let viewcontroller = storyboard.instantiateController(withIdentifier: identifier) as? BoxController else { + fatalError("Story Board Not Found") + } + return viewcontroller + } +} diff --git a/Box42/Main/BoxModel.swift b/Box42/Main/BoxModel.swift new file mode 100644 index 0000000..9600b4b --- /dev/null +++ b/Box42/Main/BoxModel.swift @@ -0,0 +1,27 @@ +// +// BoxViewModel.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import WebKit + +public extension NSScreen { + static let screenSize = NSScreen.main?.visibleFrame.size + static let screenWidth = screenSize!.width + static let screenHeight = screenSize!.height + static let halfOfScreen = (x: screenWidth / 2, y: screenHeight / 2) + static let customScreenSize = (x: CGFloat(900), y: screenHeight - 132) +} + +public struct BoxViewSize { + var halfSize: (width: CGFloat, height: CGFloat) = (NSScreen.halfOfScreen.x, NSScreen.halfOfScreen.y) + var size: (width: CGFloat, height: CGFloat) = (NSScreen.customScreenSize.x, NSScreen.customScreenSize.y) + var buttonGroupSize: (width: CGFloat, height: CGFloat) = (CGFloat(132), NSScreen.customScreenSize.y) + var viewStack = [NSView()] +} + +public class BoxStatus { + var isPin: Bool = false +} diff --git a/Box42/Main/BoxView.swift b/Box42/Main/BoxView.swift new file mode 100644 index 0000000..4221953 --- /dev/null +++ b/Box42/Main/BoxView.swift @@ -0,0 +1,12 @@ +// +// BoxView.swift +// Box42 +// +// Created by Chan on 2023/03/17. +// + +import Cocoa + +class BoxView: NSView { + +} diff --git a/Box42/Main/BoxViewController.swift b/Box42/Main/BoxViewController.swift deleted file mode 100644 index a9692c8..0000000 --- a/Box42/Main/BoxViewController.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// BoxViewController.swift -// Box42 -// -// Created by Chan on 2023/03/16. -// - -import AppKit -import WebKit - -class BoxViewController: NSViewController { - var boxView: BoxBaseContainerViewController! = BoxBaseContainerViewController() - var gradientLayer: CAGradientLayer! - let preferencesVC = PreferencesViewController() - weak var menubarVCDelegate: MenubarViewControllerDelegate? - - - override func loadView() { - self.view = boxView.view - } - - override func viewDidLoad() { - super.viewDidLoad() - - menubarVCDelegate = (NSApplication.shared.delegate as? AppDelegate)?.menubarController - - self.view.wantsLayer = true - setupGradientLayer() - - NotificationCenter.default.addObserver(self, selector: #selector(boundsDidChange), name: NSWindow.didResizeNotification, object: self.view.window) - } - - func setupGradientLayer() { - gradientLayer = CAGradientLayer() - gradientLayer.frame = self.view.bounds - let startingColor = NSColor(red: 1.0, green: 0.804, blue: 0.0, alpha: 0.9).cgColor - let endingColor = NSColor(red: 1.0, green: 0.447, blue: 0.0, alpha: 0.7).cgColor - gradientLayer.colors = [startingColor, endingColor] - - self.view.layer?.addSublayer(gradientLayer) - } - - @objc func boundsDidChange(notification: NSNotification) { - if let window = notification.object as? NSWindow { - gradientLayer.frame = window.contentView!.bounds - } - } - - @objc - func doubleClickBtn(sender: NSButton) { - WebViewManager.shared.list[sender.title]!.reload() - } - - @objc - func pin(_ sender: NSSwitch) { - StateManager.shared.setToggleIsPin() - print(sender.state) - } - - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - print(message.name) - } -} diff --git a/Box42/Main/keyDown+BoxViewController.swift b/Box42/Main/keyDown+BoxViewController.swift deleted file mode 100644 index 63b89e2..0000000 --- a/Box42/Main/keyDown+BoxViewController.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// keyDown+BoxViewController.swift -// Box42 -// -// Created by Chanhee Kim on 8/21/23. -// - -import AppKit - -extension BoxViewController { - override func keyDown(with event: NSEvent) { - print(event.keyCode) - if event.keyCode == 1 { - StorageConfig.shared.setThreshold(.percentage50) - StorageConfig.shared.setPeriod(.period10s) - } - if event.keyCode == 2 { - // SdtorageConfig.shared.setThreshold(.percentage30) - DispatchQueue.main.async { - StorageConfig.shared.setThreshold(.percentage30) - } - StorageConfig.shared.setPeriod(.period1s) - } - - - if event.keyCode == 53 { // Escape ν‚€μ˜ keyCodeλŠ” 53μž…λ‹ˆλ‹€. - print("escape") - menubarVCDelegate?.toggleWindow(sender: nil) - } else { - super.keyDown(with: event) // 기타 ν‚€λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μƒμœ„ ν΄λž˜μŠ€μ—κ²Œ 전달 - } - } -} diff --git a/Box42/Menubar/MenubarController.swift b/Box42/Menubar/MenubarController.swift new file mode 100644 index 0000000..2287c9d --- /dev/null +++ b/Box42/Menubar/MenubarController.swift @@ -0,0 +1,39 @@ +// +// MenubarController.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Foundation + +import AppKit + +class MenuBarController: NSWorkspace { + let cpu = CPU() + let statusBar = StatusBar() + let menuBarView = MenuBarView() + + func buttonInit() { + menuBarView.imageInit("box", statusBar) + menuBarView.buttonAppear(statusBar) + } + + func startRunning() { + statusBar.isRunning = cpu.processCPU(statusBar) + animate() + } + + func stopRunning() { + statusBar.isRunning = cpu.StopCPU() + } + + func animate() { + statusBar.statusItem.button?.image = statusBar.frames[statusBar.cnt] + statusBar.cnt = (statusBar.cnt + 1) % statusBar.frames.count + if !statusBar.isRunning { return } + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + statusBar.interval) { + self.animate() + } + } +} diff --git a/Box42/Menubar/MenubarModel.swift b/Box42/Menubar/MenubarModel.swift index 24a9a73..2daec9a 100644 --- a/Box42/Menubar/MenubarModel.swift +++ b/Box42/Menubar/MenubarModel.swift @@ -7,22 +7,13 @@ import AppKit -class StatusBar { - static let shared = StatusBar() - - var statusItem: NSStatusItem - var frames: [NSImage] - var cnt: Int - var isRunning: Bool - var interval: Double - var alertCount: Int - - init() { - self.statusItem = NSStatusItem() - self.frames = [NSImage]() - self.cnt = 0 - self.isRunning = false - self.interval = 1.0 - self.alertCount = 0 - } +public class StatusBar { + var statusItem = NSStatusItem() + var frames = [NSImage]() + var cnt: Int = 0 + var isRunning: Bool = false + var interval: Double = 1.0 + var alertCount: Int = 0 } + + diff --git a/Box42/Menubar/MenubarView.swift b/Box42/Menubar/MenubarView.swift new file mode 100644 index 0000000..e204aab --- /dev/null +++ b/Box42/Menubar/MenubarView.swift @@ -0,0 +1,31 @@ +// +// MenubarView.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Foundation +import AppKit + +class MenuBarView { + + func buttonAppear(_ statusBar: StatusBar) { + let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + + statusBar.statusItem = statusItem + } + + func imageInit(_ imgName: String, _ statusBar: StatusBar) { + switch imgName { + case "cat": for i in (0...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "cat_page\(i)"))} + case "gon": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gon_\(i)"))} + case "gun": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gun_\(i)"))} + case "lee": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "lee_\(i)"))} + case "gam": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gam_\(i)"))} + case "box": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_\(i)"))} + case "box_oc": for i in (1...2) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_oc\(i)"))} + default : for i in (1...11) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42flip_0\(i)"))} + } + } +} diff --git a/Box42/Menubar/MenubarViewController.swift b/Box42/Menubar/MenubarViewController.swift deleted file mode 100644 index 2cb1a3f..0000000 --- a/Box42/Menubar/MenubarViewController.swift +++ /dev/null @@ -1,133 +0,0 @@ -// -// MenubarController.swift -// Box42 -// -// Created by Chan on 2023/03/16. -// - -import Foundation -import AppKit - -class MenubarViewController: NSWorkspace { - var popover = NSPopover() - var statusBarVM = StatusBarViewModel() - lazy var eventMonitor: EventMonitor = self.setupEventMonitor() - var boxWindowController: BoxWindowController? - - func menubarViewControllerInit() { - self.buttonInit() - } - - func menubarViewControllerStart() { - self.menubarStartRunning() - self.buttonActionInit() - self.popoverCoentViewInit() - self.startEventMonitoring() - } - - func startEventMonitoring() { - eventMonitor.start() - } - - func stopEventMonitoring() { - eventMonitor.stop() - } - - func menubarStartRunning() { - statusBarVM.startRunning() - } - - func menubarStopRunning() { - statusBarVM.stopRunning() - } - - func buttonInit() { - buttonImageChange("Cat") - statusBarVM.statusButtonAppear() - } - - func buttonImageChange(_ img: String) { - statusBarVM.changeStatusBarIcon(img) - } - - func buttonActionInit() { - statusBarVM.statusBar.statusItem.button?.action = #selector(togglePopover(_:)) - statusBarVM.statusBar.statusItem.button?.target = self - } - - func popoverCoentViewInit() { - let boxViewController = BoxViewController(nibName: nil, bundle: nil) - popover.contentViewController = boxViewController - } - - func setupEventMonitor() -> EventMonitor { - return EventMonitor(mask: [.leftMouseDown, .rightMouseDown, .otherMouseDown]) { [weak self] event in - if let strongSelf = self, strongSelf.popover.isShown { - if StateManager.shared.getIsPin() == false && event?.buttonNumber != 2 { - strongSelf.closePopover(sender: event) - } - } else if let strongSelf = self, !strongSelf.popover.isShown { - if event?.buttonNumber == 2 { - strongSelf.popoverHandler(sender: event) - } - } - } - } - - @objc func togglePopover(_ sender: Any?) { - if popover.isShown { - closePopover(sender: sender) - } else { - popoverHandler(sender: sender) - } - } - - func popoverHandler(sender: Any?) { - if let event = sender as? NSEvent { - if event.type == .otherMouseDown { - self.toggleWindow(sender: sender) - } - } else if let button = statusBarVM.statusBar.statusItem.button { - popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) - } - } - - func closePopover(sender: Any?) { - popover.performClose(sender) - } -} - -extension MenubarViewController: MenubarViewControllerDelegate { - func toggleWindow(sender: Any?) { - StateManager.shared.setToggleIsShowWindow() - if StateManager.shared.getIsShowWindow() == false { - if let window = boxWindowController?.window { - if window.isVisible { - window.orderOut(sender) - print("hide") - } - } - } else { - if boxWindowController == nil { - boxWindowController = BoxWindowController(window: nil) - } - if let button = statusBarVM.statusBar.statusItem.button, - let window = boxWindowController?.window { - if StateManager.shared.getIsShowFirstWindow() == false { - let buttonFrame = button.window?.convertToScreen(button.frame) ?? NSZeroRect - let desiredPosition = NSPoint(x: buttonFrame.origin.x - (BoxSizeManager.shared.size.width / 2) - 10, y: buttonFrame.origin.y - window.frame.height) - - window.setFrameOrigin(desiredPosition) - StateManager.shared.setToggleIsShowFirstWindow() - } - window.level = .floating - } - boxWindowController?.showWindow(sender) - } - } - -} - -protocol MenubarViewControllerDelegate: AnyObject { - func toggleWindow(sender: Any?) -} diff --git a/Box42/Menubar/MenubarViewModel.swift b/Box42/Menubar/MenubarViewModel.swift deleted file mode 100644 index 7a7fb9e..0000000 --- a/Box42/Menubar/MenubarViewModel.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// MenubarViewModel.swift -// Box42 -// -// Created by Chanhee Kim on 8/8/23. -// - -import AppKit - -class StatusBarViewModel { - let cpu: CPU - let statusBar: StatusBar - private var currentAnimationWorkItem: DispatchWorkItem? - - init () { - self.statusBar = StatusBar.shared - self.cpu = CPU() - } - - func statusButtonAppear() { - statusBar.statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - } - - func changeStatusBarIcon(_ imgName: String) { - statusBar.frames.removeAll() - - switch imgName { - case "Cat": for i in (0...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "cat_page\(i)"))} - case "gon": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gon_\(i)"))} - case "gun": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gun_\(i)"))} - case "gam": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gam_\(i)"))} - case "lee": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "lee_\(i)"))} - case "Box": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_\(i)"))} - case "box_oc": for i in (1...2) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_oc\(i)"))} - default : for i in (1...11) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42flip_0\(i)"))} - } - } - - func startRunning() { - statusBar.isRunning = cpu.processCPU(statusBar) - scheduleAnimation() - } - - func animate() { - statusBar.statusItem.button?.image = statusBar.frames[statusBar.cnt] - statusBar.cnt = (statusBar.cnt + 1) % statusBar.frames.count - if !statusBar.isRunning { return } - - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + statusBar.interval) { - self.animate() - } - } - - func scheduleAnimation() { - currentAnimationWorkItem?.cancel() - - let workItem = DispatchWorkItem { [weak self] in - self?.statusBar.statusItem.button?.image = self?.statusBar.frames[self?.statusBar.cnt ?? 0] - self?.statusBar.cnt = ((self?.statusBar.cnt)! + 1) % (self?.statusBar.frames.count ?? 1) - - if self?.statusBar.isRunning ?? false { - self?.scheduleAnimation() - } - } - - currentAnimationWorkItem = workItem - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + statusBar.interval, execute: workItem) - } - - func stopRunning() { - statusBar.isRunning = cpu.StopCPU() - currentAnimationWorkItem?.cancel() - statusBar.cnt = 0 - } -} diff --git a/Box42/Preferences/Accessibility.swift b/Box42/Preferences/Accessibility.swift deleted file mode 100644 index 7121713..0000000 --- a/Box42/Preferences/Accessibility.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Accessibility.swift -// Box42 -// -// Created by Chanhee Kim on 8/8/23. -// - -import Cocoa - -func alertAccessibility() { - let alert = NSAlert() - alert.messageText = "Permission Required" - alert.informativeText = "Please allow accessibility permissions in System Preferences to enable this feature." - alert.addButton(withTitle: "Open System Preferences") - alert.addButton(withTitle: "Cancel") - let response = alert.runModal() - - if response == .alertFirstButtonReturn { - if let url = URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility") { - NSWorkspace.shared.open(url) - } - } -} diff --git a/Box42/Preferences/Hotkey.swift b/Box42/Preferences/Hotkey.swift deleted file mode 100644 index 64a71f1..0000000 --- a/Box42/Preferences/Hotkey.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// Hotkey.swift -// Box42 -// -// Created by Chanhee Kim on 7/8/23. -// - -import Foundation - -import Cocoa - -func hotkey() { - let eventMask: CGEventMask = (1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.keyUp.rawValue) - guard let eventTap = CGEvent.tapCreate(tap: .cghidEventTap, place: .headInsertEventTap, options: .defaultTap, eventsOfInterest: eventMask, callback: { (proxy, type, event, refcon) -> Unmanaged? in - if [.keyDown, .keyUp].contains(type) { - let flags = event.flags - let isCommandPressed = flags.contains(.maskCommand) - let isControlPressed = flags.contains(.maskControl) - let keyCode = event.getIntegerValueField(.keyboardEventKeycode) - - // keyCode 11 corresponds to the 'b' key - if isCommandPressed, isControlPressed, keyCode == 11 { - print("Command + Control + B pressed!") - } - } - - return Unmanaged.passRetained(event) - }, userInfo: nil) else { - print("Failed to create event tap") - return - } - - let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0) - CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes) - CGEvent.tapEnable(tap: eventTap, enable: true) - - CFRunLoopRun() -} diff --git a/Box42/Preferences/Icon.swift b/Box42/Preferences/Icon.swift deleted file mode 100644 index d256436..0000000 --- a/Box42/Preferences/Icon.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// Icon.swift -// Box42 -// -// Created by Chanhee Kim on 7/8/23. -// - -struct iconModel { - var icon: [String] = [ - "Cat", - "gam", - "gon", - "gun", - "lee", - "Box", - "box_oc", - "42" - ] -} diff --git a/Box42/Preferences/PreferencesView.swift b/Box42/Preferences/PreferencesView.swift deleted file mode 100644 index d2abcff..0000000 --- a/Box42/Preferences/PreferencesView.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// PreferencesView.swift -// Box42 -// -// Created by Chanhee Kim on 7/8/23. -// - -import Foundation - diff --git a/Box42/Preferences/PreferencesViewController.swift b/Box42/Preferences/PreferencesViewController.swift deleted file mode 100644 index 6604203..0000000 --- a/Box42/Preferences/PreferencesViewController.swift +++ /dev/null @@ -1,152 +0,0 @@ -// -// PreferencesViewController.swift -// Box42 -// -// Created by Chanhee Kim on 7/24/23. -// - -import Cocoa -import Foundation - -class PreferencesViewController: NSViewController { - let menubarVC = MenubarViewController() - private var stackView: NSStackView! - private var rightView: NSView! - private var outputView: NSTextView! - - override func loadView() { - self.view = NSView() - self.stackView = NSStackView() - self.stackView.orientation = .vertical - self.stackView.distribution = .fillEqually - self.stackView.spacing = 20 - self.view.addSubview(stackView) - stackView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - stackView.topAnchor.constraint(equalTo: self.view.topAnchor), - stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), - stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor) - ]) - - let leftView = NSView() - self.rightView = NSView() - self.stackView.addArrangedSubview(leftView) - self.stackView.addArrangedSubview(rightView) - - outputView = NSTextView() - outputView.translatesAutoresizingMaskIntoConstraints = false - rightView.addSubview(outputView) - - NSLayoutConstraint.activate([ - outputView.topAnchor.constraint(equalTo: rightView.topAnchor), - outputView.leadingAnchor.constraint(equalTo: rightView.leadingAnchor), - outputView.trailingAnchor.constraint(equalTo: rightView.trailingAnchor), - outputView.bottomAnchor.constraint(equalTo: rightView.bottomAnchor) - ]) - - - var stackBox: [NSView] = [] - - let icons = iconModel().icon - icons.forEach { (icon) in - stackBox.append(NSButton(title: "Change \(icon) Icon", target: self, action: #selector(changeIconButtonPressed))) - } - - let scripts = Scripts().info - scripts.forEach { (script) in - stackBox.append(NSButton(title: "\(script.name) Script: \(script.description)", target: self, action: #selector(scriptButtonPressed))) - - } - -// let scriptButton = NSButton(title: "Script", target: self, action: #selector(scriptButtonPressed)) - let appleScriptButton = NSButton(title: "Apple Script", target: self, action: #selector(scriptButtonPressed)) - let etcButton = NSButton(title: "Etc.", target: self, action: #selector(etcButtonPressed)) - -// stackBox.append(scriptButton) - stackBox.append(appleScriptButton) - stackBox.append(etcButton) - let buttonStackView = NSStackView(views: stackBox) - buttonStackView.orientation = .vertical - buttonStackView.distribution = .fillEqually - buttonStackView.spacing = 20 - leftView.addSubview(buttonStackView) - buttonStackView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - buttonStackView.topAnchor.constraint(equalTo: leftView.topAnchor), - buttonStackView.leadingAnchor.constraint(equalTo: leftView.leadingAnchor), - buttonStackView.trailingAnchor.constraint(equalTo: leftView.trailingAnchor), - buttonStackView.bottomAnchor.constraint(equalTo: leftView.bottomAnchor) - ]) - } - - @objc func changeIconButtonPressed(_ sender: NSButton) { - // Change the content of the right view for icon changing - let icon = sender.title.split(separator: " ").map{String($0)} - print(icon[1]) - menubarVC.menubarStopRunning() - menubarVC.buttonImageChange(icon[1]) - menubarVC.menubarStartRunning() - } - - @objc func scriptButtonPressed(_ sender: NSButton) { - let script = sender.title.split(separator: " ").map{String($0)} - if script[1] == "Script:" { - if let scriptPath = Bundle.main.path(forResource: script[0], ofType: "sh") { - let task = Process() - task.launchPath = "/bin/sh" - task.arguments = [scriptPath] - - let outputPipe = Pipe() - task.standardOutput = outputPipe - task.standardError = outputPipe - - - task.standardError = outputPipe - -// outputPipe.fileHandleForReading.readabilityHandler = { [weak self] fileHandle in -// if #available(OSX 10.15.4, *) { -// if let data = try? fileHandle.readToEnd(), let output = String(data: data, encoding: .utf8) { -// DispatchQueue.main.async { -// if let outputView = self?.outputView { -// outputView.string += "\(output)" -// } else { -// print("outputView is nil") -// } -// } -// } -// } else { -// // Fallback on earlier versions -// } -// } - - - task.launch() - task.waitUntilExit() - -// let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() -// let output = String(data: outputData, encoding: .utf8) ?? "" -// print("Output: \(output)") - } else { - print("Script not found") - } - } else if sender.title == "Apple Script" { - let appleScriptCode = "display dialog \"Hello, World!\"" - - if let appleScript = NSAppleScript(source: appleScriptCode) { - var errorDict: NSDictionary? = nil - appleScript.executeAndReturnError(&errorDict) - - if let error = errorDict { - print("Error: \(error)") - } - } - - } - } - - @objc func etcButtonPressed() { - // Change the content of the right view for etc. - } -} - diff --git a/Box42/Resources/AppDelegate.swift b/Box42/Resource/AppDelegate.swift similarity index 79% rename from Box42/Resources/AppDelegate.swift rename to Box42/Resource/AppDelegate.swift index 26df5dd..c1c6cbd 100644 --- a/Box42/Resources/AppDelegate.swift +++ b/Box42/Resource/AppDelegate.swift @@ -9,18 +9,59 @@ import Cocoa @main class AppDelegate: NSObject, NSApplicationDelegate { - var menubarController = MenubarViewController() - lazy var storage = Storage() - + let popover = NSPopover() + var eventMonitor: EventMonitor? + var menubarController = MenuBarController() + var boxController = BoxController() + var boxStatus = BoxStatus() + func applicationWillFinishLaunching(_ notification: Notification) { - menubarController.menubarViewControllerInit() + menubarController.buttonInit() } func applicationDidFinishLaunching(_ aNotification: Notification) { - menubarController.menubarViewControllerStart() -// alertAccessibility() -// hotkey() - storage.storageTimerEvent() + menubarController.startRunning() + buttonActionInit() + popoverHandler() + eventMonitorHandler() + } + + func popoverHandler() { + popover.contentViewController = BoxController.freshController() + } + + func buttonActionInit() { + menubarController.statusBar.statusItem.button?.action = #selector(togglePopover(_:)) + } + + func eventMonitorHandler() { + eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown]) { [weak self] event in + if let strongSelf = self, strongSelf.popover.isShown { + if self?.boxStatus.isPin == false { + strongSelf.closePopover(sender: event) + } + } + } + } + + @objc func togglePopover(_ sender: Any?) { + if popover.isShown { + closePopover(sender: sender) + } else { + showPopover(sender: sender) + } + } + + func showPopover(sender: Any?) { + if let button = menubarController.statusBar.statusItem.button { + popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) + } + eventMonitor?.start() + } + + func closePopover(sender: Any?) { + popover.performClose(sender) + eventMonitor?.stop() } func applicationWillTerminate(_ aNotification: Notification) { diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_1.imageset/42box_1.png b/Box42/Resource/Assets.xcassets/42box3/42box_1.imageset/42box_1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_1.imageset/42box_1.png rename to Box42/Resource/Assets.xcassets/42box3/42box_1.imageset/42box_1.png diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box3/42box_1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box3/42box_1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_2.imageset/42box_2.png b/Box42/Resource/Assets.xcassets/42box3/42box_2.imageset/42box_2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_2.imageset/42box_2.png rename to Box42/Resource/Assets.xcassets/42box3/42box_2.imageset/42box_2.png diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box3/42box_2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box3/42box_2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_3.imageset/42box_3.png b/Box42/Resource/Assets.xcassets/42box3/42box_3.imageset/42box_3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_3.imageset/42box_3.png rename to Box42/Resource/Assets.xcassets/42box3/42box_3.imageset/42box_3.png diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box3/42box_3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box3/42box_3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_4.imageset/42box_4.png b/Box42/Resource/Assets.xcassets/42box3/42box_4.imageset/42box_4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_4.imageset/42box_4.png rename to Box42/Resource/Assets.xcassets/42box3/42box_4.imageset/42box_4.png diff --git a/Box42/Resources/Assets.xcassets/42box3/42box_4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box3/42box_4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/42box_4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box3/42box_4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box3/Contents.json b/Box42/Resource/Assets.xcassets/42box3/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box3/Contents.json rename to Box42/Resource/Assets.xcassets/42box3/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box_logo 1.imageset/42box_logo.svg b/Box42/Resource/Assets.xcassets/42box_logo 1.imageset/42box_logo.svg similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_logo 1.imageset/42box_logo.svg rename to Box42/Resource/Assets.xcassets/42box_logo 1.imageset/42box_logo.svg diff --git a/Box42/Resources/Assets.xcassets/42box_logo 1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box_logo 1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_logo 1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box_logo 1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box_logo.imageset/42box_logo.png b/Box42/Resource/Assets.xcassets/42box_logo.imageset/42box_logo.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_logo.imageset/42box_logo.png rename to Box42/Resource/Assets.xcassets/42box_logo.imageset/42box_logo.png diff --git a/Box42/Resources/Assets.xcassets/42box_logo.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box_logo.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_logo.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box_logo.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box_oc1.imageset/42box_opend_black.png b/Box42/Resource/Assets.xcassets/42box_oc1.imageset/42box_opend_black.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_oc1.imageset/42box_opend_black.png rename to Box42/Resource/Assets.xcassets/42box_oc1.imageset/42box_opend_black.png diff --git a/Box42/Resources/Assets.xcassets/42box_oc1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box_oc1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_oc1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box_oc1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42box_oc2.imageset/42box_closed_black.png b/Box42/Resource/Assets.xcassets/42box_oc2.imageset/42box_closed_black.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_oc2.imageset/42box_closed_black.png rename to Box42/Resource/Assets.xcassets/42box_oc2.imageset/42box_closed_black.png diff --git a/Box42/Resources/Assets.xcassets/42box_oc2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42box_oc2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42box_oc2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42box_oc2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/42flip/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/42flip/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/42flip/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/42flip/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png b/Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png rename to Box42/Resource/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png b/Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png b/Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png b/Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png rename to Box42/Resource/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png b/Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png similarity index 100% rename from Box42/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png rename to Box42/Resource/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png diff --git a/Box42/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Box42/Resource/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/AccentColor.colorset/Contents.json rename to Box42/Resource/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/1024.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/1024.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/1024.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/1024.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/128.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/128.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/128.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/128.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/16.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/16.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/16.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/16.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/256.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/256.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/256.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/256.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/32.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/32.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/32.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/32.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/512.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/512.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/512.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/512.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/64.png b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/64.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/64.png rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/64.png diff --git a/Box42/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Box42/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Box42/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/AppIcons/Contents.json b/Box42/Resource/Assets.xcassets/AppIcons/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcons/Contents.json rename to Box42/Resource/Assets.xcassets/AppIcons/Contents.json diff --git a/Box42/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json b/Box42/Resource/Assets.xcassets/AppIcons/appstore.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/AppIcons/appstore.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png b/Box42/Resource/Assets.xcassets/AppIcons/appstore.imageset/appstore.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png rename to Box42/Resource/Assets.xcassets/AppIcons/appstore.imageset/appstore.png diff --git a/Box42/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json b/Box42/Resource/Assets.xcassets/AppIcons/playstore.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json rename to Box42/Resource/Assets.xcassets/AppIcons/playstore.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png b/Box42/Resource/Assets.xcassets/AppIcons/playstore.imageset/playstore.png similarity index 100% rename from Box42/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png rename to Box42/Resource/Assets.xcassets/AppIcons/playstore.imageset/playstore.png diff --git a/Box42/Resources/Assets.xcassets/Contents.json b/Box42/Resource/Assets.xcassets/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/Contents.json rename to Box42/Resource/Assets.xcassets/Contents.json diff --git a/Box42/Resources/Box42.entitlements b/Box42/Resource/Box42.entitlements similarity index 86% rename from Box42/Resources/Box42.entitlements rename to Box42/Resource/Box42.entitlements index aa078cb..40b639e 100644 --- a/Box42/Resources/Box42.entitlements +++ b/Box42/Resource/Box42.entitlements @@ -4,8 +4,6 @@ com.apple.security.app-sandbox - com.apple.security.automation.apple-events - com.apple.security.files.user-selected.read-only com.apple.security.network.client diff --git a/Box42/Resources/Box42.xcdatamodeld/.xccurrentversion b/Box42/Resource/Box42.xcdatamodeld/.xccurrentversion similarity index 100% rename from Box42/Resources/Box42.xcdatamodeld/.xccurrentversion rename to Box42/Resource/Box42.xcdatamodeld/.xccurrentversion diff --git a/Box42/Resource/Box42.xcdatamodeld/Box42.xcdatamodel/contents b/Box42/Resource/Box42.xcdatamodeld/Box42.xcdatamodel/contents new file mode 100644 index 0000000..e9aeffa --- /dev/null +++ b/Box42/Resource/Box42.xcdatamodeld/Box42.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Box42/System/EventMonitor.swift b/Box42/Resource/EventMonitor.swift similarity index 64% rename from Box42/System/EventMonitor.swift rename to Box42/Resource/EventMonitor.swift index ecc7f8d..5051c36 100644 --- a/Box42/System/EventMonitor.swift +++ b/Box42/Resource/EventMonitor.swift @@ -7,28 +7,26 @@ import Cocoa -class EventMonitor { +public class EventMonitor { private var monitor: Any? private let mask: NSEvent.EventTypeMask private let handler: (NSEvent?) -> Void - - init(monitor: Any? = nil, mask: NSEvent.EventTypeMask, handler: @escaping (NSEvent?) -> Void) { + + public init(monitor: Any? = nil, mask: NSEvent.EventTypeMask, handler: @escaping (NSEvent?) -> Void) { self.mask = mask self.handler = handler } - + deinit { stop() } - func start() { - print("EventMonitor: Starting") + public func start() { monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler) } - func stop() { + public func stop() { if monitor != nil { - print("EventMonitor: Stoping") NSEvent.removeMonitor(monitor!) monitor = nil } diff --git a/Box42/Resource/Info.plist b/Box42/Resource/Info.plist new file mode 100644 index 0000000..6a6654d --- /dev/null +++ b/Box42/Resource/Info.plist @@ -0,0 +1,11 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + diff --git a/Box42/Resource/Main.storyboard b/Box42/Resource/Main.storyboard new file mode 100644 index 0000000..0a27a60 --- /dev/null +++ b/Box42/Resource/Main.storyboard @@ -0,0 +1,227 @@ + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Box42/Resources/Assets.xcassets/Icons/Contents.json b/Box42/Resources/Assets.xcassets/Icons/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/Contents.json deleted file mode 100644 index e6da493..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "arrow.clockwise@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/arrow.clockwise@2x.png b/Box42/Resources/Assets.xcassets/Icons/arrow.clockwise.imageset/arrow.clockwise@2x.png deleted file mode 100644 index be10d0bdf05f8dcdd3fc35308000b79e2905d097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcmV-g1f~0lP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91BcKBS1ONa40RR91F8}}l0DVlZrT_o~#7RU!R9Fe^msyC7VHn3T#x|C0 z8DkmQqmZ&>Y^9kig_H|~Y#~>2As0eiC^wemiXx?y$XYWomd0B4HM<%jLdG6`|1;m) zJm))ezVDp#nR9MD^*hh=yvy@G=Y8Mrd*3gwQ8XDx_f^mg?net1z4rw|Jn)zkHC$fA z08{AS$%`=_{Q+)ze%dN(GF6ON2Cco3C!pWKZO>0jMNQ@-qn(0MunE1vzXLgu9*lY# z-2TyKo}QCTyg|F8Z9@0(r>2uolx1qdKwY5-3gI^#2ko1-&=@Ac3wQ{j(loS1e1l=Q z+OVUcAL#w!mv5#(32y==dd!s9YbyIN(d_9FUIe|v8Yij$PWeQ5pQJuk95yqWiS;lb zAc$t-C$xlQ@$#u_0fCaNvpOw=6=3((AN;FO;pr#nFW^K84TtT}$`ztFL$&c!Hnq;{ zz&)l;D`40%b)d}=UtcY6#_FWv-DX4y?FW3S6_CX!II-O5? zT5KXqQs|eoNgrx%nScke3zD|3t56~*z$UV^t~xVoj|o_X-8qFYYID-`Q$ov9=oi>z zj4xnmVC%Zd{l0#Y648?*nP017znAzeH-3<*rFF6uV~2Ax)tc(N;MTk(jX-6z-37DK z=o8pfN4-m=5<8V6A~0a4m0BkI4mpRfw`@*C$@DcNUpIEvO`T2M%&5DAP52D_lfrr&z$w+qBs@U%Yel>*+DXUFzeR*D#?~=U2~9P#LVanx}oEbvwQz*n;6pkS}Tik4s?lz`Vy4T gfB8QH4L$>Z0fK|Kq4O9|&j0`b07*qoM6N<$f**nGw*UYD diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/Contents.json deleted file mode 100644 index 4b93ed1..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "arrow.left@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/arrow.left@2x.png b/Box42/Resources/Assets.xcassets/Icons/arrow.left.imageset/arrow.left@2x.png deleted file mode 100644 index dd616af1f5c6826b7870cbe94f4db32f123b6b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm9!3HE<9_|SSQjEnx?oJHr&dIz4iKRw(ruq6Z zXaU(A42G$TlC0TWzSWdSpsEeBF~aK7_x1_ma6PZ!6K z2+qCJeYIU3C64P~_ZHfAZ+n>2rVU5j;=-nRT@SNs%2$~0v}VfM)}x}6TBkgT4ZG)+ zr0n|fckwd6?K_Xp%zkF~b@%x>#^-I$|35c#W^uk*@GMi~9JyT&IQAXr4xKt->0HCp z7o>V?kFR%mTff`uI8SSm$)0nD?nyhk6=u&!-n3pVtl*80_6fCTEm504Jc}?k+@rMd z`}WIf&*rR?tnf6vr}<>PJtugFe0+oK?AvZyV?J4CnVFzX$MNF6;7R@GOGJsNW_EdIdp>#y(~F4mO^3pL&z z5xiho$l!QZ&4cyqW8-YE?`)2{bECxs%ia^_oKb z7v&|glvJE5$*7vUbpDz?`Q#(7Yq#?~v)`A@RsF+Uo-0cib diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/Contents.json deleted file mode 100644 index 483e2db..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "arrow.right@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/arrow.right@2x.png b/Box42/Resources/Assets.xcassets/Icons/arrow.right.imageset/arrow.right@2x.png deleted file mode 100644 index f3362b8c3974b221da2e324d79b487f0626e1de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm9!3HE<9_|SSQjEnx?oJHr&dIz4iKRw(ruq6Z zXaU(A42G$TlC0TWzSWdSpsEeBF~aK7_xpt8rFE{-7) zoM)%+^kR0DX%BB^x#%Y7x<@NeBzLR8L5*8n+x9giB&+^lna5$*#Q%VC+Ck=xLb-cB z=&jAUqSku+JNM=dZAZ?YI`{71!_zV|&(!>UpO!Yc=up4mvN>)16`b|I5{%0X{;=ge z6fzRf&|>cWCO;>w!#Z8`D=&x2)KBrs7dpb-t~>7kIpx`WhSWDVzx<7C(Oq)1Z=qn- zRRt!`n*x)LD4IC)Ym`V%U1?p>G%3;BgImr)x@5KE6xGz=7t)=z8SQ!jJA%Gn=}tSf zYyykQ)YhsO%&kj~EnG1rSCP}>)rl$0uM}cdvcKy8Dfd~Zb;9m@nxeVfhXWYjJ^igJ zx>SJg=iO+g#S6B2r*(Z->U9jWX3w4RNNS7jli=%KmaJP}ZIGCM=I=Yl=tDdj-dua_ zmuK%}pF5%D#L0DX9@2vj5ENnX0!orlfVWa=)K>v?#Ttq($=9mo4W*s@3i; z+s9yKRipeyWZQ;C;c4AvH;wjf`!BITwp{kh4lDk~{U7*aLoy%#nILNeigr&|KbLh* G2~7YBh5MEO diff --git a/Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/Contents.json deleted file mode 100644 index 97e4fcf..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "doc.on.doc@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/doc.on.doc@2x.png b/Box42/Resources/Assets.xcassets/Icons/doc.on.doc.imageset/doc.on.doc@2x.png deleted file mode 100644 index 5a880b3a0033eb8c28d3e273eee5429edaee9b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmV+w1?u{VP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91F#rGn02daMUjP6Ee@R3^R9Fe^m|3V*WfaHnZBi>T z$R=zMy;6##%@a{X6a@thK9!mEBn9~pR8ZkV^$_%s(P)-fQnvx=rQyMc$R2#Dl!|N) z8$d!ci?THP{Z9M4t+UTL`|Q2Xxg8%|@ZaBBYp-v8|NV`7@8O|pGL`V#!6o333RS-( zb~P9UyDHQh8mT%k@rbUlvSz%Th5o$M+EUn9w!T%td)cjtV0b0UuYgYzTw zMW8gvP`9Hxn>(8Vo<={uV|4S4$3nf7;}v{|Hixyh_G|BM@y-pNpU|C$n}e^c`dt=y z3gt7P>pU(?@QA=*1N!g5uA(j>*dbO<16A{F zNtxYJlqJ|wu?L5XLz2!%rZ`*PI(i zf!OUQWB&@26Tl5%8~6bH0P2YKCHXv<0nP)DgT>%a(2%qby5#QxSAn=^HG&E*d${)& zSPDALO}80O9_2FdjY^Oy=pF#mGT%Ftw}QX49b$WN1-KeiAxC)QB)XjPMR25!8sfIK z0DPO(y^wMlXmF9-HDDe{BJ+)4dvfH;W3gxDeABU40UNTxPGWoQWDCw4!3)3x;9_t$ zxZes_fF$3e+ycH%jyC1B_#VvsUr|m2j)Wvv0vp;2lEgjpUYtIBC)vOa2`WD98VR1H zmC2)&MdVUkD%YX7k4adPGr>wA$uuV=bR|&E$dLs8p|!Kn+rAKlm=<+B3EG&4 zzh`lhb5XQQFV0>Gx}|iJWduAKf-XQ`66`{?^pk`vJA-bIoDZTe+#XZkMRP?PuXxfp zPq%3lNgaZphJ+*N&j!1!I)T8`z}jvV>I|_P?i<|_m$-jiiJ0<}HJ9uT>~+8)^UN(X z7YS<|fxe(B2mM9tV+tQ_3g;EbyXNap1>N$2F!Ct#?Uk}#k!NWtH zoqJ;srqf2ATkCE!;UW8``o4G_SQs*XI7otvAhI}+kzjsre0h)rZM*1Gz*n`6gCrO_ zZ%q9g?PK64!rOWWNzm`<*Cm1M0sev50)7KyGDw2{!?CvtWpCVOnh56!=2uZua374A z-(l@45{!SJj_z8cw}4|p_1JE3H>(o-F}TuSsNm|GIzpz|AzN%WxSLfM$$Bt7bI+&r zP1n`6J@fTi97uv$z~8#*$I&kI_d!>2PRsxjGSUAfqcoI$G8MMz6Zz@48C(R?6QYir zIAV7Kd$Fs;Rpo!V>w*7KTr7SX#`~DH#M8m)@)>v&_(kY9O)2>YZAhy(!^vU#00000 LNkvXXu0mjf*TPJ; diff --git a/Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/Contents.json deleted file mode 100644 index 849e448..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "ellipsis@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/ellipsis@2x.png b/Box42/Resources/Assets.xcassets/Icons/ellipsis.imageset/ellipsis@2x.png deleted file mode 100644 index e027e56412dc5da67a7faf1a845a0635d55048bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^szA)a!3HGj)|kBpQjEnx?oJHr&dIz4a$Hg)JkxxA z8MHvE7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%bu>H=msn**e9<;+*RfXYlgT^vI! z1m{k%_jU@DIJR}g!jo*qQ|y|XuLzjEn4ZD4(qBQZ*D*Vn&(eZLQsW0_jFx+}66c&l z7X{j<1(|&KKH<>Qf_K_K4!ytk+3tMp`T5o7cV0YEe`H7O0Y#sMyrvR|SDpBDK=X~W z{JV$DVMq1&=QJOibCBESfXXRVK3)$;gIy}=AEZU*ZWAkdnNk15HN&#Xz<0tGMM;s& z{f>!~Pm9VlN^4!=vRb$C#MMMrGnx3GhA(_q-xI&yA=$rh``^WUpX7=)pHAaF|ChzL z`%~*S=UeGICadqyQQMj-lE41t$}_7>k6&35*V}m5Zm!pwU7Y`RUtAx0`{I(kgWG4e zzbJP*Zo4O~Bi`*l-$#}9Udsckv;2D=aF+b~<{*6Kq~<~Kh>ty%ZOk_s{dY9FZ*bzi grti>xRJPcHeYTs0g%oS?Sx`WFy85}Sb4q9e01lL^;Q#;t diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/Contents.json deleted file mode 100644 index 99f8ebe..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "figure.skating@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/figure.skating@2x.png b/Box42/Resources/Assets.xcassets/Icons/figure.skating.imageset/figure.skating@2x.png deleted file mode 100644 index 1ddfa0f5d0e4fdc5b728177e6e5c2fbd05bbacdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1333 zcmV-51Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91C7=TU1ONa40RR91F#rGn00pQpO#lD{pGibPR9Fe^m}`iZMHI)^)eucX zlhyUoW@3aF)TI)Iq%tLX3os}wkj)DS`mI6)IcXV z4xhmhXb~yrQ&&NwLp}Wo5EKn8N?s=L3!dO@&@F`?9$QIOWKu7NJ`{ah@FiS$Qr%OM zlBq@B)X9vbg7zY(Z(~YQm$7{lvbPQy?t)&s>`{2aiFK9!eAw^k|L>}f6fLS#XLXWF{6Wo|?8LV9Q}T>n+6y+AmrC znC9y-PN6sTCWE_L0W@uI!Iea(HKw#V-k#Z;^BYkrNgE-~0+eZH=4OsFI% zpw6hhptW@oBzm(Sg4SF}&S7{Bbm&S>!9aLSod{`)t>`A!Fd7?7C-9tuev4!4K>ro! z1!{23KP(o`eG~igsfc^q3PO(RuOj6paPezQY z$7ff-PiyFUz?NIB`qP-8;@B=DLKp0t6Mr+#JU>An+B_LyZ<-ZgE$B3t^Z`}sTDSzR z^h0q1zJoFFFxb+QjtcAdwlZ&9NsR;rGt!NQZi+iV71qcjG`<2=js+=vp>PTT`Z zSW~G)JAo0kD`Bfq#6A_=m6<4JyGo~jnEqtAYU#Vu{uK1J%7{wDV952hG##$2M=>Al z543%*(OKxRYXeLN)hi>4uicnSd`T&Q*21fx=59-{aMD&aC4$wW`oVzq{6<@~s z@j_=-chK)jx_4AmR|XF-em zuFK~{Y=nJK85zAVeuqHg)<%vgxy9@(P1&F%s21_#NjvK?00;AihGaS0_Lw!IU80+# r659#yLCh}v6+f-Vj<6CMAWCik2kOHm^(~4k00000NkvXXu0mjfKUZ9v diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/Contents.json deleted file mode 100644 index f437f7e..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "figure.snowboarding@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/figure.snowboarding@2x.png b/Box42/Resources/Assets.xcassets/Icons/figure.snowboarding.imageset/figure.snowboarding@2x.png deleted file mode 100644 index d7972331cb9541497de78c2b7e97830fb679906c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91E1&}a1ONa40RR91CjbBd0IMvj`2YX}XGugsR9Fekn0cs=Ss2HE7>2Rs z;ud0Dw@?a0WQmZa8DvYAvTMR$l%niJNY?nzKm0SMhLAN`Q{s<%NA@*|Nh8bD*tgG@ zd)#x+J@0bfD?IhN?|Gi{oO7P{yw6#Fw^HuwNiT*P1o?0W{(y_{-N|Aiy6SKleH5gY zN*>QD*lK(1w&?|mNFxJrS{vc`7Q5HD=Zm#EH8x93f4F7|XcNF>?#d#{7 z7Qti3?p57Ey-to%X)*&QK~<+tssh~v+d#ocmcZzbrP4oo3E8!UrIIYcnvM%7D95`S zgY&$Oz7)=u*n9KT%5MmFUb zhJ&d;1QWqtBdB3gp~eg~9@3mb)$r>9T4+j-`w%P@NrPsLrY$SYzU&63)L01*-HJFp z>&)sUx4_SFoyXL*qE27rC0qb)k%^KuSbctXEAkDdJ$E)V0Qbd$QzJ{T8gwK0_E^lH zMHihZa0&F;ufQ+hUXto#(}ALXi{Ke}B{W!l{>|XdlCSeM7>`>Owy2I1PHqa-TxBI9Wucdk1#?*I_v78YA?Z*p(VeuXf;0UTbW1 z;W*?%Pq3s#r9SuTPk=nfSHC25(rFf5DKrN6O^iM2`5P5^QI#e3E_BB(13`hRQPyC4({_M5uw*;s zOO~#pW`CArD?-<)6)aiOpa!Gt2m3!M+B%G2BJp;@E=JEWw_)M$oEWX6bfOJA)A| zx`mK*KQR8@XO^7(k)9?)9%xI_#Uo0FQPBYo!>K5z5c?RMwPDu@Y4jC+n=_WaUN_C` zIZ&XFU?=~&1p1mM6|5G_3aAI)t7r$AX>wLGI|Q`d6oT}u_Xe6) nNObRb1-gu10qr)*`8OW`GFrqIvIRX%00000NkvXXu0mjf87n^L diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/Contents.json deleted file mode 100644 index faa8a6b..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "figure.surfing@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/figure.surfing@2x.png b/Box42/Resources/Assets.xcassets/Icons/figure.surfing.imageset/figure.surfing@2x.png deleted file mode 100644 index 3e6b0e9172603b167b50a3551a52b1d81239b6c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1570 zcmV+-2Hp9IP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91E}#Pd1ONa40RR91F8}}l0B`aQv;Y7Fj7da6RA>dwn0xG(Qyj;CsEFuF zl*X1QS!$N#x{%vgi8eI$bDPn$*+Pk_t+_2V%B7H*85=egnGJvB(p*NRNz%-^p^!>Z z!t2$3XC0@f-}8K*=le77?X~Be&-py(e9n2!?fY$LsIN|;y0_sgm;(F2|5~kx?shQX z_)vz|BypXAC;3H{e0<=w9+ev;JEQ{<0{1Ehy zYzs(_hYgXfP_pbCY)|cz;k=Ai97U(ir%_o)(sSXk$QF_-NL&Vg1VfSMzD1l8A4kq0 zvVxwEeHg?+lWk~(te`FH1tUz3{uq%h%!uxMY_G%F8D$@5*kaR1ai&OmzambFkBevy{0dHicxO70 z{Ke1>3}!nh_x4MmotZ=~&Pm`-R9IyK50x(_@fP$0_vKi}lQB>aq&4t6yaVp_b}Hyy z5@TR?lu%BZDD&eoOjJ z@GI3tRi;WBfTQQMIW8?A-x1ua-F@8S|AI=Y=ZL!(KL>erF2m;z_!>&9UL)>qF&hpk z5XqtVj06v@Mc_K9S@jBh5-sPQj&X3ddn%j;pMYCyO{z!W=g{KVnp)lMd<4nM!E3_O z-RAsM-h9lfp%V_CmYs7Poff0OJ$xc`fK&$Wz8~`qc@MljR5kD!)HrmHTK6<{qA=Zl!T&T-+O~1U{S!9)vtC!Ql!>k96W*<7xKOk1FJ;-Mc zZrQ;5P+^`{;P7moQ&esz#4j1-ZPSxDbjY+{=7q9>|H;cmh{uHRy_g;hn1$K|Z;*X7WP_xPgZbRPq zro%upCFR!U{yweN_p1aR+B%)YSoAD*J(&k$L(#N>I|}cEb8|dA3h_vhZB|!PdS>F`AbghC zMw34_vE5BR?p#uwpEYQIPI(LS^Lcs|`C;JP{i5leFa=&BpDxf7uzi{M-ABH(LIbYs z58wbe3H%9mDYOSiZU{Xa;qN;ADf-paQE`ll02b?nZLYSYfff>*nipY5! z*S&zeJ6K)hh#Gt&II3+SRZk30LI}bRJPxjh=5!Z@;T@k<&Wh&R$t@dz$1@NI^9p(Q zXHVc%j;^Er8eEwcR>`{n%cvhOT@OPctP2`RfBIX{Lh44n z1K>n(f%gJCS5zx;yh!KtGZw9&te+z)Z$uT?nV#U+aIs5g=+K1cifgD1tb<+p2OM+? U#-r7d`2YX_07*qoM6N<$f(KU8s{jB1 diff --git a/Box42/Resources/Assets.xcassets/Icons/minus.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/minus.imageset/Contents.json deleted file mode 100644 index c437350..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/minus.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "minus@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/minus.imageset/minus@2x.png b/Box42/Resources/Assets.xcassets/Icons/minus.imageset/minus@2x.png deleted file mode 100644 index 2a101f6b805c60f296c058b60618d675879606f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-l!3HGXyW3s?QjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvPtFV9>&IajVm~s5IIgqmRba4#P z5KT@=NO-{hh(X~QYf@EHyu;}-W2R0~ha3<8*%ROVI>PcqLz(l!?32fNwtTb|n9Xb` fJvW!#^`I9+aTnVc(ZXx0AQL@Z{an^LB{Ts5$Hy>S diff --git a/Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/Contents.json deleted file mode 100644 index ff506bf..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "pin.fill@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/pin.fill@2x.png b/Box42/Resources/Assets.xcassets/Icons/pin.fill.imageset/pin.fill@2x.png deleted file mode 100644 index 164fbcfda65f9c2ef0c2a6736acf1d5de29f6cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmV-=1BLvFP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR919-spN1ONa40RR91F8}}l09F8|GXMYrpbGezFy}jL;yWLxx3>@?3&71ezd9(NC-2wlp37ab?u?;00gv4rFpIH|8 zOP?<=gnI-^<EiF3`%lP#bq&si)uPBHYM!sD0Go_K=VRy1#?>2v0mc2 z_8o$U@qp2Ps3&soCBC78QSH}&YlkjyloOBjWRCqjp#!3f589^zD}^|NpZJP>sN$A3 z$lOaFVFf!0eP;VIZ?&ydvYg`X1KgyzwsFpTEHQ<7oEKyG-MA(ZtPJHeHnJP%=a?FM zH;LD@9TaErBxy}5STEuO+@^d&j~)F2UZO|L;7^)eLy}32f)LWI{279Ai1#gSV8obQEekub?j=RMlC< zLDd5=x&gO-$bOhYWP$ww552DtSQN5C?RY~}SIkK5_+v4sC?#OcdycAD`586KdBnQC zmbsXlH#0Z))BP$>#1TenPu+Hb$5s0U=&`oKjlN=WKO0Gz9t&$G%s!J8%8LVhV*R|y zcdfQFDN`$o>X*PpMLN6|3nSJ+OK0pC@hU5*u-S5`bx7@nTHuHAYs*II7TN{BH?Ac@ z*(lvYdtixK4P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR919-spN1ONa40RR91F8}}l09F8|GXMYsL`g(JR9Fe^ms^NVQ546=Wn3CE zZl!T452BDr8I6aLNW2*o%8N(EliZ)=!Na5!MM?>UBBfm7$t@2qiQHaHNpdNk?{oH=v8yv(Zq?6uZj`@ha!XP>pdsjK@>(l5$86?-9Qi2S`Ze?ssKTm^qb z=830cp9KRnQ6o75Z@akrTY?t!S|(MhR{fC->>NseRSK8882jCkL!Zx@&9?5T>0Q*r zSkDbwao%ffMH3&)!yGp z7OVs>Y~fh+L1w$E$^`j_vI}eiUxU-fYKax6limh?$tcU0phTnlcQdD+P*KtnYoX3T zI1B1Ji95jm83fUJs47_!HyVSImRg?qg6caS5uBCAEQy`O$zx8hgs+L?N_I~ZdpTo5 ze<-g~9G5w1jYe%B(47r-h&?? zNa~K$63>RIC9pA0DZ^YPRel$BxHfPBB=+{u$bFIY$v`b{fs87mjux6rQrH`u`@rRR zGAZ#Ig0=(iJ}T#Ra1T5L@4zSU8>r-?z%(!iECLgO%O#8*Ks<@E4X@uYx3JfOhQ#P( zr#7S4a|$@udF+v(o9HI-z`fYRyG8ZPv4U__DDa*`AL0~xm%52Uzy_b}rLHgGj&bh^ zd^#N0Y+`GeC~%w$*OPJ%ZE%*7E(fcCqyuaOm2M!#Cx(YUiKZrWdV#gfRS!s#oV4Z5ed3-j_4gpI z2Vd%#H}QRA&eeDGCVoZYaH(IhhsdnzTFfgSSg4;#r}Gf}1unUl$)^gPz5oCK07*qo IM6N<$f{dfOf&c&j diff --git a/Box42/Resources/Assets.xcassets/Icons/plus.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/plus.imageset/Contents.json deleted file mode 100644 index ace344d..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/plus.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "plus@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/plus.imageset/plus@2x.png b/Box42/Resources/Assets.xcassets/Icons/plus.imageset/plus@2x.png deleted file mode 100644 index 3b9f6216ee1a78dfcbed2c3cbd99402d1d67b79c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZp6?&Um^whD2~C zCn(5AFl>!ud^Fo(j@vpzpC?%?uRb#+g{}CfP;_?T5yl*kX-bEzRbC3TtBt6RbokqM PApd!~`njxgN@xNA^=WS< diff --git a/Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/Contents.json b/Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/Contents.json deleted file mode 100644 index e79e1f2..0000000 --- a/Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "shippingbox@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/shippingbox@2x.png b/Box42/Resources/Assets.xcassets/Icons/shippingbox.imageset/shippingbox@2x.png deleted file mode 100644 index 9a0a5b3b044dc1c370cf0b1d103f45bdbae75c15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91C!hlW1ONa40RR91D*ylh0Q^4WJyFpR9Fe^n0ttoMHq)Q%XSqj z%A~YHx@l^KnnGYm*WL1hWmy|h(Pg#NFr_6GB#OMHB_^rh9~PFE3<@l}SXfHvAKAsq zjkMUx)?&MvyP|e`p6$#s=i76>J$tGB#~(a9Gw;kd^L{h$%r|E{c4!-&M>m&2PpE^B zVGA6F7OP{6pZxd1z9bL9upIr=U|R~S;m;iPO`2NjTz7h&0%PHrCPvvq{akpjiFS>u zo9kR>dbkrNKv#(M83j2BT;gJgwUvTSei<9n^38Fsl#VK(SE57XYaV1Oac%$)&w#;+PWDk=02|=%L|rJJNyeBg35HC%pY$161xGTrMoF4; zJ!m}@#z3;2yKo{D8b?EEJ01E#tSSogVN+}j`A#7drA6djl0|SKBpt)l!RJOpA27~- zgEZ}>@CiTb7^`ujw zyM`21Qa2m6gI|<;py9kSALMR)6h_0=U?e>jZilxrspT~NMdeH268lUp{e*EA_!2sn zrEr*L88e05q<6!3h?nz3$}{0rxB}ATjM?_eM57~=SHLykX7WWEDb2aicr%%i@Hluj z1@$Jg6jnkXh;=-L3E+&~2=O?^l`&;}AAr1yAIjT^3ghiLaEYFW_zQ3;<(J_xaHf2b z*Wp3v0zt-=Vc|yjCK%Jwc(;ZPk=8!colC~uI4l@4sZPh6NV9RZ2>c4=Tt4ivQa420 zFkgN*6~<#Zd=)i{9gE{?9c>D6Eb1yd7P2Y|EWAs*5RdT}Kzl)Pl{QYHF_+edOKCjD zakL^)PJ2FYU0XPpxAWFk9CfaxGkA37S~GK=N2)V)tIxIXpK$H3|K?RkzDyzSSEIdj z0RxwW!Hv1ip+I^Ytb%@#?f=LYGsqC6U z@HV6T-7-t(yawG0uR)OZvEY?wJcNhHwwVUfli%D0a9Y&sKJxd%2Axpee!b#&rP&2R zPO;bQjc{!+wleL>^H0JWxG3t&Z}So;g)Q2HbLQ1{xB+HD4FvTf>WP)Ft|aGL$S5M&UK0SCJuiXfkcP~pqCxlWB5?IrIlmch=*o|SFRnPvcc z`}JQBv8pL7gmO4PQ!#^dIJi`?YAGy-l@PB8#l~umb3SeRkuVKTheG8o*yG8#tts@O z<~kSpbt&%xXRA0E^Q7Cb&wDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)my*}XRCk|N+{VZWnf?u_H=O! ziQs%Y(^|*HQKYThmP^#pL&Rl`%a_$xE^y8L+7+&0$~CvmY0;G+B|(?P3zi8@Z3 zZQNnEL2pKDQmD-~@hxW$tZFeoBqrjhcSBn#Sjd{g?Thq3wl@b%YtpB(h&OY~X;kmq z{eyoa*S_0)cLM|rbPnn!X(CcUKR%w=Jxy(T!O?HbPpZ@Zzk3>z=kH_@s+T#tIlbdb%*sVC zYtAh6+5CE?^0cjK(+k!Ht0@Qu75Ui~UA*)}Xx$94s6*br%k`I6RmyA$+y1uc6jO$; z%*vfXuG((BTJbY4J%6&=!R&U-p{>VfH@SH9v>iU->OI+eN7AixmD!fRi=MTnTQC1) zJMaC+_-_t&p>;O{C3pMSuDcwNoO@o;#M6C(8oaZ?>4+%{*n_aBIQF{-Ea# zyA$jK1pKt$EVj=5`s&i6nX5C*udz8_)8+rte0Bq0YuJJGaM|1X8*eSU>!kg|?o@`n z0srl9o}t3L%nL4SEp4oo@G>>J{9xghtMQtr3s^Rm7tQxxcqDvL4=9; - - - \ No newline at end of file diff --git a/Box42/Resources/ExportOptions.plist b/Box42/Resources/ExportOptions.plist deleted file mode 100644 index 31694a6..0000000 --- a/Box42/Resources/ExportOptions.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - destination - export - method - development - signingStyle - automatic - teamID - QUAC995NAA - - diff --git a/Box42/Resources/Info.plist b/Box42/Resources/Info.plist deleted file mode 100644 index 1520f65..0000000 --- a/Box42/Resources/Info.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - LSUIElement - - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneClassName - - UISceneConfigurationName - - UISceneDelegateClassName - - UISceneStoryboardFile - - - - - - - diff --git a/Box42/Resources/Main.storyboard b/Box42/Resources/Main.storyboard deleted file mode 100644 index f542723..0000000 --- a/Box42/Resources/Main.storyboard +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Box42/Resources/sh/brewInGoinfre.sh b/Box42/Resources/sh/brewInGoinfre.sh deleted file mode 100644 index c97c200..0000000 --- a/Box42/Resources/sh/brewInGoinfre.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -#42Box: https://github.com/42Box -#Author: chanheki -#Date: 2023/08/10 - -# BOXY FOX -echo "" -echo "\033[38;5;208m Boxy Fox, Brew download in goinfre" -echo "" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–“β–“β–“β–“" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–ˆβ–ˆβ–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–’β–’β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–’β–’β–’β–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆβ–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘" -echo "" - -brew --version || echo "export PATH=/goinfre/.brew/bin:$PATH" >> ~/.zshrc && brew --version || git clone --depth=1 https://github.com/Homebrew/brew /goinfre/.brew && export PATH=/goinfre/.brew/bin:$PATH && brew update && ln -s /goinfre/.brew ~/.brew - -echo "Download Complete" diff --git a/Box42/Resources/sh/cleanCache.sh b/Box42/Resources/sh/cleanCache.sh deleted file mode 100755 index 4e0024f..0000000 --- a/Box42/Resources/sh/cleanCache.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash - -#42Box: https://github.com/42Box -#Author: chanheki -#Date: 2023/08/10 - -# BOXY FOX -echo "" -echo "\033[38;5;208m Boxy Fox Cleaning Cache" -echo "" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–“β–“β–“β–“" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–ˆβ–ˆβ–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–’β–’β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–’β–’β–’β–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆβ–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘" -echo "" - -# Command -RED="\033[31m" -GREEN="\033[32m" -YELLOW="\033[33m" -BLUE="\033[34m" -ORANGE="\033[38;5;208m" -# DELINE="\033[K" -# CURSUP="\033[A" -MAGENTA="\033[35m" -CYAN="\033[36m" -RESET="\033[0m" - -# Currently Size -Size=$(df -h ~ | grep ~ | awk '{print($2)}' | tr 'i' 'B') - -# Currently used capacity -Used=$(df -h ~ | grep ~ | awk '{print($3)}' | tr 'i' 'B') - -# Currently available capacity -Avail=$(df -h ~ | grep ~ | awk '{print($4)}' | tr 'i' 'B') -if [ "$Avail" == "0BB" ]; -then - Avail="0B" -fi - -echo "$CYAN Currently used capacity $Used/$Size $RESET\n" - -echo "$MAGENTA Clearing 🧹 cache ... $DELINE $RESET $CURSUP " - -# Trash -echo "$RED Clearing 🧹 trash can ...$DELINE $RESET $CURSUP " -rm -rf ~/.Trash/* &>/dev/null - -# 42 Caches -echo "$RED Clearing 🧹 42Cache ...$DELINE $RESET $CURSUP" -rm -rf ~/Library/*.42* &>/dev/null -rm -rf ~/*.42* &>/dev/null -rm -rf ~/.zcompdump* &>/dev/null -rm -rf ~/.cocoapods.42_cache_bak* &>/dev/null - -# General Caches -echo "$RED Clearing 🧹 Library ...$DELINE $RESET $CURSUP" -chmod -R 644 ~/Library/Caches/Homebrew &>/dev/null -rm -rf ~/Library/Caches/* &>/dev/null -rm -rf ~/Library/Application\ Support/Caches/* &>/dev/null - -echo "$RED Clearing 🧹 Slack ...$DELINE $RESET $CURSUP" -rm -rf ~/Library/Application\ Support/Slack/Service\ Worker/CacheAvail/* &>/dev/null -rm -rf ~/Library/Application\ Support/Slack/Cache/* &>/dev/null - -echo "$RED Clearing 🧹 Discord ...$DELINE $RESET $CURSUP" -rm -rf ~/Library/Application\ Support/discord/Cache/* &>/dev/null -rm -rf ~/Library/Application\ Support/discord/Code\ Cache/js* &>/dev/null -rm -rf ~/Library/Application\ Support/discord/Crashpad/completed/* &>/dev/null - -echo "$RED Clearing 🧹 VS Code ...$DELINE $RESET $CURSUP" -rm -rf ~/Library/Application\ Support/Code/Cache/* &>/dev/null -rm -rf ~/Library/Application\ Support/Code/CachedData/* &>/dev/null -rm -rf ~/Library/Application\ Support/Code/CachedExtensionVSIXs/* &>/dev/null -rm -rf ~/Library/Application\ Support/Code/Crashpad/completed/* &>/dev/null -rm -rf ~/Library/Application\ Support/Code/User/workspaceAvail/* &>/dev/null - -echo "$RED Clearing 🧹 Chrome ...$DELINE $RESET $CURSUP" -rm -rf ~/Library/Application\ Support/Google/Chrome/Profile\ [0-9]/Service\ Worker/CacheAvail/* &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Default/Service\ Worker/CacheAvail/* &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Profile\ [0-9]/Application\ Cache/* &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Default/Application\ Cache/* &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Crashpad/completed/* &>/dev/null -# tmp downloaded files with browsers -rm -rf ~/Library/Application\ Support/Chromium/Default/File\ System &>/dev/null -rm -rf ~/Library/Application\ Support/Chromium/Profile\ [0-9]/File\ System &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Default/File\ System &>/dev/null -rm -rf ~/Library/Application\ Support/Google/Chrome/Profile\ [0-9]/File\ System &>/dev/null - -# .DS_Store files -#echo "$RED Clearing 🧹 All .DS_Store ...$DELINE $RESET $CURSUP" -#find ~ -name .DS_Store -depth -exec rm {} \; &>/dev/null - -# Delete desktop -rm -rf ~/Desktop/Relocated Items &>/dev/null - -# Calculate usage after cleaning -Used=$(df -h ~ | grep ~ | awk '{print($3)}' | tr 'i' 'B') - -# Calculate usage after cleaning -Avail2=$(df -h ~ | grep ~ | awk '{print($4)}' | tr 'i' 'B') -if [ "$Avail2" == "0BB" ]; -then - Avail2="0B" -fi - -# Output the result -echo "\n$MAGENTA ✨ Complete Clearing cache ✨ $RESET \n" -echo "$GREEN Available/"$RED"Used/"$BLUE"Size "$GREEN"$Avail2/"$RED"$Used/"$BLUE"$Size $RESET\n" -echo "πŸ“¦: https://github.com/42Box" -echo "🦊: chanheki in 42Box" -echo "" diff --git a/Box42/Resources/sh/exportMacOSInfo.sh b/Box42/Resources/sh/exportMacOSInfo.sh deleted file mode 100644 index 32eed6b..0000000 --- a/Box42/Resources/sh/exportMacOSInfo.sh +++ /dev/null @@ -1 +0,0 @@ -defaults export -g ~/.mysettings.plist diff --git a/Box42/Resources/sh/importMacOSInfo.sh b/Box42/Resources/sh/importMacOSInfo.sh deleted file mode 100644 index 070f87a..0000000 --- a/Box42/Resources/sh/importMacOSInfo.sh +++ /dev/null @@ -1 +0,0 @@ -defaults -currentHost import ~/.mysettings.plist diff --git a/Box42/Resources/sh/keyMapping.sh b/Box42/Resources/sh/keyMapping.sh deleted file mode 100644 index 3d8010f..0000000 --- a/Box42/Resources/sh/keyMapping.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh - -# keyMapping.sh -# Box42 -# -# Created by Chanhee Kim on 8/13/23. -# - -mac_old=(0 0xff00000005 0xff00000004 0xff0100000010 0xff010004 0xff00000009 0xff00000008 0xc000000b4 0xc000000cd 0xc000000b3 0xc000000e2 0xc000000ea 0xc000000e9) -mac_new=(0 0xff00000005 0xff00000004 0xff0100000010 0xc00000221 0xc000000cf 0x10000009b 0xc000000b4 0xc000000cd 0xc000000b3 0xc000000e2 0xc000000ea 0xc000000e9) - -this_mac=(${mac_new[@]}) # change based on "old" or "new" mac / magic keyboard layout - -fn_keys=(0 0x70000003a 0x70000003b 0x70000003c 0x70000003d 0x70000003e 0x70000003f 0x700000040 0x700000041 0x700000042 0x700000043 0x700000044 0x700000045 0x700000068 0x700000069 0x70000006a 0x70000006b 0x70000006c 0x70000006d 0x70000006e) -fn_bri_dec=0xff0100000021 # or 0xc00000070 -fn_bri_inc=0xff0100000020 # or 0xc0000006f -fn_missionc=0xff0100000010 -fn_spotl=0xff0100000001 # or 0xc00000221 -fn_dict=0xc000000cf -fn_dnd=0x10000009b -fn_rew=0xc000000b4 -fn_play=0xc000000cd -fn_fwd=0xc000000b3 -fn_mute=0xc000000e2 -fn_vol_inc=0xc000000ea -fn_vol_dec=0xc000000e9 -fn_kbd_inc=0xff00000008 -fn_kbd_dec=0xff00000009 -fn_launchp=0xff0100000004 -fn_globe=0xff0100000030 -fn_desktop=0x700000044 # or f11 -fn_num_div=0x700000054 -fn_num_mul=0x700000055 -fn_num_sub=0x700000056 -fn_num_add=0x700000057 -fn_num_enter=0x700000058 -fn_num1=0x700000059 -fn_num2=0x70000005a -fn_num3=0x70000005b -fn_num4=0x70000005c -fn_num5=0x70000005d -fn_num6=0x70000005e -fn_num7=0x70000005f -fn_num8=0x700000060 -fn_num9=0x700000061 -fn_num0=0x700000062 -fn_num_dot=0x700000063 -fn_num_equ=0x700000067 - -function help() { - echo "$LESS_TERMCAP_mb$0 $LESS_TERMCAP_md[command]$LESS_TERMCAP_me - where $LESS_TERMCAP_md[command]$LESS_TERMCAP_me is one of: - show display the current user key map - export output the current user key map for creating a LaunchAgent - reset reset user key map to default - default display the default key map (from ioreg) -$LESS_TERMCAP_mb$0 $LESS_TERMCAP_md[n=keycode ...]$LESS_TERMCAP_me - where ${LESS_TERMCAP_us}n$LESS_TERMCAP_ue is 1 to 12 for thefunction key, and - ${LESS_TERMCAP_us}keycode$LESS_TERMCAP_ue is a hex key code starting with 0x -$LESS_TERMCAP_mb$0 $LESS_TERMCAP_md[n=function ...]$LESS_TERMCAP_me - where ${LESS_TERMCAP_us}n$LESS_TERMCAP_ue is 1 to 12 for the function key, and - ${LESS_TERMCAP_us}function$LESS_TERMCAP_ue is one of: - bri_dec | bri_inc decrease / increase display brightness - kbd_dec | kbd_inc decrease / increase keyboard backlight brightness - missionc | launchp show mission control / launchpad - spotl | dict spotlight search / dictation (hold for Siri) - dnd | mute toggle do not disturb / mute - rew | play | fwd rewind / play or pause / fast-forward media - vol_dec | vol_inc decrease / increase volume - globe | desktop show emoji / desktop (same as F11) - num0 to num9 number pad keys, along with: - num_add | num_sub | num_mul | num_div | num_dot | num_equ | num_enter -" -} -function show() { - echo Current user key map - hidutil property -g UserKeyMapping -} -function reset() { - echo Reset user key map - hidutil property -s "{\"UserKeyMapping\":[]}" >/dev/null -} -function default() { - echo Show default key map - ioreg -l | grep -o "\"FnFunctionUsageMap\" = .*" -} -function export() { - x=$(hidutil property -g UserKeyMapping | sed -E "s/(HIDKeyboardModifierMappingDst) = (.*);/\"\1\": \2,/g;s/(HIDKeyboardModifierMappingSrc) = (.*);/\"\1\": \2/g;s/\(/[/;s/\)/]/") - echo ' - - - - Label - com.local.KeyRemapping - ProgramArguments - - /usr/bin/hidutil - property - --set - {"UserKeyMapping":'"$x"' - } - - RunAtLoad - - -' -} -function map() { - y="" - for x in "$@"; do - x=(${x//=/ }) - x0=${x[0]} - x1=${x[1]} - if [[ ${#x[@]} -eq 2 && ( $x0 == [1-9] || $x0 == 1[012]) ]]; then - fn=${this_mac[$x0]} - [[ "$fn" == "" ]] && echo "Error no such key F$x0" && exit -1 - if [[ "$x1" == f[1-9] || "$x1" == f1[0-9] ]]; then - kc=${x1:1} - kc=${fn_keys[$kc]} - [[ "$kc" == "" ]] && echo "Error mapping F$x0 [$fn] to unknown $x1" && exit -1 - echo "Mapping F$x0 [$fn] to HID $x1 [$kc]" - y="{\"HIDKeyboardModifierMappingSrc\":$fn,\"HIDKeyboardModifierMappingDst\":$kc},$y" - elif [[ "$kc" == 0x[0-9A-Fa-f]* && ( ${#kc} -ge 11 && ${#kc} -le 14 ) ]]; then - echo "Mapping F$x0 [$fn] to HID hex code [$kc]" - y="{\"HIDKeyboardModifierMappingSrc\":$fn,\"HIDKeyboardModifierMappingDst\":$kc},$y" - else - kc=fn_$x1 - kc=${!kc} - [[ "$kc" == "" ]] && echo "Error mapping F$x0 [$fn] to unknown $x1" && exit -1 - echo "Mapping F$x0 [$fn] to HID $x1 [$kc]" - y="{\"HIDKeyboardModifierMappingSrc\":$fn,\"HIDKeyboardModifierMappingDst\":$kc},$y" - fi - fi - hidutil property -s "{\"UserKeyMapping\":[${y%?}]}" >/dev/null - done -} -function kbd() { - map 4=kbd_dec 5=kbd_inc -} -if [[ ${#@} -eq 1 && "$1" != *=* ]]; then - [[ $(LC_ALL=C type -t "$1") == "function" && "$1" != "map" ]] && $1 && exit $? -elif [[ ${#@} -ge 1 ]]; then - map "$@" - exit $? -fi -help diff --git a/Box42/Resources/sh/nodeInstall.sh b/Box42/Resources/sh/nodeInstall.sh deleted file mode 100644 index 767a31a..0000000 --- a/Box42/Resources/sh/nodeInstall.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -#42Box: https://github.com/42Box -#Author: chanheki -#Date: 2023/08/10 - -# BOXY FOX -echo "" -echo "\033[38;5;208m Boxy Fox Node install" -echo "" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ" -echo "β–‘β–‘β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–“β–“β–“β–“" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–‘β–‘β–‘β–‘β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–“β–“β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–“β–“β–ˆβ–ˆβ–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–‘β–‘β–‘β–‘β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–’β–’β–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–’β–’β–’β–’ β–‘β–‘β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–‘β–‘β–ˆβ–ˆβ–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ" -echo " β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘" -echo "" - - -export N_PREFIX=/goinfre -curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash -s lts -echo "# bin folder for node.js">>~/.zshrc -echo 'export PATH="$PATH:$HOME/bin"' >> ~/.zshrc -export PATH=/goinfre/bin:$PATH -ln -s /goinfre/bin ~/bin - -echo "Download Complete" diff --git a/Box42/Scripts/AppleScripts+ShowMessage.swift b/Box42/Scripts/AppleScripts+ShowMessage.swift deleted file mode 100644 index 3a7411b..0000000 --- a/Box42/Scripts/AppleScripts+ShowMessage.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// AppleScripts+ShowMessage.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import Foundation -import AppKit - -func showMessageWithAppleScript(_ message: String) { - let appleScript = """ - display dialog "\(message)" buttons {"OK"} default button "OK" - """ - - var error: NSDictionary? - if let scriptObject = NSAppleScript(source: appleScript) { - scriptObject.executeAndReturnError(&error) - if let error = error { - print("AppleScript Error: \(error)") - } - } -} - -func showMessageWithAppleScript(_ message: String, _ button: String, completion: @escaping (String?) -> Void) { - let appleScript = """ - display dialog "\(message)" buttons {"\(button)", "μ·¨μ†Œ"} default button "\(button)" - """ - - var error: NSDictionary? - if let scriptObject = NSAppleScript(source: appleScript) { - let output = scriptObject.executeAndReturnError(&error) - let buttonReturned = output.forKeyword(keyDirectObject) - print("output", output.description) -// completion(output.stringValue) - completion(buttonReturned?.stringValue) - if let error = error { - print("AppleScript Error: \(error)") - completion(nil) - } - } -} diff --git a/Box42/Scripts/Scripts.swift b/Box42/Scripts/Scripts.swift deleted file mode 100644 index 96323f7..0000000 --- a/Box42/Scripts/Scripts.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// Scripts.swift -// Box42 -// -// Created by Chanhee Kim on 8/11/23. -// - -import Foundation - -struct Scripts { - var info: [(name: String, description: String)] = [("cleanCache", "cleaning cache"), ("brewInGoinfre", - "brew download in goinfre")] -} - -struct Script { - var id: UUID - var name: String - var description: String - - init(name: String, description: String) { - self.id = UUID() - self.name = name - self.description = description - } -} diff --git a/Box42/Shared/BoxSizeManager.swift b/Box42/Shared/BoxSizeManager.swift deleted file mode 100644 index acd32f4..0000000 --- a/Box42/Shared/BoxSizeManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// BoxSizeManager.swift -// Box42 -// -// Created by Chan on 2023/08/11. -// - -import Cocoa - -struct BoxSizeManager { - static let shared = BoxSizeManager() - - var halfSize: (width: CGFloat, height: CGFloat)! - var size: (width: CGFloat, height: CGFloat)! - var buttonGroupSize: (width: CGFloat, height: CGFloat)! - var toolbarGroupSize: (width: CGFloat, height: CGFloat)! - var viewStack: [NSView?] - var boxViewSizeNSRect: NSRect - var boxViewSizeNSSize: NSSize - var buttonGroupSizeNSRect: NSRect - var windowButtonGroupSize: (width: CGFloat, height: CGFloat)! - - init() { - halfSize = (NSScreen.halfOfScreen.x, NSScreen.halfOfScreen.y) - size = (NSScreen.customScreenSize.x, NSScreen.customScreenSize.y) - buttonGroupSize = (CGFloat(132), NSScreen.customScreenSize.y) - toolbarGroupSize = (CGFloat(132), CGFloat(100)) - viewStack = [NSView()] - boxViewSizeNSRect = NSRect(x: 0, y: 0, width: size.width, height: size.height) - boxViewSizeNSSize = NSSize(width: size.width, height: size.height) - buttonGroupSizeNSRect = NSRect(x: 0, y: 0, width: buttonGroupSize.width, height: buttonGroupSize.height) - windowButtonGroupSize = (CGFloat(200), NSScreen.customScreenSize.y) - } -} diff --git a/Box42/Shared/Constants.swift b/Box42/Shared/Constants.swift deleted file mode 100644 index 322faa9..0000000 --- a/Box42/Shared/Constants.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// Constants.swift -// Box42 -// -// Created by Chanhee Kim on 8/17/23. -// - -struct Constants { - struct url { - static let InitialName = "home" - static let InitialPage = "https://42box.github.io/front-end/" - } - - struct UI { - static let GroupAutolayout = 12 - } -} diff --git a/Box42/Shared/StateManager.swift b/Box42/Shared/StateManager.swift deleted file mode 100644 index e73da57..0000000 --- a/Box42/Shared/StateManager.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// StateManager.swift -// Box42 -// -// Created by Chanhee Kim on 8/8/23. -// - -class StateManager { - static let shared = StateManager() - - private var isPin: Bool! - private var isShowCPUUsage: Bool! - private var isShowWindow: Bool! - private var isShowFirstWindow: Bool! - private var isAutoStorage: Bool! - - private init() { - isPin = false - isShowCPUUsage = false - isShowWindow = false - isShowFirstWindow = false - isAutoStorage = true - } - - func getIsPin() -> Bool { - return isPin - } - - func setToggleIsPin() { - isPin.toggle() - } - - func getIsShowCPUUsage() -> Bool { - return isShowCPUUsage - } - - func setToggleIsShowCPUUsage() { - isShowCPUUsage.toggle() - } - - func getIsShowWindow() -> Bool { - return isShowWindow - } - - func setToggleIsShowWindow() { - isShowWindow.toggle() - } - - func getIsShowFirstWindow() -> Bool { - return isShowFirstWindow - } - - func setToggleIsShowFirstWindow() { - isShowFirstWindow.toggle() - } - - func getIsAutoStorage() -> Bool { - return isAutoStorage - } - - func setOffIsAutoStorage() { - isAutoStorage = false - } - - func setOnIsAutoStorage() { - isAutoStorage = true - } -} diff --git a/Box42/System/CPU.swift b/Box42/System/CPU.swift deleted file mode 100644 index f7a8dbf..0000000 --- a/Box42/System/CPU.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// CPU.swift -// Run42SeoulPackage2 -// -// Created by Chan on 2023/02/23. -// Copyright Β© 2023 Run42. All rights reserved. -// - -import Foundation - -class CPU { - var cpuTimer: Timer? = nil - var usage: (value: Double, description: String) = (0.0, "") - - private let loadInfoCount: mach_msg_type_number_t! - private var loadPrevious = host_cpu_load_info() - - init() { - loadInfoCount = mach_msg_type_number_t(MemoryLayout.size / MemoryLayout.size) - } - - private func hostCPULoadInfo() -> host_cpu_load_info { - var size: mach_msg_type_number_t = loadInfoCount - let hostInfo = host_cpu_load_info_t.allocate(capacity: 1) - let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { - return host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, $0, &size) - } - let data = hostInfo.move() - hostInfo.deallocate() - return data - } - - public func usageCPU() { - let load = hostCPULoadInfo() - let userDiff = Double(load.cpu_ticks.0 - loadPrevious.cpu_ticks.0) - let sysDiff = Double(load.cpu_ticks.1 - loadPrevious.cpu_ticks.1) - let idleDiff = Double(load.cpu_ticks.2 - loadPrevious.cpu_ticks.2) - let niceDiff = Double(load.cpu_ticks.3 - loadPrevious.cpu_ticks.3) - loadPrevious = load - - let totalTicks = sysDiff + userDiff + idleDiff + niceDiff - let sys = 100.0 * sysDiff / totalTicks - let user = 100.0 * userDiff / totalTicks - - let value: Double = round((sys + user) * 10.0) / 10.0 - let description: String = (value >= 100.0) ? "100↑%" : ((value < 10.0 ? " " : "") + String(value)) + "% " - - self.usage = (value, description) - } - - func processCPU(_ statusBar: StatusBar) -> Bool { - cpuTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true, block: { _ in - self.usageCPU() - statusBar.interval = 0.02 * (100 - max(0.0, min(99.0, self.usage.value))) / 6 - statusBar.statusItem.button?.title = StateManager.shared.getIsShowCPUUsage() ? self.usage.description : "" - }) - self.cpuTimer?.fire() - return true - } - - func StopCPU() -> Bool { - self.cpuTimer?.invalidate() - return false - } -} diff --git a/Box42/System/Storage.swift b/Box42/System/Storage.swift deleted file mode 100644 index 4024446..0000000 --- a/Box42/System/Storage.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// Storage.swift -// Box42 -// -// Created by Chanhee Kim on 8/16/23. -// - -import Foundation -import Combine - -class Storage { - var storageTimer: Timer? = nil - var usage: (value: Double, description:String) = (0.0, "") - var count = 0 - let gibiByte = Double(1 << 30) - var config: StorageConfig - - private var subscriptions = Set() - - private var availableUsage: Double? - private var usedUsage: Double? - private var totalUsage: Double? - - init(config: StorageConfig = StorageConfig.shared) { - self.config = config - - config.$threshold.sink { [weak self] newThreshold in - self?.storageTimerEvent() - }.store(in: &subscriptions) - - config.$period.sink { [weak self] newPeriod in - self?.storageTimerEvent() - }.store(in: &subscriptions) - } - - func checkStorage() -> Bool { - do { - let fileSystemAttributes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()) - if let freeSpace = fileSystemAttributes[.systemFreeSize] as? NSNumber { - availableUsage = freeSpace.doubleValue / gibiByte - } - if let totalSpace = fileSystemAttributes[.systemSize] as? NSNumber { - totalUsage = totalSpace.doubleValue / gibiByte - } - if totalUsage != nil && availableUsage != nil { - usedUsage = totalUsage! - availableUsage! - } - } catch { - print("Error obtaining system storage info: \(error)") - return true - } - return false - } - - func storageTimerEvent(){ - storageTimer?.invalidate() - - if StateManager.shared.getIsAutoStorage() == false { - return - } - - storageTimer = Timer.scheduledTimer(withTimeInterval: config.period.rawValue, repeats: true, block: { [weak self] _ in - guard let self = self else { return } - - if self.checkStorage() { - print("FileSystem정보λ₯Ό κ°€μ Έμ˜€λŠ”λ° μ‹€νŒ¨ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.") - return - } - - if let usedUsage = self.usedUsage, let totalUsage = self.totalUsage, totalUsage != 0 { - let usagePercentage = (totalUsage - usedUsage) / totalUsage - if usagePercentage < self.config.threshold.rawValue { - self.cleanSh() - self.count += 1 - if self.count > 2 { -// showMessageWithAppleScript("μΊμ‹œ λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€. ncdu ~ λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.", "μž¬μ‹œμž‘") { button in -// print("timer") -// dump(button) -// if let button = button { -// switch button { -// case "μž¬μ‹œμž‘": -// StateManager.shared.setOnIsAutoStorage() -// print("μž¬μ‹œμž‘ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμŠ΅λ‹ˆλ‹€.") -// case "μ·¨μ†Œ": -// // μ·¨μ†Œ κ΄€λ ¨ 둜직 μ‹€ν–‰ -// print("μ·¨μ†Œ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμŠ΅λ‹ˆλ‹€.") -// default: -// break -// } -// } -// } - StateManager.shared.setOffIsAutoStorage() - // μ—¬κΈ°μ„œλ„ 타이머λ₯Ό μ€‘μ§€μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€. - self.storageTimer?.invalidate() - } else { - print("\(usedUsage.roundedToTwoDecimalPlaces) GB", "Storage used is less than 30%") - } - } else { - self.count = 0 - } - } else { - print("Failed to get storage usage details") - } - }) - - storageTimer?.fire() - } - - - func cleanSh() { - if let scriptPath = Bundle.main.path(forResource: "cleanCache", ofType: "sh") { - let task = Process() - task.launchPath = "/bin/sh" - task.arguments = [scriptPath] - - task.launch() - task.waitUntilExit() - - // μ‹€ν–‰λ˜μ—ˆλ‹€λŠ” 것을 μ•Œλ €μ£Όκ³  μ‹ΆμœΌλ©΄ νŒŒμ΄ν”„ λ½‘μ•„μ„œ ν•˜λ©΄λ¨. - } else { - print("Script not found") - } - } - - func change() { - config.setThreshold(.percentage30) - config.setPeriod(.period10s) - } -} diff --git a/Box42/System/StorageConfig.swift b/Box42/System/StorageConfig.swift deleted file mode 100644 index 002581c..0000000 --- a/Box42/System/StorageConfig.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// StorageConfig.swift -// Box42 -// -// Created by Chanhee Kim on 8/16/23. -// - -enum StorageThreshold: Double { - case percentage05 = 0.05 - case percentage10 = 0.1 - case percentage30 = 0.3 - case percentage50 = 0.5 -} - -enum StoragePeriod: Double { - case period1s = 1.0 - case period3s = 3.0 - case period5s = 5.0 - case period10s = 10.0 -} - -import Combine - -class StorageConfig: ObservableObject { - static let shared = StorageConfig() - - @Published var threshold: StorageThreshold - @Published var period: StoragePeriod - - init(_ threshold: StorageThreshold = .percentage30, _ period: StoragePeriod = .period3s) { - self.threshold = threshold - self.period = period - } - - func setThreshold(_ threshold: StorageThreshold) { - self.threshold = threshold - print(self.threshold) - } - - func setPeriod(_ period: StoragePeriod) { - self.period = period - print(self.period) - } -} diff --git a/Box42/Toolbar/ToolbarViewController.swift b/Box42/Toolbar/ToolbarViewController.swift deleted file mode 100644 index ea32aab..0000000 --- a/Box42/Toolbar/ToolbarViewController.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// ToolbarViewController.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import Cocoa - -class ToolbarViewController: NSViewController { - var displayURL = DisplayURLInToolbar() - var goBackButton: GoBackInToolbar? - var goForwardButton: GoForwardInToolbar? - var reloadPageButton: ReloadPageViaToolbar? - var goHomePageViaButton: GoHomePageViaToolbar? - var sidebarLeading: SideBarLeading? - - override func loadView() { - displayURL = DisplayURLInToolbar() - sidebarLeading = SideBarLeading(image: NSImage(imageLiteralResourceName: "sidebar.leading"), completion: sidebar) - goBackButton = GoBackInToolbar(image: NSImage(imageLiteralResourceName: "arrow.left"), completion: goBack) - goForwardButton = GoForwardInToolbar(image: NSImage(imageLiteralResourceName: "arrow.right"), completion: goFoward) - reloadPageButton = ReloadPageViaToolbar(image: NSImage(imageLiteralResourceName: "arrow.clockwise"), completion: reloadPage) - goHomePageViaButton = GoHomePageViaToolbar(image: NSImage(imageLiteralResourceName: "figure.skating"), completion: goToHome) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - // Do view setup here. - } - - func sidebar() { - print("sidebar") - } - - func goBack() { - WebViewManager.shared.hostingWebView?.goBack() - } - - func goFoward() { - WebViewManager.shared.hostingWebView?.goForward() - } - - func reloadPage() { - WebViewManager.shared.hostingWebView?.reload() - } - - func goToHome() { - if let item = WebViewManager.shared.hostingWebView?.backForwardList.backList.first { - WebViewManager.shared.hostingWebView?.go(to: item) - } - } -} diff --git a/Box42/Toolbar/View/BoxToolbarViewGroup.swift b/Box42/Toolbar/View/BoxToolbarViewGroup.swift deleted file mode 100644 index ac17e8c..0000000 --- a/Box42/Toolbar/View/BoxToolbarViewGroup.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// BoxToolbarViewGroup.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit -import SnapKit - -class BoxToolbarViewGroup: NSView { - var toolbarVC: ToolbarViewController? - - init() { -// toolbarVC = ToolbarViewController(nibName: nil, bundle: nil) - - super.init(frame: NSRect(x: 0, y: 0, width: BoxSizeManager.shared.size.width - BoxSizeManager.shared.toolbarGroupSize.width, height: BoxSizeManager.shared.toolbarGroupSize.height)) - - self.wantsLayer = true -// self.addSubview(toolbarVC!.view) - - toolbarVC?.view.translatesAutoresizingMaskIntoConstraints = false - toolbarVC?.view.snp.makeConstraints { make in - make.edges.equalTo(self) - } - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Box42/Toolbar/View/DisplayURLInToolbar.swift b/Box42/Toolbar/View/DisplayURLInToolbar.swift deleted file mode 100644 index d8026dd..0000000 --- a/Box42/Toolbar/View/DisplayURLInToolbar.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// displayURLInToolbar.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class DisplayURLInToolbar: NSTextField { - - override init(frame frameRect: NSRect) { - super.init(frame: frameRect) - - self.isEditable = true - self.isBordered = false // ν…Œλ‘λ¦¬λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. - self.backgroundColor = NSColor.clear // 배경색을 투λͺ…ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. - - if let url = WebViewManager.shared.hostingWebView?.url { - self.stringValue = url.absoluteString - } - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func updateURL() { - if let url = WebViewManager.shared.hostingWebView?.url { - self.stringValue = url.absoluteString - } - } -} diff --git a/Box42/Toolbar/View/GoBackInToolbar.swift b/Box42/Toolbar/View/GoBackInToolbar.swift deleted file mode 100644 index 6bb209f..0000000 --- a/Box42/Toolbar/View/GoBackInToolbar.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// GoBackInToolbar.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class GoBackInToolbar: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(goBackWebView) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func goBackWebView() { - callback?() - } -} diff --git a/Box42/Toolbar/View/GoForwardInToolbar.swift b/Box42/Toolbar/View/GoForwardInToolbar.swift deleted file mode 100644 index e5f04fb..0000000 --- a/Box42/Toolbar/View/GoForwardInToolbar.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// GoForwardInToolbar.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class GoForwardInToolbar: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(goForwardWebView) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func goForwardWebView() { - callback?() - } -} diff --git a/Box42/Toolbar/View/GoHomePageViaToolbar().swift b/Box42/Toolbar/View/GoHomePageViaToolbar().swift deleted file mode 100644 index 2728ff3..0000000 --- a/Box42/Toolbar/View/GoHomePageViaToolbar().swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// GoHomePageViaToolbar.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class GoHomePageViaToolbar: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(goToHomePageWebView) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func goToHomePageWebView() { - callback?() - } -} diff --git a/Box42/Toolbar/View/RefreshPageViaToolbar.swift b/Box42/Toolbar/View/RefreshPageViaToolbar.swift deleted file mode 100644 index 8be72bc..0000000 --- a/Box42/Toolbar/View/RefreshPageViaToolbar.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// ReloadPageViaToolbar.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class ReloadPageViaToolbar: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(reloadWebView) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func reloadWebView() { - callback?() - } -} diff --git a/Box42/Toolbar/View/SideBarLeading.swift b/Box42/Toolbar/View/SideBarLeading.swift deleted file mode 100644 index 9849a05..0000000 --- a/Box42/Toolbar/View/SideBarLeading.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// SideBarLeading.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import AppKit - -class SideBarLeading: NSButton { - - private var callback: (() -> Void)? - - init(image: NSImage, completion: @escaping () -> Void) { - super.init(frame: .zero) - - self.image = image - self.bezelStyle = .texturedRounded - self.target = self - self.action = #selector(sideBarLeading) - self.callback = completion - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func sideBarLeading() { - callback?() - } -} diff --git a/Box42/UI/HoverButton.swift b/Box42/UI/HoverButton.swift deleted file mode 100644 index c7bbcfe..0000000 --- a/Box42/UI/HoverButton.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// HoverButton.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import Cocoa - -class HoverButton: NSButton { - - private var trackingArea: NSTrackingArea? - - override func awakeFromNib() { - super.awakeFromNib() - - self.wantsLayer = true - self.layer?.borderColor = NSColor.black.cgColor - self.layer?.borderWidth = 1.0 - self.layer?.cornerRadius = 5.0 - } - - override func updateTrackingAreas() { - super.updateTrackingAreas() - - if let trackingArea = self.trackingArea { - self.removeTrackingArea(trackingArea) - } - - let options: NSTrackingArea.Options = [.mouseEnteredAndExited, .activeAlways] - trackingArea = NSTrackingArea(rect: self.bounds, options: options, owner: self, userInfo: nil) - self.addTrackingArea(trackingArea!) - } - - override func mouseEntered(with event: NSEvent) { - // ν˜Έλ²„ μƒνƒœμΌ λ•Œμ˜ μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€. - self.layer?.backgroundColor = NSColor.gray.cgColor - self.layer?.opacity = 1.0 - } - - override func mouseExited(with event: NSEvent) { - // ν˜Έλ²„ μƒνƒœκ°€ 아닐 λ•Œμ˜ μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€. -// self.layer?.backgroundColor = NSColor.white.cgColor - self.layer?.opacity = 0.7 - } -} diff --git a/Box42/UI/MovableContainerView.swift b/Box42/UI/MovableContainerView.swift deleted file mode 100644 index 69c4042..0000000 --- a/Box42/UI/MovableContainerView.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MovableContainerView.swift -// Box42 -// -// Created by Chanhee Kim on 8/19/23. -// - -import AppKit - -class MovableContainerView: NSView { - init() { - super.init(frame: NSRect(x: 0, y: 0, width: 300, height: BoxSizeManager.shared.size.height)) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func mouseDown(with event: NSEvent) { - if let window = self.window { - window.performDrag(with: event) - } - } -} diff --git a/Box42/URL/URLModel.swift b/Box42/URL/URLModel.swift new file mode 100644 index 0000000..f7a5c13 --- /dev/null +++ b/Box42/URL/URLModel.swift @@ -0,0 +1,36 @@ +// +// URLModel.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Foundation + +struct URLModel { + let URLdict: [String: URL] = [ + "home": URL(string: "https://42box.github.io/front-end/")!, + "Box 42": URL(string: "https://42box.github.io/front-end/#/box")!, + "Intra 42": URL(string: "https://intra.42.fr")!, + "Jiphyeonjeon" : URL(string:"https://42library.kr")!, + "E-Library": URL(string:"https://42seoul.dkyobobook.co.kr/main.ink")!, + "24Hane": URL(string:"https://24hoursarenotenough.42seoul.kr")!, + "80000Coding": URL(string:"https://80000coding.oopy.io")!, + "where42": URL(string:"https://www.where42.kr")!, + "cabi": URL(string:"https://cabi.42seoul.io/")!, + "42gg": URL(string:"https://42gg.kr/")!, + ] + + let URLstring: [(String, String)] = [ + ("home", "https://42box.github.io/front-end/"), + ("Box 42", "https://42box.github.io/front-end/#/box"), + ("Intra 42", "https://intra.42.fr"), + ("Jiphyeonjeon", "https://42library.kr"), + ("E-Library", "https://42seoul.dkyobobook.co.kr/main.ink"), + ("24Hane", "https://24hoursarenotenough.42seoul.kr"), + ("80000Coding", "https://80000coding.oopy.io"), + ("where42", "https://www.where42.kr"), + ("cabi", "https://cabi.42seoul.io/"), + ("42gg", "https://42gg.kr/"), + ] +} diff --git a/Box42/Web/WebViewController.swift b/Box42/Web/WebViewController.swift new file mode 100644 index 0000000..f94f401 --- /dev/null +++ b/Box42/Web/WebViewController.swift @@ -0,0 +1,53 @@ +// +// WebViewController.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Cocoa +import WebKit + +class WebViewController: NSViewController, WKScriptMessageHandler, WKUIDelegate, WKNavigationDelegate { + + func loadWebViewInit() { + for i in 0.. WKWebView { + let preferences = WKPreferences() + preferences.javaScriptEnabled = true + preferences.javaScriptCanOpenWindowsAutomatically = true + + let contentController = WKUserContentController() + contentController.add(self, name: "box") + + let configuration = WKWebViewConfiguration() + configuration.preferences = preferences + configuration.userContentController = contentController + + let webView = WKWebView(frame: .zero, configuration: configuration) + + webView.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true + webView.configuration.preferences.javaScriptEnabled = true + + webView.uiDelegate = self + webView.navigationDelegate = self + return webView + } + + override func viewDidLoad() { + super.viewDidLoad() + } + + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print(message.name) + } +} diff --git a/Box42/Web/WebViewModel.swift b/Box42/Web/WebViewModel.swift new file mode 100644 index 0000000..50f955f --- /dev/null +++ b/Box42/Web/WebViewModel.swift @@ -0,0 +1,20 @@ +// +// WebViewModel.swift +// Box42 +// +// Created by Chan on 2023/03/19. +// + +import WebKit + +// Singleton +class WebViewList { + static let shared = WebViewList() + + var list: [String : WKWebView]! + + private init() { + list = [:] + } + +} diff --git a/Box42/WebView/URL/URLModel.swift b/Box42/WebView/URL/URLModel.swift deleted file mode 100644 index 014f62c..0000000 --- a/Box42/WebView/URL/URLModel.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// URLModel.swift -// Box42 -// -// Created by Chan on 2023/03/16. -// - -import Foundation - -typealias nameUrl = (name: String, url: String) - -struct URLModel { - var id: UUID - var name: String - var url: String - - init(name: String, url: String) { - self.id = UUID() - self.name = name - self.url = url - } -} - -struct URLModels { - var info: [URLModel] - - // Network logic api call λ‚ λ €μ„œ λ°›μ•„μ˜¬ 것. - let URLstring: [nameUrl] = [ - ("home", "http://42box.kr/"), - ("23Coaltheme", "https://42box.github.io/front-end/"), - // ("home", "http://127.0.0.1:3000/"), - ("Box 42", "https://42box.github.io/front-end/#/box"), - ("Intra 42", "https://intra.42.fr"), - ("Jiphyeonjeon", "https://42library.kr"), - ("42STAT", "https://stat.42seoul.kr/home"), - ("24Hane", "https://24hoursarenotenough.42seoul.kr"), - ("80kCoding", "https://80000coding.oopy.io"), - ("where42", "https://www.where42.kr"), - ("cabi", "https://cabi.42seoul.io/"), - ("42gg", "https://42gg.kr/"), - ("textart", "https://textart.sh/"), - ] -} diff --git a/Box42/WebView/WebView.swift b/Box42/WebView/WebView.swift deleted file mode 100644 index 0e909ad..0000000 --- a/Box42/WebView/WebView.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// WebView.swift -// Box42 -// -// Created by Chanhee Kim on 8/18/23. -// - -import WebKit - -class WebView: WKWebView, WKScriptMessageHandler, WKUIDelegate, WKNavigationDelegate { - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - print("userContentController") - } - - - init() { - let preferences = WKPreferences() - preferences.javaScriptEnabled = true - preferences.javaScriptCanOpenWindowsAutomatically = true - - let contentController = WKUserContentController() - let configuration = WKWebViewConfiguration() - configuration.preferences = preferences - configuration.userContentController = contentController - - super.init(frame: .zero, configuration: configuration) - - contentController.add(self, name: "box") // Moved after super.init - - self.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true - self.configuration.preferences.javaScriptEnabled = true - self.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") - - self.uiDelegate = self - self.navigationDelegate = self - self.becomeFirstResponder() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Box42/WebView/WebViewController.swift b/Box42/WebView/WebViewController.swift deleted file mode 100644 index e0d1f02..0000000 --- a/Box42/WebView/WebViewController.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// WebViewController.swift -// Box42 -// -// Created by Chan on 2023/03/16. -// - -import Cocoa -import WebKit -import Combine - -class WebViewController: NSViewController { - var URLVM = WebViewModel() - var webView: WKWebView! - - // Cancellables array to manage the bindings - var cancellables: Set = [] - - override func loadView() { - self.webView = WebView() - self.view = webView - webViewInit() - loadWebviewInit() -// bindViewModel() - } - - func loadWebviewInit() { - URLVM.setUpURLdict() - loadAllWebview() - } - - func loadWebView(_ name: String, _ url: URL) { - let wkWebView = WebView() - WebViewManager.shared.list[name] = wkWebView - DispatchQueue.main.async { - wkWebView.load(self.URLVM.requestURL(url)) - } - } - - func loadAllWebview() { - for (name, URL) in URLVM.URLdict { - loadWebView(name, URL) - } - } - - func webViewInit() { - WebViewManager.shared.hostingWebView = self.webView - DispatchQueue.main.async { - self.webView.load(self.URLVM.requestURL(self.URLVM.safeURL())) - } - } - - func bindViewModel() { - URLVM.$URLdict - .sink { [weak self] _ in - self?.loadAllWebview() - } - .store(in: &cancellables) - } - - override func viewDidLoad() { - super.viewDidLoad() - } - - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - print(message.name) - } - - func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { - if let url = navigationAction.request.url { - webView.load(URLRequest(url: url)) - } - return nil - } -} diff --git a/Box42/WebView/WebViewManager.swift b/Box42/WebView/WebViewManager.swift deleted file mode 100644 index bdf0fe1..0000000 --- a/Box42/WebView/WebViewManager.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// WebViewList.swift -// Box42 -// -// Created by Chanhee Kim on 8/17/23. -// - -import WebKit - -typealias WebViewMapping = [String : WKWebView] - -class WebViewManager { - static let shared = WebViewManager() - - var hostingname: String? - var hostingWebView: WKWebView? - - var list: WebViewMapping! - - private init() { - list = [:] - } -} diff --git a/Box42/WebView/WebViewModel.swift b/Box42/WebView/WebViewModel.swift deleted file mode 100644 index 2e091a0..0000000 --- a/Box42/WebView/WebViewModel.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// WebViewModel.swift -// Box42 -// -// Created by Chan on 2023/03/19. -// - -import Combine -import WebKit - -typealias URLMapping = [String: URL] - -// WebView κ΄€λ ¨ CRUD 4가지 ν˜•νƒœμ˜ 데이터 가곡 create, read, update, delete -class WebViewModel: ObservableObject { - @Published var webViewURL: URLModels - @Published var URLdict: URLMapping - private var cancellables = Set() - - init() { - self.webViewURL = URLModels(info: [URLModel(name: Constants.url.InitialName, url: Constants.url.InitialPage)]) - self.URLdict = URLMapping() - - $webViewURL.sink { (WVURL) in - self.setUpURLdict() - }.store(in: &cancellables) - } - - func setUpURLdict() { - for urlModel in webViewURL.URLstring { - URLdict[urlModel.name] = URL(string: urlModel.url) - } - } - - // Create - func createURL(_ name: String, _ url: String) { - let newURL = URLModel(name: name, url: url) - self.webViewURL.info.append(newURL) - } - - // Read - func readURLString(_ index: Int) -> URLModel { - return webViewURL.info[index] - } - - func readURL(_ index: Int) -> URL { - return URL(string: webViewURL.info[index].url) ?? URL(string: Constants.url.InitialPage)! - } - - func safeURL() -> URL { - return URL(string: webViewURL.info.first?.url ?? Constants.url.InitialPage)! - } - - func requestURL(_ url: URL) -> URLRequest { - return URLRequest(url: url) - } - - // Update - func updateURL(_ id: UUID, _ name: String, _ url: String) { - if let selectedIndex = webViewURL.info.firstIndex(where: { user in user.id == id }) { - webViewURL.info[selectedIndex].name = name - webViewURL.info[selectedIndex].url = url - } - } - - // Delete - func deleteURL(id: UUID) { - if let selectedIndex = webViewURL.info.firstIndex(where: { user in user.id == id }) { - cancellables.removeAll() - webViewURL.info.remove(at: selectedIndex) - } - } - -} - diff --git a/Box42/Window/BoxWindowController.swift b/Box42/Window/BoxWindowController.swift deleted file mode 100644 index dc69045..0000000 --- a/Box42/Window/BoxWindowController.swift +++ /dev/null @@ -1,138 +0,0 @@ -// -// BoxWindowController.swift -// Box42 -// -// Created by Chanhee Kim on 8/11/23. -// - -import Cocoa - -class BoxWindowController: NSWindowController, NSToolbarDelegate, NSWindowDelegate { - - override init(window: NSWindow?) { - let contentRect = BoxSizeManager.shared.boxViewSizeNSRect - let styleMask: NSWindow.StyleMask = [.resizable, .closable, .miniaturizable, .fullSizeContentView, .titled] - - let windowInstance = NSWindow(contentRect: contentRect, styleMask: styleMask, backing: .buffered, defer: false) - - windowInstance.titlebarAppearsTransparent = true - windowInstance.titleVisibility = .hidden - windowInstance.title = "Box" - windowInstance.isReleasedWhenClosed = false - windowInstance.isOpaque = false - windowInstance.backgroundColor = .clear - windowInstance.isMovableByWindowBackground = true - - let boxViewController = BoxViewController(nibName: nil, bundle: nil) - windowInstance.contentViewController = boxViewController - - super.init(window: windowInstance) - - windowInstance.delegate = self - - setupToolbar() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -extension BoxWindowController { - func windowShouldClose(_ sender: NSWindow) -> Bool { -// NSApplication.shared.terminate(self) - StateManager.shared.setToggleIsShowWindow() - return true - } -} - -// MARK: - Toolbar -extension BoxWindowController { - func setupToolbar() { - let toolbar = NSToolbar(identifier: "MainToolbar") - toolbar.delegate = self - toolbar.displayMode = .iconOnly - toolbar.sizeMode = .small - self.window?.toolbar = toolbar - } - - func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - return [.group] - } - - func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - return [.group, .flexibleSpace, .sidebar, .flexibleSpace, .goBack, .flexibleSpace, .goFoward, .flexibleSpace, .reloadPage, .flexibleSpace, .goToHome] - } - - func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { - switch itemIdentifier { - case .group: - let groupItem = NSToolbarItemGroup(itemIdentifier: .group) - - let sidebarItem = NSToolbarItem(itemIdentifier: .sidebar) - sidebarItem.label = "Sidebar" - sidebarItem.image = NSImage(named: NSImage.Name("sidebar.leading")) - sidebarItem.action = #selector(toggleSidebar) - sidebarItem.minSize = NSSize(width: 40, height: 40) - sidebarItem.maxSize = NSSize(width: 40, height: 40) - - let goBack = NSToolbarItem(itemIdentifier: .goBack) - goBack.label = "left" - goBack.image = NSImage(named: NSImage.Name("arrow.left")) // 이미지 μ„€μ • - goBack.action = #selector(goBackAction) // ν•΄λ‹Ή action μ„€μ • - - let goFoward = NSToolbarItem(itemIdentifier: .goFoward) - goFoward.label = "right" - goFoward.image = NSImage(named: NSImage.Name("arrow.right")) - goFoward.action = #selector(goFowardAction) - - let reloadPage = NSToolbarItem(itemIdentifier: .reloadPage) - reloadPage.label = "clockwise" - reloadPage.image = NSImage(named: NSImage.Name("arrow.clockwise")) - reloadPage.action = #selector(reloadPageAction) - - let goToHome = NSToolbarItem(itemIdentifier: .goToHome) - goToHome.label = "skating" - goToHome.image = NSImage(named: NSImage.Name("figure.skating")) - goToHome.action = #selector(goToHomeAction) - - groupItem.subitems = [sidebarItem, goBack, goFoward, reloadPage, goToHome] - - return groupItem - - default: - return nil - } - } - - @objc func toggleSidebar() { - print("sidebar") - } - - @objc func goBackAction() { - WebViewManager.shared.hostingWebView?.goBack() - } - - @objc func goFowardAction() { - WebViewManager.shared.hostingWebView?.goForward() - } - - @objc func reloadPageAction() { - WebViewManager.shared.hostingWebView?.reload() - } - - @objc func goToHomeAction() { - if let item = WebViewManager.shared.hostingWebView?.backForwardList.backList.first { - WebViewManager.shared.hostingWebView?.go(to: item) - } - } -} - -extension NSToolbarItem.Identifier { - static let sidebar = NSToolbarItem.Identifier(rawValue: "SidebarButton") - static let goBack = NSToolbarItem.Identifier(rawValue: "goBackButton") - static let goFoward = NSToolbarItem.Identifier(rawValue: "goFowardButton") - static let reloadPage = NSToolbarItem.Identifier(rawValue: "reloadPageButton") - static let goToHome = NSToolbarItem.Identifier(rawValue: "goToHomeButton") - static let group = NSToolbarItem.Identifier(rawValue: "ItemGroup") -} diff --git a/Package.swift b/Package.swift deleted file mode 100644 index 32e0316..0000000 --- a/Package.swift +++ /dev/null @@ -1,28 +0,0 @@ -// swift-tools-version:5.3 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "Box42", - platforms: [ - .macOS(.v10_15), - ], - products: [ - .library( - name: "Box42", - targets: ["Box42"]), - ], - dependencies: [ - .package(url: "https://github.com/SnapKit/SnapKit", from: "5.6.0"), - ], - targets: [ - .target( - name: "Box42", - dependencies: ["SnapKit"], - resources: [.process("Box42/Resources/Assets.xcassets"), - .process("Box42/Resources/Main.storyboard"), - .process("Box42/Resources/sh/*.sh")] - ), - ] -) diff --git a/Project.swift b/Project.swift deleted file mode 100644 index 0c1c3d1..0000000 --- a/Project.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// Project.swift -// Config -// -// Created by Chan on 2023/08/16. -// - -import ProjectDescription - -// MARK: Constants -let projectName = "Box42" -let organizationName = "Box42" -let bundleID = "com.box42" -let targetVersion = "10.15" -let dependencies: [TargetDependency] = [ - .external(name: "SnapKit"), -] -// MARK: Struct -let project = Project( - name: projectName, - organizationName: organizationName, - packages: [], - settings: nil, - targets: [ - Target(name: projectName, - platform: .macOS, - product: .app, - bundleId: bundleID, - deploymentTarget: .macOS(targetVersion: targetVersion), - infoPlist: .file(path: "\(projectName)/Resources/Info.plist"), - sources: ["\(projectName)/**"], - resources: ["\(projectName)/Resources/Assets.xcassets", - "\(projectName)/Resources/Main.storyboard", - "\(projectName)/Resources/sh/*.sh",], - entitlements: "\(projectName)/Resources/Box42.entitlements", - dependencies: dependencies - ) - ], - schemes: [], - fileHeaderTemplate: nil, - additionalFiles: [], - resourceSynthesizers: [] -) diff --git a/README.md b/README.md index 597f6e1..5a8d29c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # macOS -[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2F42Box%2FmacOS%2Freleases&count_bg=%23E7D166&title_bg=%23EB7F40&icon=dropbox.svg&icon_color=%23E7E7E7&title=μ°Ύμ•„μ™€μ£Όμ…”μ„œ+κ°μ‚¬ν•©λ‹ˆλ‹€!&edge_flat=false)](https://hits.seeyoufarm.com) +[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2F42Box%2FmacOS%2Freleases&count_bg=%23E7D166&title_bg=%23EB7F40&icon=dropbox.svg&icon_color=%23E7E7E7&title=Download+Count&edge_flat=false)](https://hits.seeyoufarm.com) [v1.0.1 Beta Release Note](https://github.com/42Box/macOS/releases/tag/v1.0.1) diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift deleted file mode 100644 index a131a1f..0000000 --- a/Tuist/Dependencies.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// Dependencies.swift -// Config -// -// Created by Chan on 2023/08/16. -// - -import ProjectDescription - -let spm = SwiftPackageManagerDependencies([ - .remote(url: "https://github.com/SnapKit/SnapKit", requirement: .exact("5.6.0")), -]) - -let dependencies = Dependencies( - swiftPackageManager: spm, - platforms: [.macOS] -)