From 9f3e6b133ff8f445c2aaa118ec5d86a022303f47 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 27 Oct 2016 13:13:36 +0800
Subject: [PATCH 01/43] init wkwebview and WebViewJavascriptBridge

---
 Podfile                                       |  13 +-
 Podfile.lock                                  |  13 +-
 .../WKWebViewJavascriptBridge.h               |   1 +
 .../WebViewJavascriptBridge.h                 |   1 +
 .../WebViewJavascriptBridgeBase.h             |   1 +
 .../WebViewJavascriptBridge_JS.h              |   1 +
 .../WKWebViewJavascriptBridge.h               |   1 +
 .../WebViewJavascriptBridge.h                 |   1 +
 .../WebViewJavascriptBridgeBase.h             |   1 +
 Pods/Local Podspecs/MASShortcut.podspec.json  |   8 +-
 Pods/Manifest.lock                            |  13 +-
 Pods/Pods.xcodeproj/project.pbxproj           | 959 +++++++++++-------
 .../RHPreferencesWindowController.m           |   2 +-
 .../ISO8601DateFormatter.xcconfig             |   8 +-
 .../MASShortcut/MASShortcut.xcconfig          |   8 +-
 ...ods-quark-shell-acknowledgements.markdown} |  28 +-
 .../Pods-quark-shell-acknowledgements.plist}  |  42 +-
 .../Pods-quark-shell/Pods-quark-shell-dummy.m |   5 +
 .../Pods-quark-shell-frameworks.sh}           |   6 +-
 .../Pods-quark-shell-resources.sh             | 102 ++
 .../Pods-quark-shell.debug.xcconfig           |  11 +
 .../Pods-quark-shell.release.xcconfig         |  11 +
 Pods/Target Support Files/Pods/Pods-dummy.m   |   5 -
 .../Pods/Pods-resources.sh                    | 101 --
 .../Pods/Pods.debug.xcconfig                  |   7 -
 .../Pods/Pods.release.xcconfig                |   7 -
 .../RHPreferences/RHPreferences.xcconfig      |   8 +-
 .../StartAtLoginController.xcconfig           |   8 +-
 .../WebViewJavascriptBridge-dummy.m           |   5 +
 .../WebViewJavascriptBridge-prefix.pch        |   4 +
 .../WebViewJavascriptBridge.xcconfig          |   9 +
 Pods/WebViewJavascriptBridge/LICENSE          |  22 +
 Pods/WebViewJavascriptBridge/README.md        | 219 ++++
 .../WKWebViewJavascriptBridge.h               |  32 +
 .../WKWebViewJavascriptBridge.m               | 172 ++++
 .../WebViewJavascriptBridge.h                 |  37 +
 .../WebViewJavascriptBridge.m                 | 185 ++++
 .../WebViewJavascriptBridgeBase.h             |  44 +
 .../WebViewJavascriptBridgeBase.m             | 214 ++++
 .../WebViewJavascriptBridge_JS.h              |   3 +
 .../WebViewJavascriptBridge_JS.m              | 123 +++
 quark-shell.xcodeproj/project.pbxproj         |  52 +-
 quark-shell/Base.lproj/MainMenu.xib           |  27 +-
 quark-shell/QSHAppDelegate.m                  |  93 +-
 44 files changed, 2025 insertions(+), 588 deletions(-)
 create mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 create mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 create mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 create mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
 create mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 create mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 create mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 rename Pods/Target Support Files/{Pods/Pods-acknowledgements.markdown => Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown} (87%)
 rename Pods/Target Support Files/{Pods/Pods-acknowledgements.plist => Pods-quark-shell/Pods-quark-shell-acknowledgements.plist} (86%)
 create mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m
 rename Pods/Target Support Files/{Pods/Pods-frameworks.sh => Pods-quark-shell/Pods-quark-shell-frameworks.sh} (93%)
 create mode 100755 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh
 create mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig
 create mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig
 delete mode 100644 Pods/Target Support Files/Pods/Pods-dummy.m
 delete mode 100755 Pods/Target Support Files/Pods/Pods-resources.sh
 delete mode 100644 Pods/Target Support Files/Pods/Pods.debug.xcconfig
 delete mode 100644 Pods/Target Support Files/Pods/Pods.release.xcconfig
 create mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m
 create mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch
 create mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig
 create mode 100644 Pods/WebViewJavascriptBridge/LICENSE
 create mode 100644 Pods/WebViewJavascriptBridge/README.md
 create mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 create mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
 create mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 create mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
 create mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 create mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
 create mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
 create mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m

diff --git a/Podfile b/Podfile
index e9bf903..c7233ae 100644
--- a/Podfile
+++ b/Podfile
@@ -2,8 +2,11 @@ platform :osx, '10.9'
 
 source 'https://github.com/CocoaPods/Specs.git'
 
-pod 'MASShortcut', :git => 'https://github.com/xhacker/MASShortcut.git', :branch => 'menubar-webkit'
-pod 'RHPreferences', :head
-pod 'Sparkle', '~> 1.13'
-pod 'ISO8601DateFormatter', '~> 0.7'
-pod 'StartAtLoginController', '~> 0.0.1'
+target 'quark-shell' do
+  pod 'MASShortcut', :git => 'https://github.com/xhacker/MASShortcut.git', :branch => 'menubar-webkit'
+  pod 'RHPreferences', '~> 1.0'
+  pod 'Sparkle', '~> 1.13'
+  pod 'ISO8601DateFormatter', '~> 0.7'
+  pod 'StartAtLoginController', '~> 0.0.1'
+  pod 'WebViewJavascriptBridge', '~> 5.0'
+end
\ No newline at end of file
diff --git a/Podfile.lock b/Podfile.lock
index b1798a1..719e6d7 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,16 +1,18 @@
 PODS:
   - ISO8601DateFormatter (0.7)
   - MASShortcut (1.2.3)
-  - RHPreferences (HEAD based on 1.0.0)
+  - RHPreferences (1.0.0)
   - Sparkle (1.13.1)
   - StartAtLoginController (0.0.1)
+  - WebViewJavascriptBridge (5.0.5)
 
 DEPENDENCIES:
   - ISO8601DateFormatter (~> 0.7)
   - MASShortcut (from `https://github.com/xhacker/MASShortcut.git`, branch `menubar-webkit`)
-  - RHPreferences (HEAD)
+  - RHPreferences (~> 1.0)
   - Sparkle (~> 1.13)
   - StartAtLoginController (~> 0.0.1)
+  - WebViewJavascriptBridge (~> 5.0)
 
 EXTERNAL SOURCES:
   MASShortcut:
@@ -24,9 +26,12 @@ CHECKOUT OPTIONS:
 
 SPEC CHECKSUMS:
   ISO8601DateFormatter: ab926648eebe497f4d167c0fd083992f959f1274
-  MASShortcut: 48e9edc2ae45df6d4e9f10c3c26a49972eaf92ac
+  MASShortcut: 534bf89dfd1fb013580accdc3b5d2341f0749dc0
   RHPreferences: 6871f9614347f4b45197c51f7c93c3cde2744ce8
   Sparkle: 2fbd47b869621d1e679c7554e3e19dda02104818
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
+  WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-COCOAPODS: 0.39.0
+PODFILE CHECKSUM: e0eb9f4d6740610df4a8ad44e676343009803cc4
+
+COCOAPODS: 1.1.1
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
new file mode 120000
index 0000000..aa9dc22
--- /dev/null
+++ b/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
new file mode 120000
index 0000000..29b9ace
--- /dev/null
+++ b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
new file mode 120000
index 0000000..dff4a3e
--- /dev/null
+++ b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
new file mode 120000
index 0000000..a6b45d8
--- /dev/null
+++ b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
new file mode 120000
index 0000000..aa9dc22
--- /dev/null
+++ b/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
new file mode 120000
index 0000000..29b9ace
--- /dev/null
+++ b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
new file mode 120000
index 0000000..dff4a3e
--- /dev/null
+++ b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
@@ -0,0 +1 @@
+../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
\ No newline at end of file
diff --git a/Pods/Local Podspecs/MASShortcut.podspec.json b/Pods/Local Podspecs/MASShortcut.podspec.json
index 5b05465..1d27e3b 100644
--- a/Pods/Local Podspecs/MASShortcut.podspec.json	
+++ b/Pods/Local Podspecs/MASShortcut.podspec.json	
@@ -12,5 +12,11 @@
   },
   "source_files": "*.{h,m}",
   "frameworks": "Carbon",
-  "requires_arc": true
+  "requires_arc": true,
+  "platforms": {
+    "osx": null,
+    "ios": null,
+    "tvos": null,
+    "watchos": null
+  }
 }
diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock
index b1798a1..719e6d7 100644
--- a/Pods/Manifest.lock
+++ b/Pods/Manifest.lock
@@ -1,16 +1,18 @@
 PODS:
   - ISO8601DateFormatter (0.7)
   - MASShortcut (1.2.3)
-  - RHPreferences (HEAD based on 1.0.0)
+  - RHPreferences (1.0.0)
   - Sparkle (1.13.1)
   - StartAtLoginController (0.0.1)
+  - WebViewJavascriptBridge (5.0.5)
 
 DEPENDENCIES:
   - ISO8601DateFormatter (~> 0.7)
   - MASShortcut (from `https://github.com/xhacker/MASShortcut.git`, branch `menubar-webkit`)
-  - RHPreferences (HEAD)
+  - RHPreferences (~> 1.0)
   - Sparkle (~> 1.13)
   - StartAtLoginController (~> 0.0.1)
+  - WebViewJavascriptBridge (~> 5.0)
 
 EXTERNAL SOURCES:
   MASShortcut:
@@ -24,9 +26,12 @@ CHECKOUT OPTIONS:
 
 SPEC CHECKSUMS:
   ISO8601DateFormatter: ab926648eebe497f4d167c0fd083992f959f1274
-  MASShortcut: 48e9edc2ae45df6d4e9f10c3c26a49972eaf92ac
+  MASShortcut: 534bf89dfd1fb013580accdc3b5d2341f0749dc0
   RHPreferences: 6871f9614347f4b45197c51f7c93c3cde2744ce8
   Sparkle: 2fbd47b869621d1e679c7554e3e19dda02104818
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
+  WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-COCOAPODS: 0.39.0
+PODFILE CHECKSUM: e0eb9f4d6740610df4a8ad44e676343009803cc4
+
+COCOAPODS: 1.1.1
diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj
index d3eb1c6..9fd2faa 100644
--- a/Pods/Pods.xcodeproj/project.pbxproj
+++ b/Pods/Pods.xcodeproj/project.pbxproj
@@ -7,366 +7,439 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		06DEF87B3F74B3BDD497AA1B58A591E8 /* ISO8601DateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 81763829D910717AC6C1C4B27BE5FF85 /* ISO8601DateFormatter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
-		0828FDDEF006C1739D0CD2AC0C7747C2 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A508092EF1FCD650B312271B0FE64201 /* ServiceManagement.framework */; };
-		099FF02F91C103E7EB9FEAA95FDA1865 /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FF8F0E0B72A95751D5A5E911844348F /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		157065063012F0E0A64BA53845C1A139 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */; };
-		2CB1FC886CB95D82C6790C2A97A82B40 /* StartAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = C338A3EB3C575048C52E49AF58F5EC9E /* StartAtLoginController.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		307AF494C44C3B03D41BF53A17F90FAC /* MASShortcutView+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 18E48513160BBAE6218466E9CB59C7E3 /* MASShortcutView+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		392DC00755985E727BBBDF305B22919B /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C67E2E69D0B91BC984ADA03DF3236AC /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		490170C7B684819125C5D0B3144C48F0 /* MASShortcut+Monitoring.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D4ACD46BBFA45371FABB4942DED1DC9 /* MASShortcut+Monitoring.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4AAD52D1B8AEB040EA2D64FCAE8B06D8 /* RHPreferencesWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BF9D1CF8E576AB6F0000ED6557C0699 /* RHPreferencesWindowController.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		516FEF3867EE0EB73955B1FCBB8D70AC /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 59CAADF2651BF6B40695386E4E74C3D1 /* MASShortcut-dummy.m */; };
-		584362F8D341B3165E032729C912A1E7 /* StartAtLoginController.h in Headers */ = {isa = PBXBuildFile; fileRef = F3C1814A7CEE4E8776A9E43C2176BD66 /* StartAtLoginController.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		590FD082B06F85831F48053F5279EDA0 /* MASShortcutView+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 48552A53D69AD5F19590BB93845F1704 /* MASShortcutView+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		5A1790ABA0E322C6F2DC72D98DED50E4 /* RHPreferences-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7FE7084B45A3627AD8558C1E8BDEE8 /* RHPreferences-dummy.m */; };
-		5AE3DB8D51982845B7E36548D4C84125 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B56E9DE7720071756ABB3843F19979B /* Carbon.framework */; };
-		6AB607BAAEFBD78D8046E0AB769DF50E /* MASShortcut+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 21776108F964D06AD7F3680E6489B64C /* MASShortcut+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		6C6B263CD37C6CC737E794A5E779B7BC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */; };
-		85E5DBEFB2B361BF802D4F83B0B9951D /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = FD0B8C1FF4C495B5761738DA589D00E4 /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		93AB4480783967918D2497148D52278E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */; };
-		9BE3602C769494DE4DCAD7439F6B965F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */; };
-		A4E8732161509BAB60525ED77EEECE71 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 808769412E9C963955DC3C13D3909893 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		B826B3ABC5D15B61465398B9D73BC4C1 /* RHPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 4048612D7AB4CB7F4FA7FE05670FAAF9 /* RHPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		BB7FEF0AAD1FF10AC43284902960205E /* StartAtLoginController-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C991C17369C4B0F694F6AB735BE96BF4 /* StartAtLoginController-dummy.m */; };
-		C3216A2D96E821D120FCA7B47FF38F22 /* MASShortcut+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = A2C0DA8347ABAAA330B258F0267B71B1 /* MASShortcut+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		C6D37B95FB83DC0E58A67508783E7D49 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */; };
-		D740839FCD6361E10AE5462DBEB4E153 /* MASShortcut+Monitoring.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C702966B43F78AD7F3E9B459E0DF209 /* MASShortcut+Monitoring.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		DBF4B241080DB0EFE5F598754D91DA0A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */; };
-		E0F6FD1E10963EA7F454D00BD33AF147 /* ISO8601DateFormatter-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA41D49F3E6641807477ABBE5DE548D4 /* ISO8601DateFormatter-dummy.m */; };
-		EA5694FC59FA851D166C97256C479095 /* RHPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C8E5A461A404A9F8809D196A8268FFB /* RHPreferencesWindowController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
-		EEC7D7F9F45667B8854AF12F610EE2BE /* ISO8601DateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6465D463BA66E71150142B7E8EB7825A /* ISO8601DateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		06DEF87B3F74B3BDD497AA1B58A591E8 /* ISO8601DateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+		099FF02F91C103E7EB9FEAA95FDA1865 /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		0AAD3F1A3513E6302638DB21A5C686D6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		0B02B78DAEA00B4EFD97A6B5DEB47CFD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		0DFEAA39ACF4CD35738E3A6A2EFFE985 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		1630DC1951EF4F01F9BF7C92277713E0 /* RHPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		232A85F5668F85CC863EF7A9C5EB7806 /* RHPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+		276BE92A73ACEBB6FBDB677C6DB79179 /* StartAtLoginController-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */; };
+		284F97193D8DFC30B5E09A2467AFF859 /* WKWebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		307AF494C44C3B03D41BF53A17F90FAC /* MASShortcutView+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		392DC00755985E727BBBDF305B22919B /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3B68CC68BCD794BEB3D9BF1AEC46E491 /* StartAtLoginController.h in Headers */ = {isa = PBXBuildFile; fileRef = 465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		490170C7B684819125C5D0B3144C48F0 /* MASShortcut+Monitoring.h in Headers */ = {isa = PBXBuildFile; fileRef = 8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		49DB848489A454335772EC4AC3EF19BA /* WebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		516FEF3867EE0EB73955B1FCBB8D70AC /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */; };
+		53DD37407AB7C949F460B353EE4C79E7 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		56AEA368E9F13473089B05F5EAE7A825 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */; };
+		590FD082B06F85831F48053F5279EDA0 /* MASShortcutView+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		666474F683617399EC47ABAD21C5A5F1 /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		6AB607BAAEFBD78D8046E0AB769DF50E /* MASShortcut+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		82BE347936BA909D1229180A62C4EBAC /* WebViewJavascriptBridge_JS.h in Headers */ = {isa = PBXBuildFile; fileRef = 62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		85E5DBEFB2B361BF802D4F83B0B9951D /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		A14EE0351FB9DF7954A3A4CC64E39BD9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		A45C95308F93724650447321012F58BB /* StartAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		A4E8732161509BAB60525ED77EEECE71 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 70A7AF6C657223298378356780081E78 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		C0DE2E1FC64474C7900800AF86F5B10D /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		C2BCC6D89C731E05A6FA021E273179EA /* RHPreferences-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */; };
+		C3216A2D96E821D120FCA7B47FF38F22 /* MASShortcut+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		C38CF90D07859A45CCCA120DBFBCA425 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		C460B0181597DE0A1D6F2F498FE043CD /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */; };
+		C4F7D5A7BE0F2CCFA63C83436B40B181 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */; };
+		D7137E57D11E0B725F2A937A90EA74C2 /* Pods-quark-shell-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */; };
+		D740839FCD6361E10AE5462DBEB4E153 /* MASShortcut+Monitoring.m in Sources */ = {isa = PBXBuildFile; fileRef = 31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		DD0EEB8EAB4A9A1E023085029415C0A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
+		E0F6FD1E10963EA7F454D00BD33AF147 /* ISO8601DateFormatter-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */; };
+		E72C2B0472108257A1C54E33F0C3EC2B /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
+		EEC7D7F9F45667B8854AF12F610EE2BE /* ISO8601DateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F1A4C183D414DAE35772059E4648E791 /* WebViewJavascriptBridgeBase.h in Headers */ = {isa = PBXBuildFile; fileRef = C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F82D2728A0328942861AF97EE663389F /* RHPreferencesWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F86A1F1CA9ED89FE6D643CC25DC69E7A /* WebViewJavascriptBridge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
-		36930A6437B7105766EF0FB5180E6269 /* PBXContainerItemProxy */ = {
+		3315DBE637FA220512EC80759AFB781F /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = C5924C338BFC3FD069C1E8171EA21B28;
-			remoteInfo = StartAtLoginController;
+			remoteGlobalIDString = B0267AE73E97C7576F08F4911FEFECD5;
+			remoteInfo = ISO8601DateFormatter;
 		};
-		62E9E86516A839D8D92B955909E17331 /* PBXContainerItemProxy */ = {
+		39AADAFB0E68C57FD4FE32D74F2C489E /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = B0267AE73E97C7576F08F4911FEFECD5;
-			remoteInfo = ISO8601DateFormatter;
+			remoteGlobalIDString = ECCCB42E94B9425098451F868F013C54;
+			remoteInfo = StartAtLoginController;
 		};
-		BDD34056CE5DF66182C4FFFA3E9D4EA1 /* PBXContainerItemProxy */ = {
+		6552E1E9853B96752F3DCB1E4F19E677 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = 6C863F6C9AB214C752194D5A06B943DB;
-			remoteInfo = MASShortcut;
+			remoteGlobalIDString = 2CD3F2A4EA1E4AECB9A7744A7B612941;
+			remoteInfo = WebViewJavascriptBridge;
 		};
-		C7EF06CB20507322A0D4D52B92331B02 /* PBXContainerItemProxy */ = {
+		717016437144947F49EB30A76215EA5C /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = 7C6AA09CF9DDE0EB36F3AB6C3B3771A2;
+			remoteGlobalIDString = BC33E7E7C814AFB79D6412EEA7DA84E7;
 			remoteInfo = RHPreferences;
 		};
+		E5029213AEB8EB44231F50DB086BE4A6 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 6C863F6C9AB214C752194D5A06B943DB;
+			remoteInfo = MASShortcut;
+		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		09E7CB49A6DB4D3E1AF315A09328B6D9 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
-		10834806BD7B412BC24F347361FA2C8E /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = "<group>"; };
-		11FCCB76691F1E4227F165B2A241353E /* RHPreferencesWindow.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RHPreferencesWindow.xib; path = RHPreferences/RHPreferencesWindow.xib; sourceTree = "<group>"; };
-		12F46E8FCDBAE364149A90D7883AD2EB /* ISO8601DateFormatter.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ISO8601DateFormatter.xcconfig; sourceTree = "<group>"; };
-		149C90B5BA7CF3518448B5A9E92F07A2 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		18E48513160BBAE6218466E9CB59C7E3 /* MASShortcutView+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcutView+UserDefaults.h"; sourceTree = "<group>"; };
-		21776108F964D06AD7F3680E6489B64C /* MASShortcut+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+UserDefaults.h"; sourceTree = "<group>"; };
-		272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = "<group>"; };
-		2AC970237546BDB84A0649CF326E906D /* ISO8601DateFormatter-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ISO8601DateFormatter-prefix.pch"; sourceTree = "<group>"; };
-		2C8E5A461A404A9F8809D196A8268FFB /* RHPreferencesWindowController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RHPreferencesWindowController.m; path = RHPreferences/RHPreferencesWindowController.m; sourceTree = "<group>"; };
-		2FF8F0E0B72A95751D5A5E911844348F /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcut.h; sourceTree = "<group>"; };
-		356E1D8DC35DD317DB937F045086EF69 /* RHPreferences.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RHPreferences.xcconfig; sourceTree = "<group>"; };
-		37DB56D75062CC75FCB0966E1C6E8A8E /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = "<group>"; };
-		3D32B3B5F605A606CC5EE42E78B34032 /* StartAtLoginController.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StartAtLoginController.xcconfig; sourceTree = "<group>"; };
-		4048612D7AB4CB7F4FA7FE05670FAAF9 /* RHPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferences.h; path = RHPreferences/RHPreferences.h; sourceTree = "<group>"; };
-		41508B2FEF4574930C8AD8B4233032EC /* libMASShortcut.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMASShortcut.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		48552A53D69AD5F19590BB93845F1704 /* MASShortcutView+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcutView+UserDefaults.m"; sourceTree = "<group>"; };
-		4B56E9DE7720071756ABB3843F19979B /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; };
-		4C7FE7084B45A3627AD8558C1E8BDEE8 /* RHPreferences-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RHPreferences-dummy.m"; sourceTree = "<group>"; };
-		4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = "<group>"; };
-		59CAADF2651BF6B40695386E4E74C3D1 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = "<group>"; };
-		5C67E2E69D0B91BC984ADA03DF3236AC /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcutView.h; sourceTree = "<group>"; };
-		5C702966B43F78AD7F3E9B459E0DF209 /* MASShortcut+Monitoring.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+Monitoring.m"; sourceTree = "<group>"; };
-		631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
-		6465D463BA66E71150142B7E8EB7825A /* ISO8601DateFormatter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ISO8601DateFormatter.h; sourceTree = "<group>"; };
-		6911BECA35E7518D864239B7E898EEF3 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = "<group>"; };
-		72E9C06F109A55C3D07D4650ABBBB9A3 /* libISO8601DateFormatter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libISO8601DateFormatter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		7BF9D1CF8E576AB6F0000ED6557C0699 /* RHPreferencesWindowController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferencesWindowController.h; path = RHPreferences/RHPreferencesWindowController.h; sourceTree = "<group>"; };
-		7DA75B993E7ABD652149639449702962 /* StartAtLoginController-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StartAtLoginController-prefix.pch"; sourceTree = "<group>"; };
-		808769412E9C963955DC3C13D3909893 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcutView.m; sourceTree = "<group>"; };
-		81763829D910717AC6C1C4B27BE5FF85 /* ISO8601DateFormatter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ISO8601DateFormatter.m; sourceTree = "<group>"; };
-		8FE268C5E761638217F12558CB4C7FC2 /* libStartAtLoginController.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStartAtLoginController.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		9339CF75BDC524C33A55EA477E9CC7F8 /* RHPreferences-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RHPreferences-prefix.pch"; sourceTree = "<group>"; };
-		97B1767101C5198125838F2A51457478 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = "<group>"; };
-		98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = "<group>"; };
-		9D4ACD46BBFA45371FABB4942DED1DC9 /* MASShortcut+Monitoring.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+Monitoring.h"; sourceTree = "<group>"; };
-		A1A36D34413696BE466E2CA0AFF194DA /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = "<group>"; };
-		A2C0DA8347ABAAA330B258F0267B71B1 /* MASShortcut+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+UserDefaults.m"; sourceTree = "<group>"; };
-		A508092EF1FCD650B312271B0FE64201 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/ServiceManagement.framework; sourceTree = DEVELOPER_DIR; };
-		BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
-		C338A3EB3C575048C52E49AF58F5EC9E /* StartAtLoginController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = StartAtLoginController.m; sourceTree = "<group>"; };
-		C991C17369C4B0F694F6AB735BE96BF4 /* StartAtLoginController-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StartAtLoginController-dummy.m"; sourceTree = "<group>"; };
-		DA41D49F3E6641807477ABBE5DE548D4 /* ISO8601DateFormatter-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ISO8601DateFormatter-dummy.m"; sourceTree = "<group>"; };
-		DE8DE352898677D5985B4CC7E7881804 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = "<group>"; };
-		F3C1814A7CEE4E8776A9E43C2176BD66 /* StartAtLoginController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = StartAtLoginController.h; sourceTree = "<group>"; };
-		F7A4670EE62343C86CCA25B707B64B96 /* libRHPreferences.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRHPreferences.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		FD0B8C1FF4C495B5761738DA589D00E4 /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcut.m; sourceTree = "<group>"; };
+		053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferences.h; path = RHPreferences/RHPreferences.h; sourceTree = "<group>"; };
+		06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = "<group>"; };
+		09E02674DBDFC9AA28B038BF782FEB54 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
+		0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+UserDefaults.h"; sourceTree = "<group>"; };
+		0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StartAtLoginController.xcconfig; sourceTree = "<group>"; };
+		0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RHPreferencesWindowController.m; path = RHPreferences/RHPreferencesWindowController.m; sourceTree = "<group>"; };
+		0ECC539C94F019D36E29CAAB646D7043 /* StartAtLoginController-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StartAtLoginController-prefix.pch"; sourceTree = "<group>"; };
+		17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridgeBase.m; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m; sourceTree = "<group>"; };
+		27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/ServiceManagement.framework; sourceTree = DEVELOPER_DIR; };
+		2826BE8CC1C37F0682A11D91B0430AE4 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = "<group>"; };
+		2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-quark-shell.release.xcconfig"; sourceTree = "<group>"; };
+		2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = "<group>"; };
+		31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+Monitoring.m"; sourceTree = "<group>"; };
+		36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
+		3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ISO8601DateFormatter.xcconfig; sourceTree = "<group>"; };
+		465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = StartAtLoginController.h; sourceTree = "<group>"; };
+		4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge_JS.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m; sourceTree = "<group>"; };
+		4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WebViewJavascriptBridge-dummy.m"; sourceTree = "<group>"; };
+		526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; };
+		53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RHPreferences.xcconfig; sourceTree = "<group>"; };
+		59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ISO8601DateFormatter.h; sourceTree = "<group>"; };
+		61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcutView+UserDefaults.m"; sourceTree = "<group>"; };
+		62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge_JS.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h; sourceTree = "<group>"; };
+		65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMASShortcut.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		70A7AF6C657223298378356780081E78 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcutView.m; sourceTree = "<group>"; };
+		797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge.m; sourceTree = "<group>"; };
+		7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; };
+		7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WebViewJavascriptBridge.xcconfig; sourceTree = "<group>"; };
+		8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+Monitoring.h"; sourceTree = "<group>"; };
+		8372FB2D7342DA57AF4C9CAC82D0D281 /* Pods-quark-shell-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-quark-shell-resources.sh"; sourceTree = "<group>"; };
+		855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libISO8601DateFormatter.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		88C13C090AB0AB273FEB9989262B6888 /* ISO8601DateFormatter-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ISO8601DateFormatter-prefix.pch"; sourceTree = "<group>"; };
+		91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StartAtLoginController-dummy.m"; sourceTree = "<group>"; };
+		92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcut.h; sourceTree = "<group>"; };
+		93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+		942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RHPreferences-dummy.m"; sourceTree = "<group>"; };
+		993B0D66EA64986DFD0D9C00FB336F25 /* Pods-quark-shell-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-quark-shell-acknowledgements.markdown"; sourceTree = "<group>"; };
+		A3CA658717B68A3765D3B5D34E448CB3 /* RHPreferencesWindow.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RHPreferencesWindow.xib; path = RHPreferences/RHPreferencesWindow.xib; sourceTree = "<group>"; };
+		A4513538D92EB56F1358ADF52369E2FE /* Pods-quark-shell-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-quark-shell-frameworks.sh"; sourceTree = "<group>"; };
+		A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = StartAtLoginController.m; sourceTree = "<group>"; };
+		AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WKWebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.m; sourceTree = "<group>"; };
+		B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+		BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcutView.h; sourceTree = "<group>"; };
+		C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridgeBase.h; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h; sourceTree = "<group>"; };
+		CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge.h; sourceTree = "<group>"; };
+		CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-quark-shell-dummy.m"; sourceTree = "<group>"; };
+		CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
+		CF383F1A79400C257CBFA7A67E41350E /* WebViewJavascriptBridge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WebViewJavascriptBridge-prefix.pch"; sourceTree = "<group>"; };
+		D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcutView+UserDefaults.h"; sourceTree = "<group>"; };
+		DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStartAtLoginController.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WKWebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.h; sourceTree = "<group>"; };
+		E1AB417A0D9ED7F2CD63090377DB9040 /* Pods-quark-shell-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-quark-shell-acknowledgements.plist"; sourceTree = "<group>"; };
+		E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ISO8601DateFormatter-dummy.m"; sourceTree = "<group>"; };
+		EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+UserDefaults.m"; sourceTree = "<group>"; };
+		EAC3DE54D1B6A835C1B78FBD3DCE4921 /* RHPreferences-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RHPreferences-prefix.pch"; sourceTree = "<group>"; };
+		EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferencesWindowController.h; path = RHPreferences/RHPreferencesWindowController.h; sourceTree = "<group>"; };
+		F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ISO8601DateFormatter.m; sourceTree = "<group>"; };
+		F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRHPreferences.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWebViewJavascriptBridge.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcut.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		021210B0918D9ED86187BC9307CBCBEA /* Frameworks */ = {
+		0529A2EAFF13066EC933C13943C180FD /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157065063012F0E0A64BA53845C1A139 /* Cocoa.framework in Frameworks */,
-				0828FDDEF006C1739D0CD2AC0C7747C2 /* ServiceManagement.framework in Frameworks */,
+				C38CF90D07859A45CCCA120DBFBCA425 /* Cocoa.framework in Frameworks */,
+				C4F7D5A7BE0F2CCFA63C83436B40B181 /* ServiceManagement.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		13D03737D33658E921F723C117A39B0D /* Frameworks */ = {
+		32DC1C17E8FFE5DE9CDC1128799AD387 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				93AB4480783967918D2497148D52278E /* Cocoa.framework in Frameworks */,
+				A14EE0351FB9DF7954A3A4CC64E39BD9 /* Cocoa.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		820E7F281D04108C63DB266C51AB64E4 /* Frameworks */ = {
+		3D2ECDD8D4B24F7B4821BED3BBCEE1C1 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				6C6B263CD37C6CC737E794A5E779B7BC /* Cocoa.framework in Frameworks */,
+				0DFEAA39ACF4CD35738E3A6A2EFFE985 /* Cocoa.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */ = {
+		4D8BB006D1CA179BB186E782687AA0F9 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				5AE3DB8D51982845B7E36548D4C84125 /* Carbon.framework in Frameworks */,
-				9BE3602C769494DE4DCAD7439F6B965F /* Cocoa.framework in Frameworks */,
+				0B02B78DAEA00B4EFD97A6B5DEB47CFD /* Cocoa.framework in Frameworks */,
+				C460B0181597DE0A1D6F2F498FE043CD /* WebKit.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		8DA9E1F85104D385B5825CB7DA52ABC8 /* Frameworks */ = {
+		820E7F281D04108C63DB266C51AB64E4 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				DBF4B241080DB0EFE5F598754D91DA0A /* Cocoa.framework in Frameworks */,
+				0AAD3F1A3513E6302638DB21A5C686D6 /* Cocoa.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				56AEA368E9F13473089B05F5EAE7A825 /* Carbon.framework in Frameworks */,
+				DD0EEB8EAB4A9A1E023085029415C0A1 /* Cocoa.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		037C0CA694176A3C0915F62C9D20B3E6 /* Targets Support Files */ = {
+		08BB01761EC8C516100E7E0A97EDD3DC /* Pods-quark-shell */ = {
 			isa = PBXGroup;
 			children = (
-				B3D1D13E0C6553800746CB8FD61CF946 /* Pods */,
+				993B0D66EA64986DFD0D9C00FB336F25 /* Pods-quark-shell-acknowledgements.markdown */,
+				E1AB417A0D9ED7F2CD63090377DB9040 /* Pods-quark-shell-acknowledgements.plist */,
+				CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */,
+				A4513538D92EB56F1358ADF52369E2FE /* Pods-quark-shell-frameworks.sh */,
+				8372FB2D7342DA57AF4C9CAC82D0D281 /* Pods-quark-shell-resources.sh */,
+				CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */,
+				2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */,
 			);
-			name = "Targets Support Files";
+			name = "Pods-quark-shell";
+			path = "Target Support Files/Pods-quark-shell";
 			sourceTree = "<group>";
 		};
-		21866C12C95A877FC20A4CBDEB71A17A /* RHPreferences */ = {
+		14407E388F5CF5B72358DFD27AC8D970 /* Sparkle */ = {
 			isa = PBXGroup;
 			children = (
-				4048612D7AB4CB7F4FA7FE05670FAAF9 /* RHPreferences.h */,
-				7BF9D1CF8E576AB6F0000ED6557C0699 /* RHPreferencesWindowController.h */,
-				2C8E5A461A404A9F8809D196A8268FFB /* RHPreferencesWindowController.m */,
-				6CCC6E0AC86A566C0B1AE986594A0B35 /* Resources */,
-				2E7EA2B6DEF861CEE95B3CC6866BE773 /* Support Files */,
+				CC6A7ED911C6EAC2FBE75BCF5C203AC2 /* Frameworks */,
 			);
-			path = RHPreferences;
+			path = Sparkle;
 			sourceTree = "<group>";
 		};
-		25CD6F7B4477D53A4C200743EF42E10A /* Support Files */ = {
+		329F045FAE67A7F73A6FEE768CB5E209 /* StartAtLoginController */ = {
 			isa = PBXGroup;
 			children = (
-				97B1767101C5198125838F2A51457478 /* MASShortcut.xcconfig */,
-				59CAADF2651BF6B40695386E4E74C3D1 /* MASShortcut-dummy.m */,
-				DE8DE352898677D5985B4CC7E7881804 /* MASShortcut-prefix.pch */,
+				465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */,
+				A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */,
+				FB8D3CCD4FA92C14BFC348627E7C9C04 /* Support Files */,
 			);
-			name = "Support Files";
-			path = "../Target Support Files/MASShortcut";
+			path = StartAtLoginController;
 			sourceTree = "<group>";
 		};
-		27D76B3436A80E27B612A04CCB4D614D /* ISO8601DateFormatter */ = {
+		344B6258D5AD934EADD72E7771F640F3 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				6465D463BA66E71150142B7E8EB7825A /* ISO8601DateFormatter.h */,
-				81763829D910717AC6C1C4B27BE5FF85 /* ISO8601DateFormatter.m */,
-				36E07695209C32660255E5FEBC69D47B /* Support Files */,
+				590C195643EF65A29D8E1FD206BF40F1 /* ISO8601DateFormatter */,
+				4A77AC04034A5504019ECD18BA4B8EA0 /* MASShortcut */,
+				DB3BF09A82C2C615B20149388337F474 /* RHPreferences */,
+				14407E388F5CF5B72358DFD27AC8D970 /* Sparkle */,
+				329F045FAE67A7F73A6FEE768CB5E209 /* StartAtLoginController */,
+				7A99B3504D105AC6B4A58AEB7F17EDBC /* WebViewJavascriptBridge */,
+			);
+			name = Pods;
+			sourceTree = "<group>";
+		};
+		4A77AC04034A5504019ECD18BA4B8EA0 /* MASShortcut */ = {
+			isa = PBXGroup;
+			children = (
+				92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */,
+				F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */,
+				8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */,
+				31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */,
+				0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */,
+				EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */,
+				BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */,
+				70A7AF6C657223298378356780081E78 /* MASShortcutView.m */,
+				D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */,
+				61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */,
+				F950E3F86D7FBBA9DF5B2079A7FF5AEE /* Support Files */,
+			);
+			path = MASShortcut;
+			sourceTree = "<group>";
+		};
+		590C195643EF65A29D8E1FD206BF40F1 /* ISO8601DateFormatter */ = {
+			isa = PBXGroup;
+			children = (
+				59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */,
+				F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */,
+				7223518E207BCE09F21BAD97C2FE2561 /* Support Files */,
 			);
 			path = ISO8601DateFormatter;
 			sourceTree = "<group>";
 		};
-		2E7EA2B6DEF861CEE95B3CC6866BE773 /* Support Files */ = {
+		5CB80EE500CF0EDE6374242CE620E981 /* OS X */ = {
 			isa = PBXGroup;
 			children = (
-				356E1D8DC35DD317DB937F045086EF69 /* RHPreferences.xcconfig */,
-				4C7FE7084B45A3627AD8558C1E8BDEE8 /* RHPreferences-dummy.m */,
-				9339CF75BDC524C33A55EA477E9CC7F8 /* RHPreferences-prefix.pch */,
+				526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */,
+				36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */,
+				27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */,
+				7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */,
 			);
-			name = "Support Files";
-			path = "../Target Support Files/RHPreferences";
+			name = "OS X";
 			sourceTree = "<group>";
 		};
-		33FBF92172BAD196BA5CBDCEA304B8D1 /* Pods */ = {
+		6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				27D76B3436A80E27B612A04CCB4D614D /* ISO8601DateFormatter */,
-				6F9D3CEDCCD4E64C18A3CF7356EBF3ED /* MASShortcut */,
-				21866C12C95A877FC20A4CBDEB71A17A /* RHPreferences */,
-				98243E6182B66F483128D5ABDFDC5C2C /* Sparkle */,
-				C3244CC3CBD8148A73791194A7F31728 /* StartAtLoginController */,
+				855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */,
+				65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */,
+				B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */,
+				F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */,
+				DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */,
+				F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */,
 			);
-			name = Pods;
+			name = Products;
 			sourceTree = "<group>";
 		};
-		36E07695209C32660255E5FEBC69D47B /* Support Files */ = {
+		7223518E207BCE09F21BAD97C2FE2561 /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				12F46E8FCDBAE364149A90D7883AD2EB /* ISO8601DateFormatter.xcconfig */,
-				DA41D49F3E6641807477ABBE5DE548D4 /* ISO8601DateFormatter-dummy.m */,
-				2AC970237546BDB84A0649CF326E906D /* ISO8601DateFormatter-prefix.pch */,
+				3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */,
+				E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */,
+				88C13C090AB0AB273FEB9989262B6888 /* ISO8601DateFormatter-prefix.pch */,
 			);
 			name = "Support Files";
 			path = "../Target Support Files/ISO8601DateFormatter";
 			sourceTree = "<group>";
 		};
-		6C5B6EF157F98E4A2D52AFD31F43D70D /* Support Files */ = {
+		7A99B3504D105AC6B4A58AEB7F17EDBC /* WebViewJavascriptBridge */ = {
 			isa = PBXGroup;
 			children = (
-				3D32B3B5F605A606CC5EE42E78B34032 /* StartAtLoginController.xcconfig */,
-				C991C17369C4B0F694F6AB735BE96BF4 /* StartAtLoginController-dummy.m */,
-				7DA75B993E7ABD652149639449702962 /* StartAtLoginController-prefix.pch */,
+				CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */,
+				797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */,
+				62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */,
+				4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */,
+				C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */,
+				17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */,
+				E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */,
+				AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */,
+				F5BADD0B257928349B9478EECD5FBA25 /* Support Files */,
 			);
-			name = "Support Files";
-			path = "../Target Support Files/StartAtLoginController";
+			path = WebViewJavascriptBridge;
 			sourceTree = "<group>";
 		};
-		6CCC6E0AC86A566C0B1AE986594A0B35 /* Resources */ = {
+		7DB346D0F39D3F0E887471402A8071AB = {
 			isa = PBXGroup;
 			children = (
-				11FCCB76691F1E4227F165B2A241353E /* RHPreferencesWindow.xib */,
+				93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
+				CD75D5B60FCA72FBF7F9C770460B2C26 /* Frameworks */,
+				344B6258D5AD934EADD72E7771F640F3 /* Pods */,
+				6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */,
+				F36B0C1FC55104B0B11431840A55DC9C /* Targets Support Files */,
 			);
-			name = Resources;
 			sourceTree = "<group>";
 		};
-		6F9D3CEDCCD4E64C18A3CF7356EBF3ED /* MASShortcut */ = {
+		84561B48C7A29789A9DD0046B9C2F59C /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				2FF8F0E0B72A95751D5A5E911844348F /* MASShortcut.h */,
-				FD0B8C1FF4C495B5761738DA589D00E4 /* MASShortcut.m */,
-				9D4ACD46BBFA45371FABB4942DED1DC9 /* MASShortcut+Monitoring.h */,
-				5C702966B43F78AD7F3E9B459E0DF209 /* MASShortcut+Monitoring.m */,
-				21776108F964D06AD7F3680E6489B64C /* MASShortcut+UserDefaults.h */,
-				A2C0DA8347ABAAA330B258F0267B71B1 /* MASShortcut+UserDefaults.m */,
-				5C67E2E69D0B91BC984ADA03DF3236AC /* MASShortcutView.h */,
-				808769412E9C963955DC3C13D3909893 /* MASShortcutView.m */,
-				18E48513160BBAE6218466E9CB59C7E3 /* MASShortcutView+UserDefaults.h */,
-				48552A53D69AD5F19590BB93845F1704 /* MASShortcutView+UserDefaults.m */,
-				25CD6F7B4477D53A4C200743EF42E10A /* Support Files */,
+				53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */,
+				942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */,
+				EAC3DE54D1B6A835C1B78FBD3DCE4921 /* RHPreferences-prefix.pch */,
 			);
-			path = MASShortcut;
+			name = "Support Files";
+			path = "../Target Support Files/RHPreferences";
 			sourceTree = "<group>";
 		};
-		7A00F5A08808FE5035E757B840D65F3E /* Frameworks */ = {
+		CC6A7ED911C6EAC2FBE75BCF5C203AC2 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				09E7CB49A6DB4D3E1AF315A09328B6D9 /* Sparkle.framework */,
+				09E02674DBDFC9AA28B038BF782FEB54 /* Sparkle.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
-		7DB346D0F39D3F0E887471402A8071AB = {
+		CD75D5B60FCA72FBF7F9C770460B2C26 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */,
-				96D996393384F21972E2DD81788EE22C /* Frameworks */,
-				33FBF92172BAD196BA5CBDCEA304B8D1 /* Pods */,
-				98CFD55139BB3CE875D7AA5B7AD48505 /* Products */,
-				037C0CA694176A3C0915F62C9D20B3E6 /* Targets Support Files */,
+				5CB80EE500CF0EDE6374242CE620E981 /* OS X */,
 			);
+			name = Frameworks;
 			sourceTree = "<group>";
 		};
-		8FB4C73A8F54645A7B0B168A9046B0A0 /* OS X */ = {
+		D6C4EA75204A53000BFC8993CA08BD2D /* Resources */ = {
 			isa = PBXGroup;
 			children = (
-				4B56E9DE7720071756ABB3843F19979B /* Carbon.framework */,
-				631B31170A908F1C0E938C32E9D9CA64 /* Cocoa.framework */,
-				A508092EF1FCD650B312271B0FE64201 /* ServiceManagement.framework */,
+				A3CA658717B68A3765D3B5D34E448CB3 /* RHPreferencesWindow.xib */,
 			);
-			name = "OS X";
+			name = Resources;
 			sourceTree = "<group>";
 		};
-		96D996393384F21972E2DD81788EE22C /* Frameworks */ = {
+		DB3BF09A82C2C615B20149388337F474 /* RHPreferences */ = {
 			isa = PBXGroup;
 			children = (
-				8FB4C73A8F54645A7B0B168A9046B0A0 /* OS X */,
+				053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */,
+				EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */,
+				0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */,
+				D6C4EA75204A53000BFC8993CA08BD2D /* Resources */,
+				84561B48C7A29789A9DD0046B9C2F59C /* Support Files */,
 			);
-			name = Frameworks;
+			path = RHPreferences;
 			sourceTree = "<group>";
 		};
-		98243E6182B66F483128D5ABDFDC5C2C /* Sparkle */ = {
+		F36B0C1FC55104B0B11431840A55DC9C /* Targets Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				7A00F5A08808FE5035E757B840D65F3E /* Frameworks */,
+				08BB01761EC8C516100E7E0A97EDD3DC /* Pods-quark-shell */,
 			);
-			path = Sparkle;
+			name = "Targets Support Files";
 			sourceTree = "<group>";
 		};
-		98CFD55139BB3CE875D7AA5B7AD48505 /* Products */ = {
+		F5BADD0B257928349B9478EECD5FBA25 /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				72E9C06F109A55C3D07D4650ABBBB9A3 /* libISO8601DateFormatter.a */,
-				41508B2FEF4574930C8AD8B4233032EC /* libMASShortcut.a */,
-				149C90B5BA7CF3518448B5A9E92F07A2 /* libPods.a */,
-				F7A4670EE62343C86CCA25B707B64B96 /* libRHPreferences.a */,
-				8FE268C5E761638217F12558CB4C7FC2 /* libStartAtLoginController.a */,
+				7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */,
+				4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */,
+				CF383F1A79400C257CBFA7A67E41350E /* WebViewJavascriptBridge-prefix.pch */,
 			);
-			name = Products;
+			name = "Support Files";
+			path = "../Target Support Files/WebViewJavascriptBridge";
 			sourceTree = "<group>";
 		};
-		B3D1D13E0C6553800746CB8FD61CF946 /* Pods */ = {
+		F950E3F86D7FBBA9DF5B2079A7FF5AEE /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				37DB56D75062CC75FCB0966E1C6E8A8E /* Pods-acknowledgements.markdown */,
-				10834806BD7B412BC24F347361FA2C8E /* Pods-acknowledgements.plist */,
-				272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */,
-				6911BECA35E7518D864239B7E898EEF3 /* Pods-frameworks.sh */,
-				A1A36D34413696BE466E2CA0AFF194DA /* Pods-resources.sh */,
-				4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */,
-				98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */,
+				06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */,
+				2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */,
+				2826BE8CC1C37F0682A11D91B0430AE4 /* MASShortcut-prefix.pch */,
 			);
-			name = Pods;
-			path = "Target Support Files/Pods";
+			name = "Support Files";
+			path = "../Target Support Files/MASShortcut";
 			sourceTree = "<group>";
 		};
-		C3244CC3CBD8148A73791194A7F31728 /* StartAtLoginController */ = {
+		FB8D3CCD4FA92C14BFC348627E7C9C04 /* Support Files */ = {
 			isa = PBXGroup;
 			children = (
-				F3C1814A7CEE4E8776A9E43C2176BD66 /* StartAtLoginController.h */,
-				C338A3EB3C575048C52E49AF58F5EC9E /* StartAtLoginController.m */,
-				6C5B6EF157F98E4A2D52AFD31F43D70D /* Support Files */,
+				0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */,
+				91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */,
+				0ECC539C94F019D36E29CAAB646D7043 /* StartAtLoginController-prefix.pch */,
 			);
-			path = StartAtLoginController;
+			name = "Support Files";
+			path = "../Target Support Files/StartAtLoginController";
 			sourceTree = "<group>";
 		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
-		50A1988656C702905498FE0315C7A0D1 /* Headers */ = {
+		40ED6FADF4979BE4546095303CC0C557 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				584362F8D341B3165E032729C912A1E7 /* StartAtLoginController.h in Headers */,
+				49DB848489A454335772EC4AC3EF19BA /* WebViewJavascriptBridge.h in Headers */,
+				82BE347936BA909D1229180A62C4EBAC /* WebViewJavascriptBridge_JS.h in Headers */,
+				F1A4C183D414DAE35772059E4648E791 /* WebViewJavascriptBridgeBase.h in Headers */,
+				284F97193D8DFC30B5E09A2467AFF859 /* WKWebViewJavascriptBridge.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -390,50 +463,58 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		FEEDAA1032FB4817C1960D1FD1532142 /* Headers */ = {
+		CCD4AB1E0729E9301411F45B5600A590 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				B826B3ABC5D15B61465398B9D73BC4C1 /* RHPreferences.h in Headers */,
-				4AAD52D1B8AEB040EA2D64FCAE8B06D8 /* RHPreferencesWindowController.h in Headers */,
+				1630DC1951EF4F01F9BF7C92277713E0 /* RHPreferences.h in Headers */,
+				F82D2728A0328942861AF97EE663389F /* RHPreferencesWindowController.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		CD3AE719FDE0C490646CA3E416EA720E /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B68CC68BCD794BEB3D9BF1AEC46E491 /* StartAtLoginController.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXHeadersBuildPhase section */
 
 /* Begin PBXNativeTarget section */
-		6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */ = {
+		2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 38809F9F9BB800C6E5FA6E2822BB8F7A /* Build configuration list for PBXNativeTarget "MASShortcut" */;
+			buildConfigurationList = 9486CFB1B75A4A77405085F9BCC95C09 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */;
 			buildPhases = (
-				6DE104C7FFAE03B0BEACB2DD219D4E92 /* Sources */,
-				8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */,
-				6BB9D8BFA1AAA5DEEC897DAA57CF4BFF /* Headers */,
+				CAABD3BD4EC6F77064E2D595609FCA85 /* Sources */,
+				4D8BB006D1CA179BB186E782687AA0F9 /* Frameworks */,
+				40ED6FADF4979BE4546095303CC0C557 /* Headers */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = MASShortcut;
-			productName = MASShortcut;
-			productReference = 41508B2FEF4574930C8AD8B4233032EC /* libMASShortcut.a */;
+			name = WebViewJavascriptBridge;
+			productName = WebViewJavascriptBridge;
+			productReference = F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		7C6AA09CF9DDE0EB36F3AB6C3B3771A2 /* RHPreferences */ = {
+		6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 86DB641ACB2A471162143703EB451AFD /* Build configuration list for PBXNativeTarget "RHPreferences" */;
+			buildConfigurationList = 38809F9F9BB800C6E5FA6E2822BB8F7A /* Build configuration list for PBXNativeTarget "MASShortcut" */;
 			buildPhases = (
-				6E1C791F810B165D65FDDD1FC16B0DC1 /* Sources */,
-				13D03737D33658E921F723C117A39B0D /* Frameworks */,
-				FEEDAA1032FB4817C1960D1FD1532142 /* Headers */,
+				6DE104C7FFAE03B0BEACB2DD219D4E92 /* Sources */,
+				8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */,
+				6BB9D8BFA1AAA5DEEC897DAA57CF4BFF /* Headers */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = RHPreferences;
-			productName = RHPreferences;
-			productReference = F7A4670EE62343C86CCA25B707B64B96 /* libRHPreferences.a */;
+			name = MASShortcut;
+			productName = MASShortcut;
+			productReference = 65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */;
 			productType = "com.apple.product-type.library.static";
 		};
 		B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */ = {
@@ -450,44 +531,62 @@
 			);
 			name = ISO8601DateFormatter;
 			productName = ISO8601DateFormatter;
-			productReference = 72E9C06F109A55C3D07D4650ABBBB9A3 /* libISO8601DateFormatter.a */;
+			productReference = 855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		C5924C338BFC3FD069C1E8171EA21B28 /* StartAtLoginController */ = {
+		BA8C63DC1F2001BD8FCF3128DD015C9F /* Pods-quark-shell */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 93799AFD06C102354FD495EF73B77FF9 /* Build configuration list for PBXNativeTarget "StartAtLoginController" */;
+			buildConfigurationList = 0B3E5210C2872F358BB1D26E957AABB9 /* Build configuration list for PBXNativeTarget "Pods-quark-shell" */;
 			buildPhases = (
-				67C85C5F6C3C944A1EA725B3CB6C3F90 /* Sources */,
-				021210B0918D9ED86187BC9307CBCBEA /* Frameworks */,
-				50A1988656C702905498FE0315C7A0D1 /* Headers */,
+				D052FC7286ED4290D70B2D99A00F8F6F /* Sources */,
+				32DC1C17E8FFE5DE9CDC1128799AD387 /* Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
+				5D0ECE9F485900871CCE03FAE3DB1C7B /* PBXTargetDependency */,
+				01A187221F343BBEFE49E284B9246A5D /* PBXTargetDependency */,
+				8E63B7398A2E57BA05A31E3D6E2F683B /* PBXTargetDependency */,
+				CE8B0C5DCA326E0E8CB5C02157C0B3DB /* PBXTargetDependency */,
+				88DBD7B98B71B0981EC3AC27C3D6AA8B /* PBXTargetDependency */,
 			);
-			name = StartAtLoginController;
-			productName = StartAtLoginController;
-			productReference = 8FE268C5E761638217F12558CB4C7FC2 /* libStartAtLoginController.a */;
+			name = "Pods-quark-shell";
+			productName = "Pods-quark-shell";
+			productReference = B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		F125E6D7BD01854BD293208264F7DBF3 /* Pods */ = {
+		BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 537524243F5BBF761176D824FE0A9A90 /* Build configuration list for PBXNativeTarget "Pods" */;
+			buildConfigurationList = 396EAD206E44264AB2C49AADC3BB03E1 /* Build configuration list for PBXNativeTarget "RHPreferences" */;
 			buildPhases = (
-				A306725A2B08C492DD48EBB201D1D296 /* Sources */,
-				8DA9E1F85104D385B5825CB7DA52ABC8 /* Frameworks */,
+				440068E9D7AB2112EFCB47706FA0BE66 /* Sources */,
+				3D2ECDD8D4B24F7B4821BED3BBCEE1C1 /* Frameworks */,
+				CCD4AB1E0729E9301411F45B5600A590 /* Headers */,
 			);
 			buildRules = (
 			);
 			dependencies = (
-				E2E00CBAC5346AFAF0C83C699CABE7D5 /* PBXTargetDependency */,
-				63507F2EBA6E8EFB2E8CCC48117546C8 /* PBXTargetDependency */,
-				0E3781B94A40CFC48F5D6EC9A2419389 /* PBXTargetDependency */,
-				DB0501F9836929C91C4F16813A29076E /* PBXTargetDependency */,
 			);
-			name = Pods;
-			productName = Pods;
-			productReference = 149C90B5BA7CF3518448B5A9E92F07A2 /* libPods.a */;
+			name = RHPreferences;
+			productName = RHPreferences;
+			productReference = F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 497F04E1E9A28CD279FD0F9C0BE2234C /* Build configuration list for PBXNativeTarget "StartAtLoginController" */;
+			buildPhases = (
+				A9EB347B62BC2FB5887F32D706C63B1B /* Sources */,
+				0529A2EAFF13066EC933C13943C180FD /* Frameworks */,
+				CD3AE719FDE0C490646CA3E416EA720E /* Headers */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = StartAtLoginController;
+			productName = StartAtLoginController;
+			productReference = DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */;
 			productType = "com.apple.product-type.library.static";
 		};
 /* End PBXNativeTarget section */
@@ -496,7 +595,7 @@
 		D41D8CD98F00B204E9800998ECF8427E /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastSwiftUpdateCheck = 0700;
+				LastSwiftUpdateCheck = 0730;
 				LastUpgradeCheck = 0700;
 			};
 			buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */;
@@ -507,15 +606,16 @@
 				en,
 			);
 			mainGroup = 7DB346D0F39D3F0E887471402A8071AB;
-			productRefGroup = 98CFD55139BB3CE875D7AA5B7AD48505 /* Products */;
+			productRefGroup = 6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */;
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
 				B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */,
 				6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */,
-				F125E6D7BD01854BD293208264F7DBF3 /* Pods */,
-				7C6AA09CF9DDE0EB36F3AB6C3B3771A2 /* RHPreferences */,
-				C5924C338BFC3FD069C1E8171EA21B28 /* StartAtLoginController */,
+				BA8C63DC1F2001BD8FCF3128DD015C9F /* Pods-quark-shell */,
+				BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */,
+				ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */,
+				2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */,
 			);
 		};
 /* End PBXProject section */
@@ -530,12 +630,12 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		67C85C5F6C3C944A1EA725B3CB6C3F90 /* Sources */ = {
+		440068E9D7AB2112EFCB47706FA0BE66 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BB7FEF0AAD1FF10AC43284902960205E /* StartAtLoginController-dummy.m in Sources */,
-				2CB1FC886CB95D82C6790C2A97A82B40 /* StartAtLoginController.m in Sources */,
+				C2BCC6D89C731E05A6FA021E273179EA /* RHPreferences-dummy.m in Sources */,
+				232A85F5668F85CC863EF7A9C5EB7806 /* RHPreferencesWindowController.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -552,79 +652,109 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		6E1C791F810B165D65FDDD1FC16B0DC1 /* Sources */ = {
+		A9EB347B62BC2FB5887F32D706C63B1B /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				276BE92A73ACEBB6FBDB677C6DB79179 /* StartAtLoginController-dummy.m in Sources */,
+				A45C95308F93724650447321012F58BB /* StartAtLoginController.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		CAABD3BD4EC6F77064E2D595609FCA85 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				5A1790ABA0E322C6F2DC72D98DED50E4 /* RHPreferences-dummy.m in Sources */,
-				EA5694FC59FA851D166C97256C479095 /* RHPreferencesWindowController.m in Sources */,
+				F86A1F1CA9ED89FE6D643CC25DC69E7A /* WebViewJavascriptBridge-dummy.m in Sources */,
+				53DD37407AB7C949F460B353EE4C79E7 /* WebViewJavascriptBridge.m in Sources */,
+				666474F683617399EC47ABAD21C5A5F1 /* WebViewJavascriptBridge_JS.m in Sources */,
+				E72C2B0472108257A1C54E33F0C3EC2B /* WebViewJavascriptBridgeBase.m in Sources */,
+				C0DE2E1FC64474C7900800AF86F5B10D /* WKWebViewJavascriptBridge.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		A306725A2B08C492DD48EBB201D1D296 /* Sources */ = {
+		D052FC7286ED4290D70B2D99A00F8F6F /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				C6D37B95FB83DC0E58A67508783E7D49 /* Pods-dummy.m in Sources */,
+				D7137E57D11E0B725F2A937A90EA74C2 /* Pods-quark-shell-dummy.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
-		0E3781B94A40CFC48F5D6EC9A2419389 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = RHPreferences;
-			target = 7C6AA09CF9DDE0EB36F3AB6C3B3771A2 /* RHPreferences */;
-			targetProxy = C7EF06CB20507322A0D4D52B92331B02 /* PBXContainerItemProxy */;
-		};
-		63507F2EBA6E8EFB2E8CCC48117546C8 /* PBXTargetDependency */ = {
+		01A187221F343BBEFE49E284B9246A5D /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = MASShortcut;
 			target = 6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */;
-			targetProxy = BDD34056CE5DF66182C4FFFA3E9D4EA1 /* PBXContainerItemProxy */;
-		};
-		DB0501F9836929C91C4F16813A29076E /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = StartAtLoginController;
-			target = C5924C338BFC3FD069C1E8171EA21B28 /* StartAtLoginController */;
-			targetProxy = 36930A6437B7105766EF0FB5180E6269 /* PBXContainerItemProxy */;
+			targetProxy = E5029213AEB8EB44231F50DB086BE4A6 /* PBXContainerItemProxy */;
 		};
-		E2E00CBAC5346AFAF0C83C699CABE7D5 /* PBXTargetDependency */ = {
+		5D0ECE9F485900871CCE03FAE3DB1C7B /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = ISO8601DateFormatter;
 			target = B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */;
-			targetProxy = 62E9E86516A839D8D92B955909E17331 /* PBXContainerItemProxy */;
+			targetProxy = 3315DBE637FA220512EC80759AFB781F /* PBXContainerItemProxy */;
+		};
+		88DBD7B98B71B0981EC3AC27C3D6AA8B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = WebViewJavascriptBridge;
+			target = 2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */;
+			targetProxy = 6552E1E9853B96752F3DCB1E4F19E677 /* PBXContainerItemProxy */;
+		};
+		8E63B7398A2E57BA05A31E3D6E2F683B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = RHPreferences;
+			target = BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */;
+			targetProxy = 717016437144947F49EB30A76215EA5C /* PBXContainerItemProxy */;
+		};
+		CE8B0C5DCA326E0E8CB5C02157C0B3DB /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = StartAtLoginController;
+			target = ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */;
+			targetProxy = 39AADAFB0E68C57FD4FE32D74F2C489E /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
-		024AF7B02246E705E369D8A835237AFB /* Debug */ = {
+		0D485120B673120F54038788B9D91341 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */;
+			baseConfigurationReference = 06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				MACH_O_TYPE = staticlib;
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = YES;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
+				MTL_ENABLE_DEBUG_INFO = NO;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
-				PODS_ROOT = "$(SRCROOT)";
+				PRIVATE_HEADERS_FOLDER_PATH = "";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PUBLIC_HEADERS_FOLDER_PATH = "";
 				SDKROOT = macosx;
-				SKIP_INSTALL = YES;
 			};
-			name = Debug;
+			name = Release;
 		};
-		162DF24AA6CC8193034191B357C59741 /* Debug */ = {
+		0EC07801F64DA50C03421F488457C4FE /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 356E1D8DC35DD317DB937F045086EF69 /* RHPreferences.xcconfig */;
+			baseConfigurationReference = 06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -635,14 +765,20 @@
 			};
 			name = Debug;
 		};
-		1E8D7E2665070FB0E9EAEFD618E03CE8 /* Debug */ = {
+		12047A998462735DDFBA995939FE9FD6 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 3D32B3B5F605A606CC5EE42E78B34032 /* StartAtLoginController.xcconfig */;
+			baseConfigurationReference = 53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -653,15 +789,20 @@
 			};
 			name = Debug;
 		};
-		3AE362A82F14FE26FB63AE999DC3841C /* Release */ = {
+		16828ADA0E97068F98FE7635747FB7C3 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 12F46E8FCDBAE364149A90D7883AD2EB /* ISO8601DateFormatter.xcconfig */;
+			baseConfigurationReference = 3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -672,14 +813,69 @@
 			};
 			name = Release;
 		};
-		3F0D4BBFD2F74F621C523DE09336C4E5 /* Debug */ = {
+		25E8E116DC81A93C31F970334E477AC7 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 12F46E8FCDBAE364149A90D7883AD2EB /* ISO8601DateFormatter.xcconfig */;
+			baseConfigurationReference = 3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				OTHER_LDFLAGS = "";
+				OTHER_LIBTOOLFLAGS = "";
+				PRIVATE_HEADERS_FOLDER_PATH = "";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PUBLIC_HEADERS_FOLDER_PATH = "";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		26B105CEE0A4139ADD853CCAC28846D1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
+				MACH_O_TYPE = staticlib;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				OTHER_LDFLAGS = "";
+				OTHER_LIBTOOLFLAGS = "";
+				PODS_ROOT = "$(SRCROOT)";
+				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = macosx;
+				SKIP_INSTALL = YES;
+			};
+			name = Release;
+		};
+		3527ACD78F78C1C7EBD99A82A285520F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -690,10 +886,11 @@
 			};
 			name = Debug;
 		};
-		52D4ECB745D1C035F94BD060EE7F6605 /* Debug */ = {
+		4ECF5F3A7DCBE32E59B23B0C7F362504 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
@@ -707,15 +904,14 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = NO;
+				CODE_SIGNING_REQUIRED = NO;
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
+					"POD_CONFIGURATION_RELEASE=1",
 					"$(inherited)",
 				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -723,59 +919,52 @@
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				ONLY_ACTIVE_ARCH = YES;
+				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
 				STRIP_INSTALLED_PRODUCT = NO;
 				SYMROOT = "${SRCROOT}/../build";
+				VALIDATE_PRODUCT = YES;
 			};
-			name = Debug;
+			name = Release;
 		};
-		6997306A09F1B49BD073D2141650D5B3 /* Release */ = {
+		5DC599EC8FEE1F00CFEC41A607D13085 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */;
+			baseConfigurationReference = CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */;
 			buildSettings = {
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
 				MACH_O_TYPE = staticlib;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_ENABLE_DEBUG_INFO = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PODS_ROOT = "$(SRCROOT)";
+				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
 			};
-			name = Release;
-		};
-		7A68B01BF4A981707E70EB7C17D68F04 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 97B1767101C5198125838F2A51457478 /* MASShortcut.xcconfig */;
-			buildSettings = {
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
+			name = Debug;
 		};
-		83F73C6840A91108DFD9F209C46F9CD4 /* Release */ = {
+		A07B54679CB1271836F6DD61D8B92434 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 3D32B3B5F605A606CC5EE42E78B34032 /* StartAtLoginController.xcconfig */;
+			baseConfigurationReference = 53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -786,10 +975,11 @@
 			};
 			name = Release;
 		};
-		A070F153A04DD66F4E492261894B37FF /* Release */ = {
+		C269F16C69C874215FB299057455A930 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
@@ -803,10 +993,18 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = YES;
-				ENABLE_NS_ASSERTIONS = NO;
+				CODE_SIGNING_REQUIRED = NO;
+				COPY_PHASE_STRIP = NO;
+				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1";
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"POD_CONFIGURATION_DEBUG=1",
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -814,21 +1012,28 @@
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				ONLY_ACTIVE_ARCH = YES;
+				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
 				STRIP_INSTALLED_PRODUCT = NO;
 				SYMROOT = "${SRCROOT}/../build";
-				VALIDATE_PRODUCT = YES;
 			};
-			name = Release;
+			name = Debug;
 		};
-		D927B1A663C555DE69FA754649B84C20 /* Debug */ = {
+		C5DE1599F06F07CDAE96F08D5054107A /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 97B1767101C5198125838F2A51457478 /* MASShortcut.xcconfig */;
+			baseConfigurationReference = 7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = YES;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = "";
+				MTL_ENABLE_DEBUG_INFO = NO;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -836,17 +1041,22 @@
 				PUBLIC_HEADERS_FOLDER_PATH = "";
 				SDKROOT = macosx;
 			};
-			name = Debug;
+			name = Release;
 		};
-		DCB11008F8C04217FB02F1735D8EFCF8 /* Release */ = {
+		E03FE4273D4C4D1542A355B2CDC3A5A4 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 356E1D8DC35DD317DB937F045086EF69 /* RHPreferences.xcconfig */;
+			baseConfigurationReference = 0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */;
 			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				EXECUTABLE_PREFIX = lib;
-				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
@@ -857,14 +1067,47 @@
 			};
 			name = Release;
 		};
+		F273CF5E4C5DA08522DE9668C2B0CA7A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				EXECUTABLE_PREFIX = lib;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch";
+				MACOSX_DEPLOYMENT_TARGET = "";
+				MTL_ENABLE_DEBUG_INFO = YES;
+				OTHER_LDFLAGS = "";
+				OTHER_LIBTOOLFLAGS = "";
+				PRIVATE_HEADERS_FOLDER_PATH = "";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PUBLIC_HEADERS_FOLDER_PATH = "";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
+		0B3E5210C2872F358BB1D26E957AABB9 /* Build configuration list for PBXNativeTarget "Pods-quark-shell" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5DC599EC8FEE1F00CFEC41A607D13085 /* Debug */,
+				26B105CEE0A4139ADD853CCAC28846D1 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 		2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				52D4ECB745D1C035F94BD060EE7F6605 /* Debug */,
-				A070F153A04DD66F4E492261894B37FF /* Release */,
+				C269F16C69C874215FB299057455A930 /* Debug */,
+				4ECF5F3A7DCBE32E59B23B0C7F362504 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
@@ -872,44 +1115,44 @@
 		38809F9F9BB800C6E5FA6E2822BB8F7A /* Build configuration list for PBXNativeTarget "MASShortcut" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				D927B1A663C555DE69FA754649B84C20 /* Debug */,
-				7A68B01BF4A981707E70EB7C17D68F04 /* Release */,
+				0EC07801F64DA50C03421F488457C4FE /* Debug */,
+				0D485120B673120F54038788B9D91341 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		537524243F5BBF761176D824FE0A9A90 /* Build configuration list for PBXNativeTarget "Pods" */ = {
+		396EAD206E44264AB2C49AADC3BB03E1 /* Build configuration list for PBXNativeTarget "RHPreferences" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				024AF7B02246E705E369D8A835237AFB /* Debug */,
-				6997306A09F1B49BD073D2141650D5B3 /* Release */,
+				12047A998462735DDFBA995939FE9FD6 /* Debug */,
+				A07B54679CB1271836F6DD61D8B92434 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		6BE723EBBD599DAAC6F54AE696E7C154 /* Build configuration list for PBXNativeTarget "ISO8601DateFormatter" */ = {
+		497F04E1E9A28CD279FD0F9C0BE2234C /* Build configuration list for PBXNativeTarget "StartAtLoginController" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				3F0D4BBFD2F74F621C523DE09336C4E5 /* Debug */,
-				3AE362A82F14FE26FB63AE999DC3841C /* Release */,
+				3527ACD78F78C1C7EBD99A82A285520F /* Debug */,
+				E03FE4273D4C4D1542A355B2CDC3A5A4 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		86DB641ACB2A471162143703EB451AFD /* Build configuration list for PBXNativeTarget "RHPreferences" */ = {
+		6BE723EBBD599DAAC6F54AE696E7C154 /* Build configuration list for PBXNativeTarget "ISO8601DateFormatter" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				162DF24AA6CC8193034191B357C59741 /* Debug */,
-				DCB11008F8C04217FB02F1735D8EFCF8 /* Release */,
+				25E8E116DC81A93C31F970334E477AC7 /* Debug */,
+				16828ADA0E97068F98FE7635747FB7C3 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		93799AFD06C102354FD495EF73B77FF9 /* Build configuration list for PBXNativeTarget "StartAtLoginController" */ = {
+		9486CFB1B75A4A77405085F9BCC95C09 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				1E8D7E2665070FB0E9EAEFD618E03CE8 /* Debug */,
-				83F73C6840A91108DFD9F209C46F9CD4 /* Release */,
+				F273CF5E4C5DA08522DE9668C2B0CA7A /* Debug */,
+				C5DE1599F06F07CDAE96F08D5054107A /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m b/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
index 9c0b6a5..29cb731 100644
--- a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
+++ b/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
@@ -31,7 +31,7 @@
 #import "RHPreferencesWindowController.h"
 
 static NSString * const RHPreferencesWindowControllerSelectedItemIdentifier = @"RHPreferencesWindowControllerSelectedItemIdentifier";
-static const CGFloat RHPreferencesWindowControllerResizeAnimationDurationPer100Pixels = 0.05f;
+static const CGFloat RHPreferencesWindowControllerResizeAnimationDurationPer100Pixels = 0.13f;
 
 #pragma mark - Custom Item Placeholder Controller
 @interface RHPreferencesCustomPlaceholderController : NSObject <RHPreferencesViewControllerProtocol> {
diff --git a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig b/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig
index 9d4b5ce..7f08449 100644
--- a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig	
+++ b/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig	
@@ -1,4 +1,8 @@
+CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
+HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_ROOT = ${SRCROOT}
-SKIP_INSTALL = YES
\ No newline at end of file
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig b/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig
index 4969e56..773f68b 100644
--- a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig	
+++ b/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig	
@@ -1,5 +1,9 @@
+CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MASShortcut
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MASShortcut" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
+HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MASShortcut" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
 OTHER_LDFLAGS = -framework "Carbon"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_ROOT = ${SRCROOT}
-SKIP_INSTALL = YES
\ No newline at end of file
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown
similarity index 87%
rename from Pods/Target Support Files/Pods/Pods-acknowledgements.markdown
rename to Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown
index ec2e14d..d3b6803 100644
--- a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown	
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown	
@@ -152,4 +152,30 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 IN THE SOFTWARE.
 
-Generated by CocoaPods - http://cocoapods.org
+
+## WebViewJavascriptBridge
+
+Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Generated by CocoaPods - https://cocoapods.org
diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist
similarity index 86%
rename from Pods/Target Support Files/Pods/Pods-acknowledgements.plist
rename to Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist
index 0f24232..6ceb37a 100644
--- a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist	
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist	
@@ -24,6 +24,8 @@ Neither the name of Peter Hosey nor the names of his contributors may be used to
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 </string>
+			<key>License</key>
+			<string>BSD</string>
 			<key>Title</key>
 			<string>ISO8601DateFormatter</string>
 			<key>Type</key>
@@ -85,6 +87,8 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 </string>
+			<key>License</key>
+			<string>Modified BSD</string>
 			<key>Title</key>
 			<string>RHPreferences</string>
 			<key>Type</key>
@@ -153,6 +157,8 @@ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 </string>
+			<key>License</key>
+			<string>MIT</string>
 			<key>Title</key>
 			<string>Sparkle</string>
 			<key>Type</key>
@@ -179,6 +185,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 IN THE SOFTWARE.
 </string>
+			<key>License</key>
+			<string>MIT</string>
 			<key>Title</key>
 			<string>StartAtLoginController</string>
 			<key>Type</key>
@@ -186,7 +194,39 @@ IN THE SOFTWARE.
 		</dict>
 		<dict>
 			<key>FooterText</key>
-			<string>Generated by CocoaPods - http://cocoapods.org</string>
+			<string>Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>WebViewJavascriptBridge</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - https://cocoapods.org</string>
 			<key>Title</key>
 			<string></string>
 			<key>Type</key>
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m
new file mode 100644
index 0000000..f22c812
--- /dev/null
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m	
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_Pods_quark_shell : NSObject
+@end
+@implementation PodsDummy_Pods_quark_shell
+@end
diff --git a/Pods/Target Support Files/Pods/Pods-frameworks.sh b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh
similarity index 93%
rename from Pods/Target Support Files/Pods/Pods-frameworks.sh
rename to Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh
index c9aab1e..21a96fd 100755
--- a/Pods/Target Support Files/Pods/Pods-frameworks.sh	
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh	
@@ -16,7 +16,7 @@ install_framework()
     local source="$1"
   fi
 
-  local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+  local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
 
   if [ -L "${source}" ]; then
       echo "Symlinked..."
@@ -59,8 +59,8 @@ code_sign_if_enabled() {
   if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
     # Use the current code_sign_identitiy
     echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
-    echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\""
-    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1"
+    echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\""
+    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1"
   fi
 }
 
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh
new file mode 100755
index 0000000..e3b67f1
--- /dev/null
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh	
@@ -0,0 +1,102 @@
+#!/bin/sh
+set -e
+
+mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+
+RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
+> "$RESOURCES_TO_COPY"
+
+XCASSET_FILES=()
+
+case "${TARGETED_DEVICE_FAMILY}" in
+  1,2)
+    TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
+    ;;
+  1)
+    TARGET_DEVICE_ARGS="--target-device iphone"
+    ;;
+  2)
+    TARGET_DEVICE_ARGS="--target-device ipad"
+    ;;
+  *)
+    TARGET_DEVICE_ARGS="--target-device mac"
+    ;;
+esac
+
+install_resource()
+{
+  if [[ "$1" = /* ]] ; then
+    RESOURCE_PATH="$1"
+  else
+    RESOURCE_PATH="${PODS_ROOT}/$1"
+  fi
+  if [[ ! -e "$RESOURCE_PATH" ]] ; then
+    cat << EOM
+error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
+EOM
+    exit 1
+  fi
+  case $RESOURCE_PATH in
+    *.storyboard)
+      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
+      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
+      ;;
+    *.xib)
+      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
+      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
+      ;;
+    *.framework)
+      echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+      ;;
+    *.xcdatamodel)
+      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\""
+      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
+      ;;
+    *.xcdatamodeld)
+      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\""
+      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
+      ;;
+    *.xcmappingmodel)
+      echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\""
+      xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
+      ;;
+    *.xcassets)
+      ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
+      XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
+      ;;
+    *)
+      echo "$RESOURCE_PATH"
+      echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
+      ;;
+  esac
+}
+if [[ "$CONFIGURATION" == "Debug" ]]; then
+  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
+fi
+if [[ "$CONFIGURATION" == "Release" ]]; then
+  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
+fi
+
+mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
+  mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+fi
+rm -f "$RESOURCES_TO_COPY"
+
+if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
+then
+  # Find all other xcassets (this unfortunately includes those of path pods and other targets).
+  OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
+  while read line; do
+    if [[ $line != "${PODS_ROOT}*" ]]; then
+      XCASSET_FILES+=("$line")
+    fi
+  done <<<"$OTHER_XCASSETS"
+
+  printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
+fi
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig
new file mode 100644
index 0000000..934d233
--- /dev/null
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig	
@@ -0,0 +1,11 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
+LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RHPreferences" "$PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -l"WebViewJavascriptBridge" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle" -framework "WebKit"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}/Pods
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig
new file mode 100644
index 0000000..934d233
--- /dev/null
+++ b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig	
@@ -0,0 +1,11 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
+LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RHPreferences" "$PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -l"WebViewJavascriptBridge" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle" -framework "WebKit"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}/Pods
diff --git a/Pods/Target Support Files/Pods/Pods-dummy.m b/Pods/Target Support Files/Pods/Pods-dummy.m
deleted file mode 100644
index ade64bd..0000000
--- a/Pods/Target Support Files/Pods/Pods-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_Pods : NSObject
-@end
-@implementation PodsDummy_Pods
-@end
diff --git a/Pods/Target Support Files/Pods/Pods-resources.sh b/Pods/Target Support Files/Pods/Pods-resources.sh
deleted file mode 100755
index 6fd731e..0000000
--- a/Pods/Target Support Files/Pods/Pods-resources.sh	
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/bin/sh
-set -e
-
-mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-
-RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
-> "$RESOURCES_TO_COPY"
-
-XCASSET_FILES=()
-
-realpath() {
-  DIRECTORY="$(cd "${1%/*}" && pwd)"
-  FILENAME="${1##*/}"
-  echo "$DIRECTORY/$FILENAME"
-}
-
-install_resource()
-{
-  case $1 in
-    *.storyboard)
-      echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
-      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
-      ;;
-    *.xib)
-      echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
-      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
-      ;;
-    *.framework)
-      echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      ;;
-    *.xcdatamodel)
-      echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\""
-      xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom"
-      ;;
-    *.xcdatamodeld)
-      echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\""
-      xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd"
-      ;;
-    *.xcmappingmodel)
-      echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\""
-      xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm"
-      ;;
-    *.xcassets)
-      ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1")
-      XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
-      ;;
-    /*)
-      echo "$1"
-      echo "$1" >> "$RESOURCES_TO_COPY"
-      ;;
-    *)
-      echo "${PODS_ROOT}/$1"
-      echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY"
-      ;;
-  esac
-}
-if [[ "$CONFIGURATION" == "Debug" ]]; then
-  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
-fi
-if [[ "$CONFIGURATION" == "Release" ]]; then
-  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
-fi
-
-mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
-  mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-fi
-rm -f "$RESOURCES_TO_COPY"
-
-if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
-then
-  case "${TARGETED_DEVICE_FAMILY}" in
-    1,2)
-      TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
-      ;;
-    1)
-      TARGET_DEVICE_ARGS="--target-device iphone"
-      ;;
-    2)
-      TARGET_DEVICE_ARGS="--target-device ipad"
-      ;;
-    *)
-      TARGET_DEVICE_ARGS="--target-device mac"
-      ;;
-  esac
-
-  # Find all other xcassets (this unfortunately includes those of path pods and other targets).
-  OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
-  while read line; do
-    if [[ $line != "`realpath $PODS_ROOT`*" ]]; then
-      XCASSET_FILES+=("$line")
-    fi
-  done <<<"$OTHER_XCASSETS"
-
-  printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-fi
diff --git a/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/Pods/Target Support Files/Pods/Pods.debug.xcconfig
deleted file mode 100644
index 8982eb6..0000000
--- a/Pods/Target Support Files/Pods/Pods.debug.xcconfig	
+++ /dev/null
@@ -1,7 +0,0 @@
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle" "${PODS_ROOT}/Sparkle"
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
-LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController"
-OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle"
-PODS_ROOT = ${SRCROOT}/Pods
\ No newline at end of file
diff --git a/Pods/Target Support Files/Pods/Pods.release.xcconfig b/Pods/Target Support Files/Pods/Pods.release.xcconfig
deleted file mode 100644
index 8982eb6..0000000
--- a/Pods/Target Support Files/Pods/Pods.release.xcconfig	
+++ /dev/null
@@ -1,7 +0,0 @@
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle" "${PODS_ROOT}/Sparkle"
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
-LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController"
-OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle"
-PODS_ROOT = ${SRCROOT}/Pods
\ No newline at end of file
diff --git a/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig b/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig
index 730459f..ed5dc20 100644
--- a/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig	
+++ b/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig	
@@ -1,5 +1,9 @@
+CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RHPreferences
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RHPreferences" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
+HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RHPreferences" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
 OTHER_LDFLAGS = -framework "Cocoa"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_ROOT = ${SRCROOT}
-SKIP_INSTALL = YES
\ No newline at end of file
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig b/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig
index 7927430..be459c0 100644
--- a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig	
+++ b/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig	
@@ -1,5 +1,9 @@
+CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/StartAtLoginController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController"
+HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/StartAtLoginController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
 OTHER_LDFLAGS = -framework "ServiceManagement"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_ROOT = ${SRCROOT}
-SKIP_INSTALL = YES
\ No newline at end of file
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m
new file mode 100644
index 0000000..6c5914c
--- /dev/null
+++ b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m	
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_WebViewJavascriptBridge : NSObject
+@end
+@implementation PodsDummy_WebViewJavascriptBridge
+@end
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch
new file mode 100644
index 0000000..b9c163b
--- /dev/null
+++ b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch	
@@ -0,0 +1,4 @@
+#ifdef __OBJC__
+#import <Cocoa/Cocoa.h>
+#endif
+
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig
new file mode 100644
index 0000000..4717295
--- /dev/null
+++ b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig	
@@ -0,0 +1,9 @@
+CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
+OTHER_LDFLAGS = -framework "WebKit"
+PODS_BUILD_DIR = $BUILD_DIR
+PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
diff --git a/Pods/WebViewJavascriptBridge/LICENSE b/Pods/WebViewJavascriptBridge/LICENSE
new file mode 100644
index 0000000..56b0824
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Pods/WebViewJavascriptBridge/README.md b/Pods/WebViewJavascriptBridge/README.md
new file mode 100644
index 0000000..ab7af42
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/README.md
@@ -0,0 +1,219 @@
+WebViewJavascriptBridge
+=======================
+
+[![Build Status](https://travis-ci.org/marcuswestin/WebViewJavascriptBridge.svg)](https://travis-ci.org/marcuswestin/WebViewJavascriptBridge)
+
+An iOS/OSX bridge for sending messages between Obj-C and JavaScript in UIWebViews/WebViews.
+
+Who uses WebViewJavascriptBridge?
+---------------------------------
+WebViewJavascriptBridge is used by a range of companies and projects. This is a small and incomplete sample list:
+
+- [Facebook Messenger](https://www.facebook.com/mobile/messenger)
+- [Facebook Paper](https://facebook.com/paper)
+- [Yardsale](http://www.getyardsale.com/)
+- [EverTrue](http://www.evertrue.com/)
+- [Game Insight](http://www.game-insight.com/)
+- [Sush.io](http://www.sush.io)
+- [Imbed](http://imbed.github.io/)
+- [CareZone](https://carezone.com)
+- [Hemlig](http://www.hemlig.co)
+- [Altralogica](http://www.altralogica.it)
+- [鼎盛中华](https://itunes.apple.com/us/app/ding-sheng-zhong-hua/id537273940?mt=8)
+- [FRIL](https://fril.jp)
+- [留白·WHITE](http://liubaiapp.com)
+
+Installation (iOS & OSX)
+------------------------
+
+### Installation with CocoaPods
+Add this to your [podfile](https://guides.cocoapods.org/using/getting-started.html) and run `pod install` to install:
+
+```ruby
+`pod 'WebViewJavascriptBridge', '~> 5.0'`
+```
+
+### Manual installation
+
+Drag the `WebViewJavascriptBridge` folder into your project.
+
+In the dialog that appears, uncheck "Copy items into destination group's folder" and select "Create groups for any folders".
+
+Examples
+--------
+
+See the `Example Apps/` folder. Open either the iOS or OSX project and hit run to see it in action.
+
+To use a WebViewJavascriptBridge in your own project:
+
+Usage
+-----
+
+1) Import the header file and declare an ivar property:
+
+```objc
+#import "WebViewJavascriptBridge.h"
+```
+
+...
+
+```objc
+@property WebViewJavascriptBridge* bridge;
+```
+
+2) Instantiate WebViewJavascriptBridge with a UIWebView (iOS) or WebView (OSX):
+
+```objc
+self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
+```
+
+3) Register a handler in ObjC, and call a JS handler:
+
+```objc
+[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {
+	NSLog(@"ObjC Echo called with: %@", data);
+	responseCallback(data);
+}];
+[self.bridge callHandler:@"JS Echo" responseCallback:^(id responseData) {
+	NSLog(@"ObjC received response: %@", responseData);
+}];
+```
+
+4) Copy and paste `setupWebViewJavascriptBridge` into your JS:
+	
+```javascript
+function setupWebViewJavascriptBridge(callback) {
+	if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
+	if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
+	window.WVJBCallbacks = [callback];
+	var WVJBIframe = document.createElement('iframe');
+	WVJBIframe.style.display = 'none';
+	WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
+	document.documentElement.appendChild(WVJBIframe);
+	setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
+}
+```
+
+5) Finally, call `setupWebViewJavascriptBridge` and then use the bridge to register handlers and call ObjC handlers:
+
+```javascript
+setupWebViewJavascriptBridge(function(bridge) {
+	
+	/* Initialize your app here */
+
+	bridge.registerHandler('JS Echo', function(data, responseCallback) {
+		console.log("JS Echo called with:", data)
+		responseCallback(data)
+	})
+	bridge.callHandler('ObjC Echo', function responseCallback(responseData) {
+		console.log("JS received response:", responseData)
+	})
+})
+```
+
+WKWebView Support (iOS 8+ & OS 10.10+)
+--------------------------------------
+
+(WARNING: WKWebView still has [bugs and missing network APIs.](https://github.com/ShingoFukuyama/WKWebViewTips/blob/master/README.md) It may not be a simple drop-in replacement).
+
+WebViewJavascriptBridge supports [WKWebView](http://nshipster.com/wkwebkit/) for iOS 8 and OSX Yosemite. In order to use WKWebView you need to instantiate the `WKWebViewJavascriptBridge`. The rest of the `WKWebViewJavascriptBridge` API is the same as `WebViewJavascriptBridge`.
+
+1) Import the header file:
+
+```objc
+#import "WKWebViewJavascriptBridge.h"
+```
+
+2) Instantiate WKWebViewJavascriptBridge and with a WKWebView object
+
+```objc
+WKWebViewJavascriptBridge* bridge = [WKWebViewJavascriptBridge bridgeForWebView:webView];
+```
+
+Contributors & Forks
+--------------------
+Contributors: https://github.com/marcuswestin/WebViewJavascriptBridge/graphs/contributors
+
+Forks: https://github.com/marcuswestin/WebViewJavascriptBridge/network/members
+
+API Reference
+-------------
+
+### ObjC API
+
+##### `[WebViewJavascriptBridge bridgeForWebView:(UIWebView/WebView*)webview`
+
+Create a javascript bridge for the given web view.
+
+Example:
+
+```objc	
+[WebViewJavascriptBridge bridgeForWebView:webView];
+```
+
+##### `[bridge registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler]`
+
+Register a handler called `handlerName`. The javascript can then call this handler with `WebViewJavascriptBridge.callHandler("handlerName")`.
+
+Example:
+
+```objc
+[self.bridge registerHandler:@"getScreenHeight" handler:^(id data, WVJBResponseCallback responseCallback) {
+	responseCallback([NSNumber numberWithInt:[UIScreen mainScreen].bounds.size.height]);
+}];
+[self.bridge registerHandler:@"log" handler:^(id data, WVJBResponseCallback responseCallback) {
+	NSLog(@"Log: %@", data);
+}];
+
+```
+
+##### `[bridge callHandler:(NSString*)handlerName data:(id)data]`
+##### `[bridge callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)callback]`
+
+Call the javascript handler called `handlerName`. If a `responseCallback` block is given the javascript handler can respond.
+
+Example:
+
+```objc
+[self.bridge callHandler:@"showAlert" data:@"Hi from ObjC to JS!"];
+[self.bridge callHandler:@"getCurrentPageUrl" data:nil responseCallback:^(id responseData) {
+	NSLog(@"Current UIWebView page URL is: %@", responseData);
+}];
+```
+
+#### `[bridge setWebViewDelegate:UIWebViewDelegate*)webViewDelegate]`
+
+Optionally, set a `UIWebViewDelegate` if you need to respond to the [web view's lifecycle events](http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html).
+
+
+
+
+### Javascript API
+
+##### `bridge.registerHandler("handlerName", function(responseData) { ... })`
+
+Register a handler called `handlerName`. The ObjC can then call this handler with `[bridge callHandler:"handlerName" data:@"Foo"]` and `[bridge callHandler:"handlerName" data:@"Foo" responseCallback:^(id responseData) { ... }]`
+
+Example:
+
+```javascript
+bridge.registerHandler("showAlert", function(data) { alert(data) })
+bridge.registerHandler("getCurrentPageUrl", function(data, responseCallback) {
+	responseCallback(document.location.toString())
+})
+```
+
+
+##### `bridge.callHander("handlerName", data)`
+##### `bridge.callHander("handlerName", data, function responseCallback(responseData) { ... })`
+
+Call an ObjC handler called `handlerName`. If a `responseCallback` function is given the ObjC handler can respond.
+
+Example:
+
+```javascript
+bridge.callHandler("Log", "Foo")
+bridge.callHandler("getScreenHeight", null, function(response) {
+	alert('Screen height:' + response)
+})
+```
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
new file mode 100644
index 0000000..99859f0
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
@@ -0,0 +1,32 @@
+//
+//  WKWebViewJavascriptBridge.h
+//
+//  Created by @LokiMeyburg on 10/15/14.
+//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
+//
+
+#if (__MAC_OS_X_VERSION_MAX_ALLOWED > __MAC_10_9 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_1)
+#define supportsWKWebKit
+#endif
+
+#if defined(supportsWKWebKit )
+
+#import <Foundation/Foundation.h>
+#import "WebViewJavascriptBridgeBase.h"
+#import <WebKit/WebKit.h>
+
+@interface WKWebViewJavascriptBridge : NSObject<WKNavigationDelegate, WebViewJavascriptBridgeBaseDelegate>
+
++ (instancetype)bridgeForWebView:(WKWebView*)webView;
++ (void)enableLogging;
+
+- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
+- (void)callHandler:(NSString*)handlerName;
+- (void)callHandler:(NSString*)handlerName data:(id)data;
+- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
+- (void)reset;
+- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate;
+
+@end
+
+#endif
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
new file mode 100644
index 0000000..88679fb
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
@@ -0,0 +1,172 @@
+//
+//  WKWebViewJavascriptBridge.m
+//
+//  Created by @LokiMeyburg on 10/15/14.
+//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
+//
+
+
+#import "WKWebViewJavascriptBridge.h"
+
+#if defined(supportsWKWebKit)
+
+@implementation WKWebViewJavascriptBridge {
+    WKWebView* _webView;
+    id<WKNavigationDelegate> _webViewDelegate;
+    long _uniqueId;
+    WebViewJavascriptBridgeBase *_base;
+}
+
+/* API
+ *****/
+
++ (void)enableLogging { [WebViewJavascriptBridgeBase enableLogging]; }
+
++ (instancetype)bridgeForWebView:(WKWebView*)webView {
+    WKWebViewJavascriptBridge* bridge = [[self alloc] init];
+    [bridge _setupInstance:webView];
+    [bridge reset];
+    return bridge;
+}
+
+- (void)send:(id)data {
+    [self send:data responseCallback:nil];
+}
+
+- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
+    [_base sendData:data responseCallback:responseCallback handlerName:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName {
+    [self callHandler:handlerName data:nil responseCallback:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName data:(id)data {
+    [self callHandler:handlerName data:data responseCallback:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
+    [_base sendData:data responseCallback:responseCallback handlerName:handlerName];
+}
+
+- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
+    _base.messageHandlers[handlerName] = [handler copy];
+}
+
+- (void)reset {
+    [_base reset];
+}
+
+- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate {
+    _webViewDelegate = webViewDelegate;
+}
+
+/* Internals
+ ***********/
+
+- (void)dealloc {
+    _base = nil;
+    _webView = nil;
+    _webViewDelegate = nil;
+    _webView.navigationDelegate = nil;
+}
+
+
+/* WKWebView Specific Internals
+ ******************************/
+
+- (void) _setupInstance:(WKWebView*)webView {
+    _webView = webView;
+    _webView.navigationDelegate = self;
+    _base = [[WebViewJavascriptBridgeBase alloc] init];
+    _base.delegate = self;
+}
+
+
+- (void)WKFlushMessageQueue {
+    [_webView evaluateJavaScript:[_base webViewJavascriptFetchQueyCommand] completionHandler:^(NSString* result, NSError* error) {
+        if (error != nil) {
+            NSLog(@"WebViewJavascriptBridge: WARNING: Error when trying to fetch data from WKWebView: %@", error);
+        }
+        [_base flushMessageQueue:result];
+    }];
+}
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
+{
+    if (webView != _webView) { return; }
+    
+    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFinishNavigation:)]) {
+        [strongDelegate webView:webView didFinishNavigation:navigation];
+    }
+}
+
+
+- (void)webView:(WKWebView *)webView
+decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
+decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
+    if (webView != _webView) { return; }
+    NSURL *url = navigationAction.request.URL;
+    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
+
+    if ([_base isCorrectProcotocolScheme:url]) {
+        if ([_base isBridgeLoadedURL:url]) {
+            [_base injectJavascriptFile];
+        } else if ([_base isQueueMessageURL:url]) {
+            [self WKFlushMessageQueue];
+        } else {
+            [_base logUnkownMessage:url];
+        }
+        decisionHandler(WKNavigationActionPolicyCancel);
+    }
+    
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) {
+        [_webViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
+    } else {
+        decisionHandler(WKNavigationActionPolicyAllow);
+    }
+}
+
+- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
+    if (webView != _webView) { return; }
+    
+    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)]) {
+        [strongDelegate webView:webView didStartProvisionalNavigation:navigation];
+    }
+}
+
+
+- (void)webView:(WKWebView *)webView
+didFailNavigation:(WKNavigation *)navigation
+      withError:(NSError *)error {
+    if (webView != _webView) { return; }
+    
+    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailNavigation:withError:)]) {
+        [strongDelegate webView:webView didFailNavigation:navigation withError:error];
+    }
+}
+
+- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
+    if (webView != _webView) { return; }
+    
+    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailProvisionalNavigation:withError:)]) {
+        [strongDelegate webView:webView didFailProvisionalNavigation:navigation withError:error];
+    }
+}
+
+- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand
+{
+    [_webView evaluateJavaScript:javascriptCommand completionHandler:nil];
+    return NULL;
+}
+
+
+
+@end
+
+
+#endif
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
new file mode 100755
index 0000000..aff0553
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
@@ -0,0 +1,37 @@
+//
+//  WebViewJavascriptBridge.h
+//  ExampleApp-iOS
+//
+//  Created by Marcus Westin on 6/14/13.
+//  Copyright (c) 2013 Marcus Westin. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "WebViewJavascriptBridgeBase.h"
+
+#if defined __MAC_OS_X_VERSION_MAX_ALLOWED
+    #import <WebKit/WebKit.h>
+    #define WVJB_PLATFORM_OSX
+    #define WVJB_WEBVIEW_TYPE WebView
+    #define WVJB_WEBVIEW_DELEGATE_TYPE NSObject<WebViewJavascriptBridgeBaseDelegate>
+    #define WVJB_WEBVIEW_DELEGATE_INTERFACE NSObject<WebViewJavascriptBridgeBaseDelegate, WebPolicyDelegate>
+#elif defined __IPHONE_OS_VERSION_MAX_ALLOWED
+    #import <UIKit/UIWebView.h>
+    #define WVJB_PLATFORM_IOS
+    #define WVJB_WEBVIEW_TYPE UIWebView
+    #define WVJB_WEBVIEW_DELEGATE_TYPE NSObject<UIWebViewDelegate>
+    #define WVJB_WEBVIEW_DELEGATE_INTERFACE NSObject<UIWebViewDelegate, WebViewJavascriptBridgeBaseDelegate>
+#endif
+
+@interface WebViewJavascriptBridge : WVJB_WEBVIEW_DELEGATE_INTERFACE
+
++ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView;
++ (void)enableLogging;
++ (void)setLogMaxLength:(int)length;
+
+- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
+- (void)callHandler:(NSString*)handlerName;
+- (void)callHandler:(NSString*)handlerName data:(id)data;
+- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
+- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate;
+@end
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
new file mode 100755
index 0000000..20e88d4
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
@@ -0,0 +1,185 @@
+//
+//  WebViewJavascriptBridge.m
+//  ExampleApp-iOS
+//
+//  Created by Marcus Westin on 6/14/13.
+//  Copyright (c) 2013 Marcus Westin. All rights reserved.
+//
+
+#import "WebViewJavascriptBridge.h"
+
+#if __has_feature(objc_arc_weak)
+    #define WVJB_WEAK __weak
+#else
+    #define WVJB_WEAK __unsafe_unretained
+#endif
+
+@implementation WebViewJavascriptBridge {
+    WVJB_WEAK WVJB_WEBVIEW_TYPE* _webView;
+    WVJB_WEAK id _webViewDelegate;
+    long _uniqueId;
+    WebViewJavascriptBridgeBase *_base;
+}
+
+/* API
+ *****/
+
++ (void)enableLogging { [WebViewJavascriptBridgeBase enableLogging]; }
++ (void)setLogMaxLength:(int)length { [WebViewJavascriptBridgeBase setLogMaxLength:length]; }
+
++ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView {
+    WebViewJavascriptBridge* bridge = [[self alloc] init];
+    [bridge _platformSpecificSetup:webView];
+    return bridge;
+}
+
+- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate {
+    _webViewDelegate = webViewDelegate;
+}
+
+- (void)send:(id)data {
+    [self send:data responseCallback:nil];
+}
+
+- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
+    [_base sendData:data responseCallback:responseCallback handlerName:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName {
+    [self callHandler:handlerName data:nil responseCallback:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName data:(id)data {
+    [self callHandler:handlerName data:data responseCallback:nil];
+}
+
+- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
+    [_base sendData:data responseCallback:responseCallback handlerName:handlerName];
+}
+
+- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
+    _base.messageHandlers[handlerName] = [handler copy];
+}
+
+/* Platform agnostic internals
+ *****************************/
+
+- (void)dealloc {
+    [self _platformSpecificDealloc];
+    _base = nil;
+    _webView = nil;
+    _webViewDelegate = nil;
+}
+
+- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand
+{
+    return [_webView stringByEvaluatingJavaScriptFromString:javascriptCommand];
+}
+
+/* Platform specific internals: OSX
+ **********************************/
+#if defined WVJB_PLATFORM_OSX
+
+- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView {
+    _webView = webView;
+    
+    _webView.policyDelegate = self;
+    
+    _base = [[WebViewJavascriptBridgeBase alloc] init];
+    _base.delegate = self;
+}
+
+- (void) _platformSpecificDealloc {
+    _webView.policyDelegate = nil;
+}
+
+- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
+{
+    if (webView != _webView) { return; }
+    
+    NSURL *url = [request URL];
+    if ([_base isCorrectProcotocolScheme:url]) {
+        if ([_base isBridgeLoadedURL:url]) {
+            [_base injectJavascriptFile];
+        } else if ([_base isQueueMessageURL:url]) {
+            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
+            [_base flushMessageQueue:messageQueueString];
+        } else {
+            [_base logUnkownMessage:url];
+        }
+        [listener ignore];
+    } else if (_webViewDelegate && [_webViewDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)]) {
+        [_webViewDelegate webView:webView decidePolicyForNavigationAction:actionInformation request:request frame:frame decisionListener:listener];
+    } else {
+        [listener use];
+    }
+}
+
+
+
+/* Platform specific internals: iOS
+ **********************************/
+#elif defined WVJB_PLATFORM_IOS
+
+- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView {
+    _webView = webView;
+    _webView.delegate = self;
+    _base = [[WebViewJavascriptBridgeBase alloc] init];
+    _base.delegate = self;
+}
+
+- (void) _platformSpecificDealloc {
+    _webView.delegate = nil;
+}
+
+- (void)webViewDidFinishLoad:(UIWebView *)webView {
+    if (webView != _webView) { return; }
+    
+    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
+        [strongDelegate webViewDidFinishLoad:webView];
+    }
+}
+
+- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
+    if (webView != _webView) { return; }
+    
+    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
+        [strongDelegate webView:webView didFailLoadWithError:error];
+    }
+}
+
+- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
+    if (webView != _webView) { return YES; }
+    NSURL *url = [request URL];
+    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
+    if ([_base isCorrectProcotocolScheme:url]) {
+        if ([_base isBridgeLoadedURL:url]) {
+            [_base injectJavascriptFile];
+        } else if ([_base isQueueMessageURL:url]) {
+            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
+            [_base flushMessageQueue:messageQueueString];
+        } else {
+            [_base logUnkownMessage:url];
+        }
+        return NO;
+    } else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
+        return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
+    } else {
+        return YES;
+    }
+}
+
+- (void)webViewDidStartLoad:(UIWebView *)webView {
+    if (webView != _webView) { return; }
+    
+    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
+    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
+        [strongDelegate webViewDidStartLoad:webView];
+    }
+}
+
+#endif
+
+@end
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
new file mode 100755
index 0000000..16b23c7
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
@@ -0,0 +1,44 @@
+//
+//  WebViewJavascriptBridgeBase.h
+//
+//  Created by @LokiMeyburg on 10/15/14.
+//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#define kCustomProtocolScheme @"wvjbscheme"
+#define kQueueHasMessage      @"__WVJB_QUEUE_MESSAGE__"
+#define kBridgeLoaded         @"__BRIDGE_LOADED__"
+
+typedef void (^WVJBResponseCallback)(id responseData);
+typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback);
+typedef NSDictionary WVJBMessage;
+
+@protocol WebViewJavascriptBridgeBaseDelegate <NSObject>
+- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand;
+@end
+
+@interface WebViewJavascriptBridgeBase : NSObject
+
+
+@property (assign) id <WebViewJavascriptBridgeBaseDelegate> delegate;
+@property (strong, nonatomic) NSMutableArray* startupMessageQueue;
+@property (strong, nonatomic) NSMutableDictionary* responseCallbacks;
+@property (strong, nonatomic) NSMutableDictionary* messageHandlers;
+@property (strong, nonatomic) WVJBHandler messageHandler;
+
++ (void)enableLogging;
++ (void)setLogMaxLength:(int)length;
+- (void)reset;
+- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName;
+- (void)flushMessageQueue:(NSString *)messageQueueString;
+- (void)injectJavascriptFile;
+- (BOOL)isCorrectProcotocolScheme:(NSURL*)url;
+- (BOOL)isQueueMessageURL:(NSURL*)urll;
+- (BOOL)isBridgeLoadedURL:(NSURL*)urll;
+- (void)logUnkownMessage:(NSURL*)url;
+- (NSString *)webViewJavascriptCheckCommand;
+- (NSString *)webViewJavascriptFetchQueyCommand;
+
+@end
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
new file mode 100755
index 0000000..f290a48
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
@@ -0,0 +1,214 @@
+//
+//  WebViewJavascriptBridgeBase.m
+//
+//  Created by @LokiMeyburg on 10/15/14.
+//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "WebViewJavascriptBridgeBase.h"
+#import "WebViewJavascriptBridge_JS.h"
+
+@implementation WebViewJavascriptBridgeBase {
+    id _webViewDelegate;
+    long _uniqueId;
+}
+
+static bool logging = false;
+static int logMaxLength = 500;
+
++ (void)enableLogging { logging = true; }
++ (void)setLogMaxLength:(int)length { logMaxLength = length;}
+
+-(id)init {
+    self = [super init];
+    self.messageHandlers = [NSMutableDictionary dictionary];
+    self.startupMessageQueue = [NSMutableArray array];
+    self.responseCallbacks = [NSMutableDictionary dictionary];
+    _uniqueId = 0;
+    return(self);
+}
+
+- (void)dealloc {
+    self.startupMessageQueue = nil;
+    self.responseCallbacks = nil;
+    self.messageHandlers = nil;
+}
+
+- (void)reset {
+    self.startupMessageQueue = [NSMutableArray array];
+    self.responseCallbacks = [NSMutableDictionary dictionary];
+    _uniqueId = 0;
+}
+
+- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName {
+    NSMutableDictionary* message = [NSMutableDictionary dictionary];
+    
+    if (data) {
+        message[@"data"] = data;
+    }
+    
+    if (responseCallback) {
+        NSString* callbackId = [NSString stringWithFormat:@"objc_cb_%ld", ++_uniqueId];
+        self.responseCallbacks[callbackId] = [responseCallback copy];
+        message[@"callbackId"] = callbackId;
+    }
+    
+    if (handlerName) {
+        message[@"handlerName"] = handlerName;
+    }
+    [self _queueMessage:message];
+}
+
+- (void)flushMessageQueue:(NSString *)messageQueueString{
+    if (messageQueueString == nil || messageQueueString.length == 0) {
+        NSLog(@"WebViewJavascriptBridge: WARNING: ObjC got nil while fetching the message queue JSON from webview. This can happen if the WebViewJavascriptBridge JS is not currently present in the webview, e.g if the webview just loaded a new page.");
+        return;
+    }
+
+    id messages = [self _deserializeMessageJSON:messageQueueString];
+    for (WVJBMessage* message in messages) {
+        if (![message isKindOfClass:[WVJBMessage class]]) {
+            NSLog(@"WebViewJavascriptBridge: WARNING: Invalid %@ received: %@", [message class], message);
+            continue;
+        }
+        [self _log:@"RCVD" json:message];
+        
+        NSString* responseId = message[@"responseId"];
+        if (responseId) {
+            WVJBResponseCallback responseCallback = _responseCallbacks[responseId];
+            responseCallback(message[@"responseData"]);
+            [self.responseCallbacks removeObjectForKey:responseId];
+        } else {
+            WVJBResponseCallback responseCallback = NULL;
+            NSString* callbackId = message[@"callbackId"];
+            if (callbackId) {
+                responseCallback = ^(id responseData) {
+                    if (responseData == nil) {
+                        responseData = [NSNull null];
+                    }
+                    
+                    WVJBMessage* msg = @{ @"responseId":callbackId, @"responseData":responseData };
+                    [self _queueMessage:msg];
+                };
+            } else {
+                responseCallback = ^(id ignoreResponseData) {
+                    // Do nothing
+                };
+            }
+            
+            WVJBHandler handler = self.messageHandlers[message[@"handlerName"]];
+            
+            if (!handler) {
+                NSLog(@"WVJBNoHandlerException, No handler for message from JS: %@", message);
+                continue;
+            }
+            
+            handler(message[@"data"], responseCallback);
+        }
+    }
+}
+
+- (void)injectJavascriptFile {
+    NSString *js = WebViewJavascriptBridge_js();
+    [self _evaluateJavascript:js];
+    if (self.startupMessageQueue) {
+        NSArray* queue = self.startupMessageQueue;
+        self.startupMessageQueue = nil;
+        for (id queuedMessage in queue) {
+            [self _dispatchMessage:queuedMessage];
+        }
+    }
+}
+
+-(BOOL)isCorrectProcotocolScheme:(NSURL*)url {
+    if([[url scheme] isEqualToString:kCustomProtocolScheme]){
+        return YES;
+    } else {
+        return NO;
+    }
+}
+
+-(BOOL)isQueueMessageURL:(NSURL*)url {
+    if([[url host] isEqualToString:kQueueHasMessage]){
+        return YES;
+    } else {
+        return NO;
+    }
+}
+
+-(BOOL)isBridgeLoadedURL:(NSURL*)url {
+    return ([[url scheme] isEqualToString:kCustomProtocolScheme] && [[url host] isEqualToString:kBridgeLoaded]);
+}
+
+-(void)logUnkownMessage:(NSURL*)url {
+    NSLog(@"WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@://%@", kCustomProtocolScheme, [url path]);
+}
+
+-(NSString *)webViewJavascriptCheckCommand {
+    return @"typeof WebViewJavascriptBridge == \'object\';";
+}
+
+-(NSString *)webViewJavascriptFetchQueyCommand {
+    return @"WebViewJavascriptBridge._fetchQueue();";
+}
+
+// Private
+// -------------------------------------------
+
+- (void) _evaluateJavascript:(NSString *)javascriptCommand {
+    [self.delegate _evaluateJavascript:javascriptCommand];
+}
+
+- (void)_queueMessage:(WVJBMessage*)message {
+    if (self.startupMessageQueue) {
+        [self.startupMessageQueue addObject:message];
+    } else {
+        [self _dispatchMessage:message];
+    }
+}
+
+- (void)_dispatchMessage:(WVJBMessage*)message {
+    NSString *messageJSON = [self _serializeMessage:message pretty:NO];
+    [self _log:@"SEND" json:messageJSON];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"];
+    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"];
+    
+    NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON];
+    if ([[NSThread currentThread] isMainThread]) {
+        [self _evaluateJavascript:javascriptCommand];
+
+    } else {
+        dispatch_sync(dispatch_get_main_queue(), ^{
+            [self _evaluateJavascript:javascriptCommand];
+        });
+    }
+}
+
+- (NSString *)_serializeMessage:(id)message pretty:(BOOL)pretty{
+    return [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:message options:(NSJSONWritingOptions)(pretty ? NSJSONWritingPrettyPrinted : 0) error:nil] encoding:NSUTF8StringEncoding];
+}
+
+- (NSArray*)_deserializeMessageJSON:(NSString *)messageJSON {
+    return [NSJSONSerialization JSONObjectWithData:[messageJSON dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
+}
+
+- (void)_log:(NSString *)action json:(id)json {
+    if (!logging) { return; }
+    if (![json isKindOfClass:[NSString class]]) {
+        json = [self _serializeMessage:json pretty:YES];
+    }
+    if ([json length] > logMaxLength) {
+        NSLog(@"WVJB %@: %@ [...]", action, [json substringToIndex:logMaxLength]);
+    } else {
+        NSLog(@"WVJB %@: %@", action, json);
+    }
+}
+
+@end
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
new file mode 100644
index 0000000..6cb1cb9
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
@@ -0,0 +1,3 @@
+#import <Foundation/Foundation.h>
+
+NSString * WebViewJavascriptBridge_js();
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m
new file mode 100644
index 0000000..3a494dd
--- /dev/null
+++ b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m
@@ -0,0 +1,123 @@
+// This file contains the source for the Javascript side of the
+// WebViewJavascriptBridge. It is plaintext, but converted to an NSString
+// via some preprocessor tricks.
+//
+// Previous implementations of WebViewJavascriptBridge loaded the javascript source
+// from a resource. This worked fine for app developers, but library developers who
+// included the bridge into their library, awkwardly had to ask consumers of their
+// library to include the resource, violating their encapsulation. By including the
+// Javascript as a string resource, the encapsulation of the library is maintained.
+
+#import "WebViewJavascriptBridge_JS.h"
+
+NSString * WebViewJavascriptBridge_js() {
+	#define __wvjb_js_func__(x) #x
+	
+	// BEGIN preprocessorJSCode
+	static NSString * preprocessorJSCode = @__wvjb_js_func__(
+;(function() {
+	if (window.WebViewJavascriptBridge) {
+		return;
+	}
+	window.WebViewJavascriptBridge = {
+		registerHandler: registerHandler,
+		callHandler: callHandler,
+		_fetchQueue: _fetchQueue,
+		_handleMessageFromObjC: _handleMessageFromObjC
+	};
+
+	var messagingIframe;
+	var sendMessageQueue = [];
+	var messageHandlers = {};
+	
+	var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme';
+	var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__';
+	
+	var responseCallbacks = {};
+	var uniqueId = 1;
+
+	function registerHandler(handlerName, handler) {
+		messageHandlers[handlerName] = handler;
+	}
+	
+	function callHandler(handlerName, data, responseCallback) {
+		if (arguments.length == 2 && typeof data == 'function') {
+			responseCallback = data;
+			data = null;
+		}
+		_doSend({ handlerName:handlerName, data:data }, responseCallback);
+	}
+	
+	function _doSend(message, responseCallback) {
+		if (responseCallback) {
+			var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime();
+			responseCallbacks[callbackId] = responseCallback;
+			message['callbackId'] = callbackId;
+		}
+		sendMessageQueue.push(message);
+		messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
+	}
+
+	function _fetchQueue() {
+		var messageQueueString = JSON.stringify(sendMessageQueue);
+		sendMessageQueue = [];
+		return messageQueueString;
+	}
+
+	function _dispatchMessageFromObjC(messageJSON) {
+		setTimeout(function _timeoutDispatchMessageFromObjC() {
+			var message = JSON.parse(messageJSON);
+			var messageHandler;
+			var responseCallback;
+
+			if (message.responseId) {
+				responseCallback = responseCallbacks[message.responseId];
+				if (!responseCallback) {
+					return;
+				}
+				responseCallback(message.responseData);
+				delete responseCallbacks[message.responseId];
+			} else {
+				if (message.callbackId) {
+					var callbackResponseId = message.callbackId;
+					responseCallback = function(responseData) {
+						_doSend({ responseId:callbackResponseId, responseData:responseData });
+					};
+				}
+				
+				var handler = messageHandlers[message.handlerName];
+				try {
+					handler(message.data, responseCallback);
+				} catch(exception) {
+					console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception);
+				}
+				if (!handler) {
+					console.log("WebViewJavascriptBridge: WARNING: no handler for message from ObjC:", message);
+				}
+			}
+		});
+	}
+	
+	function _handleMessageFromObjC(messageJSON) {
+        _dispatchMessageFromObjC(messageJSON);
+	}
+
+	messagingIframe = document.createElement('iframe');
+	messagingIframe.style.display = 'none';
+	messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
+	document.documentElement.appendChild(messagingIframe);
+
+	setTimeout(_callWVJBCallbacks, 0);
+	function _callWVJBCallbacks() {
+		var callbacks = window.WVJBCallbacks;
+		delete window.WVJBCallbacks;
+		for (var i=0; i<callbacks.length; i++) {
+			callbacks[i](WebViewJavascriptBridge);
+		}
+	}
+})();
+	); // END preprocessorJSCode
+
+	#undef __wvjb_js_func__
+	return preprocessorJSCode;
+};
\ No newline at end of file
diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index 67672b4..bb1b4b2 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -33,7 +33,7 @@
 		1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF6371D18E9FF430099B508 /* QSHWebViewDelegate.m */; };
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
-		2E50CD93BE1C4FDAA087BA31 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BEDF5A5127B1458BB9768C43 /* libPods.a */; };
+		9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 92906357BD95D526FFB4245E /* libPods-quark-shell.a */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -68,6 +68,7 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		02F1A3336EF3226FC19C4B96 /* Pods-quark-shell.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.release.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig"; sourceTree = "<group>"; };
 		1A05BC371B0D8A0B00E5BCED /* quark-shell.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "quark-shell.entitlements"; sourceTree = "<group>"; };
 		1A42764819196B6F00815DC6 /* QSHWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWindow.h; sourceTree = "<group>"; };
 		1A42764919196B6F00815DC6 /* QSHWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWindow.m; sourceTree = "<group>"; };
@@ -115,9 +116,8 @@
 		1AFBA8B719483E4900BEDA0A /* QSHPreferencesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHPreferencesViewController.h; sourceTree = "<group>"; };
 		1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHPreferencesViewController.m; sourceTree = "<group>"; };
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
-		6AFB3BBE0E79B03C1B72DCF5 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
-		BEDF5A5127B1458BB9768C43 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		F95033968F72053A096CA5D2 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
+		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
+		92906357BD95D526FFB4245E /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -127,7 +127,7 @@
 			files = (
 				1A91FA5A18E25F3C00AA8B7E /* WebKit.framework in Frameworks */,
 				1A91F9E318E2530B00AA8B7E /* Cocoa.framework in Frameworks */,
-				2E50CD93BE1C4FDAA087BA31 /* libPods.a in Frameworks */,
+				9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -159,7 +159,7 @@
 				1ADE93531B0F093E00D69828 /* quark-shell-helper */,
 				1A91F9E118E2530B00AA8B7E /* Frameworks */,
 				1A91F9E018E2530B00AA8B7E /* Products */,
-				8DAB617192B594608C5F2565 /* Pods */,
+				736AF7F86A2B1D35667C5FE5 /* Pods */,
 			);
 			sourceTree = "<group>";
 		};
@@ -180,7 +180,7 @@
 				1A91F9E218E2530B00AA8B7E /* Cocoa.framework */,
 				1A91FA0118E2530B00AA8B7E /* XCTest.framework */,
 				1A91F9E418E2530B00AA8B7E /* Other Frameworks */,
-				BEDF5A5127B1458BB9768C43 /* libPods.a */,
+				92906357BD95D526FFB4245E /* libPods-quark-shell.a */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -285,11 +285,11 @@
 			name = "Supporting Files";
 			sourceTree = "<group>";
 		};
-		8DAB617192B594608C5F2565 /* Pods */ = {
+		736AF7F86A2B1D35667C5FE5 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				F95033968F72053A096CA5D2 /* Pods.debug.xcconfig */,
-				6AFB3BBE0E79B03C1B72DCF5 /* Pods.release.xcconfig */,
+				6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */,
+				02F1A3336EF3226FC19C4B96 /* Pods-quark-shell.release.xcconfig */,
 			);
 			name = Pods;
 			sourceTree = "<group>";
@@ -301,14 +301,14 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 1A91FA1018E2530C00AA8B7E /* Build configuration list for PBXNativeTarget "quark-shell" */;
 			buildPhases = (
-				95C1AD7FB7144AA080FC28BA /* Check Pods Manifest.lock */,
+				4C1BC13A0E7EE86363E2E2B8 /* [CP] Check Pods Manifest.lock */,
 				1A91F9DB18E2530B00AA8B7E /* Sources */,
 				1A91F9DC18E2530B00AA8B7E /* Frameworks */,
 				1A91F9DD18E2530B00AA8B7E /* Resources */,
-				28BFB662D6264E858326F16E /* Copy Pods Resources */,
 				1AB53A9819988EA100A4A15F /* Run Script */,
 				1A05BC6D1B0D91D400E5BCED /* Copy Helper */,
-				5B096F10A4B14EE501EBDC12 /* Embed Pods Frameworks */,
+				E231D9E5F6D061FAEE1A90D9 /* [CP] Embed Pods Frameworks */,
+				4CF6684E7B151F82D2520B29 /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -454,49 +454,49 @@
 			shellPath = /bin/sh;
 			shellScript = "echo \"rm -rf \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/app\\\"\"\nrm -rf \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/app\"\n\necho \"cp -RL \\\"${SRCROOT}/app\\\" \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/app\\\"\"\ncp -RL \"${SRCROOT}/app\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/app\"";
 		};
-		28BFB662D6264E858326F16E /* Copy Pods Resources */ = {
+		4C1BC13A0E7EE86363E2E2B8 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Copy Pods Resources";
+			name = "[CP] Check Pods Manifest.lock";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
-		5B096F10A4B14EE501EBDC12 /* Embed Pods Frameworks */ = {
+		4CF6684E7B151F82D2520B29 /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Embed Pods Frameworks";
+			name = "[CP] Copy Pods Resources";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		95C1AD7FB7144AA080FC28BA /* Check Pods Manifest.lock */ = {
+		E231D9E5F6D061FAEE1A90D9 /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Check Pods Manifest.lock";
+			name = "[CP] Embed Pods Frameworks";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */
@@ -668,7 +668,7 @@
 		};
 		1A91FA1118E2530C00AA8B7E /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = F95033968F72053A096CA5D2 /* Pods.debug.xcconfig */;
+			baseConfigurationReference = 6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_ENTITLEMENTS = "quark-shell/quark-shell.entitlements";
@@ -677,6 +677,7 @@
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "quark-shell/quark-shell-Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/quark-shell/quark-shell-Info.plist";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				OTHER_CODE_SIGN_FLAGS = "--deep";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "quark-shell";
@@ -686,7 +687,7 @@
 		};
 		1A91FA1218E2530C00AA8B7E /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 6AFB3BBE0E79B03C1B72DCF5 /* Pods.release.xcconfig */;
+			baseConfigurationReference = 02F1A3336EF3226FC19C4B96 /* Pods-quark-shell.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_ENTITLEMENTS = "quark-shell/quark-shell.entitlements";
@@ -695,6 +696,7 @@
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "quark-shell/quark-shell-Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/quark-shell/quark-shell-Info.plist";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				OTHER_CODE_SIGN_FLAGS = "--deep";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "quark-shell";
@@ -760,6 +762,7 @@
 				);
 				INFOPLIST_FILE = "quark-shell-helper/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -779,6 +782,7 @@
 				GCC_NO_COMMON_BLOCKS = YES;
 				INFOPLIST_FILE = "quark-shell-helper/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/quark-shell/Base.lproj/MainMenu.xib b/quark-shell/Base.lproj/MainMenu.xib
index 5345994..a229147 100644
--- a/quark-shell/Base.lproj/MainMenu.xib
+++ b/quark-shell/Base.lproj/MainMenu.xib
@@ -1,9 +1,7 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15A282b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
-        <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/>
-        <plugIn identifier="com.apple.WebKitIBPlugin" version="8191"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -15,7 +13,6 @@
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <customObject id="Voe-Tx-rLC" customClass="QSHAppDelegate">
             <connections>
-                <outlet property="webView" destination="kp8-f9-tLw" id="5cx-jf-k0f"/>
                 <outlet property="window" destination="9CT-7c-xhj" id="KBM-Ih-ApP"/>
             </connections>
         </customObject>
@@ -23,26 +20,10 @@
         <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="9CT-7c-xhj" customClass="QSHWindow">
             <windowCollectionBehavior key="collectionBehavior" canJoinAllSpaces="YES"/>
             <rect key="contentRect" x="0.0" y="0.0" width="320" height="280"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
             <view key="contentView" id="K10-CQ-J3N" customClass="QSHWindowBorderView">
                 <rect key="frame" x="0.0" y="0.0" width="320" height="280"/>
                 <autoresizingMask key="autoresizingMask"/>
-                <subviews>
-                    <webView translatesAutoresizingMaskIntoConstraints="NO" id="kp8-f9-tLw">
-                        <rect key="frame" x="0.0" y="0.0" width="320" height="270"/>
-                        <animations/>
-                        <webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12">
-                            <nil key="identifier"/>
-                        </webPreferences>
-                    </webView>
-                </subviews>
-                <constraints>
-                    <constraint firstItem="kp8-f9-tLw" firstAttribute="top" secondItem="K10-CQ-J3N" secondAttribute="top" constant="10" id="8yw-um-fHS"/>
-                    <constraint firstAttribute="bottom" secondItem="kp8-f9-tLw" secondAttribute="bottom" id="TUI-1i-XAm"/>
-                    <constraint firstAttribute="trailing" secondItem="kp8-f9-tLw" secondAttribute="trailing" id="dww-IB-gOv"/>
-                    <constraint firstItem="kp8-f9-tLw" firstAttribute="leading" secondItem="K10-CQ-J3N" secondAttribute="leading" id="ouW-Xo-0qu"/>
-                </constraints>
-                <animations/>
             </view>
         </window>
         <menu title="Main Menu" systemMenu="main" id="tdM-1d-aZL">
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index ae8a01e..e603407 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -10,6 +10,7 @@
 #import "QSHWebViewDelegate.h"
 #import "QSHStatusItemView.h"
 #import "NSWindow+Fade.h"
+#import "WKWebViewJavascriptBridge.h"
 
 @interface WebPreferences (WebPreferencesPrivate)
 
@@ -28,59 +29,81 @@ @interface QSHAppDelegate () <NSWindowDelegate>
 
 @end
 
-@implementation QSHAppDelegate
+@implementation QSHAppDelegate {
+    WKWebView *_WKWebView;
+    WKWebViewJavascriptBridge* _WKBridge;
+    NSView* _WKWebViewWrapper;
+}
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
     // TODO: bundle identifier should be generated from manifest.json
-    WebPreferences *webPrefs = [WebPreferences standardPreferences];
     NSString *bundleIdentifier = [[NSBundle mainBundle] infoDictionary][@"CFBundleIdentifier"];
     NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath];
     NSString *savePath = [NSString pathWithComponents:@[applicationSupportFile, bundleIdentifier, @"LocalStorage"]];
-    [webPrefs _setLocalStorageDatabasePath:savePath];
-    [webPrefs setLocalStorageEnabled:YES];
+    
+    [self setupStatusItemAndWindow];
+    [self setupWebView];
+}
 
+- (void)setupStatusItemAndWindow
+{
     NSStatusBar *bar = [NSStatusBar systemStatusBar];
 
     self.statusItem = [bar statusItemWithLength:NSSquareStatusItemLength];
-    if (IS_PRIOR_TO_10_9) {
-        self.statusItemView = [[QSHStatusItemView alloc] initWithFrame:NSMakeRect(0, 0, 20, 20)];
-        self.statusItemView.target = self;
-        self.statusItemView.action = @selector(statusItemClicked);
-        [self.statusItemView sendActionOn:(NSLeftMouseDownMask | NSRightMouseDownMask)];
-        self.statusItem.view = self.statusItemView;
-        self.statusItemView.statusItem = self.statusItem;
-    }
-    else {
-        NSImage *statusIcon = [NSImage imageNamed:@"StatusIcon"];
-        [statusIcon setTemplate:YES];
-        self.statusItem.button.image = statusIcon;
 
-        self.statusItem.button.target = self;
-        self.statusItem.button.action = @selector(statusItemClicked);
-        [self.statusItem.button sendActionOn:(NSLeftMouseDownMask | NSRightMouseDownMask)];
-    }
+    NSImage *statusIcon = [NSImage imageNamed:@"StatusIcon"];
+    [statusIcon setTemplate:YES];
+    self.statusItem.button.image = statusIcon;
+
+    self.statusItem.button.target = self;
+    self.statusItem.button.action = @selector(statusItemClicked);
+    [self.statusItem.button sendActionOn:(NSLeftMouseDownMask | NSRightMouseDownMask)];
 
     self.window.level = NSFloatingWindowLevel;
     self.window.delegate = self;
     [self.window setOpaque:NO];
     [self.window setBackgroundColor:[NSColor clearColor]];
+}
 
-    self.webView.wantsLayer = YES;
-    self.webView.layer.cornerRadius = 5;
-    self.webView.layer.masksToBounds = YES;
-    [self.webView setDrawsBackground:NO];
-
-    NSString *url = [[NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
-    self.webView.mainFrameURL = url;
-
-    self.webViewDelegate = [[QSHWebViewDelegate alloc] init];
-    self.webViewDelegate.appDelegate = self;
-    self.webViewDelegate.statusItem = self.statusItem;
-    self.webViewDelegate.statusItemView = self.statusItemView;
-    self.webViewDelegate.webView = self.webView;
-    self.webView.frameLoadDelegate = self.webViewDelegate;
-    self.webView.UIDelegate = self.webViewDelegate;
+- (void)_createViews {
+    NSView* contentView = _window.contentView;
+    
+    // WKWebView
+    _WKWebView = [[WKWebView alloc] initWithFrame:contentView.frame];
+    [_WKWebView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
+    
+    [contentView addSubview:_WKWebView];
+}
+    
+- (void)_configureWKWebview {
+    // Create Bridge
+    _WKBridge = [WKWebViewJavascriptBridge bridgeForWebView:_WKWebView];
+    
+    [_WKBridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
+        NSLog(@"testObjcCallback called: %@", data);
+        responseCallback(@"Response from testObjcCallback");
+    }];
+    
+    [_WKBridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
+    
+    // Create Buttons
+    NSButton *callbackButton = [[NSButton alloc] initWithFrame:NSMakeRect(5, 0, 120, 40)];
+    [callbackButton setTitle:@"Call handler"];
+    [callbackButton setBezelStyle:NSRoundedBezelStyle];
+    [callbackButton setTarget:self];
+    [callbackButton setAction:@selector(_WKCallHandler)];
+    [_WKWebView addSubview:callbackButton];
+    
+    // Load Page
+    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
+    [_WKWebView loadRequest:[NSURLRequest requestWithURL:URL]];
+}
+    
+- (void)setupWebView
+{
+    [self _createViews];
+    [self _configureWKWebview];
 }
 
 - (void)windowDidResignKey:(NSNotification *)notification

From 6bb6abedb0143b04a5695f80d368853e3df76ae8 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 27 Oct 2016 15:22:36 +0800
Subject: [PATCH 02/43] add QSHWebView

---
 quark-shell.xcodeproj/project.pbxproj |  6 +++
 quark-shell/QSHAppDelegate.m          | 64 +++++++++------------------
 quark-shell/QSHWebView.h              | 16 +++++++
 quark-shell/QSHWebView.m              | 19 ++++++++
 quark-shell/QSHWebViewDelegate.h      | 12 ++++-
 quark-shell/QSHWebViewDelegate.m      | 27 +++++++++--
 sample/index.js                       | 30 ++++++++++++-
 7 files changed, 122 insertions(+), 52 deletions(-)
 create mode 100644 quark-shell/QSHWebView.h
 create mode 100644 quark-shell/QSHWebView.m

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index bb1b4b2..16e2248 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -33,6 +33,7 @@
 		1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF6371D18E9FF430099B508 /* QSHWebViewDelegate.m */; };
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
+		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 92906357BD95D526FFB4245E /* libPods-quark-shell.a */; };
 /* End PBXBuildFile section */
 
@@ -117,6 +118,8 @@
 		1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHPreferencesViewController.m; sourceTree = "<group>"; };
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
+		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
+		8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWebView.m; sourceTree = "<group>"; };
 		92906357BD95D526FFB4245E /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -221,6 +224,8 @@
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
 				1A91F9FA18E2530B00AA8B7E /* Images.xcassets */,
 				1A91F9E918E2530B00AA8B7E /* Supporting Files */,
+				8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */,
+				8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */,
 			);
 			path = "quark-shell";
 			sourceTree = "<group>";
@@ -506,6 +511,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */,
 				1A9A456E1A1C93C600C98589 /* NSWindow+Fade.m in Sources */,
 				1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */,
 				1A91F9F618E2530B00AA8B7E /* QSHAppDelegate.m in Sources */,
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index e603407..d4a7423 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -6,20 +6,18 @@
 //  Copyright (c) 2014 Xhacker. All rights reserved.
 //
 
+#import <WebKit/WebKit.h>
 #import "QSHAppDelegate.h"
+#import "QSHWebView.h"
 #import "QSHWebViewDelegate.h"
 #import "QSHStatusItemView.h"
 #import "NSWindow+Fade.h"
 #import "WKWebViewJavascriptBridge.h"
 
-@interface WebPreferences (WebPreferencesPrivate)
-
-- (void)_setLocalStorageDatabasePath:(NSString *)path;
-- (void)setLocalStorageEnabled:(BOOL)localStorageEnabled;
-
+@interface WKPreferences (WKPrivate)
+@property (nonatomic, setter=_setDeveloperExtrasEnabled:) BOOL _developerExtrasEnabled;
 @end
 
-
 @interface QSHAppDelegate () <NSWindowDelegate>
 
 @property (nonatomic) NSStatusItem *statusItem;
@@ -30,8 +28,7 @@ @interface QSHAppDelegate () <NSWindowDelegate>
 @end
 
 @implementation QSHAppDelegate {
-    WKWebView *_WKWebView;
-    WKWebViewJavascriptBridge* _WKBridge;
+    QSHWebView *_WKWebView;
     NSView* _WKWebViewWrapper;
 }
 
@@ -44,6 +41,15 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
     
     [self setupStatusItemAndWindow];
     [self setupWebView];
+    
+    self.webViewDelegate = [[QSHWebViewDelegate alloc] init];
+    
+//    self.webViewDelegate.appDelegate = self;
+//    self.webViewDelegate.statusItem = self.statusItem;
+//    self.webViewDelegate.statusItemView = self.statusItemView;
+//    self.webViewDelegate.webView = _WKWebView;
+//    _WKWebView.navigationDelegate = self.webViewDelegate;
+//    _WKWebView.UIDelegate = self.webViewDelegate;
 }
 
 - (void)setupStatusItemAndWindow
@@ -70,40 +76,17 @@ - (void)_createViews {
     NSView* contentView = _window.contentView;
     
     // WKWebView
-    _WKWebView = [[WKWebView alloc] initWithFrame:contentView.frame];
+    _WKWebView = [[QSHWebView alloc] initWithFrame:contentView.frame];
     [_WKWebView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
-    
+    _WKWebView.configuration.preferences._developerExtrasEnabled = YES;
     [contentView addSubview:_WKWebView];
 }
-    
-- (void)_configureWKWebview {
-    // Create Bridge
-    _WKBridge = [WKWebViewJavascriptBridge bridgeForWebView:_WKWebView];
-    
-    [_WKBridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
-        NSLog(@"testObjcCallback called: %@", data);
-        responseCallback(@"Response from testObjcCallback");
-    }];
-    
-    [_WKBridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
-    
-    // Create Buttons
-    NSButton *callbackButton = [[NSButton alloc] initWithFrame:NSMakeRect(5, 0, 120, 40)];
-    [callbackButton setTitle:@"Call handler"];
-    [callbackButton setBezelStyle:NSRoundedBezelStyle];
-    [callbackButton setTarget:self];
-    [callbackButton setAction:@selector(_WKCallHandler)];
-    [_WKWebView addSubview:callbackButton];
-    
-    // Load Page
-    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
-    [_WKWebView loadRequest:[NSURLRequest requestWithURL:URL]];
-}
-    
+
 - (void)setupWebView
 {
     [self _createViews];
-    [self _configureWKWebview];
+    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
+    [QSHWebViewDelegate initWebviewWithBridge:_WKWebView url:URL webDelegate:self.webViewDelegate];
 }
 
 - (void)windowDidResignKey:(NSNotification *)notification
@@ -169,14 +152,7 @@ - (void)statusItemClicked
 - (void)refreshStyle
 {
     NSRect itemFrame;
-
-    if (IS_PRIOR_TO_10_9) {
-        self.statusItemView.itemHighlighted = self.shouldBeVisible;
-        itemFrame = self.statusItem.view.window.frame;
-    }
-    else {
-        itemFrame = self.statusItem.button.window.frame;
-    }
+    itemFrame = self.statusItem.button.window.frame;
 
     NSRect windowFrame = self.window.frame;
     windowFrame.origin.x = NSMidX(itemFrame) - NSWidth(windowFrame) / 2.0;
diff --git a/quark-shell/QSHWebView.h b/quark-shell/QSHWebView.h
new file mode 100644
index 0000000..5a24e15
--- /dev/null
+++ b/quark-shell/QSHWebView.h
@@ -0,0 +1,16 @@
+//
+//  QSHWebView.h
+//  quark-shell
+//
+//  Created by 孙亮 on 27/10/2016.
+//  Copyright © 2016 Hackplan. All rights reserved.
+//
+
+#import <WebKit/WebKit.h>
+#import "WKWebViewJavascriptBridge.h"
+
+@interface QSHWebView : WKWebView
+
+@property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
+
+@end
diff --git a/quark-shell/QSHWebView.m b/quark-shell/QSHWebView.m
new file mode 100644
index 0000000..ba5897f
--- /dev/null
+++ b/quark-shell/QSHWebView.m
@@ -0,0 +1,19 @@
+//
+//  QSHWebView.m
+//  quark-shell
+//
+//  Created by 孙亮 on 27/10/2016.
+//  Copyright © 2016 Hackplan. All rights reserved.
+//
+
+#import "QSHWebView.h"
+
+@implementation QSHWebView
+
+- (void)drawRect:(NSRect)dirtyRect {
+    [super drawRect:dirtyRect];
+    
+    // Drawing code here.
+}
+
+@end
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 58b65a2..fe4abf3 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -7,14 +7,22 @@
 //
 
 #import <Foundation/Foundation.h>
+#import <WebKit/WebKit.h>
 #import "QSHStatusItemView.h"
 #import "QSHAppDelegate.h"
+#import "QSHWebView.h"
 
-@interface QSHWebViewDelegate : NSObject <WebUIDelegate, WebFrameLoadDelegate>
+@interface QSHWebViewDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
 
 @property (nonatomic, weak) QSHAppDelegate *appDelegate;
 @property (nonatomic, weak) NSStatusItem *statusItem;
 @property (nonatomic, weak) QSHStatusItemView *statusItemView;
-@property (nonatomic, weak) WebView *webView;
+@property (nonatomic, weak) QSHWebView *webView;
+
++ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
+
++ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate;
+
+- (void)changeIcon:(NSArray *)args;
 
 @end
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 2e08d75..58c1b45 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -15,8 +15,8 @@
 #import <Sparkle/Sparkle.h>
 #import <ISO8601DateFormatter.h>
 #import <StartAtLoginController.h>
+#import "WKWebViewJavascriptBridge.h"
 
-static NSString * const kWebScriptNamespace = @"quark";
 static const NSInteger kPreferencesDefaultHeight = 192;
 
 @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDelegate> {
@@ -55,9 +55,27 @@ - (instancetype)init
     return self;
 }
 
-- (void)webView:(WebView *)webView didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame
++ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate
 {
-    [windowScriptObject setValue:self forKey:kWebScriptNamespace];
+    // Create Bridge
+    WKWebViewJavascriptBridge* _WKBridge = [WKWebViewJavascriptBridge bridgeForWebView:webview];
+    webview.bridge = _WKBridge;
+    
+    [_WKBridge registerHandler:@"quark" handler:^(id data, WVJBResponseCallback responseCallback) {
+        if ([data isKindOfClass:[NSDictionary class]]) {
+            NSLog(@"Trigger method: %@ from JS", data[@"method"]);
+            SEL method = NSSelectorFromString(data[@"method"]);
+            NSArray *args = data[@"args"];
+            if (![QSHWebViewDelegate isSelectorExcludedFromWebScript: method]) {
+                [webDelegate performSelector:method withObject: args];
+            }
+        }
+        responseCallback(@"Response from testObjcCallback");
+    }];
+    
+    // Load Page
+    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
+    [webview loadRequest:[NSURLRequest requestWithURL:URL]];
 }
 
 #pragma mark WebScripting Protocol
@@ -209,8 +227,9 @@ - (void)openURL:(NSString *)url
     [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
 }
 
-- (void)changeIcon:(NSString *)base64
+- (void)changeIcon:(NSArray *)args
 {
+    NSString *base64 = args[0];
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:base64]];
     NSImage *icon = [[NSImage alloc] initWithData:data];
     icon.size = NSMakeSize(20, 20);
diff --git a/sample/index.js b/sample/index.js
index 9968c02..053f3d4 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -94,7 +94,33 @@ function setIcon() {
     highlightedIconCtx.fillStyle = "white"
     highlightedIconCtx.fillRect(6, 8, 28, 28)
     highlightedIconCtx.clearRect(12, 14, 16, 16)
+    
+    bridge.callHandler('quark', {'method': 'changeIcon:', 'args': [iconCanvas.toDataURL()]})
+}
 
-    quark.setMenubarIcon(iconCanvas.toDataURL())
-    quark.setMenubarHighlightedIcon(highlightedIconCanvas.toDataURL())
+function setupWebViewJavascriptBridge(callback) {
+    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
+    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
+    window.WVJBCallbacks = [callback];
+    var WVJBIframe = document.createElement('iframe');
+    WVJBIframe.style.display = 'none';
+    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
+    document.documentElement.appendChild(WVJBIframe);
+    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
 }
+
+setupWebViewJavascriptBridge(function(bridge) {
+    var uniqueId = 1
+    function log(message, data) {
+    var log = document.getElementById('log')
+    var el = document.createElement('div')
+    el.className = 'logLine'
+    el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)
+    if (log.children.length) { log.insertBefore(el, log.children[0]) }
+    else { log.appendChild(el) }
+    }
+    window.bridge = bridge;
+    bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
+        log('JS got response', response)
+    })
+})

From 7df65891b4ecc298ddc96d7914c99e4226c23536 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 27 Oct 2016 20:24:37 +0800
Subject: [PATCH 03/43] emit wip

---
 quark-shell/QSHAppDelegate.m               | 28 +++----
 quark-shell/QSHWebView.h                   |  4 +
 quark-shell/QSHWebViewDelegate.h           |  8 +-
 quark-shell/QSHWebViewDelegate.m           | 95 ++++++++++------------
 quark-shell/QSHWebViewWindowController.h   |  7 +-
 quark-shell/QSHWebViewWindowController.m   | 52 +++++++++++-
 quark-shell/QSHWebViewWindowController.xib | 24 +-----
 sample/about.html                          |  4 +-
 sample/index.html                          |  6 +-
 sample/index.js                            | 29 ++++---
 10 files changed, 142 insertions(+), 115 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index d4a7423..750a2e0 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -14,22 +14,16 @@
 #import "NSWindow+Fade.h"
 #import "WKWebViewJavascriptBridge.h"
 
-@interface WKPreferences (WKPrivate)
-@property (nonatomic, setter=_setDeveloperExtrasEnabled:) BOOL _developerExtrasEnabled;
-@end
-
 @interface QSHAppDelegate () <NSWindowDelegate>
 
 @property (nonatomic) NSStatusItem *statusItem;
 @property (nonatomic) QSHStatusItemView *statusItemView;
-@property (nonatomic, weak) IBOutlet WebView *webView;
 @property (nonatomic) QSHWebViewDelegate *webViewDelegate;
 
 @end
 
 @implementation QSHAppDelegate {
-    QSHWebView *_WKWebView;
-    NSView* _WKWebViewWrapper;
+    QSHWebView *_webView;
 }
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
@@ -39,17 +33,17 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
     NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath];
     NSString *savePath = [NSString pathWithComponents:@[applicationSupportFile, bundleIdentifier, @"LocalStorage"]];
     
+    self.webViewDelegate = [[QSHWebViewDelegate alloc] init];
+    
     [self setupStatusItemAndWindow];
     [self setupWebView];
     
-    self.webViewDelegate = [[QSHWebViewDelegate alloc] init];
-    
 //    self.webViewDelegate.appDelegate = self;
 //    self.webViewDelegate.statusItem = self.statusItem;
 //    self.webViewDelegate.statusItemView = self.statusItemView;
-//    self.webViewDelegate.webView = _WKWebView;
-//    _WKWebView.navigationDelegate = self.webViewDelegate;
-//    _WKWebView.UIDelegate = self.webViewDelegate;
+//    self.webViewDelegate.webView = _webView;
+//    _webView.navigationDelegate = self.webViewDelegate;
+//    _webView.UIDelegate = self.webViewDelegate;
 }
 
 - (void)setupStatusItemAndWindow
@@ -76,17 +70,17 @@ - (void)_createViews {
     NSView* contentView = _window.contentView;
     
     // WKWebView
-    _WKWebView = [[QSHWebView alloc] initWithFrame:contentView.frame];
-    [_WKWebView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
-    _WKWebView.configuration.preferences._developerExtrasEnabled = YES;
-    [contentView addSubview:_WKWebView];
+    _webView = [[QSHWebView alloc] initWithFrame:contentView.frame];
+    [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
+    _webView.configuration.preferences._developerExtrasEnabled = YES;
+    [contentView addSubview:_webView];
 }
 
 - (void)setupWebView
 {
     [self _createViews];
     NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
-    [QSHWebViewDelegate initWebviewWithBridge:_WKWebView url:URL webDelegate:self.webViewDelegate];
+    [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
 - (void)windowDidResignKey:(NSNotification *)notification
diff --git a/quark-shell/QSHWebView.h b/quark-shell/QSHWebView.h
index 5a24e15..517c310 100644
--- a/quark-shell/QSHWebView.h
+++ b/quark-shell/QSHWebView.h
@@ -9,6 +9,10 @@
 #import <WebKit/WebKit.h>
 #import "WKWebViewJavascriptBridge.h"
 
+@interface WKPreferences (WKPrivate)
+@property (nonatomic, setter=_setDeveloperExtrasEnabled:) BOOL _developerExtrasEnabled;
+@end
+
 @interface QSHWebView : WKWebView
 
 @property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index fe4abf3..b6fe4da 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -11,6 +11,9 @@
 #import "QSHStatusItemView.h"
 #import "QSHAppDelegate.h"
 #import "QSHWebView.h"
+#import "WKWebViewJavascriptBridge.h"
+
+@class QSHWebViewWindowController;
 
 @interface QSHWebViewDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
 
@@ -18,11 +21,14 @@
 @property (nonatomic, weak) NSStatusItem *statusItem;
 @property (nonatomic, weak) QSHStatusItemView *statusItemView;
 @property (nonatomic, weak) QSHWebView *webView;
+@property (nonatomic, weak) WKWebViewJavascriptBridge *mainBridge;
 
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
 
-+ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate;
++ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate isMain:(BOOL)isMain;
 
 - (void)changeIcon:(NSArray *)args;
 
+- (void)removeWindowFromWindows:(QSHWebViewWindowController *)windowController;
+
 @end
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 58c1b45..5f18c77 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -27,8 +27,7 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
 }
 
 @property (nonatomic) NSWindowController *preferencesWindowController;
-@property (nonatomic) QSHWebViewWindowController *webViewWindowController;
-@property (nonatomic) NSMutableDictionary *messageSubscribers;
+@property (nonatomic) NSMutableArray *windows;
 
 @end
 
@@ -44,8 +43,7 @@ - (instancetype)init
 {
     self = [super init];
     if (self) {
-        _messageSubscribers = [NSMutableDictionary dictionary];
-
+        self.windows = [[NSMutableArray alloc] init];
         NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
         appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
         appBundleVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
@@ -55,17 +53,23 @@ - (instancetype)init
     return self;
 }
 
-+ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate
++ (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate isMain:(BOOL)isMain
 {
     // Create Bridge
     WKWebViewJavascriptBridge* _WKBridge = [WKWebViewJavascriptBridge bridgeForWebView:webview];
     webview.bridge = _WKBridge;
+    if (isMain){
+        webDelegate.mainBridge = _WKBridge;
+    }
     
     [_WKBridge registerHandler:@"quark" handler:^(id data, WVJBResponseCallback responseCallback) {
         if ([data isKindOfClass:[NSDictionary class]]) {
             NSLog(@"Trigger method: %@ from JS", data[@"method"]);
-            SEL method = NSSelectorFromString(data[@"method"]);
             NSArray *args = data[@"args"];
+            SEL method = NSSelectorFromString(data[@"method"]);
+            if ([args count] > 0) {
+                method = NSSelectorFromString([data[@"method"] stringByAppendingString:@":"]);
+            }
             if (![QSHWebViewDelegate isSelectorExcludedFromWebScript: method]) {
                 [webDelegate performSelector:method withObject: args];
             }
@@ -74,8 +78,7 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
     }];
     
     // Load Page
-    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
-    [webview loadRequest:[NSURLRequest requestWithURL:URL]];
+    [webview loadRequest:[NSURLRequest requestWithURL:url]];
 }
 
 #pragma mark WebScripting Protocol
@@ -104,13 +107,12 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(openPreferences) ||
         selector == @selector(closePreferences) ||
         selector == @selector(newWindow:) ||
-        selector == @selector(closeWindow) ||
+//        selector == @selector(closeWindow) ||
         selector == @selector(pin) ||
         selector == @selector(unpin) ||
         selector == @selector(checkUpdate:) ||
         selector == @selector(checkUpdateInBackground:) ||
-        selector == @selector(emitMessage:withPayload:) ||
-        selector == @selector(subscribeMessage:withCallback:) ||
+        selector == @selector(emitMessage:) ||
         selector == @selector(showMenu:)) {
         return NO;
     }
@@ -161,12 +163,9 @@ + (NSString *)webScriptNameForSelector:(SEL)selector
     else if (selector == @selector(checkUpdateInBackground:)) {
         result = @"checkUpdateInBackground";
     }
-    else if (selector == @selector(emitMessage:withPayload:)) {
+    else if (selector == @selector(emitMessage:)) {
         result = @"emit";
     }
-    else if (selector == @selector(subscribeMessage:withCallback:)) {
-        result = @"on";
-    }
     else if (selector == @selector(showMenu:)) {
         result = @"showMenu";
     }
@@ -303,10 +302,9 @@ - (void)setLaunchAtLogin:(BOOL)launchAtLogin
     loginController.startAtLogin = launchAtLogin;
 }
 
-- (void)notify:(WebScriptObject *)obj
+- (void)notify:(NSArray *)args
 {
-    QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-    NSDictionary *message = [converter dictionaryFromWebScriptObject:obj];
+    NSDictionary *message = args[0];
 
     NSUserNotification *notification = [[NSUserNotification alloc] init];
     notification.title = message[@"title"];
@@ -413,15 +411,21 @@ - (void)closePreferences
     [self.preferencesWindowController close];
 }
 
-- (void)newWindow:(WebScriptObject *)scriptObj
+- (void)removeWindowFromWindows:(QSHWebViewWindowController *)windowController
 {
-    QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-    NSDictionary *options = [converter dictionaryFromWebScriptObject:scriptObj];
+    [self.windows removeObject:windowController];
+}
+
+- (void)newWindow:(NSArray *)args
+{
+    NSDictionary *options = args[0];
     NSString *urlString = options[@"url"];
     CGFloat width = [options[@"width"] doubleValue];
     CGFloat height = [options[@"height"] doubleValue];
-
-    self.webViewWindowController = [[QSHWebViewWindowController alloc] initWithURLString:urlString width:width height:height];
+    
+    QSHWebViewWindowController *webViewWindowController;
+    webViewWindowController = [[QSHWebViewWindowController alloc] initWithURLString:urlString width:width height:height webDelegate:self];
+    [self.windows addObject:webViewWindowController];
 
     if (options[@"x"] && options[@"y"]) {
         CGFloat screenWidth = [[NSScreen mainScreen] frame].size.width;
@@ -436,34 +440,31 @@ - (void)newWindow:(WebScriptObject *)scriptObj
             yFlipped = (screenHeight - height) / 2;
         }
 
-        [self.webViewWindowController.window setFrameOrigin:NSMakePoint(x, yFlipped)];
+        [webViewWindowController.window setFrameOrigin:NSMakePoint(x, yFlipped)];
     }
 
     if (options[@"border"] && [options[@"border"] boolValue] == NO) {
-        self.webViewWindowController.window.styleMask = NSBorderlessWindowMask;
+        webViewWindowController.window.styleMask = NSBorderlessWindowMask;
     }
 
     if (options[@"shadow"] && [options[@"shadow"] boolValue] == NO) {
-        self.webViewWindowController.window.hasShadow = NO;
+        webViewWindowController.window.hasShadow = NO;
     }
 
     if ([options[@"alwaysOnTop"] boolValue]) {
-        self.webViewWindowController.window.level = NSScreenSaverWindowLevel;
+        webViewWindowController.window.level = NSScreenSaverWindowLevel;
     }
 
     if (options[@"alpha"]) {
-        self.webViewWindowController.window.alphaValue = [options[@"alpha"] doubleValue];
+        webViewWindowController.window.alphaValue = [options[@"alpha"] doubleValue];
     }
 
-    self.webViewWindowController.webView.frameLoadDelegate = self;
-    self.webViewWindowController.webView.UIDelegate = self;
-    self.webViewWindowController.webView.policyDelegate = self;
-    [self.webViewWindowController showWindow:nil];
+    [webViewWindowController showWindow:nil];
 }
 
 - (void)closeWindow
 {
-    [self.webViewWindowController close];
+//    [self.webViewWindowController close];
 }
 
 - (void)pin
@@ -490,21 +491,16 @@ - (void)checkUpdateInBackground:(NSString *)url
     [updater checkForUpdatesInBackground];
 }
 
-- (void)emitMessage:(NSString *)name withPayload:(WebScriptObject *)payload
-{
-    for (WebScriptObject *callback in self.messageSubscribers[name]) {
-        QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-        [converter callFunction:callback withArgs:@[payload]];
-    }
-}
-
-- (void)subscribeMessage:(NSString *)name withCallback:(WebScriptObject *)callback
+- (void)emitMessage:(NSArray *)arg
 {
-    if (self.messageSubscribers[name]) {
-        [self.messageSubscribers[name] addObject:callback];
+    NSMutableArray *bridges = [[NSMutableArray alloc] init];
+    for (QSHWebViewWindowController *window in self.windows) {
+        [bridges addObject:window.webView.bridge];
     }
-    else {
-        self.messageSubscribers[name] = [NSMutableArray arrayWithObject:callback];
+    [bridges addObject:self.mainBridge];
+    
+    for (WKWebViewJavascriptBridge *b in bridges) {
+        [b callHandler:@"onQuarkMessages" data:arg[0]];
     }
 }
 
@@ -610,13 +606,6 @@ - (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaF
     }
 }
 
-- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame
-{
-    if (sender == self.webViewWindowController.webView) {
-        self.webViewWindowController.window.title = title;
-    }
-}
-
 #pragma mark WebPolicyDelegate
 
 - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
diff --git a/quark-shell/QSHWebViewWindowController.h b/quark-shell/QSHWebViewWindowController.h
index 3fc3aeb..9a8859c 100644
--- a/quark-shell/QSHWebViewWindowController.h
+++ b/quark-shell/QSHWebViewWindowController.h
@@ -7,13 +7,16 @@
 //
 
 #import <Cocoa/Cocoa.h>
+#import "QSHWebView.h"
+#import "QSHWebViewDelegate.h"
 
 @interface QSHWebViewWindowController : NSWindowController
 
-@property (weak) IBOutlet WebView *webView;
+@property (nonatomic, strong) QSHWebView *webView;
 
 - (id)initWithURLString:(NSString *)URLString
                   width:(CGFloat)width
-                 height:(CGFloat)height;
+                 height:(CGFloat)height
+            webDelegate:(QSHWebViewDelegate *)webDelegate;
 
 @end
diff --git a/quark-shell/QSHWebViewWindowController.m b/quark-shell/QSHWebViewWindowController.m
index 9b7ce98..a1ed9f9 100644
--- a/quark-shell/QSHWebViewWindowController.m
+++ b/quark-shell/QSHWebViewWindowController.m
@@ -8,15 +8,45 @@
 
 #import "QSHWebViewWindowController.h"
 
-@interface QSHWebViewWindowController ()
+@interface QSHWebViewWindowController () <WKUIDelegate, NSWindowDelegate>
 
 @end
 
-@implementation QSHWebViewWindowController
+@implementation QSHWebViewWindowController {
+    QSHWebViewDelegate *_webDelegate;
+}
+
+- (void)_createViews {
+    NSView* contentView = self.window.contentView;
+    
+    // WKWebView
+    _webView = [[QSHWebView alloc] initWithFrame:contentView.frame];
+    [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
+    _webView.configuration.preferences._developerExtrasEnabled = YES;
+    [contentView addSubview:_webView];
+}
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+    if ([keyPath isEqualToString:@"title"])
+    {
+        if (object == _webView) {
+            self.window.title = _webView.title;
+        }
+        else
+        {
+            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+        }
+    }
+    else {
+        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+    }
+}
 
 - (id)initWithURLString:(NSString *)urlString
                   width:(CGFloat)width
                  height:(CGFloat)height
+            webDelegate:(QSHWebViewDelegate *)webDelegate
 {
     self = [super initWithWindowNibName:@"QSHWebViewWindowController"];
     if (self) {
@@ -24,8 +54,15 @@ - (id)initWithURLString:(NSString *)urlString
         self.window.animationBehavior = NSWindowAnimationBehaviorDocumentWindow;
 
         NSString *fullURLString = [kRootPath stringByAppendingString:urlString];
-        NSString *url = [[NSURL URLWithString:fullURLString relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
-        self.webView.mainFrameURL = url;
+        NSURL *url = [NSURL URLWithString:fullURLString relativeToURL:[[NSBundle mainBundle] resourceURL]];
+        
+        [self _createViews];
+        
+        [QSHWebViewDelegate initWebviewWithBridge:_webView url:url webDelegate:webDelegate isMain:NO];
+        
+        [_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
+        
+        _webDelegate = webDelegate;
     }
     return self;
 }
@@ -33,6 +70,13 @@ - (id)initWithURLString:(NSString *)urlString
 - (void)windowDidLoad
 {
     [super windowDidLoad];
+    self.window.delegate = self;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+    [_webView removeObserver:self forKeyPath:@"title"];
+    [_webDelegate removeWindowFromWindows:self];
 }
 
 @end
diff --git a/quark-shell/QSHWebViewWindowController.xib b/quark-shell/QSHWebViewWindowController.xib
index 638875c..ec5200b 100644
--- a/quark-shell/QSHWebViewWindowController.xib
+++ b/quark-shell/QSHWebViewWindowController.xib
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6250" systemVersion="14B25" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6250"/>
-        <plugIn identifier="com.apple.WebKitIBPlugin" version="6250"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="QSHWebViewWindowController">
             <connections>
-                <outlet property="webView" destination="GAv-OH-jTJ" id="DzU-vy-Tak"/>
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
             </connections>
         </customObject>
@@ -17,24 +15,10 @@
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="196" y="240" width="480" height="270"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
             <view key="contentView" id="se5-gp-TjO">
                 <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
                 <autoresizingMask key="autoresizingMask"/>
-                <subviews>
-                    <webView translatesAutoresizingMaskIntoConstraints="NO" id="GAv-OH-jTJ">
-                        <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
-                        <webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12">
-                            <nil key="identifier"/>
-                        </webPreferences>
-                    </webView>
-                </subviews>
-                <constraints>
-                    <constraint firstAttribute="trailing" secondItem="GAv-OH-jTJ" secondAttribute="trailing" id="aay-no-vOz"/>
-                    <constraint firstAttribute="bottom" secondItem="GAv-OH-jTJ" secondAttribute="bottom" id="bUy-YV-RnR"/>
-                    <constraint firstItem="GAv-OH-jTJ" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="uBa-Uf-BKq"/>
-                    <constraint firstItem="GAv-OH-jTJ" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="xhr-BL-5Ss"/>
-                </constraints>
             </view>
             <connections>
                 <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
diff --git a/sample/about.html b/sample/about.html
index c8f425e..cbfd96d 100644
--- a/sample/about.html
+++ b/sample/about.html
@@ -19,9 +19,7 @@
     margin-top: 60px;
   }
   </style>
-  <script type="text/javascript">
-    quark.emit("TestMessage", "Open the pod bay doors")
-  </script>
+  <script type="text/javascript" src="index.js"></script>
 </head>
 <body>
   <h1>Awesome Project!</h1>
diff --git a/sample/index.html b/sample/index.html
index 232d1f8..80092dd 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -71,9 +71,9 @@ <h1>
 
   <div class="button">
     <p>
-      <button onclick="quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true})">Notify</button>
-      <button onclick="quark.closePopup()">Close Popup</button>
-      <button onclick="quark.newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
+      <button onclick="notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true})">Notify</button>
+      <button onclick="emit({title: 'close'})">Close Popup</button>
+      <button onclick="newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
     </p>
     <p>
       <button onclick="quark.openPreferences()">Preferences</button>
diff --git a/sample/index.js b/sample/index.js
index 053f3d4..6fd0a1b 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -1,3 +1,4 @@
+/*
 $(function() {
     quark.debug = true
 
@@ -78,6 +79,7 @@ $(function() {
         console.log(message)
     })
 })
+ */
 
 function setIcon() {
     var iconCanvas = document.getElementById('icon')
@@ -95,7 +97,19 @@ function setIcon() {
     highlightedIconCtx.fillRect(6, 8, 28, 28)
     highlightedIconCtx.clearRect(12, 14, 16, 16)
     
-    bridge.callHandler('quark', {'method': 'changeIcon:', 'args': [iconCanvas.toDataURL()]})
+    bridge.callHandler('quark', {'method': 'changeIcon', 'args': [iconCanvas.toDataURL()]})
+}
+
+function notify(options){
+    bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
+}
+
+function emit(options){
+    bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
+}
+
+function newWindow(options){
+    bridge.callHandler('quark', {'method': 'newWindow', 'args': [options]})
 }
 
 function setupWebViewJavascriptBridge(callback) {
@@ -110,17 +124,8 @@ function setupWebViewJavascriptBridge(callback) {
 }
 
 setupWebViewJavascriptBridge(function(bridge) {
-    var uniqueId = 1
-    function log(message, data) {
-    var log = document.getElementById('log')
-    var el = document.createElement('div')
-    el.className = 'logLine'
-    el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)
-    if (log.children.length) { log.insertBefore(el, log.children[0]) }
-    else { log.appendChild(el) }
-    }
     window.bridge = bridge;
-    bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
-        log('JS got response', response)
+    bridge.registerHandler('onQuarkMessages', function(data) {
+        console.error('ObjC called testJavascriptHandler with', data)
     })
 })

From 193857c12852d20a40472b26ed05206b3376a201 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 27 Oct 2016 21:46:46 +0800
Subject: [PATCH 04/43] finish close window

---
 quark-shell/QSHWebView.h                 |  3 +++
 quark-shell/QSHWebViewDelegate.h         |  2 +-
 quark-shell/QSHWebViewDelegate.m         | 14 +++++++++-----
 quark-shell/QSHWebViewWindowController.m |  2 ++
 sample/about.html                        |  2 +-
 sample/index.js                          |  4 ++++
 6 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/quark-shell/QSHWebView.h b/quark-shell/QSHWebView.h
index 517c310..5f5521c 100644
--- a/quark-shell/QSHWebView.h
+++ b/quark-shell/QSHWebView.h
@@ -9,6 +9,8 @@
 #import <WebKit/WebKit.h>
 #import "WKWebViewJavascriptBridge.h"
 
+@class QSHWebViewWindowController;
+
 @interface WKPreferences (WKPrivate)
 @property (nonatomic, setter=_setDeveloperExtrasEnabled:) BOOL _developerExtrasEnabled;
 @end
@@ -16,5 +18,6 @@
 @interface QSHWebView : WKWebView
 
 @property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
+@property (nonatomic) QSHWebViewWindowController *parentWindow;
 
 @end
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index b6fe4da..1bf4bcb 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -10,9 +10,9 @@
 #import <WebKit/WebKit.h>
 #import "QSHStatusItemView.h"
 #import "QSHAppDelegate.h"
-#import "QSHWebView.h"
 #import "WKWebViewJavascriptBridge.h"
 
+@class QSHWebView;
 @class QSHWebViewWindowController;
 
 @interface QSHWebViewDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 5f18c77..c68438e 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -61,7 +61,7 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
     if (isMain){
         webDelegate.mainBridge = _WKBridge;
     }
-    
+
     [_WKBridge registerHandler:@"quark" handler:^(id data, WVJBResponseCallback responseCallback) {
         if ([data isKindOfClass:[NSDictionary class]]) {
             NSLog(@"Trigger method: %@ from JS", data[@"method"]);
@@ -71,7 +71,11 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
                 method = NSSelectorFromString([data[@"method"] stringByAppendingString:@":"]);
             }
             if (![QSHWebViewDelegate isSelectorExcludedFromWebScript: method]) {
-                [webDelegate performSelector:method withObject: args];
+                if (method == NSSelectorFromString(@"closeWindow:") ){
+                    [webDelegate performSelector:method withObject: webview.parentWindow];
+                } else {
+                    [webDelegate performSelector:method withObject: args];
+                }
             }
         }
         responseCallback(@"Response from testObjcCallback");
@@ -107,7 +111,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(openPreferences) ||
         selector == @selector(closePreferences) ||
         selector == @selector(newWindow:) ||
-//        selector == @selector(closeWindow) ||
+        selector == @selector(closeWindow:) ||
         selector == @selector(pin) ||
         selector == @selector(unpin) ||
         selector == @selector(checkUpdate:) ||
@@ -462,9 +466,9 @@ - (void)newWindow:(NSArray *)args
     [webViewWindowController showWindow:nil];
 }
 
-- (void)closeWindow
+- (void)closeWindow:(NSWindowController *)window
 {
-//    [self.webViewWindowController close];
+    [window close];
 }
 
 - (void)pin
diff --git a/quark-shell/QSHWebViewWindowController.m b/quark-shell/QSHWebViewWindowController.m
index a1ed9f9..1cb35c6 100644
--- a/quark-shell/QSHWebViewWindowController.m
+++ b/quark-shell/QSHWebViewWindowController.m
@@ -24,6 +24,8 @@ - (void)_createViews {
     [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
     _webView.configuration.preferences._developerExtrasEnabled = YES;
     [contentView addSubview:_webView];
+    
+    _webView.parentWindow = self.window.windowController;
 }
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
diff --git a/sample/about.html b/sample/about.html
index cbfd96d..31373a0 100644
--- a/sample/about.html
+++ b/sample/about.html
@@ -23,6 +23,6 @@
 </head>
 <body>
   <h1>Awesome Project!</h1>
-  <button onclick="quark.closeWindow()">Close</button>
+  <button onclick="closeWindow()">Close</button>
 </body>
 </html>
diff --git a/sample/index.js b/sample/index.js
index 6fd0a1b..4e5c26b 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -104,6 +104,10 @@ function notify(options){
     bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
 }
 
+function closeWindow(options){
+    bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
+}
+
 function emit(options){
     bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
 }

From 7d6a226867cfd5810fb4fe13eab7b923016d74ff Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 28 Oct 2016 00:23:28 +0800
Subject: [PATCH 05/43] fix Preferences

---
 quark-shell/QSHAppDelegate.m     |  10 +-
 quark-shell/QSHWebViewDelegate.m |  23 +--
 sample/index.html                |   2 +-
 sample/index.js                  | 239 ++++++++++++++++++++-----------
 4 files changed, 166 insertions(+), 108 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 750a2e0..d32456c 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -38,12 +38,12 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
     [self setupStatusItemAndWindow];
     [self setupWebView];
     
-//    self.webViewDelegate.appDelegate = self;
-//    self.webViewDelegate.statusItem = self.statusItem;
-//    self.webViewDelegate.statusItemView = self.statusItemView;
-//    self.webViewDelegate.webView = _webView;
+    self.webViewDelegate.appDelegate = self;
+    self.webViewDelegate.statusItem = self.statusItem;
+    self.webViewDelegate.statusItemView = self.statusItemView;
+    self.webViewDelegate.webView = _webView;
 //    _webView.navigationDelegate = self.webViewDelegate;
-//    _webView.UIDelegate = self.webViewDelegate;
+    _webView.UIDelegate = self.webViewDelegate;
 }
 
 - (void)setupStatusItemAndWindow
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index c68438e..4e885e0 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -107,7 +107,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(removeAllDeliveredNotifications) ||
         selector == @selector(addKeyboardShortcut:) ||
         selector == @selector(clearKeyboardShortcut) ||
-        selector == @selector(setupPreferenes:) ||
+        selector == @selector(setupPreferences:) ||
         selector == @selector(openPreferences) ||
         selector == @selector(closePreferences) ||
         selector == @selector(newWindow:) ||
@@ -155,7 +155,7 @@ + (NSString *)webScriptNameForSelector:(SEL)selector
     else if (selector == @selector(addKeyboardShortcut:)) {
         result = @"addKeyboardShortcut";
     }
-    else if (selector == @selector(setupPreferenes:)) {
+    else if (selector == @selector(setupPreferences:)) {
         result = @"setupPreferences";
     }
     else if (selector == @selector(newWindow:)) {
@@ -208,10 +208,9 @@ - (void)togglePopup
     [self.appDelegate toggleWindow];
 }
 
-- (void)resizePopup:(WebScriptObject *)obj
+- (void)resizePopup:(NSArray *)args
 {
-    QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-    NSDictionary *options = [converter dictionaryFromWebScriptObject:obj];
+    NSDictionary *options = args[0];
     CGFloat width = [options[@"width"] doubleValue];
     CGFloat height = [options[@"height"] doubleValue];
     
@@ -256,16 +255,12 @@ - (void)changeHighlightedIcon:(NSString *)base64
 - (void)changeClickAction:(WebScriptObject *)callback
 {
     self.appDelegate.clickCallback = ^{
-        QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-        [converter callFunction:callback];
     };
 }
 
 - (void)changeSecondaryClickAction:(WebScriptObject *)callback
 {
     self.appDelegate.secondaryClickCallback = ^{
-        QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-        [converter callFunction:callback];
     };
 }
 
@@ -380,10 +375,8 @@ - (void)clearKeyboardShortcut
     [MASShortcut clearGlobalHotkeyMonitor];
 }
 
-- (void)setupPreferenes:(WebScriptObject *)scriptObj
+- (void)setupPreferences:(NSArray *)preferencesArray
 {
-    QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-    NSArray *preferencesArray = [converter arrayFromWebScriptObject:scriptObj];
     NSMutableArray *viewControllers = [NSMutableArray array];
 	for (NSDictionary *preferences in preferencesArray) {
         NSInteger height = preferences[@"height"] ? [preferences[@"height"] integerValue]: kPreferencesDefaultHeight;
@@ -508,10 +501,9 @@ - (void)emitMessage:(NSArray *)arg
     }
 }
 
-- (void)showMenu:(WebScriptObject *)scriptObj
+- (void)showMenu:(NSArray *)args
 {
-    QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-    NSDictionary *options = [converter dictionaryFromWebScriptObject:scriptObj];
+    NSDictionary *options = args[0];
     NSMenu *menu = [[NSMenu alloc] init];
     menu.autoenablesItems = NO;
 	for (NSDictionary *item in options[@"items"]) {
@@ -522,7 +514,6 @@ - (void)showMenu:(WebScriptObject *)scriptObj
             NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:item[@"label"] action:@selector(menuItemClicked:) keyEquivalent:@""];
             menuItem.target = self;
             menuItem.representedObject = ^{
-                [converter callFunction:item[@"click"]];
             };
             [menuItem setEnabled:YES];
             [menu addItem:menuItem];
diff --git a/sample/index.html b/sample/index.html
index 80092dd..7d2fb76 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -76,7 +76,7 @@ <h1>
       <button onclick="newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
     </p>
     <p>
-      <button onclick="quark.openPreferences()">Preferences</button>
+      <button onclick="openPreferences()">Preferences</button>
       <button onclick="quark.openURL('https://github.com/xhacker')">Open URL</button>
       <button onclick="quark.checkUpdate('https://rawgit.com/HackPlan/quark-shell-mac/master/updater/SampleAppcast.xml')">Check Update</button>
     </p>
diff --git a/sample/index.js b/sample/index.js
index 4e5c26b..1d2de3b 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -1,86 +1,111 @@
 /*
-$(function() {
-    quark.debug = true
-
-    $("#app-version").html(quark.appVersion)
-    $("#app-bundle-version").html("(" + quark.appBundleVersion + ")")
-
-    quark.addKeyboardShortcut({
-        keycode: 0x7A, // F1 key
-        modifierFlags: 0, // no modifier key
-        callback: function () {
-            console.log("wow")
-            quark.togglePopup()
-        }
-    })
-
-    quark.setClickAction(function () {
-        console.log("Don’t click me!")
-    })
-    quark.setSecondaryClickAction(function () {
-        console.log("What did I say?")
-    })
-
-    quark.setupPreferences([
-        {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
-        {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
-        {
-            "label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
-            "nativeComponents": [{
-                type: "ShortcutRecorder",
-                options: {
-                    x: 140,
-                    y: 28,
-                    keycode: 0x7A, // F1 key
-                    modifierFlags: 0, // no modifier key
-                    onChange: function (keycode, modifierFlags) {
-                        console.log("New shortcut:", keycode, modifierFlags)
-                        quark.clearKeyboardShortcut()
-                        quark.addKeyboardShortcut({
-                            keycode: keycode,
-                            modifierFlags: modifierFlags,
-                            callback: function () {
-                                console.log("wow")
-                                quark.togglePopup()
-                            }
-                        })
-                    }
-                }
-            }]
-        }
-    ])
-
-    $("#toggle-pin").click(function() {
-        if ($(this).html() == "Pin") {
-            quark.pin()
-            $(this).html("Unpin")
-        }
-        else {
-            quark.unpin()
-            $(this).html("Pin")
-        }
-    })
-
-    $("#show-menu").click(function(event) {
-        quark.showMenu({
-            items: [
-                {label: "Test", click: function() { console.log("I am completely operational") } },
-                {type: "separator"},
-                {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
-            ],
-            x: event.clientX,
-            y: event.clientY
-        })
-    })
-
-    var db = openDatabase('test', '1.0', 'Quark Shell supports WebSQL database', 5 * 1024 * 1024)
-
-    quark.on("TestMessage", function(message) {
-        console.log(message)
-    })
-})
+ $(function() {
+ quark.debug = true
+ 
+ $("#app-version").html(quark.appVersion)
+ $("#app-bundle-version").html("(" + quark.appBundleVersion + ")")
+ 
+ quark.addKeyboardShortcut({
+ keycode: 0x7A, // F1 key
+ modifierFlags: 0, // no modifier key
+ callback: function () {
+ console.log("wow")
+ quark.togglePopup()
+ }
+ })
+ 
+ quark.setClickAction(function () {
+ console.log("Don’t click me!")
+ })
+ quark.setSecondaryClickAction(function () {
+ console.log("What did I say?")
+ })
+ 
+ quark.setupPreferences([
+ {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
+ {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
+ {
+ "label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
+ "nativeComponents": [{
+ type: "ShortcutRecorder",
+ options: {
+ x: 140,
+ y: 28,
+ keycode: 0x7A, // F1 key
+ modifierFlags: 0, // no modifier key
+ onChange: function (keycode, modifierFlags) {
+ console.log("New shortcut:", keycode, modifierFlags)
+ quark.clearKeyboardShortcut()
+ quark.addKeyboardShortcut({
+ keycode: keycode,
+ modifierFlags: modifierFlags,
+ callback: function () {
+ console.log("wow")
+ quark.togglePopup()
+ }
+ })
+ }
+ }
+ }]
+ }
+ ])
+ 
+ $("#toggle-pin").click(function() {
+ if ($(this).html() == "Pin") {
+ quark.pin()
+ $(this).html("Unpin")
+ }
+ else {
+ quark.unpin()
+ $(this).html("Pin")
+ }
+ })
+ 
+ $("#show-menu").click(function(event) {
+ quark.showMenu({
+ items: [
+ {label: "Test", click: function() { console.log("I am completely operational") } },
+ {type: "separator"},
+ {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
+ ],
+ x: event.clientX,
+ y: event.clientY
+ })
+ })
+ 
+ var db = openDatabase('test', '1.0', 'Quark Shell supports WebSQL database', 5 * 1024 * 1024)
+ 
+ quark.on("TestMessage", function(message) {
+ console.log(message)
+ })
+ })
  */
 
+$(function() {
+  $("#toggle-pin").click(function() {
+                         if ($(this).html() == "Pin") {
+                         pin()
+                         $(this).html("Unpin")
+                         }
+                         else {
+                         unpin()
+                         $(this).html("Pin")
+                         }
+                         });
+  $("#show-menu").click(function(event) {
+                        bridge.callHandler('quark', {'method': 'showMenu', 'args': [{
+                                                                                    items: [
+                                                                                            {label: "Test", click: function() { console.log("I am completely operational") } },
+                                                                                            {type: "separator"},
+                                                                                            {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
+                                                                                            ],
+                                                                                    x: event.clientX,
+                                                                                    y: event.clientY
+                                                                                    }]});
+                        });
+  
+  });
+
 function setIcon() {
     var iconCanvas = document.getElementById('icon')
     iconCanvas.width = 40
@@ -88,7 +113,7 @@ function setIcon() {
     var iconCtx = iconCanvas.getContext('2d')
     iconCtx.fillRect(6, 8, 28, 28)
     iconCtx.clearRect(12, 14, 16, 16)
-
+    
     var highlightedIconCanvas = document.getElementById('highlighted-icon')
     highlightedIconCanvas.width = 40
     highlightedIconCanvas.height = 40
@@ -100,6 +125,48 @@ function setIcon() {
     bridge.callHandler('quark', {'method': 'changeIcon', 'args': [iconCanvas.toDataURL()]})
 }
 
+function pin(){
+    bridge.callHandler('quark', {'method': 'pin'})
+}
+
+function setupPref(){
+    bridge.callHandler('quark', {'method': 'setupPreferences', 'args': [
+                                                                        {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
+                                                                        {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
+                                                                        {"label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
+                                                                        "nativeComponents": [{
+                                                                                             type: "ShortcutRecorder",
+                                                                                             options: {
+                                                                                             x: 140,
+                                                                                             y: 28,
+                                                                                             keycode: 0x7A, // F1 key
+                                                                                             modifierFlags: 0, // no modifier key
+                                                                                             onChange: function (keycode, modifierFlags) {
+                                                                                             console.log("New shortcut:", keycode, modifierFlags)
+                                                                                             quark.clearKeyboardShortcut()
+                                                                                             quark.addKeyboardShortcut({
+                                                                                                                       keycode: keycode,
+                                                                                                                       modifierFlags: modifierFlags,
+                                                                                                                       callback: function () {
+                                                                                                                       console.log("wow")
+                                                                                                                       quark.togglePopup()
+                                                                                                                       }
+                                                                                                                       })
+                                                                                             }
+                                                                                             }
+                                                                                             }]
+                                                                        }
+                                                                        ]});
+}
+
+function openPreferences(){
+    bridge.callHandler('quark', {'method': 'openPreferences'})
+}
+
+function unpin(){
+    bridge.callHandler('quark', {'method': 'unpin'})
+}
+
 function notify(options){
     bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
 }
@@ -128,8 +195,8 @@ function setupWebViewJavascriptBridge(callback) {
 }
 
 setupWebViewJavascriptBridge(function(bridge) {
-    window.bridge = bridge;
-    bridge.registerHandler('onQuarkMessages', function(data) {
-        console.error('ObjC called testJavascriptHandler with', data)
-    })
-})
+                             window.bridge = bridge;
+                             bridge.registerHandler('onQuarkMessages', function(data) {
+                                                    console.error('ObjC called testJavascriptHandler with', data)
+                                                    })
+                             })

From 17ea1b406d1e628acdc6beb991d9487517e7dea7 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 28 Oct 2016 00:49:49 +0800
Subject: [PATCH 06/43] use wkwebview in Preferences

---
 quark-shell/QSHPreferencesViewController.h |  4 ++-
 quark-shell/QSHPreferencesViewController.m | 29 +++++++++++++++-------
 sample/about.html                          |  1 +
 sample/preferences/account.html            |  4 ++-
 4 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/quark-shell/QSHPreferencesViewController.h b/quark-shell/QSHPreferencesViewController.h
index 052b970..88e4551 100644
--- a/quark-shell/QSHPreferencesViewController.h
+++ b/quark-shell/QSHPreferencesViewController.h
@@ -8,10 +8,12 @@
 
 #import <Cocoa/Cocoa.h>
 #import <RHPreferences.h>
+#import "QSHWebView.h"
+#import "QSHWebViewDelegate.h"
 
 @interface QSHPreferencesViewController : NSViewController <RHPreferencesViewControllerProtocol>
 
-@property (weak) IBOutlet WebView *webView;
+@property (nonatomic, strong) QSHWebView *webView;
 
 - (instancetype)initWithIdentifier:(NSString *)identifier
                       toolbarImage:(NSImage *)image
diff --git a/quark-shell/QSHPreferencesViewController.m b/quark-shell/QSHPreferencesViewController.m
index b0bffaa..bdc0260 100644
--- a/quark-shell/QSHPreferencesViewController.m
+++ b/quark-shell/QSHPreferencesViewController.m
@@ -43,20 +43,29 @@ - (instancetype)initWithIdentifier:(NSString *)identifier
     return self;
 }
 
+- (void)_createViews {
+    NSView* contentView = self.view;
+    
+    // WKWebView
+    _webView = [[QSHWebView alloc] initWithFrame:contentView.frame];
+    [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
+    _webView.configuration.preferences._developerExtrasEnabled = YES;
+    [contentView addSubview:_webView];
+}
+
 - (void)loadView
 {
     [super loadView];
 
     self.view.frame = NSMakeRect(self.view.frame.origin.x, self.view.frame.origin.y,
                                  self.view.frame.size.width, self.height);
+    
+    [self _createViews];
 
     NSString *url = [[NSURL URLWithString:kPreferencesDirectory relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
     url = [url stringByAppendingString:[NSString stringWithFormat:@"%@.html", self.identifier]];
-    self.webView.mainFrameURL = url;
-
-    self.webView.frameLoadDelegate = self.delegate;
-    self.webView.UIDelegate = self.delegate;
-    self.webView.policyDelegate = self.delegate;
+    
+    [QSHWebViewDelegate initWebviewWithBridge:_webView url:[NSURL URLWithString:url] webDelegate:_delegate isMain:NO];
 }
 
 - (void)addNativeComponent:(NSDictionary *)component
@@ -76,10 +85,12 @@ - (void)addNativeComponent:(NSDictionary *)component
         }
         
         shortcutView.shortcutValueChange = ^(MASShortcutView *sender) {
-            QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-            [converter callFunction:component[@"options"][@"onChange"]
-                           withArgs:@[@([sender.shortcutValue keyCode]),
-                                      @([sender.shortcutValue modifierFlags])]];
+            [self.webView.bridge callHandler:@"testJavascriptHandler" data:@
+            { @"component":component,
+              @"args": @[@([sender.shortcutValue keyCode]),
+                         @([sender.shortcutValue modifierFlags])
+                        ]
+            }];
         };
 
         [self.view addSubview:shortcutView];
diff --git a/sample/about.html b/sample/about.html
index 31373a0..d52d74c 100644
--- a/sample/about.html
+++ b/sample/about.html
@@ -19,6 +19,7 @@
     margin-top: 60px;
   }
   </style>
+  <script type="text/javascript" src="jquery-2.1.0.min.js"></script>
   <script type="text/javascript" src="index.js"></script>
 </head>
 <body>
diff --git a/sample/preferences/account.html b/sample/preferences/account.html
index 854a401..c38ac9c 100644
--- a/sample/preferences/account.html
+++ b/sample/preferences/account.html
@@ -30,8 +30,10 @@
     text-decoration: underline;
   }
   </style>
+  <script type="text/javascript" src="../jquery-2.1.0.min.js"></script>
+  <script type="text/javascript" src="../index.js"></script>
 </head>
 <body>
-  <p><a onclick="quark.notify({title: 'Quark Shell', content: 'It works!', popupOnClick: true})">quark object is also usable here.</a></p>
+  <p><a onclick="notify({title: 'Quark Shell', content: 'It works!', popupOnClick: true})">quark object is also usable here.</a></p>
 </body>
 </html>

From 326619601ffd8ee5aa404fef0d29ce1312d31eda Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 29 Oct 2016 16:06:26 +0800
Subject: [PATCH 07/43] inject Quark.js into webview

---
 quark-shell.xcodeproj/project.pbxproj |   8 +-
 quark-shell/QSHWebView.h              |   6 +-
 quark-shell/QSHWebView.m              |  29 +++++-
 quark-shell/Quark.js                  |  65 ++++++++++++
 quark-shell/quark-shell-Info.plist    |   2 +-
 sample/index.js                       | 139 ++++++++------------------
 6 files changed, 139 insertions(+), 110 deletions(-)
 create mode 100644 quark-shell/Quark.js

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index 16e2248..c6d2fe7 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -34,6 +34,7 @@
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
+		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
 		9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 92906357BD95D526FFB4245E /* libPods-quark-shell.a */; };
 /* End PBXBuildFile section */
 
@@ -120,6 +121,7 @@
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
 		8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWebView.m; sourceTree = "<group>"; };
+		8AC4ABDD1DC48AAD0026D522 /* Quark.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Quark.js; sourceTree = "<group>"; tabWidth = 4; };
 		92906357BD95D526FFB4245E /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -222,10 +224,11 @@
 				1AA896721964FB1800E4FDAC /* QSHWebViewWindowController.xib */,
 				1A9A456C1A1C93C600C98589 /* NSWindow+Fade.h */,
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
+				8AC4ABDD1DC48AAD0026D522 /* Quark.js */,
 				1A91F9FA18E2530B00AA8B7E /* Images.xcassets */,
-				1A91F9E918E2530B00AA8B7E /* Supporting Files */,
 				8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */,
 				8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */,
+				1A91F9E918E2530B00AA8B7E /* Supporting Files */,
 			);
 			path = "quark-shell";
 			sourceTree = "<group>";
@@ -368,7 +371,7 @@
 			attributes = {
 				CLASSPREFIX = QSH;
 				LastUpgradeCheck = 0700;
-				ORGANIZATIONNAME = Hackplan;
+				ORGANIZATIONNAME = HackPlan;
 				TargetAttributes = {
 					1A91F9DE18E2530B00AA8B7E = {
 						DevelopmentTeam = 7676B49VAW;
@@ -422,6 +425,7 @@
 				1A91F9F318E2530B00AA8B7E /* Credits.rtf in Resources */,
 				1AA896741964FB1800E4FDAC /* QSHWebViewWindowController.xib in Resources */,
 				1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */,
+				8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */,
 				1A91F9F918E2530B00AA8B7E /* MainMenu.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
diff --git a/quark-shell/QSHWebView.h b/quark-shell/QSHWebView.h
index 5f5521c..9e5c99b 100644
--- a/quark-shell/QSHWebView.h
+++ b/quark-shell/QSHWebView.h
@@ -2,8 +2,8 @@
 //  QSHWebView.h
 //  quark-shell
 //
-//  Created by 孙亮 on 27/10/2016.
-//  Copyright © 2016 Hackplan. All rights reserved.
+//  Created by Sun Liang on 27/10/2016.
+//  Copyright © 2016 HackPlan. All rights reserved.
 //
 
 #import <WebKit/WebKit.h>
@@ -20,4 +20,6 @@
 @property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
 @property (nonatomic) QSHWebViewWindowController *parentWindow;
 
++ (WKWebViewConfiguration *)webViewConfiguration;
+
 @end
diff --git a/quark-shell/QSHWebView.m b/quark-shell/QSHWebView.m
index ba5897f..2fd01dc 100644
--- a/quark-shell/QSHWebView.m
+++ b/quark-shell/QSHWebView.m
@@ -2,18 +2,37 @@
 //  QSHWebView.m
 //  quark-shell
 //
-//  Created by 孙亮 on 27/10/2016.
-//  Copyright © 2016 Hackplan. All rights reserved.
+//  Created by Sun Liang on 27/10/2016.
+//  Copyright © 2016 HackPlan. All rights reserved.
 //
 
 #import "QSHWebView.h"
 
 @implementation QSHWebView
 
-- (void)drawRect:(NSRect)dirtyRect {
-    [super drawRect:dirtyRect];
++ (NSString *)quarkSourceScript
+{
+    return [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Quark" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
+}
+
++ (WKWebViewConfiguration *)webViewConfiguration
+{
+    static WKWebViewConfiguration *configuration = nil;
+    
+    if (configuration == nil) {
+        configuration = [[WKWebViewConfiguration alloc] init];
+        
+        WKUserScript *script = [[WKUserScript alloc] initWithSource:[self quarkSourceScript] injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
+        
+        [configuration.userContentController addUserScript:script];
+    }
     
-    // Drawing code here.
+    return configuration;
+}
+
+- (instancetype)initWithFrame:(NSRect)frameRect
+{
+    return [super initWithFrame:frameRect configuration: [QSHWebView webViewConfiguration]];
 }
 
 @end
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
new file mode 100644
index 0000000..3c9b29e
--- /dev/null
+++ b/quark-shell/Quark.js
@@ -0,0 +1,65 @@
+function setupWebViewJavascriptBridge(callback) {
+    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
+    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
+    window.WVJBCallbacks = [callback];
+    var WVJBIframe = document.createElement('iframe');
+    WVJBIframe.style.display = 'none';
+    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
+    document.documentElement.appendChild(WVJBIframe);
+    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
+}
+
+function setupQuarkWithBridge(bridge) {
+  window.quark = {};
+  
+  window.quark.setupPref = function (options) {
+    bridge.callHandler('quark', {'method': 'setupPreferences', 'args': [options]});
+  }
+
+  window.quark.openPreferences = function () {
+    bridge.callHandler('quark', {'method': 'openPreferences'})
+  }
+
+  window.quark.pin = function () {
+    bridge.callHandler('quark', {'method': 'pin'})
+  }
+
+  window.quark.unpin = function () {
+      bridge.callHandler('quark', {'method': 'unpin'})
+  }
+
+  window.quark.notify = function (options) {
+      bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
+  }
+
+  window.quark.closeWindow = function (options) {
+      bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
+  }
+
+  window.quark.emit = function (options) {
+      bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
+  }
+
+  window.quark.newWindow = function (options) {
+      bridge.callHandler('quark', {'method': 'newWindow', 'args': [options]})
+  }
+
+  window.quark.setIcon = function (base64) {
+    bridge.callHandler('quark', {'method': 'changeIcon', 'args': [base64]})
+  }
+
+}
+
+setupWebViewJavascriptBridge(function(bridge) {
+  window.bridge = bridge;
+
+  setupQuarkWithBridge(bridge);
+  // TODO: implement quark.on('name', function(data) {})
+  bridge.registerHandler('onQuarkMessages', function(data) {
+    console.error('ObjC called testJavascriptHandler with', data)
+  });
+
+  if (window.onQuarkLoaded){
+    window.onQuarkLoaded()
+  }
+})
\ No newline at end of file
diff --git a/quark-shell/quark-shell-Info.plist b/quark-shell/quark-shell-Info.plist
index b262ac7..84e3279 100644
--- a/quark-shell/quark-shell-Info.plist
+++ b/quark-shell/quark-shell-Info.plist
@@ -27,7 +27,7 @@
 	<key>LSUIElement</key>
 	<true/>
 	<key>NSHumanReadableCopyright</key>
-	<string>Copyright © 2014 Xhacker. All rights reserved.</string>
+	<string>Copyright © HackPlan. All rights reserved.</string>
 	<key>NSMainNibFile</key>
 	<string>MainMenu</string>
 	<key>NSPrincipalClass</key>
diff --git a/sample/index.js b/sample/index.js
index 1d2de3b..b2973b0 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -93,110 +93,49 @@ $(function() {
                          }
                          });
   $("#show-menu").click(function(event) {
-                        bridge.callHandler('quark', {'method': 'showMenu', 'args': [{
-                                                                                    items: [
-                                                                                            {label: "Test", click: function() { console.log("I am completely operational") } },
-                                                                                            {type: "separator"},
-                                                                                            {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
-                                                                                            ],
-                                                                                    x: event.clientX,
-                                                                                    y: event.clientY
-                                                                                    }]});
+                        bridge.callHandler('quark', {
+                            'method': 'showMenu',
+                            'args': [{
+                                items: [
+                                        {label: "Test", click: function() { console.log("I am completely operational") } },
+                                        {type: "separator"},
+                                        {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
+                                        ],
+                                x: event.clientX,
+                                y: event.clientY
+                                }]});
                         });
-  
   });
 
-function setIcon() {
-    var iconCanvas = document.getElementById('icon')
-    iconCanvas.width = 40
-    iconCanvas.height = 40
-    var iconCtx = iconCanvas.getContext('2d')
-    iconCtx.fillRect(6, 8, 28, 28)
-    iconCtx.clearRect(12, 14, 16, 16)
-    
-    var highlightedIconCanvas = document.getElementById('highlighted-icon')
-    highlightedIconCanvas.width = 40
-    highlightedIconCanvas.height = 40
-    var highlightedIconCtx = highlightedIconCanvas.getContext('2d')
-    highlightedIconCtx.fillStyle = "white"
-    highlightedIconCtx.fillRect(6, 8, 28, 28)
-    highlightedIconCtx.clearRect(12, 14, 16, 16)
-    
-    bridge.callHandler('quark', {'method': 'changeIcon', 'args': [iconCanvas.toDataURL()]})
-}
-
-function pin(){
-    bridge.callHandler('quark', {'method': 'pin'})
-}
-
 function setupPref(){
-    bridge.callHandler('quark', {'method': 'setupPreferences', 'args': [
-                                                                        {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
-                                                                        {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
-                                                                        {"label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
-                                                                        "nativeComponents": [{
-                                                                                             type: "ShortcutRecorder",
-                                                                                             options: {
-                                                                                             x: 140,
-                                                                                             y: 28,
-                                                                                             keycode: 0x7A, // F1 key
-                                                                                             modifierFlags: 0, // no modifier key
-                                                                                             onChange: function (keycode, modifierFlags) {
-                                                                                             console.log("New shortcut:", keycode, modifierFlags)
-                                                                                             quark.clearKeyboardShortcut()
-                                                                                             quark.addKeyboardShortcut({
-                                                                                                                       keycode: keycode,
-                                                                                                                       modifierFlags: modifierFlags,
-                                                                                                                       callback: function () {
-                                                                                                                       console.log("wow")
-                                                                                                                       quark.togglePopup()
-                                                                                                                       }
-                                                                                                                       })
-                                                                                             }
-                                                                                             }
-                                                                                             }]
-                                                                        }
-                                                                        ]});
-}
-
-function openPreferences(){
-    bridge.callHandler('quark', {'method': 'openPreferences'})
-}
-
-function unpin(){
-    bridge.callHandler('quark', {'method': 'unpin'})
-}
-
-function notify(options){
-    bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
-}
-
-function closeWindow(options){
-    bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
-}
-
-function emit(options){
-    bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
-}
-
-function newWindow(options){
-    bridge.callHandler('quark', {'method': 'newWindow', 'args': [options]})
+    quark.setupPref([
+    {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
+    {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
+    {"label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
+    "nativeComponents": [{
+                         type: "ShortcutRecorder",
+                         options: {
+                         x: 140,
+                         y: 28,
+                         keycode: 0x7A, // F1 key
+                         modifierFlags: 0, // no modifier key
+                         onChange: function (keycode, modifierFlags) {
+                         console.log("New shortcut:", keycode, modifierFlags)
+                         quark.clearKeyboardShortcut()
+                         quark.addKeyboardShortcut({
+                                                   keycode: keycode,
+                                                   modifierFlags: modifierFlags,
+                                                   callback: function () {
+                                                   console.log("wow")
+                                                   quark.togglePopup()
+                                                   }
+                                                   })
+                         }
+                         }
+                         }]
+    }]);
 }
 
-function setupWebViewJavascriptBridge(callback) {
-    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
-    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
-    window.WVJBCallbacks = [callback];
-    var WVJBIframe = document.createElement('iframe');
-    WVJBIframe.style.display = 'none';
-    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
-    document.documentElement.appendChild(WVJBIframe);
-    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
+onQuarkLoaded = function () {
+    quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
 }
-
-setupWebViewJavascriptBridge(function(bridge) {
-                             window.bridge = bridge;
-                             bridge.registerHandler('onQuarkMessages', function(data) {
-                                                    console.error('ObjC called testJavascriptHandler with', data)
-                                                    })
-                             })

From 07c1ac6e5f7340f1d1a6eee723ae9672b0f0a69a Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 29 Oct 2016 19:28:25 +0800
Subject: [PATCH 08/43] most quark apis work now

---
 quark-shell.xcodeproj/project.pbxproj      |  16 +--
 quark-shell/QSHAppDelegate.m               |   5 -
 quark-shell/QSHPreferencesViewController.m |   1 -
 quark-shell/QSHWebScriptObjectConverter.h  |  54 --------
 quark-shell/QSHWebScriptObjectConverter.m  | 144 ---------------------
 quark-shell/QSHWebViewDelegate.m           | 108 ++++------------
 quark-shell/Quark.js                       |  75 ++++++-----
 sample/about.html                          |   2 +-
 sample/index.html                          |  12 +-
 sample/index.js                            |  44 +++++--
 10 files changed, 108 insertions(+), 353 deletions(-)
 delete mode 100644 quark-shell/QSHWebScriptObjectConverter.h
 delete mode 100644 quark-shell/QSHWebScriptObjectConverter.m

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index c6d2fe7..ba66985 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -8,7 +8,6 @@
 
 /* Begin PBXBuildFile section */
 		1A42764A19196B6F00815DC6 /* QSHWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A42764919196B6F00815DC6 /* QSHWindow.m */; };
-		1A42D2CA194C2C620091F581 /* QSHWebScriptObjectConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A42D2C9194C2C620091F581 /* QSHWebScriptObjectConverter.m */; };
 		1A82DE5B1903B095006AB37F /* QSHWindowBorderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A82DE5A1903B095006AB37F /* QSHWindowBorderView.m */; };
 		1A91F9E318E2530B00AA8B7E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91F9E218E2530B00AA8B7E /* Cocoa.framework */; };
 		1A91F9ED18E2530B00AA8B7E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1A91F9EB18E2530B00AA8B7E /* InfoPlist.strings */; };
@@ -74,8 +73,6 @@
 		1A05BC371B0D8A0B00E5BCED /* quark-shell.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "quark-shell.entitlements"; sourceTree = "<group>"; };
 		1A42764819196B6F00815DC6 /* QSHWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWindow.h; sourceTree = "<group>"; };
 		1A42764919196B6F00815DC6 /* QSHWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWindow.m; sourceTree = "<group>"; };
-		1A42D2C8194C2C620091F581 /* QSHWebScriptObjectConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebScriptObjectConverter.h; sourceTree = "<group>"; };
-		1A42D2C9194C2C620091F581 /* QSHWebScriptObjectConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = QSHWebScriptObjectConverter.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
 		1A75781C19B9A261002A9886 /* app */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app; sourceTree = "<group>"; };
 		1A82DE591903B095006AB37F /* QSHWindowBorderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWindowBorderView.h; sourceTree = "<group>"; };
 		1A82DE5A1903B095006AB37F /* QSHWindowBorderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWindowBorderView.m; sourceTree = "<group>"; };
@@ -121,7 +118,7 @@
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
 		8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWebView.m; sourceTree = "<group>"; };
-		8AC4ABDD1DC48AAD0026D522 /* Quark.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Quark.js; sourceTree = "<group>"; tabWidth = 4; };
+		8AC4ABDD1DC48AAD0026D522 /* Quark.js */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.javascript; path = Quark.js; sourceTree = "<group>"; tabWidth = 4; };
 		92906357BD95D526FFB4245E /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -204,7 +201,6 @@
 			isa = PBXGroup;
 			children = (
 				1A05BC371B0D8A0B00E5BCED /* quark-shell.entitlements */,
-				1AA896751965089700E4FDAC /* Utils */,
 				1A91F9F418E2530B00AA8B7E /* QSHAppDelegate.h */,
 				1A91F9F518E2530B00AA8B7E /* QSHAppDelegate.m */,
 				1A91F9F718E2530B00AA8B7E /* MainMenu.xib */,
@@ -263,15 +259,6 @@
 			name = "Supporting Files";
 			sourceTree = "<group>";
 		};
-		1AA896751965089700E4FDAC /* Utils */ = {
-			isa = PBXGroup;
-			children = (
-				1A42D2C8194C2C620091F581 /* QSHWebScriptObjectConverter.h */,
-				1A42D2C9194C2C620091F581 /* QSHWebScriptObjectConverter.m */,
-			);
-			name = Utils;
-			sourceTree = "<group>";
-		};
 		1ADE93531B0F093E00D69828 /* quark-shell-helper */ = {
 			isa = PBXGroup;
 			children = (
@@ -520,7 +507,6 @@
 				1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */,
 				1A91F9F618E2530B00AA8B7E /* QSHAppDelegate.m in Sources */,
 				1AA896731964FB1800E4FDAC /* QSHWebViewWindowController.m in Sources */,
-				1A42D2CA194C2C620091F581 /* QSHWebScriptObjectConverter.m in Sources */,
 				1A91F9EF18E2530B00AA8B7E /* main.m in Sources */,
 				1A82DE5B1903B095006AB37F /* QSHWindowBorderView.m in Sources */,
 				1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */,
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index d32456c..fb7fc1b 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -28,11 +28,6 @@ @implementation QSHAppDelegate {
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
-    // TODO: bundle identifier should be generated from manifest.json
-    NSString *bundleIdentifier = [[NSBundle mainBundle] infoDictionary][@"CFBundleIdentifier"];
-    NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath];
-    NSString *savePath = [NSString pathWithComponents:@[applicationSupportFile, bundleIdentifier, @"LocalStorage"]];
-    
     self.webViewDelegate = [[QSHWebViewDelegate alloc] init];
     
     [self setupStatusItemAndWindow];
diff --git a/quark-shell/QSHPreferencesViewController.m b/quark-shell/QSHPreferencesViewController.m
index bdc0260..dbb1040 100644
--- a/quark-shell/QSHPreferencesViewController.m
+++ b/quark-shell/QSHPreferencesViewController.m
@@ -7,7 +7,6 @@
 //
 
 #import "QSHPreferencesViewController.h"
-#import "QSHWebScriptObjectConverter.h"
 #import <MASShortcutView.h>
 #import <MASShortcut.h>
 
diff --git a/quark-shell/QSHWebScriptObjectConverter.h b/quark-shell/QSHWebScriptObjectConverter.h
deleted file mode 100644
index 9469380..0000000
--- a/quark-shell/QSHWebScriptObjectConverter.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  QSHWebScriptObjectConverter.h
-//  quark-shell
-//
-//  Created by Xhacker Liu on 6/14/14.
-//  Copyright (c) 2014 Xhacker. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@interface QSHWebScriptObjectConverter : NSObject
-
-- (instancetype)initWithWebView:(WebView *)webView;
-
-- (BOOL)isArray:(WebScriptObject *)obj;
-- (BOOL)isDictionary:(WebScriptObject *)obj;
-
-/**
- *  Convert WebScriptObject to NSDictionary
- *  Assumption: webScriptObject has already been tested using isDictionary:
- *
- *  @param webScriptObject
- *
- *  @return NSDictionary
- */
-- (NSDictionary *)dictionaryFromWebScriptObject:(WebScriptObject *)webScriptObject;
-
-/**
- *  Convert WebScriptObject to NSArray
- *  Assumption: webScriptObject has already been tested using isArray:
- *
- *  @param webScriptObject
- *
- *  @return NSArray
- */
-- (NSArray *)arrayFromWebScriptObject:(WebScriptObject *)webScriptObject;
-
-/**
- *  Call function in WebScriptObject
- *
- *  @param webScriptObject Function object
- */
-- (void)callFunction:(WebScriptObject *)webScriptObject;
-
-/**
- *  Call function in WebScriptObject with arguments
- *
- *  @param webScriptObject Function object
- *  @param args arguments
- */
-- (void)callFunction:(WebScriptObject *)webScriptObject
-            withArgs:(NSArray *)args;
-
-@end
diff --git a/quark-shell/QSHWebScriptObjectConverter.m b/quark-shell/QSHWebScriptObjectConverter.m
deleted file mode 100644
index 6b9b222..0000000
--- a/quark-shell/QSHWebScriptObjectConverter.m
+++ /dev/null
@@ -1,144 +0,0 @@
-//
-//  QSHWebScriptObjectConverter.m
-//  quark-shell
-//
-//  Created by Xhacker Liu on 6/14/14.
-//  Copyright (c) 2014 Xhacker. All rights reserved.
-//
-
-#import "QSHWebScriptObjectConverter.h"
-
-@interface QSHWebScriptObjectConverter ()
-
-@property (nonatomic, weak) WebView *webView;
-
-@end
-
-@implementation QSHWebScriptObjectConverter
-
-- (instancetype)initWithWebView:(WebView *)webView
-{
-    self = [super init];
-    if (self) {
-        _webView = webView;
-        [self registerJavaScriptHelpers];
-    }
-    return self;
-}
-
-- (void)registerJavaScriptHelpers
-{
-    NSString *bridgeUtil = @"QSHBridgeUtil = {};";
-    NSString *isArray = @"QSHBridgeUtil.isArray = function(obj) { return obj.constructor == Array; };";
-    NSString *isObject = @"QSHBridgeUtil.isObject = function(obj) { return obj.constructor == Object; };";
-    NSString *dictionaryKeys = @"QSHBridgeUtil.dictionaryKeys = function(obj) { \
-                                     var a = []; \
-                                     for (var key in obj) { \
-                                         if (!obj.hasOwnProperty(key)) { \
-                                             continue; \
-                                         } \
-                                         a.push(key); \
-                                     } \
-                                     return a; \
-                                 }";
-    NSString *callFunction = @"QSHBridgeUtil.callFunction = function(func) { func(); };";
-    NSString *callFunctionWithArgs = @"QSHBridgeUtil.callFunctionWithArgs = function(func, args) { func.apply(null, args); };";
-
-    WebScriptObject *win = self.webView.windowScriptObject;
-    [win evaluateWebScript:bridgeUtil];
-    [win evaluateWebScript:isArray];
-    [win evaluateWebScript:isObject];
-    [win evaluateWebScript:dictionaryKeys];
-    [win evaluateWebScript:callFunction];
-    [win evaluateWebScript:callFunctionWithArgs];
-}
-
-- (BOOL)isArray:(WebScriptObject *)obj
-{
-    WebScriptObject *win = self.webView.windowScriptObject;
-    WebScriptObject *bridgeUtil = [win evaluateWebScript:@"QSHBridgeUtil"];
-    NSNumber *result = [bridgeUtil callWebScriptMethod:@"isArray" withArguments:@[obj]];
-
-    return result.boolValue;
-}
-
-- (BOOL)isDictionary:(WebScriptObject *)obj
-{
-    WebScriptObject *win = self.webView.windowScriptObject;
-    WebScriptObject *bridgeUtil = [win evaluateWebScript:@"QSHBridgeUtil"];
-    NSNumber *result = [bridgeUtil callWebScriptMethod:@"isObject" withArguments:@[obj]];
-
-    return result.boolValue;
-}
-
-- (NSDictionary *)dictionaryFromWebScriptObject:(WebScriptObject *)webScriptObject
-{
-    WebScriptObject *win = self.webView.windowScriptObject;
-    WebScriptObject *bridgeUtil = [win evaluateWebScript:@"QSHBridgeUtil"];
-
-    WebScriptObject *keysObject = [bridgeUtil callWebScriptMethod:@"dictionaryKeys" withArguments:@[webScriptObject]];
-    NSArray *keys = [self arrayFromWebScriptObject:keysObject];
-    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:keys.count];
-
-    for (NSString *key in keys) {
-        id item = [webScriptObject valueForKey:key];
-        if ([item isKindOfClass:[WebScriptObject class]]) {
-            if ([self isArray:item]) {
-                dict[key] = [self arrayFromWebScriptObject:item];
-            }
-            else if ([self isDictionary:item]) {
-                dict[key] = [self dictionaryFromWebScriptObject:item];
-            }
-            else {
-                dict[key] = item;
-            }
-        }
-        else {
-            dict[key] = item;
-        }
-    }
-
-    return dict;
-}
-
-- (NSArray *)arrayFromWebScriptObject:(WebScriptObject *)webScriptObject
-{
-    NSUInteger count = [[webScriptObject valueForKey:@"length"] integerValue];
-    NSMutableArray *a = [NSMutableArray array];
-    for (unsigned i = 0; i < count; i++) {
-        id item = [webScriptObject webScriptValueAtIndex:i];
-        if ([item isKindOfClass:[WebScriptObject class]]) {
-            if ([self isArray:item]) {
-                [a addObject:[self arrayFromWebScriptObject:item]];
-            }
-            else if ([self isDictionary:item]) {
-                [a addObject:[self dictionaryFromWebScriptObject:item]];
-            }
-            else {
-                [a addObject:item];
-            }
-        }
-        else {
-            [a addObject:item];
-        }
-    }
-
-    return a;
-}
-
-- (void)callFunction:(WebScriptObject *)webScriptObject
-{
-    WebScriptObject *win = self.webView.windowScriptObject;
-    WebScriptObject *bridgeUtil = [win evaluateWebScript:@"QSHBridgeUtil"];
-    [bridgeUtil callWebScriptMethod:@"callFunction" withArguments:@[webScriptObject]];
-}
-
-- (void)callFunction:(WebScriptObject *)webScriptObject
-            withArgs:(NSArray *)args
-{
-    WebScriptObject *win = self.webView.windowScriptObject;
-    WebScriptObject *bridgeUtil = [win evaluateWebScript:@"QSHBridgeUtil"];
-    [bridgeUtil callWebScriptMethod:@"callFunctionWithArgs" withArguments:@[webScriptObject, args]];
-}
-
-@end
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 4e885e0..d537699 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -8,7 +8,6 @@
 
 #import "QSHWebViewDelegate.h"
 #import "QSHPreferencesViewController.h"
-#import "QSHWebScriptObjectConverter.h"
 #import "QSHWebViewWindowController.h"
 #import <MASShortcut+Monitoring.h>
 #import <RHPreferences.h>
@@ -124,62 +123,6 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
     return YES;
 }
 
-+ (NSString *)webScriptNameForSelector:(SEL)selector
-{
-    id result = nil;
-
-    if (selector == @selector(resizePopup:)) {
-        result = @"resizePopup";
-    }
-    else if (selector == @selector(notify:)) {
-        result = @"notify";
-    }
-    else if (selector == @selector(changeIcon:)) {
-        result = @"setMenubarIcon";
-    }
-    else if (selector == @selector(changeHighlightedIcon:)) {
-        result = @"setMenubarHighlightedIcon";
-    }
-    else if (selector == @selector(changeClickAction:)) {
-        result = @"setClickAction";
-    }
-    else if (selector == @selector(changeSecondaryClickAction:)) {
-        result = @"setSecondaryClickAction";
-    }
-    else if (selector == @selector(changeLabel:)) {
-        result = @"setLabel";
-    }
-    else if (selector == @selector(openURL:)) {
-        result = @"openURL";
-    }
-    else if (selector == @selector(addKeyboardShortcut:)) {
-        result = @"addKeyboardShortcut";
-    }
-    else if (selector == @selector(setupPreferences:)) {
-        result = @"setupPreferences";
-    }
-    else if (selector == @selector(newWindow:)) {
-        result = @"newWindow";
-    }
-    else if (selector == @selector(checkUpdate:)) {
-        result = @"checkUpdate";
-    }
-    else if (selector == @selector(checkUpdateInBackground:)) {
-        result = @"checkUpdateInBackground";
-    }
-    else if (selector == @selector(emitMessage:)) {
-        result = @"emit";
-    }
-    else if (selector == @selector(showMenu:)) {
-        result = @"showMenu";
-    }
-    else if (selector == @selector(setLaunchAtLogin:)) {
-        result = @"setLaunchAtLogin";
-    }
-
-    return result;
-}
-
 + (BOOL)isKeyExcludedFromWebScript:(const char *)name
 {
     if (strncmp(name, "appVersion", 10) == 0 ||
@@ -224,8 +167,9 @@ - (void)quit
     [NSApp terminate:nil];
 }
 
-- (void)openURL:(NSString *)url
+- (void)openURL:(NSArray *)args
 {
+    NSString *url = args[0];
     [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
 }
 
@@ -236,29 +180,25 @@ - (void)changeIcon:(NSArray *)args
     NSImage *icon = [[NSImage alloc] initWithData:data];
     icon.size = NSMakeSize(20, 20);
 
-    if (IS_PRIOR_TO_10_9) {
-        self.statusItemView.icon = icon;
-    }
-    else {
-        [icon setTemplate:YES];
-        self.statusItem.button.image = icon;
-    }
+    [icon setTemplate:YES];
+    self.statusItem.button.image = icon;
 }
 
-- (void)changeHighlightedIcon:(NSString *)base64
+- (void)changeHighlightedIcon:(NSArray *)args
 {
+    NSString *base64 = args[0];
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:base64]];
     NSImage *icon = [[NSImage alloc] initWithData:data];
     self.statusItemView.highlightedIcon = icon;
 }
 
-- (void)changeClickAction:(WebScriptObject *)callback
+- (void)changeClickAction:(NSArray *)args
 {
     self.appDelegate.clickCallback = ^{
     };
 }
 
-- (void)changeSecondaryClickAction:(WebScriptObject *)callback
+- (void)changeSecondaryClickAction:(NSArray *)args
 {
     self.appDelegate.secondaryClickCallback = ^{
     };
@@ -277,26 +217,24 @@ - (void)resetMenubarIcon
     }
 }
 
-- (void)changeLabel:(NSString *)label
+- (void)changeLabel:(NSArray *)args
 {
+    NSString *label = args[0];
     NSDictionary *barTextAttributes;
-    if (IS_PRIOR_TO_10_9) {
-        self.statusItemView.label = label;
-        barTextAttributes = @{NSFontAttributeName: MENUBAR_FONT};
-    }
-    else {
-        self.statusItem.title = label;
-        if (!IS_PRIOR_TO_10_10) {
-            self.statusItem.button.font = MENUBAR_FONT_10_11;
-        }
-        barTextAttributes = @{NSFontAttributeName: self.statusItem.button.font};
+    self.statusItem.title = label;
+    if (!IS_PRIOR_TO_10_10) {
+        self.statusItem.button.font = MENUBAR_FONT_10_11;
     }
+    barTextAttributes = @{NSFontAttributeName: self.statusItem.button.font};
+
     // 20 is image width, 10 is extra margin
     self.statusItem.length = 20 + [label sizeWithAttributes:barTextAttributes].width + 10;
 }
 
-- (void)setLaunchAtLogin:(BOOL)launchAtLogin
+- (void)setLaunchAtLogin:(NSArray *)args
 {
+    BOOL launchAtLogin = args[0];
+    
     StartAtLoginController *loginController = [[StartAtLoginController alloc] initWithIdentifier:@"com.hackplan.quark-shell-helper"];
     loginController.startAtLogin = launchAtLogin;
 }
@@ -350,8 +288,9 @@ - (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNot
     [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification];
 }
 
-- (void)addKeyboardShortcut:(WebScriptObject *)shortcutObj
+- (void)addKeyboardShortcut:(NSArray *)args
 {
+    NSDictionary* shortcutObj = args[0];
     NSUInteger keycode = [[shortcutObj valueForKey:@"keycode"] integerValue];
     NSUInteger flags = [[shortcutObj valueForKey:@"modifierFlags"] integerValue];
 
@@ -361,12 +300,11 @@ - (void)addKeyboardShortcut:(WebScriptObject *)shortcutObj
         return;
     }
 
-    WebScriptObject *callback = [shortcutObj valueForKey:@"callback"];
+    NSString *callbackId = [shortcutObj valueForKey:@"callback"];
     MASShortcut *shortcut = [MASShortcut shortcutWithKeyCode:keycode modifierFlags:flags];
     [MASShortcut removeGlobalHotkeyMonitor:shortcut.description];
     [MASShortcut addGlobalHotkeyMonitorWithShortcut:shortcut handler:^{
-        QSHWebScriptObjectConverter *converter = [[QSHWebScriptObjectConverter alloc] initWithWebView:self.webView];
-        [converter callFunction:callback];
+        [self.mainBridge callHandler:@"onQuarkShortcut" data:callbackId];
     }];
 }
 
@@ -497,7 +435,7 @@ - (void)emitMessage:(NSArray *)arg
     [bridges addObject:self.mainBridge];
     
     for (WKWebViewJavascriptBridge *b in bridges) {
-        [b callHandler:@"onQuarkMessages" data:arg[0]];
+        [b callHandler:@"onQuarkMessage" data:arg[0]];
     }
 }
 
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 3c9b29e..4c94173 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -11,55 +11,72 @@ function setupWebViewJavascriptBridge(callback) {
 
 function setupQuarkWithBridge(bridge) {
   window.quark = {};
-  
-  window.quark.setupPref = function (options) {
-    bridge.callHandler('quark', {'method': 'setupPreferences', 'args': [options]});
-  }
 
-  window.quark.openPreferences = function () {
-    bridge.callHandler('quark', {'method': 'openPreferences'})
-  }
+  var setMethods = function (methods, needOptions) {
+    function makeMethod(method, needOptions) {
+      if (needOptions){
+        return function(options) {
+          bridge.callHandler('quark', {'method': method, 'args': [options]});
+        }
+      } else {
+        return function() {
+          bridge.callHandler('quark', {'method': method});
+        }
+      }
+    }
 
-  window.quark.pin = function () {
-    bridge.callHandler('quark', {'method': 'pin'})
+    var i;
+    for (i = 0; i < methods.length; i++) {
+      window.quark[methods[i]] = makeMethod(methods[i], needOptions);
+    }
   }
 
-  window.quark.unpin = function () {
-      bridge.callHandler('quark', {'method': 'unpin'})
-  }
+  setMethods([
+    'openPopup', 'closePopup', 'togglePopup',
+    'resetMenubarIcon', 'removeAllScheduledNotifications', 'removeAllDeliveredNotifications',
+    'clearKeyboardShortcut', 'openPreferences', 'closePreferences',
+    'pin', 'unpin',
+    'quit'
+  ], false);
 
-  window.quark.notify = function (options) {
-      bridge.callHandler('quark', {'method': 'notify', 'args': [options]})
-  }
+  setMethods([
+    'setupPreferences', 'notify',
+    'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
+    'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow',
+    'checkUpdate', 'checkUpdateInBackground',
+    'resizePopup'
+  ], true);
 
   window.quark.closeWindow = function (options) {
-      bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
-  }
-
-  window.quark.emit = function (options) {
-      bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
+    bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
   }
 
-  window.quark.newWindow = function (options) {
-      bridge.callHandler('quark', {'method': 'newWindow', 'args': [options]})
+  window.quark.setLaunchAtLogin = function (shouldLaunchAtLogin) {
+    shouldLaunchAtLogin = !!shouldLaunchAtLogin
+    bridge.callHandler('quark', {'method': 'setLaunchAtLogin', 'args': [shouldLaunchAtLogin]})
   }
 
-  window.quark.setIcon = function (base64) {
-    bridge.callHandler('quark', {'method': 'changeIcon', 'args': [base64]})
+  window.quark.emit = function (options) {
+    bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
   }
-
+  
 }
 
 setupWebViewJavascriptBridge(function(bridge) {
   window.bridge = bridge;
 
   setupQuarkWithBridge(bridge);
-  // TODO: implement quark.on('name', function(data) {})
-  bridge.registerHandler('onQuarkMessages', function(data) {
-    console.error('ObjC called testJavascriptHandler with', data)
+  // TODO: implement quark.onMessage('name', function(data) {})
+  bridge.registerHandler('onQuarkMessage', function(data) {
+    console.error('quark emitted', data)
+  });
+                             
+  // TODO: implement quark.onShortcut('id', function() {})
+  bridge.registerHandler('onQuarkShortcut', function(id) {
+    console.error('shortcut triggered', id)
   });
 
   if (window.onQuarkLoaded){
     window.onQuarkLoaded()
   }
-})
\ No newline at end of file
+})
diff --git a/sample/about.html b/sample/about.html
index d52d74c..c2feced 100644
--- a/sample/about.html
+++ b/sample/about.html
@@ -24,6 +24,6 @@
 </head>
 <body>
   <h1>Awesome Project!</h1>
-  <button onclick="closeWindow()">Close</button>
+  <button onclick="quark.closeWindow()">Close</button>
 </body>
 </html>
diff --git a/sample/index.html b/sample/index.html
index 7d2fb76..6131c8d 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -71,18 +71,18 @@ <h1>
 
   <div class="button">
     <p>
-      <button onclick="notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true})">Notify</button>
-      <button onclick="emit({title: 'close'})">Close Popup</button>
-      <button onclick="newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
+      <button onclick="quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true})">Notify</button>
+      <button onclick="quark.closePopup()">Close Popup</button>
+      <button onclick="quark.newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
     </p>
     <p>
-      <button onclick="openPreferences()">Preferences</button>
-      <button onclick="quark.openURL('https://github.com/xhacker')">Open URL</button>
+      <button onclick="quark.openPreferences()">Preferences</button>
+      <button onclick="quark.openURL('https://github.com/hackplan')">Open URL</button>
       <button onclick="quark.checkUpdate('https://rawgit.com/HackPlan/quark-shell-mac/master/updater/SampleAppcast.xml')">Check Update</button>
     </p>
     <p>
       <button onclick="setIcon()">Set Icon</button>
-      <button onclick="quark.setLabel('03:14 AM 喵')">Set Label</button>
+      <button onclick="quark.changeLabel('03:14 AM 喵')">Set Label</button>
       <button id="show-menu">Show Menu</button>
     </p>
     <p>
diff --git a/sample/index.js b/sample/index.js
index b2973b0..046902f 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -84,26 +84,24 @@
 $(function() {
   $("#toggle-pin").click(function() {
                          if ($(this).html() == "Pin") {
-                         pin()
+                         quark.pin()
                          $(this).html("Unpin")
                          }
                          else {
-                         unpin()
+                         quark.unpin()
                          $(this).html("Pin")
                          }
                          });
   $("#show-menu").click(function(event) {
-                        bridge.callHandler('quark', {
-                            'method': 'showMenu',
-                            'args': [{
-                                items: [
-                                        {label: "Test", click: function() { console.log("I am completely operational") } },
-                                        {type: "separator"},
-                                        {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
-                                        ],
-                                x: event.clientX,
-                                y: event.clientY
-                                }]});
+                        quark.showMenu({
+                                       items: [
+                                               {label: "Test", click: function() { console.log("I am completely operational") } },
+                                               {type: "separator"},
+                                               {label: "Exit", click: function() { console.log("LIFE FUNCTION TERMINATED") } }
+                                               ],
+                                       x: event.clientX,
+                                       y: event.clientY
+                                       });
                         });
   });
 
@@ -139,3 +137,23 @@ function setupPref(){
 onQuarkLoaded = function () {
     quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
 }
+
+function setIcon() {
+    var iconCanvas = document.getElementById('icon')
+    iconCanvas.width = 40
+    iconCanvas.height = 40
+    var iconCtx = iconCanvas.getContext('2d')
+    iconCtx.fillRect(6, 8, 28, 28)
+    iconCtx.clearRect(12, 14, 16, 16)
+
+    var highlightedIconCanvas = document.getElementById('highlighted-icon')
+    highlightedIconCanvas.width = 40
+    highlightedIconCanvas.height = 40
+    var highlightedIconCtx = highlightedIconCanvas.getContext('2d')
+    highlightedIconCtx.fillStyle = "white"
+    highlightedIconCtx.fillRect(6, 8, 28, 28)
+    highlightedIconCtx.clearRect(12, 14, 16, 16)
+
+    quark.changeIcon(iconCanvas.toDataURL())
+    quark.changeHighlightedIcon(highlightedIconCanvas.toDataURL())
+}

From a4e484fed57d561f770879cab772118a93d56c8b Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 29 Oct 2016 20:00:24 +0800
Subject: [PATCH 09/43] implement alert confirm and prompt

---
 quark-shell/QSHWebViewDelegate.m | 66 ++++++++++++++++++++++----------
 sample/index.html                |  4 +-
 sample/index.js                  | 15 ++++++++
 3 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index d537699..8b6523f 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -471,7 +471,7 @@ - (void)menuItemClicked:(NSMenuItem *)sender
 
 #pragma mark - Delegate methods
 
-- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message
+- (void)webView:(WKWebView *)webView addMessageToConsole:(NSDictionary *)message
 {
 	if (![message isKindOfClass:[NSDictionary class]]) {
 		return;
@@ -483,17 +483,19 @@ - (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message
 		  message[@"message"]);
 }
 
-- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
+- (void)webView:(QSHWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
 {
     NSAlert *alert = [[NSAlert alloc] init];
     [alert addButtonWithTitle:@"OK"];
     alert.messageText = message;
     alert.alertStyle = NSWarningAlertStyle;
-
+    
     [alert runModal];
+    completionHandler();
 }
 
-- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
+- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
+
 {
     NSAlert *alert = [[NSAlert alloc] init];
     [alert addButtonWithTitle:@"Yes"];
@@ -502,13 +504,50 @@ - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString
     alert.alertStyle = NSWarningAlertStyle;
 
     if ([alert runModal] == NSAlertFirstButtonReturn) {
-        return YES;
+        completionHandler(YES);
     }
     else {
-        return NO;
+        completionHandler(NO);
     }
 }
 
+- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)message defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler
+{
+    NSArray *components = [message componentsSeparatedByString: @"::"];
+    message = (NSString*) [components objectAtIndex:0];
+    NSString *okText = nil;
+    NSString *cancelText = nil;
+    if ([components count] > 1) {
+        okText = (NSString*) [components objectAtIndex:1];
+        @try{
+            cancelText = (NSString*) [components objectAtIndex:2];
+        } @catch (NSException * e) {
+            NSLog(@"Exception: %@", e);
+        }
+    }
+    if (okText.length < 1) {
+        okText = NSLocalizedString(@"OK", @"");
+    }
+    
+    NSAlert *alert = [[NSAlert alloc] init];
+    
+    [alert addButtonWithTitle: okText];
+    [alert addButtonWithTitle: cancelText];
+    [alert setMessageText:message];
+    NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)];
+    [input setStringValue:defaultText];
+    [alert setAccessoryView:input];
+    
+    NSInteger button = [alert runModal];
+    if (button == NSAlertFirstButtonReturn) {
+        [input validateEditing];
+        return completionHandler([input stringValue]);
+    }
+    
+    completionHandler(nil);
+
+}
+
 // Enable <input type="file">
 - (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener
 {
@@ -524,21 +563,6 @@ - (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(i
     }];
 }
 
-// Enable WebSQL: http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate
-- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id)origin database:(NSString *)databaseIdentifier
-{
-    static const unsigned long long defaultQuota = 5 * 1024 * 1024;
-    #pragma clang diagnostic push
-    #pragma clang diagnostic ignored "-Wundeclared-selector"
-    if ([origin respondsToSelector:@selector(setQuota:)]) {
-        [origin performSelector:@selector(setQuota:) withObject:@(defaultQuota)];
-    }
-    #pragma clang diagnostic pop
-    else {
-        NSLog(@"Could not increase quota for %lld", defaultQuota);
-    }
-}
-
 #pragma mark WebPolicyDelegate
 
 - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
diff --git a/sample/index.html b/sample/index.html
index 6131c8d..2d2e456 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -88,11 +88,11 @@ <h1>
     <p>
       <button onclick="$('audio')[0].play()">Audio</button>
       <button id="toggle-pin">Pin</button>
-      <button onclick="confirm('Quark Shell rocks!')">Confirm</button>
+      <button onclick="showConfirm()">Confirm</button>
     </p>
     <p>
       <button onclick="quark.resizePopup({width: 400, height: 320})">Resize</button>
-      <button style="visibility: hidden;"></button>
+      <button onclick="showPrompt()">Alert</button>
       <button onclick="quark.quit()">Quit</button>
     </p>
   </div>
diff --git a/sample/index.js b/sample/index.js
index 046902f..17478b0 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -138,6 +138,21 @@ onQuarkLoaded = function () {
     quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
 }
 
+function showConfirm() {
+  var content;
+  if (confirm('Quark Shell rocks!')){
+    content = "YES"
+  } else {
+    content = "NO"
+  }
+  quark.notify({title: 'Quark Shell', content: content, popupOnClick: true})
+}
+
+function showPrompt() {
+  var content = prompt('What do you say:');
+  quark.notify({title: 'Quark Shell', content: content, popupOnClick: true})
+}
+
 function setIcon() {
     var iconCanvas = document.getElementById('icon')
     iconCanvas.width = 40

From 8be568c61341302ce8bb84f4b123d0e593eb1b05 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 29 Oct 2016 21:54:18 +0800
Subject: [PATCH 10/43] right border window

---
 quark-shell.xcodeproj/project.pbxproj |  4 +-
 quark-shell/QSHAppDelegate.m          | 62 ++++++++++++++++++++-------
 quark-shell/QSHWindowBorderView.h     |  3 ++
 quark-shell/QSHWindowBorderView.m     | 30 ++++++++-----
 sample/index.js                       |  1 +
 5 files changed, 72 insertions(+), 28 deletions(-)

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index ba66985..181be8b 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -20,7 +20,6 @@
 		1A91FA0318E2530B00AA8B7E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91F9E218E2530B00AA8B7E /* Cocoa.framework */; };
 		1A91FA0B18E2530C00AA8B7E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1A91FA0918E2530C00AA8B7E /* InfoPlist.strings */; };
 		1A91FA0D18E2530C00AA8B7E /* quark_shellTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A91FA0C18E2530C00AA8B7E /* quark_shellTests.m */; };
-		1A91FA5A18E25F3C00AA8B7E /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91FA5918E25F3C00AA8B7E /* WebKit.framework */; };
 		1A9A456E1A1C93C600C98589 /* NSWindow+Fade.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */; };
 		1AA896731964FB1800E4FDAC /* QSHWebViewWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AA896711964FB1800E4FDAC /* QSHWebViewWindowController.m */; };
 		1AA896741964FB1800E4FDAC /* QSHWebViewWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AA896721964FB1800E4FDAC /* QSHWebViewWindowController.xib */; };
@@ -34,6 +33,7 @@
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
+		8AC4ABDF1DC4D5810026D522 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91FA5918E25F3C00AA8B7E /* WebKit.framework */; };
 		9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 92906357BD95D526FFB4245E /* libPods-quark-shell.a */; };
 /* End PBXBuildFile section */
 
@@ -127,7 +127,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A91FA5A18E25F3C00AA8B7E /* WebKit.framework in Frameworks */,
+				8AC4ABDF1DC4D5810026D522 /* WebKit.framework in Frameworks */,
 				1A91F9E318E2530B00AA8B7E /* Cocoa.framework in Frameworks */,
 				9118E5937926C55B468AC86C /* libPods-quark-shell.a in Frameworks */,
 			);
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index fb7fc1b..60a1591 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -7,13 +7,17 @@
 //
 
 #import <WebKit/WebKit.h>
+#import <AppKit/AppKit.h>
 #import "QSHAppDelegate.h"
+#import "QSHWindowBorderView.h"
 #import "QSHWebView.h"
 #import "QSHWebViewDelegate.h"
 #import "QSHStatusItemView.h"
 #import "NSWindow+Fade.h"
 #import "WKWebViewJavascriptBridge.h"
 
+static const CGFloat kMinimumSpaceBetweenWindowAndScreenEdge = 10;
+
 @interface QSHAppDelegate () <NSWindowDelegate>
 
 @property (nonatomic) NSStatusItem *statusItem;
@@ -61,19 +65,17 @@ - (void)setupStatusItemAndWindow
     [self.window setBackgroundColor:[NSColor clearColor]];
 }
 
-- (void)_createViews {
-    NSView* contentView = _window.contentView;
-    
-    // WKWebView
-    _webView = [[QSHWebView alloc] initWithFrame:contentView.frame];
+- (void)setupWebView
+{
+    QSHWindowBorderView *contentView = _window.contentView;
+    _webView = [[QSHWebView alloc] initWithFrame:contentView.innerFrame];
     [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
     _webView.configuration.preferences._developerExtrasEnabled = YES;
+    
     [contentView addSubview:_webView];
-}
-
-- (void)setupWebView
-{
-    [self _createViews];
+    // TODO: remove this, this is for debug
+    self.pinned = YES;
+    
     NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
@@ -140,12 +142,42 @@ - (void)statusItemClicked
 
 - (void)refreshStyle
 {
-    NSRect itemFrame;
-    itemFrame = self.statusItem.button.window.frame;
-
+    NSRect itemFrame, screenFrame;
+    
+    if (IS_PRIOR_TO_10_9) {
+        self.statusItemView.itemHighlighted = self.shouldBeVisible;
+        itemFrame = self.statusItem.view.window.frame;
+    }
+    else {
+        itemFrame = self.statusItem.button.window.frame;
+    }
+    
     NSRect windowFrame = self.window.frame;
-    windowFrame.origin.x = NSMidX(itemFrame) - NSWidth(windowFrame) / 2.0;
-    windowFrame.origin.y = NSMinY(itemFrame) - NSHeight(windowFrame);
+    
+    screenFrame = [[NSScreen mainScreen] frame];
+    
+    // Calculate window's top left point.
+    // First, center window under status item.
+    CGFloat w = NSWidth(windowFrame);
+    CGFloat x = NSMidX(itemFrame) - NSWidth(windowFrame) / 2.0;
+    CGFloat y = NSMinY(itemFrame) - NSHeight(windowFrame);
+    
+    windowFrame.origin.y = y;
+    
+    // If the calculated x position puts the window too
+    // far to the right, shift the window left.
+    CGFloat screenMaxX = NSMaxX(screenFrame);
+    if (x + w + kMinimumSpaceBetweenWindowAndScreenEdge > screenMaxX) {
+        x = screenMaxX - w - kMinimumSpaceBetweenWindowAndScreenEdge;
+    }
+    
+    windowFrame.origin.x = x;
+    
+    QSHWindowBorderView *contentView = [[self window] contentView];
+    
+    contentView.arrowMidX = NSMidX(itemFrame) - x;
+    [contentView setNeedsDisplay:YES];
+    
     [self.window setFrame:windowFrame display:NO];
 }
 
diff --git a/quark-shell/QSHWindowBorderView.h b/quark-shell/QSHWindowBorderView.h
index dedadd2..f9d283a 100644
--- a/quark-shell/QSHWindowBorderView.h
+++ b/quark-shell/QSHWindowBorderView.h
@@ -9,5 +9,8 @@
 #import <Cocoa/Cocoa.h>
 
 @interface QSHWindowBorderView : NSView
+@property (nonatomic, assign) CGFloat arrowMidX;
+
+- (NSRect)innerFrame;
 
 @end
diff --git a/quark-shell/QSHWindowBorderView.m b/quark-shell/QSHWindowBorderView.m
index 62d69cd..45cd0e6 100644
--- a/quark-shell/QSHWindowBorderView.m
+++ b/quark-shell/QSHWindowBorderView.m
@@ -8,6 +8,10 @@
 
 #import "QSHWindowBorderView.h"
 
+static const CGFloat roundedRectangleCornerRadius = 5;
+static const CGFloat arrowHeight = 10;
+static const CGFloat arrowWidth = 20;
+
 @implementation QSHWindowBorderView
 
 - (id)initWithFrame:(NSRect)frame
@@ -18,28 +22,32 @@ - (id)initWithFrame:(NSRect)frame
     return self;
 }
 
-// courtesy of https://github.com/jesseXu/Bang
+- (NSRect)innerFrame
+{
+    return NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
+}
+
 - (void)drawRect:(NSRect)dirtyRect
 {
     [super drawRect:dirtyRect];
-    
-    CGFloat roundedRectangleCornerRadius = 5;
-    CGFloat arrowHeight = 10;
-    CGFloat arrowWidth = 20;
+
     NSRect roundedRectangleRect = NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
     NSRect roundedRectangleInnerRect = NSInsetRect(roundedRectangleRect, roundedRectangleCornerRadius, roundedRectangleCornerRadius);
     NSBezierPath *roundedRectanglePath = [NSBezierPath bezierPath];
     [roundedRectanglePath appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(roundedRectangleInnerRect), NSMinY(roundedRectangleInnerRect)) radius: roundedRectangleCornerRadius startAngle:180 endAngle:270];
     [roundedRectanglePath appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(roundedRectangleInnerRect), NSMinY(roundedRectangleInnerRect)) radius: roundedRectangleCornerRadius startAngle:270 endAngle:360];
     [roundedRectanglePath appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(roundedRectangleInnerRect), NSMaxY(roundedRectangleInnerRect)) radius: roundedRectangleCornerRadius startAngle:0 endAngle:90];
-
-    [roundedRectanglePath lineToPoint:NSMakePoint(NSMidX(roundedRectangleRect) - arrowWidth / 2, NSMaxY(roundedRectangleRect))];
-    [roundedRectanglePath lineToPoint:NSMakePoint(NSMidX(roundedRectangleRect), NSMaxY(roundedRectangleRect) + arrowHeight)];
-    [roundedRectanglePath lineToPoint:NSMakePoint(NSMidX(roundedRectangleRect) + arrowWidth / 2, NSMaxY(roundedRectangleRect))];
-
+    
+    // draw arrow
+    CGFloat arrowMidX = (_arrowMidX == 0) ? NSMidX(roundedRectangleRect) : _arrowMidX;
+    
+    [roundedRectanglePath lineToPoint:NSMakePoint(arrowMidX - arrowWidth / 2, NSMaxY(roundedRectangleRect))];
+    [roundedRectanglePath lineToPoint:NSMakePoint(arrowMidX, NSMaxY(roundedRectangleRect) + arrowHeight)];
+    [roundedRectanglePath lineToPoint:NSMakePoint(arrowMidX + arrowWidth / 2, NSMaxY(roundedRectangleRect))];
+    
     [roundedRectanglePath appendBezierPathWithArcWithCenter: NSMakePoint(NSMinX(roundedRectangleInnerRect), NSMaxY(roundedRectangleInnerRect)) radius:roundedRectangleCornerRadius startAngle:90 endAngle:180];
     [roundedRectanglePath closePath];
-
+    
     [[NSColor controlColor] setFill];
     [roundedRectanglePath fill];
 }
diff --git a/sample/index.js b/sample/index.js
index 17478b0..b8362a6 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -136,6 +136,7 @@ function setupPref(){
 
 onQuarkLoaded = function () {
     quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
+    quark.pin();
 }
 
 function showConfirm() {

From 72d3feff5aa0b77034062663510d055035bbdf81 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sun, 30 Oct 2016 00:14:24 +0800
Subject: [PATCH 11/43] fix popup window rounded border

---
 quark-shell/QSHAppDelegate.m      | 10 ++++++++--
 quark-shell/QSHWindowBorderView.m |  5 +++--
 sample/index.html                 |  2 +-
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 60a1591..3ada280 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -73,8 +73,14 @@ - (void)setupWebView
     _webView.configuration.preferences._developerExtrasEnabled = YES;
     
     [contentView addSubview:_webView];
-    // TODO: remove this, this is for debug
-    self.pinned = YES;
+    
+    contentView.wantsLayer = YES;
+    contentView.layer.cornerRadius = 5.0;
+    contentView.layer.masksToBounds = YES;
+    
+    _webView.wantsLayer = YES;
+    _webView.layer.cornerRadius = 5.0;
+    _webView.layer.masksToBounds = YES;
     
     NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
diff --git a/quark-shell/QSHWindowBorderView.m b/quark-shell/QSHWindowBorderView.m
index 45cd0e6..bc7e3c0 100644
--- a/quark-shell/QSHWindowBorderView.m
+++ b/quark-shell/QSHWindowBorderView.m
@@ -8,6 +8,7 @@
 
 #import "QSHWindowBorderView.h"
 
+static const CGFloat marginTop = -5;
 static const CGFloat roundedRectangleCornerRadius = 5;
 static const CGFloat arrowHeight = 10;
 static const CGFloat arrowWidth = 20;
@@ -24,14 +25,14 @@ - (id)initWithFrame:(NSRect)frame
 
 - (NSRect)innerFrame
 {
-    return NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
+    return NSMakeRect(0, marginTop, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
 }
 
 - (void)drawRect:(NSRect)dirtyRect
 {
     [super drawRect:dirtyRect];
 
-    NSRect roundedRectangleRect = NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
+    NSRect roundedRectangleRect = NSMakeRect(0, marginTop, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
     NSRect roundedRectangleInnerRect = NSInsetRect(roundedRectangleRect, roundedRectangleCornerRadius, roundedRectangleCornerRadius);
     NSBezierPath *roundedRectanglePath = [NSBezierPath bezierPath];
     [roundedRectanglePath appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(roundedRectangleInnerRect), NSMinY(roundedRectangleInnerRect)) radius: roundedRectangleCornerRadius startAngle:180 endAngle:270];
diff --git a/sample/index.html b/sample/index.html
index 2d2e456..b365fb7 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -92,7 +92,7 @@ <h1>
     </p>
     <p>
       <button onclick="quark.resizePopup({width: 400, height: 320})">Resize</button>
-      <button onclick="showPrompt()">Alert</button>
+      <button onclick="showPrompt()">Prompt</button>
       <button onclick="quark.quit()">Quit</button>
     </p>
   </div>

From 793007c13de112c1a854f00d52e54cfb8423d891 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Wed, 2 Nov 2016 20:04:18 +0800
Subject: [PATCH 12/43] exclude pods and finish shortcut api

---
 .gitignore                                    |    1 +
 Podfile                                       |    2 +-
 Podfile.lock                                  |   26 +-
 .../ISO8601DateFormatter.h                    |    1 -
 .../MASShortcut/MASShortcut+Monitoring.h      |    1 -
 .../MASShortcut/MASShortcut+UserDefaults.h    |    1 -
 .../Headers/Private/MASShortcut/MASShortcut.h |    1 -
 .../MASShortcutView+UserDefaults.h            |    1 -
 .../Private/MASShortcut/MASShortcutView.h     |    1 -
 .../Private/RHPreferences/RHPreferences.h     |    1 -
 .../RHPreferencesWindowController.h           |    1 -
 .../StartAtLoginController.h                  |    1 -
 .../WKWebViewJavascriptBridge.h               |    1 -
 .../WebViewJavascriptBridge.h                 |    1 -
 .../WebViewJavascriptBridgeBase.h             |    1 -
 .../WebViewJavascriptBridge_JS.h              |    1 -
 .../ISO8601DateFormatter.h                    |    1 -
 .../MASShortcut/MASShortcut+Monitoring.h      |    1 -
 .../MASShortcut/MASShortcut+UserDefaults.h    |    1 -
 Pods/Headers/Public/MASShortcut/MASShortcut.h |    1 -
 .../MASShortcutView+UserDefaults.h            |    1 -
 .../Public/MASShortcut/MASShortcutView.h      |    1 -
 .../Public/RHPreferences/RHPreferences.h      |    1 -
 .../RHPreferencesWindowController.h           |    1 -
 .../Public/Sparkle/Sparkle/SUAppcast.h        |    1 -
 .../Public/Sparkle/Sparkle/SUAppcastItem.h    |    1 -
 .../Headers/Public/Sparkle/Sparkle/SUErrors.h |    1 -
 .../Headers/Public/Sparkle/Sparkle/SUExport.h |    1 -
 .../Sparkle/SUStandardVersionComparator.h     |    1 -
 .../Public/Sparkle/Sparkle/SUUpdater.h        |    1 -
 .../Sparkle/SUVersionComparisonProtocol.h     |    1 -
 .../Sparkle/SUVersionDisplayProtocol.h        |    1 -
 Pods/Headers/Public/Sparkle/Sparkle/Sparkle.h |    1 -
 .../StartAtLoginController.h                  |    1 -
 .../WKWebViewJavascriptBridge.h               |    1 -
 .../WebViewJavascriptBridge.h                 |    1 -
 .../WebViewJavascriptBridgeBase.h             |    1 -
 .../ISO8601DateFormatter.h                    |  209 ---
 .../ISO8601DateFormatter.m                    | 1008 --------------
 Pods/ISO8601DateFormatter/LICENSE.txt         |    9 -
 Pods/ISO8601DateFormatter/README.md           |  159 ---
 Pods/Local Podspecs/MASShortcut.podspec.json  |   22 -
 Pods/MASShortcut/LICENSE                      |   22 -
 Pods/MASShortcut/MASShortcut+Monitoring.h     |    9 -
 Pods/MASShortcut/MASShortcut+Monitoring.m     |  172 ---
 Pods/MASShortcut/MASShortcut+UserDefaults.h   |    9 -
 Pods/MASShortcut/MASShortcut+UserDefaults.m   |  104 --
 Pods/MASShortcut/MASShortcut.h                |   59 -
 Pods/MASShortcut/MASShortcut.m                |  345 -----
 .../MASShortcutView+UserDefaults.h            |    7 -
 .../MASShortcutView+UserDefaults.m            |  130 --
 Pods/MASShortcut/MASShortcutView.h            |   20 -
 Pods/MASShortcut/MASShortcutView.m            |  439 -------
 Pods/MASShortcut/README.md                    |   71 -
 Pods/Manifest.lock                            |   37 -
 Pods/Pods.xcodeproj/project.pbxproj           | 1163 -----------------
 Pods/RHPreferences/LICENSE                    |   25 -
 Pods/RHPreferences/README.md                  |  109 --
 .../RHPreferences/RHPreferences-Prefix.pch    |    7 -
 .../RHPreferences/RHPreferences.h             |   33 -
 .../RHPreferences/RHPreferencesWindow.xib     |  305 -----
 .../RHPreferencesWindowController.h           |   97 --
 .../RHPreferencesWindowController.m           |  487 -------
 Pods/Sparkle/LICENSE                          |   60 -
 .../Contents/Info.plist                       |   20 -
 .../Contents/Resources/DWARF/Sparkle          |  Bin 2789845 -> 0 bytes
 Pods/Sparkle/Sparkle.framework/Headers        |    1 -
 Pods/Sparkle/Sparkle.framework/Modules        |    1 -
 Pods/Sparkle/Sparkle.framework/PrivateHeaders |    1 -
 Pods/Sparkle/Sparkle.framework/Resources      |    1 -
 Pods/Sparkle/Sparkle.framework/Sparkle        |    1 -
 .../Versions/A/Headers/SUAppcast.h            |   26 -
 .../Versions/A/Headers/SUAppcastItem.h        |   44 -
 .../Versions/A/Headers/SUErrors.h             |   47 -
 .../Versions/A/Headers/SUExport.h             |   18 -
 .../A/Headers/SUStandardVersionComparator.h   |   38 -
 .../Versions/A/Headers/SUUpdater.h            |  364 ------
 .../A/Headers/SUVersionComparisonProtocol.h   |   30 -
 .../A/Headers/SUVersionDisplayProtocol.h      |   25 -
 .../Versions/A/Headers/Sparkle.h              |   25 -
 .../Versions/A/Modules/module.modulemap       |    6 -
 .../Versions/A/PrivateHeaders/SUUnarchiver.h  |   35 -
 .../Autoupdate.app/Contents/Info.plist        |   54 -
 .../Autoupdate.app/Contents/MacOS/Autoupdate  |  Bin 166964 -> 0 bytes
 .../Resources/Autoupdate.app/Contents/PkgInfo |    1 -
 .../Contents/Resources/AppIcon.icns           |  Bin 155776 -> 0 bytes
 .../Contents/Resources/SUStatus.nib           |  Bin 6572 -> 0 bytes
 .../Resources/ar.lproj/Sparkle.strings        |  Bin 8076 -> 0 bytes
 .../Resources/ca.lproj/Sparkle.strings        |  Bin 6310 -> 0 bytes
 .../Resources/cs.lproj/Sparkle.strings        |  Bin 7430 -> 0 bytes
 .../Resources/da.lproj/Sparkle.strings        |  Bin 7996 -> 0 bytes
 .../Resources/de.lproj/Sparkle.strings        |  Bin 8046 -> 0 bytes
 .../Resources/el.lproj/Sparkle.strings        |  Bin 7338 -> 0 bytes
 .../Resources/en.lproj/Sparkle.strings        |  Bin 9108 -> 0 bytes
 .../Resources/es.lproj/Sparkle.strings        |  Bin 7746 -> 0 bytes
 .../Resources/fi.lproj/Sparkle.strings        |  Bin 5614 -> 0 bytes
 .../Resources/fr.lproj/Sparkle.strings        |  Bin 8188 -> 0 bytes
 .../Resources/he.lproj/Sparkle.strings        |  Bin 4872 -> 0 bytes
 .../Resources/is.lproj/Sparkle.strings        |  Bin 5478 -> 0 bytes
 .../Resources/it.lproj/Sparkle.strings        |  Bin 7926 -> 0 bytes
 .../Resources/ja.lproj/Sparkle.strings        |  Bin 7884 -> 0 bytes
 .../Resources/ko.lproj/Sparkle.strings        |  Bin 5874 -> 0 bytes
 .../Resources/nb.lproj/Sparkle.strings        |  Bin 9004 -> 0 bytes
 .../Resources/nl.lproj/Sparkle.strings        |  Bin 8554 -> 0 bytes
 .../Resources/pl.lproj/Sparkle.strings        |  Bin 8142 -> 0 bytes
 .../Resources/pt_BR.lproj/Sparkle.strings     |  Bin 7160 -> 0 bytes
 .../Resources/pt_PT.lproj/Sparkle.strings     |  Bin 7440 -> 0 bytes
 .../Resources/ro.lproj/Sparkle.strings        |  Bin 9418 -> 0 bytes
 .../Resources/ru.lproj/Sparkle.strings        |  Bin 7452 -> 0 bytes
 .../Resources/sk.lproj/Sparkle.strings        |  Bin 7174 -> 0 bytes
 .../Resources/sl.lproj/Sparkle.strings        |  Bin 7568 -> 0 bytes
 .../Resources/sv.lproj/Sparkle.strings        |  Bin 7412 -> 0 bytes
 .../Resources/th.lproj/Sparkle.strings        |  Bin 8124 -> 0 bytes
 .../Resources/tr.lproj/Sparkle.strings        |  Bin 9252 -> 0 bytes
 .../Resources/uk.lproj/Sparkle.strings        |  Bin 7472 -> 0 bytes
 .../Resources/zh_CN.lproj/Sparkle.strings     |  Bin 5500 -> 0 bytes
 .../Resources/zh_TW.lproj/Sparkle.strings     |  Bin 5416 -> 0 bytes
 .../Versions/A/Resources/Info.plist           |   44 -
 .../A/Resources/SUModelTranslation.plist      |  314 -----
 .../Versions/A/Resources/SUStatus.nib         |  Bin 6572 -> 0 bytes
 .../ar.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7184 -> 0 bytes
 .../A/Resources/ar.lproj/SUUpdateAlert.nib    |  Bin 16687 -> 0 bytes
 .../ar.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12785 -> 0 bytes
 .../A/Resources/ar.lproj/Sparkle.strings      |  Bin 8076 -> 0 bytes
 .../A/Resources/ca.lproj/Sparkle.strings      |  Bin 6310 -> 0 bytes
 .../cs.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7175 -> 0 bytes
 .../A/Resources/cs.lproj/SUUpdateAlert.nib    |  Bin 16718 -> 0 bytes
 .../cs.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12915 -> 0 bytes
 .../A/Resources/cs.lproj/Sparkle.strings      |  Bin 7430 -> 0 bytes
 .../da.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7081 -> 0 bytes
 .../A/Resources/da.lproj/SUUpdateAlert.nib    |  Bin 16591 -> 0 bytes
 .../da.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12672 -> 0 bytes
 .../A/Resources/da.lproj/Sparkle.strings      |  Bin 7996 -> 0 bytes
 .../de.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7120 -> 0 bytes
 .../A/Resources/de.lproj/SUUpdateAlert.nib    |  Bin 16656 -> 0 bytes
 .../de.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12834 -> 0 bytes
 .../A/Resources/de.lproj/Sparkle.strings      |  Bin 8046 -> 0 bytes
 .../el.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7224 -> 0 bytes
 .../A/Resources/el.lproj/SUUpdateAlert.nib    |  Bin 16728 -> 0 bytes
 .../el.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12915 -> 0 bytes
 .../A/Resources/el.lproj/Sparkle.strings      |  Bin 7338 -> 0 bytes
 .../en.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7078 -> 0 bytes
 .../A/Resources/en.lproj/SUUpdateAlert.nib    |  Bin 16580 -> 0 bytes
 .../en.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12614 -> 0 bytes
 .../A/Resources/en.lproj/Sparkle.strings      |  Bin 9108 -> 0 bytes
 .../es.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7134 -> 0 bytes
 .../A/Resources/es.lproj/SUUpdateAlert.nib    |  Bin 16762 -> 0 bytes
 .../es.lproj/SUUpdatePermissionPrompt.nib     |  Bin 13007 -> 0 bytes
 .../A/Resources/es.lproj/Sparkle.strings      |  Bin 7746 -> 0 bytes
 .../A/Resources/fi.lproj/Sparkle.strings      |  Bin 5614 -> 0 bytes
 .../fr.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7137 -> 0 bytes
 .../A/Resources/fr.lproj/SUUpdateAlert.nib    |  Bin 16684 -> 0 bytes
 .../fr.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12993 -> 0 bytes
 .../A/Resources/fr.lproj/Sparkle.strings      |  Bin 8188 -> 0 bytes
 .../Versions/A/Resources/fr_CA.lproj          |    1 -
 .../A/Resources/he.lproj/Sparkle.strings      |  Bin 4872 -> 0 bytes
 .../is.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7148 -> 0 bytes
 .../A/Resources/is.lproj/SUUpdateAlert.nib    |  Bin 16697 -> 0 bytes
 .../is.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12913 -> 0 bytes
 .../A/Resources/is.lproj/Sparkle.strings      |  Bin 5478 -> 0 bytes
 .../it.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7084 -> 0 bytes
 .../A/Resources/it.lproj/SUUpdateAlert.nib    |  Bin 16622 -> 0 bytes
 .../it.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12850 -> 0 bytes
 .../A/Resources/it.lproj/Sparkle.strings      |  Bin 7926 -> 0 bytes
 .../ja.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7088 -> 0 bytes
 .../A/Resources/ja.lproj/SUUpdateAlert.nib    |  Bin 16602 -> 0 bytes
 .../ja.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12571 -> 0 bytes
 .../A/Resources/ja.lproj/Sparkle.strings      |  Bin 7884 -> 0 bytes
 .../ko.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7056 -> 0 bytes
 .../A/Resources/ko.lproj/SUUpdateAlert.nib    |  Bin 16556 -> 0 bytes
 .../ko.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12550 -> 0 bytes
 .../A/Resources/ko.lproj/Sparkle.strings      |  Bin 5874 -> 0 bytes
 .../nb.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7100 -> 0 bytes
 .../A/Resources/nb.lproj/SUUpdateAlert.nib    |  Bin 16551 -> 0 bytes
 .../nb.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12806 -> 0 bytes
 .../A/Resources/nb.lproj/Sparkle.strings      |  Bin 9004 -> 0 bytes
 .../nl.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7089 -> 0 bytes
 .../A/Resources/nl.lproj/SUUpdateAlert.nib    |  Bin 16602 -> 0 bytes
 .../nl.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12648 -> 0 bytes
 .../A/Resources/nl.lproj/Sparkle.strings      |  Bin 8554 -> 0 bytes
 .../pl.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7175 -> 0 bytes
 .../A/Resources/pl.lproj/SUUpdateAlert.nib    |  Bin 16701 -> 0 bytes
 .../pl.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12697 -> 0 bytes
 .../A/Resources/pl.lproj/Sparkle.strings      |  Bin 8142 -> 0 bytes
 .../Versions/A/Resources/pt.lproj             |    1 -
 .../pt_BR.lproj/SUAutomaticUpdateAlert.nib    |  Bin 7152 -> 0 bytes
 .../A/Resources/pt_BR.lproj/SUUpdateAlert.nib |  Bin 16742 -> 0 bytes
 .../pt_BR.lproj/SUUpdatePermissionPrompt.nib  |  Bin 12925 -> 0 bytes
 .../A/Resources/pt_BR.lproj/Sparkle.strings   |  Bin 7160 -> 0 bytes
 .../pt_PT.lproj/SUAutomaticUpdateAlert.nib    |  Bin 7158 -> 0 bytes
 .../A/Resources/pt_PT.lproj/SUUpdateAlert.nib |  Bin 16762 -> 0 bytes
 .../pt_PT.lproj/SUUpdatePermissionPrompt.nib  |  Bin 12965 -> 0 bytes
 .../A/Resources/pt_PT.lproj/Sparkle.strings   |  Bin 7440 -> 0 bytes
 .../ro.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7186 -> 0 bytes
 .../A/Resources/ro.lproj/SUUpdateAlert.nib    |  Bin 16746 -> 0 bytes
 .../ro.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12683 -> 0 bytes
 .../A/Resources/ro.lproj/Sparkle.strings      |  Bin 9418 -> 0 bytes
 .../ru.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7226 -> 0 bytes
 .../A/Resources/ru.lproj/SUUpdateAlert.nib    |  Bin 16797 -> 0 bytes
 .../ru.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12999 -> 0 bytes
 .../A/Resources/ru.lproj/Sparkle.strings      |  Bin 7452 -> 0 bytes
 .../sk.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7204 -> 0 bytes
 .../A/Resources/sk.lproj/SUUpdateAlert.nib    |  Bin 16748 -> 0 bytes
 .../sk.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12911 -> 0 bytes
 .../A/Resources/sk.lproj/Sparkle.strings      |  Bin 7174 -> 0 bytes
 .../sl.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7114 -> 0 bytes
 .../A/Resources/sl.lproj/SUUpdateAlert.nib    |  Bin 16660 -> 0 bytes
 .../sl.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12830 -> 0 bytes
 .../A/Resources/sl.lproj/Sparkle.strings      |  Bin 7568 -> 0 bytes
 .../sv.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7163 -> 0 bytes
 .../A/Resources/sv.lproj/SUUpdateAlert.nib    |  Bin 16723 -> 0 bytes
 .../sv.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12826 -> 0 bytes
 .../A/Resources/sv.lproj/Sparkle.strings      |  Bin 7412 -> 0 bytes
 .../th.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7150 -> 0 bytes
 .../A/Resources/th.lproj/SUUpdateAlert.nib    |  Bin 16665 -> 0 bytes
 .../th.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12745 -> 0 bytes
 .../A/Resources/th.lproj/Sparkle.strings      |  Bin 8124 -> 0 bytes
 .../tr.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7188 -> 0 bytes
 .../A/Resources/tr.lproj/SUUpdateAlert.nib    |  Bin 16670 -> 0 bytes
 .../tr.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12870 -> 0 bytes
 .../A/Resources/tr.lproj/Sparkle.strings      |  Bin 9252 -> 0 bytes
 .../uk.lproj/SUAutomaticUpdateAlert.nib       |  Bin 7244 -> 0 bytes
 .../A/Resources/uk.lproj/SUUpdateAlert.nib    |  Bin 16817 -> 0 bytes
 .../uk.lproj/SUUpdatePermissionPrompt.nib     |  Bin 12908 -> 0 bytes
 .../A/Resources/uk.lproj/Sparkle.strings      |  Bin 7472 -> 0 bytes
 .../zh_CN.lproj/SUAutomaticUpdateAlert.nib    |  Bin 7022 -> 0 bytes
 .../A/Resources/zh_CN.lproj/SUUpdateAlert.nib |  Bin 16513 -> 0 bytes
 .../zh_CN.lproj/SUUpdatePermissionPrompt.nib  |  Bin 12469 -> 0 bytes
 .../A/Resources/zh_CN.lproj/Sparkle.strings   |  Bin 5500 -> 0 bytes
 .../zh_TW.lproj/SUAutomaticUpdateAlert.nib    |  Bin 7028 -> 0 bytes
 .../A/Resources/zh_TW.lproj/SUUpdateAlert.nib |  Bin 16517 -> 0 bytes
 .../zh_TW.lproj/SUUpdatePermissionPrompt.nib  |  Bin 12479 -> 0 bytes
 .../A/Resources/zh_TW.lproj/Sparkle.strings   |  Bin 5416 -> 0 bytes
 .../Sparkle.framework/Versions/A/Sparkle      |  Bin 466940 -> 0 bytes
 .../Sparkle.framework/Versions/Current        |    1 -
 Pods/StartAtLoginController/README.md         |   94 --
 .../StartAtLoginController.h                  |   37 -
 .../StartAtLoginController.m                  |  127 --
 .../ISO8601DateFormatter-dummy.m              |    5 -
 .../ISO8601DateFormatter-prefix.pch           |    4 -
 .../ISO8601DateFormatter.xcconfig             |    8 -
 .../MASShortcut/MASShortcut-dummy.m           |    5 -
 .../MASShortcut/MASShortcut-prefix.pch        |    4 -
 .../MASShortcut/MASShortcut.xcconfig          |    9 -
 ...Pods-quark-shell-acknowledgements.markdown |  181 ---
 .../Pods-quark-shell-acknowledgements.plist   |  241 ----
 .../Pods-quark-shell/Pods-quark-shell-dummy.m |    5 -
 .../Pods-quark-shell-frameworks.sh            |   91 --
 .../Pods-quark-shell-resources.sh             |  102 --
 .../Pods-quark-shell.debug.xcconfig           |   11 -
 .../Pods-quark-shell.release.xcconfig         |   11 -
 .../RHPreferences/RHPreferences-dummy.m       |    5 -
 .../RHPreferences/RHPreferences-prefix.pch    |   11 -
 .../RHPreferences/RHPreferences.xcconfig      |    9 -
 .../StartAtLoginController-dummy.m            |    5 -
 .../StartAtLoginController-prefix.pch         |    4 -
 .../StartAtLoginController.xcconfig           |    9 -
 .../WebViewJavascriptBridge-dummy.m           |    5 -
 .../WebViewJavascriptBridge-prefix.pch        |    4 -
 .../WebViewJavascriptBridge.xcconfig          |    9 -
 Pods/WebViewJavascriptBridge/LICENSE          |   22 -
 Pods/WebViewJavascriptBridge/README.md        |  219 ----
 .../WKWebViewJavascriptBridge.h               |   32 -
 .../WKWebViewJavascriptBridge.m               |  172 ---
 .../WebViewJavascriptBridge.h                 |   37 -
 .../WebViewJavascriptBridge.m                 |  185 ---
 .../WebViewJavascriptBridgeBase.h             |   44 -
 .../WebViewJavascriptBridgeBase.m             |  214 ---
 .../WebViewJavascriptBridge_JS.h              |    3 -
 .../WebViewJavascriptBridge_JS.m              |  123 --
 quark-shell/QSHAppDelegate.m                  |    7 +
 quark-shell/QSHPreferencesViewController.h    |    1 +
 quark-shell/QSHPreferencesViewController.m    |   25 +-
 quark-shell/QSHWebViewDelegate.h              |    1 +
 quark-shell/QSHWebViewDelegate.m              |   16 +-
 quark-shell/Quark.js                          |   28 +-
 sample/index.js                               |   44 +-
 277 files changed, 77 insertions(+), 8371 deletions(-)
 delete mode 120000 Pods/Headers/Private/ISO8601DateFormatter/ISO8601DateFormatter.h
 delete mode 120000 Pods/Headers/Private/MASShortcut/MASShortcut+Monitoring.h
 delete mode 120000 Pods/Headers/Private/MASShortcut/MASShortcut+UserDefaults.h
 delete mode 120000 Pods/Headers/Private/MASShortcut/MASShortcut.h
 delete mode 120000 Pods/Headers/Private/MASShortcut/MASShortcutView+UserDefaults.h
 delete mode 120000 Pods/Headers/Private/MASShortcut/MASShortcutView.h
 delete mode 120000 Pods/Headers/Private/RHPreferences/RHPreferences.h
 delete mode 120000 Pods/Headers/Private/RHPreferences/RHPreferencesWindowController.h
 delete mode 120000 Pods/Headers/Private/StartAtLoginController/StartAtLoginController.h
 delete mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 delete mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 delete mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 delete mode 120000 Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
 delete mode 120000 Pods/Headers/Public/ISO8601DateFormatter/ISO8601DateFormatter.h
 delete mode 120000 Pods/Headers/Public/MASShortcut/MASShortcut+Monitoring.h
 delete mode 120000 Pods/Headers/Public/MASShortcut/MASShortcut+UserDefaults.h
 delete mode 120000 Pods/Headers/Public/MASShortcut/MASShortcut.h
 delete mode 120000 Pods/Headers/Public/MASShortcut/MASShortcutView+UserDefaults.h
 delete mode 120000 Pods/Headers/Public/MASShortcut/MASShortcutView.h
 delete mode 120000 Pods/Headers/Public/RHPreferences/RHPreferences.h
 delete mode 120000 Pods/Headers/Public/RHPreferences/RHPreferencesWindowController.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUAppcast.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUAppcastItem.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUErrors.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUExport.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUStandardVersionComparator.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUUpdater.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUVersionComparisonProtocol.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/SUVersionDisplayProtocol.h
 delete mode 120000 Pods/Headers/Public/Sparkle/Sparkle/Sparkle.h
 delete mode 120000 Pods/Headers/Public/StartAtLoginController/StartAtLoginController.h
 delete mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 delete mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 delete mode 120000 Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 delete mode 100644 Pods/ISO8601DateFormatter/ISO8601DateFormatter.h
 delete mode 100644 Pods/ISO8601DateFormatter/ISO8601DateFormatter.m
 delete mode 100644 Pods/ISO8601DateFormatter/LICENSE.txt
 delete mode 100644 Pods/ISO8601DateFormatter/README.md
 delete mode 100644 Pods/Local Podspecs/MASShortcut.podspec.json
 delete mode 100644 Pods/MASShortcut/LICENSE
 delete mode 100644 Pods/MASShortcut/MASShortcut+Monitoring.h
 delete mode 100644 Pods/MASShortcut/MASShortcut+Monitoring.m
 delete mode 100644 Pods/MASShortcut/MASShortcut+UserDefaults.h
 delete mode 100644 Pods/MASShortcut/MASShortcut+UserDefaults.m
 delete mode 100644 Pods/MASShortcut/MASShortcut.h
 delete mode 100644 Pods/MASShortcut/MASShortcut.m
 delete mode 100644 Pods/MASShortcut/MASShortcutView+UserDefaults.h
 delete mode 100644 Pods/MASShortcut/MASShortcutView+UserDefaults.m
 delete mode 100644 Pods/MASShortcut/MASShortcutView.h
 delete mode 100644 Pods/MASShortcut/MASShortcutView.m
 delete mode 100644 Pods/MASShortcut/README.md
 delete mode 100644 Pods/Manifest.lock
 delete mode 100644 Pods/Pods.xcodeproj/project.pbxproj
 delete mode 100644 Pods/RHPreferences/LICENSE
 delete mode 100644 Pods/RHPreferences/README.md
 delete mode 100644 Pods/RHPreferences/RHPreferences/RHPreferences-Prefix.pch
 delete mode 100644 Pods/RHPreferences/RHPreferences/RHPreferences.h
 delete mode 100644 Pods/RHPreferences/RHPreferences/RHPreferencesWindow.xib
 delete mode 100644 Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.h
 delete mode 100644 Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
 delete mode 100644 Pods/Sparkle/LICENSE
 delete mode 100644 Pods/Sparkle/Sparkle.framework.dSYM/Contents/Info.plist
 delete mode 100644 Pods/Sparkle/Sparkle.framework.dSYM/Contents/Resources/DWARF/Sparkle
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Headers
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Modules
 delete mode 120000 Pods/Sparkle/Sparkle.framework/PrivateHeaders
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Resources
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Sparkle
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcast.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUErrors.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUExport.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUUpdater.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Headers/Sparkle.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Modules/module.modulemap
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist
 delete mode 100755 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ca.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fi.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/he.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Info.plist
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUStatus.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt.lproj
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
 delete mode 100644 Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings
 delete mode 100755 Pods/Sparkle/Sparkle.framework/Versions/A/Sparkle
 delete mode 120000 Pods/Sparkle/Sparkle.framework/Versions/Current
 delete mode 100644 Pods/StartAtLoginController/README.md
 delete mode 100644 Pods/StartAtLoginController/StartAtLoginController.h
 delete mode 100644 Pods/StartAtLoginController/StartAtLoginController.m
 delete mode 100644 Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-dummy.m
 delete mode 100644 Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch
 delete mode 100644 Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig
 delete mode 100644 Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m
 delete mode 100644 Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch
 delete mode 100644 Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig
 delete mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown
 delete mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist
 delete mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m
 delete mode 100755 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh
 delete mode 100755 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh
 delete mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig
 delete mode 100644 Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig
 delete mode 100644 Pods/Target Support Files/RHPreferences/RHPreferences-dummy.m
 delete mode 100644 Pods/Target Support Files/RHPreferences/RHPreferences-prefix.pch
 delete mode 100644 Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig
 delete mode 100644 Pods/Target Support Files/StartAtLoginController/StartAtLoginController-dummy.m
 delete mode 100644 Pods/Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch
 delete mode 100644 Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig
 delete mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m
 delete mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch
 delete mode 100644 Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig
 delete mode 100644 Pods/WebViewJavascriptBridge/LICENSE
 delete mode 100644 Pods/WebViewJavascriptBridge/README.md
 delete mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
 delete mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
 delete mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
 delete mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
 delete mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
 delete mode 100755 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
 delete mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
 delete mode 100644 Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m

diff --git a/.gitignore b/.gitignore
index 18f0b50..7526cf1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 # Xcode
 .DS_Store
 build/
+Pods/
 *.pbxuser
 !default.pbxuser
 *.mode1v3
diff --git a/Podfile b/Podfile
index c7233ae..1d0d739 100644
--- a/Podfile
+++ b/Podfile
@@ -3,7 +3,7 @@ platform :osx, '10.9'
 source 'https://github.com/CocoaPods/Specs.git'
 
 target 'quark-shell' do
-  pod 'MASShortcut', :git => 'https://github.com/xhacker/MASShortcut.git', :branch => 'menubar-webkit'
+  pod 'MASShortcut', '~> 2.3.6'
   pod 'RHPreferences', '~> 1.0'
   pod 'Sparkle', '~> 1.13'
   pod 'ISO8601DateFormatter', '~> 0.7'
diff --git a/Podfile.lock b/Podfile.lock
index 719e6d7..5e7d93c 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,37 +1,27 @@
 PODS:
-  - ISO8601DateFormatter (0.7)
-  - MASShortcut (1.2.3)
+  - ISO8601DateFormatter (0.8)
+  - MASShortcut (2.3.6)
   - RHPreferences (1.0.0)
-  - Sparkle (1.13.1)
+  - Sparkle (1.14.0)
   - StartAtLoginController (0.0.1)
   - WebViewJavascriptBridge (5.0.5)
 
 DEPENDENCIES:
   - ISO8601DateFormatter (~> 0.7)
-  - MASShortcut (from `https://github.com/xhacker/MASShortcut.git`, branch `menubar-webkit`)
+  - MASShortcut (~> 2.3.6)
   - RHPreferences (~> 1.0)
   - Sparkle (~> 1.13)
   - StartAtLoginController (~> 0.0.1)
   - WebViewJavascriptBridge (~> 5.0)
 
-EXTERNAL SOURCES:
-  MASShortcut:
-    :branch: menubar-webkit
-    :git: https://github.com/xhacker/MASShortcut.git
-
-CHECKOUT OPTIONS:
-  MASShortcut:
-    :commit: e54886366d753c75d8bbe07d1a7dd42af69f70fd
-    :git: https://github.com/xhacker/MASShortcut.git
-
 SPEC CHECKSUMS:
-  ISO8601DateFormatter: ab926648eebe497f4d167c0fd083992f959f1274
-  MASShortcut: 534bf89dfd1fb013580accdc3b5d2341f0749dc0
+  ISO8601DateFormatter: 4551b6ce4f83185425f583b0b3feb3c7b59b942c
+  MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa
   RHPreferences: 6871f9614347f4b45197c51f7c93c3cde2744ce8
-  Sparkle: 2fbd47b869621d1e679c7554e3e19dda02104818
+  Sparkle: ccd95233b12a3e3d4eeb55ff01dd4c8bb8188b07
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
   WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-PODFILE CHECKSUM: e0eb9f4d6740610df4a8ad44e676343009803cc4
+PODFILE CHECKSUM: 699cfe5aa1afb8c30201f5e2e256967a66c3435b
 
 COCOAPODS: 1.1.1
diff --git a/Pods/Headers/Private/ISO8601DateFormatter/ISO8601DateFormatter.h b/Pods/Headers/Private/ISO8601DateFormatter/ISO8601DateFormatter.h
deleted file mode 120000
index 028d798..0000000
--- a/Pods/Headers/Private/ISO8601DateFormatter/ISO8601DateFormatter.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../ISO8601DateFormatter/ISO8601DateFormatter.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/MASShortcut/MASShortcut+Monitoring.h b/Pods/Headers/Private/MASShortcut/MASShortcut+Monitoring.h
deleted file mode 120000
index f1f413d..0000000
--- a/Pods/Headers/Private/MASShortcut/MASShortcut+Monitoring.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut+Monitoring.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/MASShortcut/MASShortcut+UserDefaults.h b/Pods/Headers/Private/MASShortcut/MASShortcut+UserDefaults.h
deleted file mode 120000
index 2faf894..0000000
--- a/Pods/Headers/Private/MASShortcut/MASShortcut+UserDefaults.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut+UserDefaults.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/MASShortcut/MASShortcut.h b/Pods/Headers/Private/MASShortcut/MASShortcut.h
deleted file mode 120000
index 9709ad3..0000000
--- a/Pods/Headers/Private/MASShortcut/MASShortcut.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/MASShortcut/MASShortcutView+UserDefaults.h b/Pods/Headers/Private/MASShortcut/MASShortcutView+UserDefaults.h
deleted file mode 120000
index 5c2ad97..0000000
--- a/Pods/Headers/Private/MASShortcut/MASShortcutView+UserDefaults.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcutView+UserDefaults.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/MASShortcut/MASShortcutView.h b/Pods/Headers/Private/MASShortcut/MASShortcutView.h
deleted file mode 120000
index 6d77f9d..0000000
--- a/Pods/Headers/Private/MASShortcut/MASShortcutView.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcutView.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/RHPreferences/RHPreferences.h b/Pods/Headers/Private/RHPreferences/RHPreferences.h
deleted file mode 120000
index aa7c824..0000000
--- a/Pods/Headers/Private/RHPreferences/RHPreferences.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../RHPreferences/RHPreferences/RHPreferences.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/RHPreferences/RHPreferencesWindowController.h b/Pods/Headers/Private/RHPreferences/RHPreferencesWindowController.h
deleted file mode 120000
index 07192eb..0000000
--- a/Pods/Headers/Private/RHPreferences/RHPreferencesWindowController.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../RHPreferences/RHPreferences/RHPreferencesWindowController.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/StartAtLoginController/StartAtLoginController.h b/Pods/Headers/Private/StartAtLoginController/StartAtLoginController.h
deleted file mode 120000
index b422e9b..0000000
--- a/Pods/Headers/Private/StartAtLoginController/StartAtLoginController.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../StartAtLoginController/StartAtLoginController.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
deleted file mode 120000
index aa9dc22..0000000
--- a/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
deleted file mode 120000
index 29b9ace..0000000
--- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
deleted file mode 120000
index dff4a3e..0000000
--- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
\ No newline at end of file
diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
deleted file mode 120000
index a6b45d8..0000000
--- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/ISO8601DateFormatter/ISO8601DateFormatter.h b/Pods/Headers/Public/ISO8601DateFormatter/ISO8601DateFormatter.h
deleted file mode 120000
index 028d798..0000000
--- a/Pods/Headers/Public/ISO8601DateFormatter/ISO8601DateFormatter.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../ISO8601DateFormatter/ISO8601DateFormatter.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/MASShortcut/MASShortcut+Monitoring.h b/Pods/Headers/Public/MASShortcut/MASShortcut+Monitoring.h
deleted file mode 120000
index f1f413d..0000000
--- a/Pods/Headers/Public/MASShortcut/MASShortcut+Monitoring.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut+Monitoring.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/MASShortcut/MASShortcut+UserDefaults.h b/Pods/Headers/Public/MASShortcut/MASShortcut+UserDefaults.h
deleted file mode 120000
index 2faf894..0000000
--- a/Pods/Headers/Public/MASShortcut/MASShortcut+UserDefaults.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut+UserDefaults.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/MASShortcut/MASShortcut.h b/Pods/Headers/Public/MASShortcut/MASShortcut.h
deleted file mode 120000
index 9709ad3..0000000
--- a/Pods/Headers/Public/MASShortcut/MASShortcut.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcut.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/MASShortcut/MASShortcutView+UserDefaults.h b/Pods/Headers/Public/MASShortcut/MASShortcutView+UserDefaults.h
deleted file mode 120000
index 5c2ad97..0000000
--- a/Pods/Headers/Public/MASShortcut/MASShortcutView+UserDefaults.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcutView+UserDefaults.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/MASShortcut/MASShortcutView.h b/Pods/Headers/Public/MASShortcut/MASShortcutView.h
deleted file mode 120000
index 6d77f9d..0000000
--- a/Pods/Headers/Public/MASShortcut/MASShortcutView.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../MASShortcut/MASShortcutView.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/RHPreferences/RHPreferences.h b/Pods/Headers/Public/RHPreferences/RHPreferences.h
deleted file mode 120000
index aa7c824..0000000
--- a/Pods/Headers/Public/RHPreferences/RHPreferences.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../RHPreferences/RHPreferences/RHPreferences.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/RHPreferences/RHPreferencesWindowController.h b/Pods/Headers/Public/RHPreferences/RHPreferencesWindowController.h
deleted file mode 120000
index 07192eb..0000000
--- a/Pods/Headers/Public/RHPreferences/RHPreferencesWindowController.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../RHPreferences/RHPreferences/RHPreferencesWindowController.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUAppcast.h b/Pods/Headers/Public/Sparkle/Sparkle/SUAppcast.h
deleted file mode 120000
index 494c9e9..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUAppcast.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcast.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUAppcastItem.h b/Pods/Headers/Public/Sparkle/Sparkle/SUAppcastItem.h
deleted file mode 120000
index 3f32594..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUAppcastItem.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUErrors.h b/Pods/Headers/Public/Sparkle/Sparkle/SUErrors.h
deleted file mode 120000
index e280af4..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUErrors.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUErrors.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUExport.h b/Pods/Headers/Public/Sparkle/Sparkle/SUExport.h
deleted file mode 120000
index 191aae3..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUExport.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUExport.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUStandardVersionComparator.h b/Pods/Headers/Public/Sparkle/Sparkle/SUStandardVersionComparator.h
deleted file mode 120000
index ad58189..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUStandardVersionComparator.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUUpdater.h b/Pods/Headers/Public/Sparkle/Sparkle/SUUpdater.h
deleted file mode 120000
index 31c5e6b..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUUpdater.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUUpdater.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUVersionComparisonProtocol.h b/Pods/Headers/Public/Sparkle/Sparkle/SUVersionComparisonProtocol.h
deleted file mode 120000
index 3e4495e..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUVersionComparisonProtocol.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/SUVersionDisplayProtocol.h b/Pods/Headers/Public/Sparkle/Sparkle/SUVersionDisplayProtocol.h
deleted file mode 120000
index 4bfc8fe..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/SUVersionDisplayProtocol.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/Sparkle/Sparkle/Sparkle.h b/Pods/Headers/Public/Sparkle/Sparkle/Sparkle.h
deleted file mode 120000
index 28a1899..0000000
--- a/Pods/Headers/Public/Sparkle/Sparkle/Sparkle.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../Sparkle/Sparkle.framework/Versions/A/Headers/Sparkle.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/StartAtLoginController/StartAtLoginController.h b/Pods/Headers/Public/StartAtLoginController/StartAtLoginController.h
deleted file mode 120000
index b422e9b..0000000
--- a/Pods/Headers/Public/StartAtLoginController/StartAtLoginController.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../StartAtLoginController/StartAtLoginController.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
deleted file mode 120000
index aa9dc22..0000000
--- a/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
deleted file mode 120000
index 29b9ace..0000000
--- a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
\ No newline at end of file
diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
deleted file mode 120000
index dff4a3e..0000000
--- a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
\ No newline at end of file
diff --git a/Pods/ISO8601DateFormatter/ISO8601DateFormatter.h b/Pods/ISO8601DateFormatter/ISO8601DateFormatter.h
deleted file mode 100644
index 5833137..0000000
--- a/Pods/ISO8601DateFormatter/ISO8601DateFormatter.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*ISO8601DateFormatter.h
- *
- *Created by Peter Hosey on 2009-04-11.
- *Copyright 2009–2013 Peter Hosey. All rights reserved.
- */
-
-#import <Foundation/Foundation.h>
-
-///Which of ISO 8601's three date formats the formatter should produce.
-typedef NS_ENUM(NSUInteger, ISO8601DateFormat) {
-	///YYYY-MM-DD.
-	ISO8601DateFormatCalendar,
-	///YYYY-DDD, where DDD ranges from 1 to 366; for example, 2009-32 is 2009-02-01.
-	ISO8601DateFormatOrdinal,
-	///YYYY-Www-D, where ww ranges from 1 to 53 (the 'W' is literal) and D ranges from 1 to 7; for example, 2009-W05-07.
-	ISO8601DateFormatWeek,
-};
-
-///The default separator for time values. Currently, this is ':'.
-extern const unichar ISO8601DefaultTimeSeparatorCharacter;
-
-/*!
- *	@brief	This class converts dates to and from ISO 8601 strings.
- *
- *	@details	TL;DR: You want to use ISO 8601 for any and all dates you send or receive over the internet, unless the spec for the protocol or format you're working with specifically tells you otherwise. See http://xkcd.com/1179/ .
- *
- * ISO 8601 is most recognizable as “year-month-date” strings, such as “2013-09-08T15:06:11-0800”. Of course, as you might expect of a formal standard, it's more sophisticated (some might say complicated) than that.
- *
- * For one thing, ISO 8601 actually defines *three* different date formats. The most common one, shown above, is called the calendar date format. The other two are week dates, where the month is replaced by a week of the year and the day is a day-of-the-week (1 being Monday) rather than day-of-month, and ordinal dates, where the middle segment is dispensed with entirely and the day component is day-of-year (1–366).
- *
- * The week format is the most bizarre of them, since 7 × 52 ≠ 365. The start and end of the year for purposes of week dates usually don't line up with the start and end of the calendar year. As a result, the first and/or last day of a year in the week-date “calendar” more often than not is on a different year from the first and/or last day of that year on the actual Gregorian calendar.
- *
- * In practice, almost all ISO 8601 dates you see in the wild will be in the calendar format.
- *
- * At any rate, this formatter can both parse and unparse dates in all three formats. (By “unparse”, I mean “produce a string from”—the reverse of parsing.)
- *
- * For a good and more detailed introduction to ISO 8601, see [“A summary of the international standard date and time notation” by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/iso-time.html). The actual standard itself can be found in PDF format online with a well-crafted web search.
- */
-
-@interface ISO8601DateFormatter: NSFormatter
-
-@property(nonatomic, retain) NSTimeZone *defaultTimeZone;
-
-#pragma mark Parsing
-/*!
- *	@name	Parsing
- */
-
-//As a formatter, this object converts strings to dates.
-
-/*!
- *	@brief	Disables various leniencies in how the formatter parses strings.
- *
- *	@details	By default, the parser allows these extensions to the ISO 8601 standard:
- *
- * - Whitespace is allowed before the date.
- * - Numbers don't have to be within range for a component. For example, you can have a string that refers to the 56th day of the hundredth month.
- * - Since 0.6, allows a single whitespace character before the time-zone specification. This extension provides compatibility with NSDate output (`description`) and input (`dateWithString:`).
- * - “Superfluous” hyphens in date specifications such as “`--DDD`” (where DDD is an ordinal day-of-year number and the year is implied) are allowed. (The standard recommends writing such a date as “`-DDD`”, with only a single hyphen. This is consistent with ordinal dates having only two components: the year and the day-of-year, separated by one hyphen.)
- * - The same goes for week dates such as “`--Www-DD`”. Again, the extra hyphen really is superfluous, but is allowed as an extension.
- * - Calendar dates with no separator between month and day-of-month are allowed, at least when they total four digits. (For example, 2013-0908, which would be interpreted as 2013-09-08.)
- * - Single-digit components are allowed. (If you wish to specify a date in a single-digit year with the strict parser, pad it with zeroes.)
- * - “YYYY-W” (without a week number after the 'W') is allowed, interpreted as “YYYY-W01-01”.
- *
- * Setting this property to `YES` will disable all of those extensions.
- *
- * These extensions are intended to help you process degenerate input (received from programs and services that use broken date-formatting libraries); whenever *you* create ISO 8601 strings, you should generate strictly-conforming ones.
- *
- * This property does not affect unparsing. The formatter always creates valid ISO 8601 strings. Any invalid string (loosely, any string that would require turning this property off to re-parse) should be considered a bug; please report it.
- */
-@property BOOL parsesStrictly;
-
-/*!
- *	@brief	Parse a string into individual date components.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@returns	An NSDateComponents object containing most of the information parsed from the string, aside from the fraction of second and time zone (which are lost).
- *	@sa	dateComponentsFromString:timeZone:
- *	@sa	dateComponentsFromString:timeZone:range:fractionOfSecond:
- */
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string;
-/*!
- *	@brief	Parse a string into individual date components.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@param	outTimeZone	If non-`NULL`, an NSTimeZone object or `nil` will be stored here, depending on whether the string specified a time zone.
- *	@returns	An NSDateComponents object containing most of the information parsed from the string, aside from the fraction of second (which is lost) and time zone.
- *	@sa	dateComponentsFromString:
- *	@sa	dateComponentsFromString:timeZone:range:fractionOfSecond:
- */
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone;
-/*!
- *	@brief	Parse a string into individual date components.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@param	outTimeZone	If non-`NULL`, an NSTimeZone object or `nil` will be stored here, depending on whether the string specified a time zone.
- *	@param	outRange	If non-`NULL`, an NSRange structure will be stored here, identifying the substring of `string` that specified the date.
- *	@param	outFractionOfSecond	If non-`NULL`, an NSTimeInterval value will be stored here, containing the fraction of a second, if the string specified one. If it didn't, this will be set to zero.
- *	@returns	An NSDateComponents object containing most of the information parsed from the string, aside from the fraction of second and time zone.
- *	@sa	dateComponentsFromString:
- *	@sa	dateComponentsFromString:timeZone:
- */
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange fractionOfSecond:(NSTimeInterval *)outFractionOfSecond;
-
-/*!
- *	@brief	Parse a string.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@returns	An NSDate object containing most of the information parsed from the string, aside from the time zone (which is lost).
- *	@sa	dateComponentsFromString:
- *	@sa	dateFromString:timeZone:
- *	@sa	dateFromString:timeZone:range:
- */
-- (NSDate *) dateFromString:(NSString *)string;
-/*!
- *	@brief	Parse a string.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@param	outTimeZone	If non-`NULL`, an NSTimeZone object or `nil` will be stored here, depending on whether the string specified a time zone.
- *	@returns	An NSDate object containing most of the information parsed from the string, aside from the time zone.
- *	@sa	dateComponentsFromString:timeZone:
- *	@sa	dateFromString:
- *	@sa	dateFromString:timeZone:range:
- */
-- (NSDate *) dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone;
-/*!
- *	@brief	Parse a string into a single date, identified by an NSDate object.
- *
- *	@param	string	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@param	outTimeZone	If non-`NULL`, an NSTimeZone object or `nil` will be stored here, depending on whether the string specified a time zone.
- *	@param	outRange	If non-`NULL`, an NSRange structure will be stored here, identifying the substring of `string` that specified the date.
- *	@returns	An NSDate object containing most of the information parsed from the string, aside from the time zone.
- *	@sa	dateComponentsFromString:timeZone:range:fractionOfSecond:
- *	@sa	dateFromString:
- *	@sa	dateFromString:timeZone:
- */
-- (NSDate *) dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange;
-
-#pragma mark Unparsing
-/*!
- *	@name	Unparsing
- */
-
-/*!
- *	@brief	Which ISO 8601 format to format dates in.
- *
- *	@details	See ISO8601DateFormat for possible values.
- */
-@property ISO8601DateFormat format;
-/*!
- *	@brief	Whether strings should include time of day.
- *
- *	@details	If `NO`, strings include only the date, nothing after it.
- *
- *	@sa	timeSeparator
- *	@sa	timeZoneSeparator
- */
-@property BOOL includeTime;
-/*!
- *	@brief	The character to use to separate components of the time of day.
- *
- *	@details	This is used in both parsing and unparsing.
- *
- * The default value is ISO8601DefaultTimeSeparatorCharacter.
- *
- * When parsesStrictly is set to `YES`, this property is ignored. Otherwise, the parser will raise an exception if this is set to zero.
- *
- *	@sa	includeTime
- *	@sa	timeZoneSeparator
- */
-@property unichar timeSeparator;
-/*!
- *	@brief	The character to use to separate the hour and minute in a time zone specification.
- *
- *	@details	This is used in both parsing and unparsing.
- *
- * If zero, no separator is inserted into time zone specifications.
- *
- * The default value is zero (no separator).
- *
- *	@sa	includeTime
- *	@sa	timeSeparator
- */
-@property unichar timeZoneSeparator;
-
-/*!
- *	@brief	Produce a string that represents a date in UTC.
- *
- *	@param	date	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@returns	A string that represents the date in UTC.
- *	@sa	stringFromDate:timeZone:
- */
-- (NSString *) stringFromDate:(NSDate *)date;
-/*!
- *	@brief	Produce a string that represents a date.
- *
- *	@param	date	The string to parse. Must represent a date in one of the ISO 8601 formats.
- *	@param	timeZone	An NSTimeZone object identifying the time zone in which to specify the date.
- *	@returns	A string that represents the date in the requested time zone, if possible.
- *
- *	@details	Not all dates are representable in all time zones (because of historical calendar changes, such as transitions from the Julian to the Gregorian calendar).
- *	For an example, see http://stackoverflow.com/questions/18663407/date-formatter-returns-nil-for-june .
- *	This method *should* return `nil` in such cases.
- *
- *	@sa	stringFromDate:
- */
-- (NSString *) stringFromDate:(NSDate *)date timeZone:(NSTimeZone *)timeZone;
-
-@end
diff --git a/Pods/ISO8601DateFormatter/ISO8601DateFormatter.m b/Pods/ISO8601DateFormatter/ISO8601DateFormatter.m
deleted file mode 100644
index b6bae72..0000000
--- a/Pods/ISO8601DateFormatter/ISO8601DateFormatter.m
+++ /dev/null
@@ -1,1008 +0,0 @@
-/*ISO8601DateFormatter.m
- *
- *Created by Peter Hosey on 2009-04-11.
- *Copyright 2009–2013 Peter Hosey. All rights reserved.
- */
-
-#import <Foundation/Foundation.h>
-#if TARGET_OS_IPHONE
-#	import <UIKit/UIKit.h>
-#endif
-#import "ISO8601DateFormatter.h"
-
-#ifndef DEFAULT_TIME_SEPARATOR
-#	define DEFAULT_TIME_SEPARATOR ':'
-#endif
-const unichar ISO8601DefaultTimeSeparatorCharacter = DEFAULT_TIME_SEPARATOR;
-
-//Unicode date formats.
-#define ISO_CALENDAR_DATE_FORMAT @"yyyy-MM-dd"
-//#define ISO_WEEK_DATE_FORMAT @"YYYY-'W'ww-ee" //Doesn't actually work because NSDateComponents counts the weekday starting at 1.
-#define ISO_ORDINAL_DATE_FORMAT @"yyyy-DDD"
-#define ISO_TIME_FORMAT @"HH:mm:ss"
-//printf formats.
-#define ISO_TIMEZONE_UTC_FORMAT @"Z"
-#define ISO_TIMEZONE_OFFSET_FORMAT_NO_SEPARATOR @"%+.2d%.2d"
-#define ISO_TIMEZONE_OFFSET_FORMAT_WITH_SEPARATOR @"%+.2d%C%.2d"
-
-@interface ISO8601DateFormatter ()
-+ (void) createGlobalCachesThatDoNotAlreadyExist;
-//Used when a memory warning occurs (if at least one ISO 8601 Date Formatter exists at the time).
-+ (void) purgeGlobalCaches;
-@end
-
-@interface ISO8601DateFormatter(UnparsingPrivate)
-
-- (NSString *) replaceColonsInString:(NSString *)timeFormat withTimeSeparator:(unichar)timeSep;
-
-- (NSString *) stringFromDate:(NSDate *)date formatString:(NSString *)dateFormat timeZone:(NSTimeZone *)timeZone;
-- (NSString *) weekDateStringForDate:(NSDate *)date timeZone:(NSTimeZone *)timeZone;
-
-@end
-
-static NSMutableDictionary *timeZonesByOffset;
-
-#if ISO8601_TESTING_PURPOSES_ONLY
-//This method only exists for use by the project's test cases. DO NOT use this in an application.
-extern bool ISO8601DateFormatter_GlobalCachesAreWarm(void);
-
-bool ISO8601DateFormatter_GlobalCachesAreWarm(void) {
-	return (timeZonesByOffset != nil) && (timeZonesByOffset.count > 0);
-}
-#endif
-
-@implementation ISO8601DateFormatter
-{
-	NSString *lastUsedFormatString;
-	NSDateFormatter *unparsingFormatter;
-
-	NSCalendar *parsingCalendar, *unparsingCalendar;
-
-	NSTimeZone *defaultTimeZone;
-	ISO8601DateFormat format;
-	unichar timeSeparator;
-	BOOL includeTime;
-	BOOL parsesStrictly;
-}
-
-+ (void) initialize {
-	[self createGlobalCachesThatDoNotAlreadyExist];
-}
-
-+ (void) createGlobalCachesThatDoNotAlreadyExist {
-	if (!timeZonesByOffset) {
-		timeZonesByOffset = [[NSMutableDictionary alloc] init];
-	}
-}
-
-+ (void) purgeGlobalCaches {
-	NSMutableDictionary *oldCache = timeZonesByOffset;
-	timeZonesByOffset = nil;
-	[oldCache release];
-}
-
-- (NSCalendar *) makeCalendarWithDesiredConfiguration {
-	NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
-	calendar.firstWeekday = 2; //Monday
-	calendar.timeZone = [NSTimeZone defaultTimeZone];
-	return calendar;
-}
-
-- (id) init {
-	if ((self = [super init])) {
-		parsingCalendar = [[self makeCalendarWithDesiredConfiguration] retain];
-		unparsingCalendar = [[self makeCalendarWithDesiredConfiguration] retain];
-
-		format = ISO8601DateFormatCalendar;
-		timeSeparator = ISO8601DefaultTimeSeparatorCharacter;
-		includeTime = NO;
-		parsesStrictly = NO;
-
-#if TARGET_OS_IPHONE
-		[[NSNotificationCenter defaultCenter] addObserver:self
-			selector:@selector(didReceiveMemoryWarning:)
-			name:UIApplicationDidReceiveMemoryWarningNotification
-			object:nil];
-#endif
-	}
-	return self;
-}
-
-- (void) dealloc {
-#if TARGET_OS_IPHONE
-	[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
-#endif
-
-	[defaultTimeZone release];
-
-	[unparsingFormatter release];
-	[lastUsedFormatString release];
-	[parsingCalendar release];
-	[unparsingCalendar release];
-
-	[super dealloc];
-}
-
-- (void) didReceiveMemoryWarning:(NSNotification *)notification {
-	[[self class] purgeGlobalCaches];
-}
-
-@synthesize defaultTimeZone;
-- (void) setDefaultTimeZone:(NSTimeZone *)tz {
-	if (defaultTimeZone != tz) {
-		[defaultTimeZone release];
-		defaultTimeZone = [tz retain];
-
-		unparsingCalendar.timeZone = defaultTimeZone;
-	}
-}
-
-//The following properties are only here because GCC doesn't like @synthesize in category implementations.
-
-#pragma mark Parsing
-
-@synthesize parsesStrictly;
-
-static NSUInteger read_segment(const unichar *str, const unichar **next, NSUInteger *out_num_digits);
-static NSUInteger read_segment_4digits(const unichar *str, const unichar **next, NSUInteger *out_num_digits);
-static NSUInteger read_segment_2digits(const unichar *str, const unichar **next);
-static double read_double(const unichar *str, const unichar **next);
-static BOOL is_leap_year(NSUInteger year);
-
-/*Valid ISO 8601 date formats:
- *
- *YYYYMMDD
- *YYYY-MM-DD
- *YYYY-MM
- *YYYY
- *YY //century 
- * //Implied century: YY is 00-99
- *  YYMMDD
- *  YY-MM-DD
- * -YYMM
- * -YY-MM
- * -YY
- * //Implied year
- *  --MMDD
- *  --MM-DD
- *  --MM
- * //Implied year and month
- *   ---DD
- * //Ordinal dates: DDD is the number of the day in the year (1-366)
- *YYYYDDD
- *YYYY-DDD
- *  YYDDD
- *  YY-DDD
- *   -DDD
- * //Week-based dates: ww is the number of the week, and d is the number (1-7) of the day in the week
- *yyyyWwwd
- *yyyy-Www-d
- *yyyyWww
- *yyyy-Www
- *yyWwwd
- *yy-Www-d
- *yyWww
- *yy-Www
- * //Year of the implied decade
- *-yWwwd
- *-y-Www-d
- *-yWww
- *-y-Www
- * //Week and day of implied year
- *  -Wwwd
- *  -Www-d
- * //Week only of implied year
- *  -Www
- * //Day only of implied week
- *  -W-d
- */
-
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string {
-	return [self dateComponentsFromString:string timeZone:NULL];
-}
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone {
-	return [self dateComponentsFromString:string timeZone:outTimeZone range:NULL fractionOfSecond:NULL];
-}
-- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange fractionOfSecond:(out NSTimeInterval *)outFractionOfSecond {
-	if (string == nil)
-		return nil;
-	// Bail if the string contains a slash delimiter (we don't yet support ISO 8601 intervals and we don't support slash-separated dates)
-	if ([string rangeOfString:@"/"].location != NSNotFound)
-		return nil;
-
-	NSDate *now = [NSDate date];
-
-	NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
-	NSDateComponents *nowComponents = [parsingCalendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:now];
-
-	NSUInteger
-		//Date
-		year,
-		month_or_week = 0U,
-		day = 0U,
-		//Time
-		hour = 0U;
-	NSTimeInterval
-		minute = 0.0,
-		second = 0.0;
-	//Time zone
-	NSInteger tz_hour = 0;
-	NSInteger tz_minute = 0;
-
-	enum {
-		monthAndDate,
-		week,
-		dateOnly
-	} dateSpecification = monthAndDate;
-
-	BOOL strict = self.parsesStrictly;
-	unichar timeSep = self.timeSeparator;
-
-	if (strict) timeSep = ISO8601DefaultTimeSeparatorCharacter;
-	NSAssert(timeSep != '\0', @"Time separator must not be NUL.");
-
-	BOOL isValidDate = ([string length] > 0U);
-	NSTimeZone *timeZone = nil;
-
-	const unichar *ch = (const unichar *)[string cStringUsingEncoding:NSUnicodeStringEncoding];
-
-	NSRange range = { 0U, 0U };
-	const unichar *start_of_date = NULL;
-	if (strict && isspace(*ch)) {
-		range.location = NSNotFound;
-		isValidDate = NO;
-	} else {
-		//Skip leading whitespace.
-		NSUInteger i = 0U;
-		while (isspace(ch[i]))
-			++i;
-
-		range.location = i;
-		ch += i;
-		start_of_date = ch;
-
-		NSUInteger segment;
-		NSUInteger num_leading_hyphens = 0U, num_digits = 0U;
-
-		if (*ch == 'T') {
-			//There is no date here, only a time. Set the date to now; then we'll parse the time.
-			isValidDate = isdigit(*++ch);
-
-			year = nowComponents.year;
-			month_or_week = nowComponents.month;
-			day = nowComponents.day;
-		} else {
-			while(*ch == '-') {
-				++num_leading_hyphens;
-				++ch;
-			}
-
-			segment = read_segment(ch, &ch, &num_digits);
-			switch(num_digits) {
-				case 0:
-					if (*ch == 'W') {
-						if ((ch[1] == '-') && isdigit(ch[2]) && ((num_leading_hyphens == 1U) || ((num_leading_hyphens == 2U) && !strict))) {
-							year = nowComponents.year;
-							month_or_week = 1U;
-							ch += 2;
-							goto parseDayAfterWeek;
-						} else if (num_leading_hyphens == 1U) {
-							year = nowComponents.year;
-							goto parseWeekAndDay;
-						} else
-							isValidDate = NO;
-					} else
-						isValidDate = NO;
-					break;
-
-				case 8: //YYYY MM DD
-					if (num_leading_hyphens > 0U)
-						isValidDate = NO;
-					else {
-						day = segment % 100U;
-						segment /= 100U;
-						month_or_week = segment % 100U;
-						year = segment / 100U;
-					}
-					break;
-
-				case 6: //YYMMDD (implicit century)
-					if (num_leading_hyphens > 0U || strict)
-						isValidDate = NO;
-					else {
-						day = segment % 100U;
-						segment /= 100U;
-						month_or_week = segment % 100U;
-						year  = nowComponents.year;
-						year -= (year % 100U);
-						year += segment / 100U;
-					}
-					break;
-
-				case 4:
-					switch(num_leading_hyphens) {
-						case 0: //YYYY
-							year = segment;
-
-							if (*ch == '-') ++ch;
-
-							if (!isdigit(*ch)) {
-								if (*ch == 'W')
-									goto parseWeekAndDay;
-								else
-									month_or_week = day = 1U;
-							} else {
-								segment = read_segment(ch, &ch, &num_digits);
-								switch(num_digits) {
-									case 4: //MMDD
-										if (strict)
-											isValidDate = NO;
-										else {
-											day = segment % 100U;
-											month_or_week = segment / 100U;
-										}
-										break;
-
-									case 2: //MM
-										month_or_week = segment;
-
-										if (*ch == '-') ++ch;
-										if (!isdigit(*ch))
-											day = 1U;
-										else
-											day = read_segment(ch, &ch, NULL);
-										break;
-
-									case 3: //DDD
-										day = segment % 1000U;
-										dateSpecification = dateOnly;
-										if (strict && (day > (365U + is_leap_year(year))))
-											isValidDate = NO;
-										break;
-
-									default:
-										isValidDate = NO;
-								}
-							}
-							break;
-
-						case 1: //YYMM
-							month_or_week = segment % 100U;
-							year = segment / 100U;
-
-							if (*ch == '-') ++ch;
-							if (!isdigit(*ch))
-								day = 1U;
-							else
-								day = read_segment(ch, &ch, NULL);
-
-							break;
-
-						case 2: //MMDD
-							day = segment % 100U;
-							month_or_week = segment / 100U;
-							year = nowComponents.year;
-
-							break;
-
-						default:
-							isValidDate = NO;
-					} //switch(num_leading_hyphens) (4 digits)
-					break;
-
-				case 1:
-					if (strict) {
-						//Two digits only - never just one.
-						if (num_leading_hyphens == 1U) {
-							if (*ch == '-') ++ch;
-							if (*++ch == 'W') {
-								year  = nowComponents.year;
-								year -= (year % 10U);
-								year += segment;
-								goto parseWeekAndDay;
-							} else
-								isValidDate = NO;
-						} else
-							isValidDate = NO;
-						break;
-					}
-				case 2:
-					switch(num_leading_hyphens) {
-						case 0:
-							if (*ch == '-') {
-								//Implicit century
-								year  = nowComponents.year;
-								year -= (year % 100U);
-								year += segment;
-
-								if (*++ch == 'W')
-									goto parseWeekAndDay;
-								else if (!isdigit(*ch)) {
-									goto centuryOnly;
-								} else {
-									//Get month and/or date.
-									segment = read_segment_4digits(ch, &ch, &num_digits);
-									NSLog(@"(%@) parsing month; segment is %lu and ch is %@", string, (unsigned long)segment, [NSString stringWithCString:(const char *)ch encoding:NSUnicodeStringEncoding]);
-									switch(num_digits) {
-										case 4: //YY-MMDD
-											day = segment % 100U;
-											month_or_week = segment / 100U;
-											break;
-
-										case 1: //YY-M; YY-M-DD (extension)
-											if (strict) {
-												isValidDate = NO;
-												break;
-											}
-										case 2: //YY-MM; YY-MM-DD
-											month_or_week = segment;
-											if (*ch == '-') {
-												if (isdigit(*++ch))
-													day = read_segment_2digits(ch, &ch);
-												else
-													day = 1U;
-											} else
-												day = 1U;
-											break;
-
-										case 3: //Ordinal date.
-											day = segment;
-											dateSpecification = dateOnly;
-											break;
-									}
-								}
-							} else if (*ch == 'W') {
-								year  = nowComponents.year;
-								year -= (year % 100U);
-								year += segment;
-
-							parseWeekAndDay: //*ch should be 'W' here.
-								if (!isdigit(*++ch)) {
-									//Not really a week-based date; just a year followed by '-W'.
-									if (strict)
-										isValidDate = NO;
-									else
-										month_or_week = day = 1U;
-								} else {
-									month_or_week = read_segment_2digits(ch, &ch);
-									if (*ch == '-') ++ch;
-								parseDayAfterWeek:
-									day = isdigit(*ch) ? read_segment_2digits(ch, &ch) : 1U;
-									dateSpecification = week;
-								}
-							} else {
-								//Century only. Assume current year.
-							centuryOnly:
-								year = segment * 100U + nowComponents.year % 100U;
-								month_or_week = day = 1U;
-							}
-							break;
-
-						case 1:; //-YY; -YY-MM (implicit century)
-							NSLog(@"(%@) found %lu digits and one hyphen, so this is either -YY or -YY-MM; segment (year) is %lu", string, (unsigned long)num_digits, (unsigned long)segment);
-							NSUInteger current_year = nowComponents.year;
-							NSUInteger current_century = (current_year % 100U);
-							year = segment + (current_year - current_century);
-							if (num_digits == 1U) //implied decade
-								year += current_century - (current_year % 10U);
-
-							if (*ch == '-') {
-								++ch;
-								month_or_week = read_segment_2digits(ch, &ch);
-								NSLog(@"(%@) month is %lu", string, (unsigned long)month_or_week);
-							}
-
-							day = 1U;
-							break;
-
-						case 2: //--MM; --MM-DD
-							year = nowComponents.year;
-							month_or_week = segment;
-							if (*ch == '-') {
-								++ch;
-								day = read_segment_2digits(ch, &ch);
-							}
-							break;
-
-						case 3: //---DD
-							year = nowComponents.year;
-							month_or_week = nowComponents.month;
-							day = segment;
-							break;
-
-						default:
-							isValidDate = NO;
-					} //switch(num_leading_hyphens) (2 digits)
-					break;
-
-				case 7: //YYYY DDD (ordinal date)
-					if (num_leading_hyphens > 0U)
-						isValidDate = NO;
-					else {
-						day = segment % 1000U;
-						year = segment / 1000U;
-						dateSpecification = dateOnly;
-						if (strict && (day > (365U + is_leap_year(year))))
-							isValidDate = NO;
-					}
-					break;
-
-				case 3: //--DDD (ordinal date, implicit year)
-					//Technically, the standard only allows one hyphen. But it says that two hyphens is the logical implementation, and one was dropped for brevity. So I have chosen to allow the missing hyphen.
-					if ((num_leading_hyphens < 1U) || ((num_leading_hyphens > 2U) && !strict))
-						isValidDate = NO;
-					else {
-						day = segment;
-						year = nowComponents.year;
-						dateSpecification = dateOnly;
-						if (strict && (day > (365U + is_leap_year(year))))
-							isValidDate = NO;
-					}
-					break;
-
-				default:
-					isValidDate = NO;
-			}
-		}
-
-		if (isValidDate) {
-			if (isspace(*ch) || (*ch == 'T')) ++ch;
-
-			if (isdigit(*ch)) {
-				hour = read_segment_2digits(ch, &ch);
-				if (*ch == timeSep) {
-					++ch;
-					if ((timeSep == ',') || (timeSep == '.')) {
-						//We can't do fractional minutes when '.' is the segment separator.
-						//Only allow whole minutes and whole seconds.
-						minute = read_segment_2digits(ch, &ch);
-						if (*ch == timeSep) {
-							++ch;
-							second = read_segment_2digits(ch, &ch);
-						}
-					} else {
-						//Allow a fractional minute.
-						//If we don't get a fraction, look for a seconds segment.
-						//Otherwise, the fraction of a minute is the seconds.
-						minute = read_double(ch, &ch);
-						second = modf(minute, &minute);
-						if (second > DBL_EPSILON)
-							second *= 60.0; //Convert fraction (e.g. .5) into seconds (e.g. 30).
-						else if (*ch == timeSep) {
-							++ch;
-							second = read_double(ch, &ch);
-						}
-					}
-				}
-
-				if (!strict) {
-					if (isspace(*ch)) ++ch;
-				}
-
-				switch(*ch) {
-					case 'Z':
-						timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
-						++ch; //So that the Z is included in the range.
-						break;
-
-					case '+':
-					case '-':;
-						BOOL negative = (*ch == '-');
-						if (isdigit(*++ch)) {
-							//Read hour offset.
-							segment = *ch - '0';
-							if (isdigit(*++ch)) {
-								segment *= 10U;
-								segment += *(ch++) - '0';
-							}
-							tz_hour = (NSInteger)segment;
-							if (negative) tz_hour = -tz_hour;
-
-							//Optional separator.
-							if (*ch == self.timeZoneSeparator) ++ch;
-
-							if (isdigit(*ch)) {
-								//Read minute offset.
-								segment = *ch - '0';
-								if (isdigit(*++ch)) {
-									segment *= 10U;
-									segment += *ch - '0';
-								}
-								tz_minute = segment;
-								if (negative) tz_minute = -tz_minute;
-							}
-
-							[[self class] createGlobalCachesThatDoNotAlreadyExist];
-
-							NSInteger timeZoneOffset = (tz_hour * 3600) + (tz_minute * 60);
-							NSNumber *offsetNum = [NSNumber numberWithInteger:timeZoneOffset];
-							timeZone = [timeZonesByOffset objectForKey:offsetNum];
-							if (!timeZone) {
-								timeZone = [NSTimeZone timeZoneForSecondsFromGMT:timeZoneOffset];
-								if (timeZone)
-									[timeZonesByOffset setObject:timeZone forKey:offsetNum];
-							}
-						}
-				}
-			}
-		}
-
-		if (isValidDate) {
-			components.year = year;
-			components.day = day;
-			components.hour = hour;
-			components.minute = (NSInteger)minute;
-			components.second = (NSInteger)second;
-
-			if (outFractionOfSecond != NULL) {
-				NSTimeInterval fractionOfSecond = second - components.second;
-				if (fractionOfSecond > 0.0) {
-					*outFractionOfSecond = fractionOfSecond;
-				}
-			}
-
-			switch(dateSpecification) {
-				case monthAndDate:
-					components.month = month_or_week;
-					break;
-
-				case week:;
-					//Adapted from <http://personal.ecu.edu/mccartyr/ISOwdALG.txt>.
-					//This works by converting the week date into an ordinal date, then letting the next case handle it.
-					NSUInteger prevYear = year - 1U;
-					NSUInteger YY = prevYear % 100U;
-					NSUInteger C = prevYear - YY;
-					NSUInteger G = YY + YY / 4U;
-					NSUInteger isLeapYear = (((C / 100U) % 4U) * 5U);
-					NSUInteger Jan1Weekday = (isLeapYear + G) % 7U;
-					enum { monday, tuesday, wednesday, thursday/*, friday, saturday, sunday*/ };
-					components.day = ((8U - Jan1Weekday) + (7U * (Jan1Weekday > thursday))) + (day - 1U) + (7U * (month_or_week - 2));
-
-				case dateOnly: //An "ordinal date".
-					break;
-			}
-		}
-	} //if (!(strict && isdigit(ch[0])))
-
-	if (outRange) {
-		if (isValidDate)
-			range.length = ch - start_of_date;
-		else
-			range.location = NSNotFound;
-
-		*outRange = range;
-	}
-	if (outTimeZone) {
-		*outTimeZone = timeZone;
-	}
-
-	return isValidDate ? components : nil;
-}
-
-- (NSDate *) dateFromString:(NSString *)string {
-	return [self dateFromString:string timeZone:NULL];
-}
-- (NSDate *) dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone {
-	return [self dateFromString:string timeZone:outTimeZone range:NULL];
-}
-- (NSDate *) dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange {
-	NSTimeZone *timeZone = nil;
-	NSTimeInterval parsedFractionOfSecond = 0.0;
-  
-	NSDateComponents *components = [self dateComponentsFromString:string timeZone:&timeZone range:outRange fractionOfSecond:&parsedFractionOfSecond];
-
-	if (outTimeZone)
-		*outTimeZone = timeZone;
-	if (components == nil)
-		return nil;
-
-	parsingCalendar.timeZone = timeZone;
-
-	NSDate *parsedDate = [parsingCalendar dateFromComponents:components];
-
-	if (parsedFractionOfSecond > 0.0) {
-		parsedDate = [parsedDate dateByAddingTimeInterval:parsedFractionOfSecond];
-	}
-  
-  return parsedDate;
-}
-
-- (BOOL)getObjectValue:(id *)outValue forString:(NSString *)string errorDescription:(NSString **)error {
-	NSDate *date = [self dateFromString:string];
-	if (outValue)
-		*outValue = date;
-	return (date != nil);
-}
-
-#pragma mark Unparsing
-
-@synthesize format;
-@synthesize includeTime;
-@synthesize timeSeparator;
-
-- (NSString *) replaceColonsInString:(NSString *)timeFormat withTimeSeparator:(unichar)timeSep {
-	if (timeSep != ':') {
-		NSMutableString *timeFormatMutable = [[timeFormat mutableCopy] autorelease];
-		[timeFormatMutable replaceOccurrencesOfString:@":"
-		                               	   withString:[NSString stringWithCharacters:&timeSep length:1U]
-	                                      	  options:NSBackwardsSearch | NSLiteralSearch
-	                                        	range:(NSRange){ 0UL, [timeFormat length] }];
-		timeFormat = timeFormatMutable;
-	}
-	return timeFormat;
-}
-
-- (NSString *) stringFromDate:(NSDate *)date {
-	NSTimeZone *timeZone = self.defaultTimeZone;
-	if (!timeZone) timeZone = [NSTimeZone defaultTimeZone];
-	return [self stringFromDate:date timeZone:timeZone];
-}
-
-- (NSString *) stringFromDate:(NSDate *)date timeZone:(NSTimeZone *)timeZone {
-	switch (self.format) {
-		case ISO8601DateFormatCalendar:
-			return [self stringFromDate:date formatString:ISO_CALENDAR_DATE_FORMAT timeZone:timeZone];
-		case ISO8601DateFormatWeek:
-			return [self weekDateStringForDate:date timeZone:timeZone];
-		case ISO8601DateFormatOrdinal:
-			return [self stringFromDate:date formatString:ISO_ORDINAL_DATE_FORMAT timeZone:timeZone];
-		default:
-			[NSException raise:NSInternalInconsistencyException format:@"self.format was %tu, not calendar (%tu), week (%tu), or ordinal (%tu)", self.format, ISO8601DateFormatCalendar, ISO8601DateFormatWeek, ISO8601DateFormatOrdinal];
-			return nil;
-	}
-}
-
-- (NSString *) stringFromDate:(NSDate *)date formatString:(NSString *)dateFormat timeZone:(NSTimeZone *)timeZone {
-	if (includeTime)
-		dateFormat = [dateFormat stringByAppendingFormat:@"'T'%@", [self replaceColonsInString:ISO_TIME_FORMAT withTimeSeparator:self.timeSeparator]];
-
-	if ([dateFormat isEqualToString:lastUsedFormatString] == NO) {
-		[unparsingFormatter release];
-		unparsingFormatter = nil;
-
-		[lastUsedFormatString release];
-		lastUsedFormatString = [dateFormat retain];
-	}
-
-	if (!unparsingFormatter) {
-		unparsingFormatter = [[NSDateFormatter alloc] init];
-		unparsingFormatter.formatterBehavior = NSDateFormatterBehavior10_4;
-		unparsingFormatter.dateFormat = dateFormat;
-		unparsingFormatter.calendar = unparsingCalendar;
-		unparsingFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
-	}
-
-	unparsingCalendar.timeZone = timeZone;
-	unparsingFormatter.timeZone = timeZone;
-	NSString *str = [unparsingFormatter stringForObjectValue:date];
-
-	if (includeTime) {
-		NSInteger offset = [timeZone secondsFromGMTForDate:date];
-		offset /= 60;  //bring down to minutes
-		if (offset == 0)
-			str = [str stringByAppendingString:ISO_TIMEZONE_UTC_FORMAT];
-		else {
-			int timeZoneOffsetHour = (int)(offset / 60);
-			int timeZoneOffsetMinute = (int)(offset % 60);
-			if (self.timeZoneSeparator)
-				str = [str stringByAppendingFormat:ISO_TIMEZONE_OFFSET_FORMAT_WITH_SEPARATOR, timeZoneOffsetHour, self.timeZoneSeparator, timeZoneOffsetMinute];
-			else
-				str = [str stringByAppendingFormat:ISO_TIMEZONE_OFFSET_FORMAT_NO_SEPARATOR, timeZoneOffsetHour, timeZoneOffsetMinute];
-		}
-	}
-
-	//Undo the change we made earlier
-	unparsingCalendar.timeZone = self.defaultTimeZone;
-	unparsingFormatter.timeZone = self.defaultTimeZone;
-
-	return str;
-}
-
-- (NSString *) stringForObjectValue:(id)value {
-	if ( ! [value isKindOfClass:[NSDate class]]) {
-		NSLog(@"%s: Can only format NSDate objects, not objects like %@", __func__, value);
-		return nil;
-	}
-
-	return [self stringFromDate:(NSDate *)value];
-}
-
-/*Adapted from:
- *	Algorithm for Converting Gregorian Dates to ISO 8601 Week Date
- *	Rick McCarty, 1999
- *	http://personal.ecu.edu/mccartyr/ISOwdALG.txt
- */
-- (NSString *) weekDateStringForDate:(NSDate *)date timeZone:(NSTimeZone *)timeZone {
-	unparsingCalendar.timeZone = timeZone;
-	NSDateComponents *components = [unparsingCalendar components:NSYearCalendarUnit | NSWeekdayCalendarUnit | NSDayCalendarUnit fromDate:date];
-
-	//Determine the ordinal date.
-	NSDateComponents *startOfYearComponents = [unparsingCalendar components:NSYearCalendarUnit fromDate:date];
-	startOfYearComponents.month = 1;
-	startOfYearComponents.day = 1;
-	NSDateComponents *ordinalComponents = [unparsingCalendar components:NSDayCalendarUnit fromDate:[unparsingCalendar dateFromComponents:startOfYearComponents] toDate:date options:0];
-	ordinalComponents.day += 1;
-
-	enum {
-		monday, tuesday, wednesday, thursday, friday, saturday, sunday
-	};
-	enum {
-		january = 1, february, march,
-		april, may, june,
-		july, august, september,
-		october, november, december
-	};
-
-	NSInteger year = components.year;
-	NSInteger week = 0;
-	//The old unparser added 6 to [calendarDate dayOfWeek], which was zero-based; components.weekday is one-based, so we now add only 5.
-	NSInteger dayOfWeek = (components.weekday + 5) % 7;
-	NSInteger dayOfYear = ordinalComponents.day;
-
-	NSInteger prevYear = year - 1;
-
-	BOOL yearIsLeapYear = is_leap_year(year);
-	BOOL prevYearIsLeapYear = is_leap_year(prevYear);
-
-	NSInteger YY = prevYear % 100;
-	NSInteger C = prevYear - YY;
-	NSInteger G = YY + YY / 4;
-	NSInteger Jan1Weekday = (((((C / 100) % 4) * 5) + G) % 7);
-
-	NSInteger weekday = ((dayOfYear + Jan1Weekday) - 1) % 7;
-
-	if((dayOfYear <= (7 - Jan1Weekday)) && (Jan1Weekday > thursday)) {
-		week = 52 + ((Jan1Weekday == friday) || ((Jan1Weekday == saturday) && prevYearIsLeapYear));
-		--year;
-	} else {
-		NSInteger lengthOfYear = 365 + yearIsLeapYear;
-		if((lengthOfYear - dayOfYear) < (thursday - weekday)) {
-			++year;
-			week = 1;
-		} else {
-			NSInteger J = dayOfYear + (sunday - weekday) + Jan1Weekday;
-			week = J / 7 - (Jan1Weekday > thursday);
-		}
-	}
-
-	NSString *string = [NSString stringWithFormat:@"%lu-W%02lu-%02lu", (unsigned long)year, (unsigned long)week, ((unsigned long)dayOfWeek) + 1U];
-
-	NSString *timeString;
-	if(includeTime) {
-		NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
-		unichar timeSep = self.timeSeparator;
-		if (!timeSep) timeSep = ISO8601DefaultTimeSeparatorCharacter;
-		formatter.dateFormat = [self replaceColonsInString:ISO_TIME_FORMAT withTimeSeparator:timeSep];
-		formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
-		formatter.timeZone = timeZone;
-
-		timeString = [formatter stringForObjectValue:date];
-
-		[formatter release];
-
-		//TODO: This is copied from the calendar-date code. It should be isolated in a method.
-		NSInteger offset = [timeZone secondsFromGMTForDate:date];
-		offset /= 60;  //bring down to minutes
-		if (offset == 0)
-			timeString = [timeString stringByAppendingString:ISO_TIMEZONE_UTC_FORMAT];
-		else {
-			int timeZoneOffsetHour = (int)(offset / 60);
-			int timeZoneOffsetMinute = (int)(offset % 60);
-			if (self.timeZoneSeparator)
-				timeString = [timeString stringByAppendingFormat:ISO_TIMEZONE_OFFSET_FORMAT_WITH_SEPARATOR,
-				                                                 timeZoneOffsetHour, self.timeZoneSeparator,
-				                                                 timeZoneOffsetMinute];
-			else
-				timeString = [timeString stringByAppendingFormat:ISO_TIMEZONE_OFFSET_FORMAT_NO_SEPARATOR,
-				                                                 timeZoneOffsetHour, timeZoneOffsetMinute];
-		}
-
-		string = [string stringByAppendingFormat:@"T%@", timeString];
-	}
-
-	return string;
-}
-
-@end
-
-static NSUInteger read_segment(const unichar *str, const unichar **next, NSUInteger *out_num_digits) {
-	NSUInteger num_digits = 0U;
-	NSUInteger value = 0U;
-
-	while(isdigit(*str)) {
-		value *= 10U;
-		value += *str - '0';
-		++num_digits;
-		++str;
-	}
-
-	if (next) *next = str;
-	if (out_num_digits) *out_num_digits = num_digits;
-
-	return value;
-}
-static NSUInteger read_segment_4digits(const unichar *str, const unichar **next, NSUInteger *out_num_digits) {
-	NSUInteger num_digits = 0U;
-	NSUInteger value = 0U;
-
-	if (isdigit(*str)) {
-		value += *(str++) - '0';
-		++num_digits;
-	}
-
-	if (isdigit(*str)) {
-		value *= 10U;
-		value += *(str++) - '0';
-		++num_digits;
-	}
-
-	if (isdigit(*str)) {
-		value *= 10U;
-		value += *(str++) - '0';
-		++num_digits;
-	}
-
-	if (isdigit(*str)) {
-		value *= 10U;
-		value += *(str++) - '0';
-		++num_digits;
-	}
-
-	if (next) *next = str;
-	if (out_num_digits) *out_num_digits = num_digits;
-
-	return value;
-}
-static NSUInteger read_segment_2digits(const unichar *str, const unichar **next) {
-	NSUInteger value = 0U;
-
-	if (isdigit(*str))
-		value += *str - '0';
-
-	if (isdigit(*++str)) {
-		value *= 10U;
-		value += *(str++) - '0';
-	}
-
-	if (next) *next = str;
-
-	return value;
-}
-
-//strtod doesn't support ',' as a separator. This does.
-static double read_double(const unichar *str, const unichar **next) {
-	double value = 0.0;
-
-	if (str) {
-		NSUInteger int_value = 0;
-
-		while(isdigit(*str)) {
-			int_value *= 10U;
-			int_value += (*(str++) - '0');
-		}
-		value = int_value;
-
-		if (((*str == ',') || (*str == '.'))) {
-			++str;
-
-			register double multiplier, multiplier_multiplier;
-			multiplier = multiplier_multiplier = 0.1;
-
-			while(isdigit(*str)) {
-				value += (*(str++) - '0') * multiplier;
-				multiplier *= multiplier_multiplier;
-			}
-		}
-	}
-
-	if (next) *next = str;
-
-	return value;
-}
-
-static BOOL is_leap_year(NSUInteger year) {
-	return \
-	    ((year %   4U) == 0U)
-	&& (((year % 100U) != 0U)
-	||  ((year % 400U) == 0U));
-}
diff --git a/Pods/ISO8601DateFormatter/LICENSE.txt b/Pods/ISO8601DateFormatter/LICENSE.txt
deleted file mode 100644
index b5b3048..0000000
--- a/Pods/ISO8601DateFormatter/LICENSE.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Copyright © 2006–2013 Peter Hosey
- All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-Neither the name of Peter Hosey nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Pods/ISO8601DateFormatter/README.md b/Pods/ISO8601DateFormatter/README.md
deleted file mode 100644
index fec7b1d..0000000
--- a/Pods/ISO8601DateFormatter/README.md
+++ /dev/null
@@ -1,159 +0,0 @@
-# ISO 8601: The only date format worth using
-
-[![Image: Status of most recent build and test attempt.](https://travis-ci.org/boredzo/iso-8601-date-formatter.png?branch=master)](https://travis-ci.org/boredzo/iso-8601-date-formatter)
-[![Image: Test code coverage percentage.](https://coveralls.io/repos/boredzo/iso-8601-date-formatter/badge.png?branch=master)](https://coveralls.io/r/boredzo/iso-8601-date-formatter?branch=master)
-
-Obligatory relevant [xkcd](http://xkcd.com/):
-
-[![Seriously now. “ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04.”](http://imgs.xkcd.com/comics/iso_8601.png)](http://xkcd.com/1179/)
-
-## How to use this code in your program
-
-Add the source files to your project.
-
-### Parsing
-
-Create an ISO 8601 date formatter, then call `[formatter dateFromString:myString]`. The method will return either an NSDate or `nil`.
-
-There are a total of six parser methods. The one that contains the actual parser is `-[ISO8601DateFormatter dateComponentsFromString:timeZone:range:]`. The other five are based on this one.
-
-The “`outTimeZone`” parameter, when not set to `NULL`, is a pointer to an `NSTimeZone *`variable. If the string specified a time zone, you'll receive the time zone object in that variable. If the string didn't specify a time zone, you'll receive `nil`.
-
-The “`outRange`” parameter, when not set to `NULL`, is a pointer to `NSRange` storage. You will receive the range of the parsed substring in that storage.
-
-### Unparsing
-
-Create an ISO 8601 date formatter, then call `[formatter stringFromDate:myDate]`. The method will return a string.
-
-The formatter has several properties that control its behavior:
-
-* You can set the format of the resulting strings. By default, the formatter will generate calendar-date strings; your other options are week dates and ordinal dates.
-* You can set a default time zone; by default, it will use `[NSTimeZone defaultTimeZone]`.
-* You can enable a strict mode, wherein the formatter enforces sanity checks on the string. By default, the parser will afford you quite a bit of leeway.
-* You can set whether to include the time in the string, and if so, what hour-minute separator to use (default `':'`).
-
-## How to test that this code works
-
-UPDATE from the year 2013: Conversion from the old make-based test monsters to modern OCUnit-based tests is underway. Contributions of new and old test cases will be greatly appreciated.
-
-'make test' will perform all tests. If you want to perform only *some* tests:
-
-### Parsing
-
-Type 'make parser-test'. make will build the test program (testparser), then invoke testparser.sh.py to generate testparser.sh. Then make will invoke testparser.sh, which will invoke the test program with various dates.
-
-If you don't want to use my tests, 'make testparser' will create the test program without running it. You can then invoke testparser yourself with any date you want to. If it doesn't give you the result you expected, contact me, making sure to provide me with both the input and the output.
-
-### Unparsing
-
-Type 'make unparser-test'. make will build the test programs, then invoke testunparser.sh. This shell script invokes each test program for -01-01 of every year from 1991 to 2010, writing the output to a file, and then runs diff -qs between that file (testunparser.out) and a file (testunparser-expected.out) containing known correct output. diff should report that the files are identical.
-
-Three test programs are included: unparse-date, unparse-weekdate, and unparse-ordinal date. If you don't want to use my tests, you can make these test programs separately. Each takes a date specified by ISO 8601 (parsed with my own ISO 8601 parser), and outputs a string that should represent the same date.
-
-## Notes
-
-### Version history
-
-This version is 0.7. Changes from 0.6:
-
-- Cocoa Touch is now officially supported. 4bc0a08 5d95233
-- Added an Xcode project with static library targets. c847ddb 4bc0a08
-- `stringFromObjectValue:` now logs to the Console when you hand it a value that isn't an NSDate. Check your Console output after upgrading—you might have had a bug all this time without knowing! 4e05978
-- Added proper documentation in the header, compatible with [appledoc](http://gentlebytes.com/appledoc/). f17713f
-- Fixed nonsense date components/dates being returned when the input is not a valid date string. 288f757 93bb9df 0cb6442
-- Fixed a bug in unparsing where the time zone was wrong (#3). 0e355ee 8f8a2c3 (Thanks, Carl Lindberg)
-- Fixed a DST bug in unparsing where the time zone offset was computed in general rather than for the date being unparsed (#6). 5665132 (Thanks, Zachary West) 9e835c8 0d36057
-- Fixed AM/PM (or local equivalent) appearing in some locales on iOS devices (#15). 4bc0a08 3f697b5 249b3df (Thanks, Matthias Bauch)
-- Fixed another NSDateFormatter-rewriting-formats-to-12-hour-in-some-locales bug. 7c9907f (Thanks, Carl Lindberg)
-- (iOS) The class now purges its time zone cache automatically in response to a memory warning. You don't need to do that yourself, anymore, so the method to purge the caches is no longer public. 138e186 3224b32 a9b6973 3f3c3b8
-- Added support for strings that specify a fraction of a second. 1d3194b 0b0b1ea (Thanks, Luke Redpath)
-- Added support for non-ASCII time separator characters. 47d5035
-- Added support for a time zone separator. 8198f1b 3bd0c07 17c15ed (Thanks to Daniel Tull for the suggestion.)
-- Fixed the parser's response to being passed `nil`. 3c12abc 4980ee6
-- Fixed (I think) #5: dates being formatted with DST applied when they shouldn't. 7368fe8
-- Fixed `stringFromObjectValue:` to behave as NSFormatter's documentation says it should. 3846f80 9754438
-- Added real unit tests based on OCUnit. c847ddb aa1c2cb daf3cc9 9029991 d92aeb6 b412326 (Thanks, Luke Redpath) 45af6bd cfedd75 af0b93c 6a7fd88 9e835c8 9e835c8 0d36057 7368fe8 4bc0a08 3f697b5 8f8a2c3 51c1130 e888681 13a872d f49193c 10ed166 d5fdf51 4980ee6 3846f80 288f757 93bb9df daa45fb 2d61bd0 9f35c4a 8f95099 d62777a 138e186 2a63718
-- Fixed range computation for strings where the date portion ends with a 'Z'. 8f95099 efa095e 808e8c4
-- Fixed some formats with missing hyphens being wrongly accepted when strict mode is on. 9f35c4a c4e0f15
-- Fixed week date strings not having a 'T' between date and time. 7b6fd9f 6a1b66b
-- Fixed week date strings having wrong time zones. 9f6af7c
-- Strings that specify intervals (as specified by ISO 8601) are now explicitly rejected, at least for now (#20). 6d539db 51c1130 bf6a2db 6aef760 (Thanks, Blake Watters)
-- `ISO8601DefaultTimeSeparatorCharacter` is now declared as `const`. I hope none of you were relying on changing that. db9877c
-- Upgraded this README to Markdown. 103f666 fbd34b2 ebbf65a c0b9609
-- Added the above xkcd comic. fbd34b2 63ba50a da3ed65
-- Some light modernization (#25, #28). cdec3e9 8df32fd bb7c5c9
-
-Changes in 0.6 from 0.5:
-
-* When not set to strict parsing, allow a space before the time-zone specification, for greater compatibility with NSDate output (`description`) and input (`dateWithString:`). 27603efc8a77
-* Bug fix: We no longer try to format the formatter. 83415de9f527
-* Bug fix: Hours are now zero-padded correctly ([#4](https://bitbucket.org/boredzo/iso-8601-parser-unparser/issue/4/time-zones-are-emitted-without-leading)). a5608e189ebe af0c6b397428
-* Fixed many various compiler warnings. Some fixes contributed by Sparks. 8be3d6f7c6f2 78ae31de2170 68dc351e9fdb e7ea87db8621 873f499ae6db
-* Now 75 times faster. 6a023812bd2b 05dc35d6b505 3b2225e0ce8c d59720ad015a 10f526956963 297b8dae4095 796be11aa596 cadf0f0c8199 61d2959c6921
-* iOS users can now tell the ISO 8601 date formatter class to drop its caches (which you should do when you receive a memory warning). 2bb1725914b1
-* Added a couple of command-line options to the calendar-format-unparser test tool. c644aadb2b14
-* The parser test tool now displays parsed dates in GMT rather than the local time zone. 788c1455ecb1
-* Added a test tool to test unparsing with the time included. a89a9a8b3d61
-* You can now “make analysis” to run the Clang Static Analyzer on the date formatter. b3dd33841f42
-* The test tools are now built using Clang. 0723d3aa6596
-
-Changes in 0.5 from 0.4:
-
-* Rewrote as an NSFormatter subclass using NSCalendar.
-  * Making it a formatter makes it much easier to use with Bindings.
-  * Using NSCalendar means we're no longer using NSCalendarDate, which Apple has said they will deprecate at some point.
-* Fixed a bug in week date generation: One subtraction could give a negative result, which was a problem because my implementation of the algorithm used unsigned integers. I've changed it to use signed integers, so the result truly is negative now. I also added a test case for this.
-
-Changes in 0.4 from 0.3:
-
-* Added the ability to use a time separator other than ':'.
-
-Changes in 0.3 from 0.2:
-
-* Colin Barrett noticed that I used `%m` instead of `%M` when creating the time strings. Oops.
-* Colin also noticed that I had the `?:` in `ISO8601DateStringWithTime:` the wrong way around. Oops again.
-
-Changes in 0.2 from 0.1:
-
-* The unparser is new. The  has been munged to allow both components together, 
-* The parser has not changed.
-
-## Implementation details
-### Parsing
-
-Whitespace before a date, and anything after a date, is ignored. Thus, "    T23 and all's well" is a valid date for the purpose of this method. (Yes, T23 is a valid ISO 8601 date. It means 23:00:00, or 11 PM.)
-
-All of the frills of ISO 8601 are supported, except for extended dates (years longer than 4 digits). Specifically, you can use week-based dates (2006-W2 for the second week of 2006), ordinal dates (2006-365 for December 31), decimal minutes (11:30.5 == 11:30:30), and decimal seconds (11:30:10.5). All methods of specifying a time zone are supported.
-
-ISO 8601 leaves quite a bit up to the parties exchanging dates. I hope I've chosen reasonable defaults. For example (note that I'm writing this on 2006-02-24):
-
-* If the month or month and date are missing, 1 is assumed. "2006" == "2006-01-01".
-* If the year or year and month are missing, the current ones are assumed. "--02-01" == "2006-02-01". "---28" == "2006-02-28".
-* In the case of week-based dates, with  the day missing, this implementation returns the first day of that week: 2006-W1 is 2006-01-01, 2006-W2 is 2006-01-08, etc.
-* For any date without a time, midnight on that date is used.
-* ISO 8601 permits the choice of either T0 or T24 for midnight. This implementation uses T0. T24 will get you T0 on the following day.
-* If no time-zone is specified, local time (as returned by [NSTimeZone localTimeZone]) is used.
-
-When a date is parsed that has a year but no century, this implementation adds the current century.
-
-The implementation is tolerant of out-of-range numbers. For example, "2005-13-40T24:62:89" == 1:02 AM on 2006-02-10. Notice that the month (13 > 12), date (40 > 31), hour (24 > 23), minute (62 > 59), and second (89 > 59) are all out-of-range.
-
-As mentioned above, there is a "strict" mode that enforces sanity checks. In particular, the date must be the entire contents of the string, and numbers are range-checked. If you have any suggestions on how to make this mode more strict, please file an enhancement request in the Issues section.
-
-### Unparsing
-
-I use [Rick McCarty's algorithm for converting calendar dates to week dates](http://personal.ecu.edu/mccartyr/ISOwdAlg.txt), slightly tweaked.
-
-## Bugs
-
-### Parsing
-
-* This method won't extract a date from just anywhere in a string, only immediately after the start of the string (or any leading whitespace). There are two solutions: either require you to invoke the parser on a string that is only an ISO 8601 date, with nothing before or after (bad for parsing purposes), or make the parser able to find an ISO 8601 date as a substring. I won't do the first one, and barring a patch, I probably won't do the second one either.
-
-* Date ranges (also specified by ISO 8601) are not supported; this method will only return one date. To handle ranges would require at least one more method.
-
-* There is no method to analyze a date string and tell you what was found in it (year, month, week, day, ordinal day, etc.). Feel free to submit a patch.
-
-## Copyright
-
-This code is copyright 2006–2013 Peter Hosey. It is under the BSD license; see LICENSE.txt for the full text of the license.
diff --git a/Pods/Local Podspecs/MASShortcut.podspec.json b/Pods/Local Podspecs/MASShortcut.podspec.json
deleted file mode 100644
index 1d27e3b..0000000
--- a/Pods/Local Podspecs/MASShortcut.podspec.json	
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name": "MASShortcut",
-  "version": "1.2.3",
-  "summary": "Modern framework for managing global keyboard shortcuts compatible with Mac App Store",
-  "homepage": "https://github.com/sonoramac/MASShortcut",
-  "authors": {
-    "Vadim Shpakovski": "vadim@shpakovski.com"
-  },
-  "source": {
-    "git": "git@github.com:xhacker/MASShortcut.git",
-    "branch": "clearGlobalHotkeyMonitor"
-  },
-  "source_files": "*.{h,m}",
-  "frameworks": "Carbon",
-  "requires_arc": true,
-  "platforms": {
-    "osx": null,
-    "ios": null,
-    "tvos": null,
-    "watchos": null
-  }
-}
diff --git a/Pods/MASShortcut/LICENSE b/Pods/MASShortcut/LICENSE
deleted file mode 100644
index e768631..0000000
--- a/Pods/MASShortcut/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2012-2013, Vadim Shpakovski
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Pods/MASShortcut/MASShortcut+Monitoring.h b/Pods/MASShortcut/MASShortcut+Monitoring.h
deleted file mode 100644
index a314548..0000000
--- a/Pods/MASShortcut/MASShortcut+Monitoring.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#import "MASShortcut.h"
-
-@interface MASShortcut (Monitoring)
-
-+ (id)addGlobalHotkeyMonitorWithShortcut:(MASShortcut *)shortcut handler:(void (^)())handler;
-+ (void)removeGlobalHotkeyMonitor:(id)monitor;
-+ (void)clearGlobalHotkeyMonitor;
-
-@end
diff --git a/Pods/MASShortcut/MASShortcut+Monitoring.m b/Pods/MASShortcut/MASShortcut+Monitoring.m
deleted file mode 100644
index c4755fa..0000000
--- a/Pods/MASShortcut/MASShortcut+Monitoring.m
+++ /dev/null
@@ -1,172 +0,0 @@
-#import "MASShortcut+Monitoring.h"
-
-NSMutableDictionary *MASRegisteredHotKeys(void);
-BOOL InstallCommonEventHandler(void);
-BOOL InstallHotkeyWithShortcut(MASShortcut *shortcut, UInt32 *outCarbonHotKeyID, EventHotKeyRef *outCarbonHotKey);
-void UninstallEventHandler(void);
-
-#pragma mark -
-
-@interface MASShortcutHotKey : NSObject
-
-@property (nonatomic, readonly) MASShortcut *shortcut;
-@property (nonatomic, readonly, copy) void (^handler)();
-@property (nonatomic, readonly) EventHotKeyRef carbonHotKey;
-@property (nonatomic, readonly) UInt32 carbonHotKeyID;
-
-- (id)initWithShortcut:(MASShortcut *)shortcut handler:(void (^)())handler;
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcut (Monitoring)
-
-+ (id)addGlobalHotkeyMonitorWithShortcut:(MASShortcut *)shortcut handler:(void (^)())handler
-{
-    NSString *monitor = [NSString stringWithFormat:@"%@", shortcut.description];
-    if ([MASRegisteredHotKeys() objectForKey:monitor]) return nil;
-
-    MASShortcutHotKey *hotKey = [[MASShortcutHotKey alloc] initWithShortcut:shortcut handler:handler];
-    if (hotKey == nil) return nil;
-
-    [MASRegisteredHotKeys() setObject:hotKey forKey:monitor];
-    return monitor;
-}
-
-+ (void)removeGlobalHotkeyMonitor:(id)monitor
-{
-    if (monitor == nil) return;
-    NSMutableDictionary *registeredHotKeys = MASRegisteredHotKeys();
-    [registeredHotKeys removeObjectForKey:monitor];
-    if (registeredHotKeys.count == 0) {
-        UninstallEventHandler();
-    }
-}
-
-+ (void)clearGlobalHotkeyMonitor
-{
-    NSMutableDictionary *registeredHotKeys = MASRegisteredHotKeys();
-    [registeredHotKeys removeAllObjects];
-    UninstallEventHandler();
-}
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcutHotKey
-
-@synthesize carbonHotKeyID = _carbonHotKeyID;
-@synthesize handler = _handler;
-@synthesize shortcut = _shortcut;
-@synthesize carbonHotKey = _carbonHotKey;
-
-#pragma mark -
-
-- (id)initWithShortcut:(MASShortcut *)shortcut handler:(void (^)())handler
-{
-    self = [super init];
-    if (self) {
-        _shortcut = shortcut;
-        _handler = [handler copy];
-
-        if (!InstallHotkeyWithShortcut(shortcut, &_carbonHotKeyID, &_carbonHotKey))
-            self = nil;
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    [self uninstallExisitingHotKey];
-}
-
-- (void)uninstallExisitingHotKey
-{
-    if (_carbonHotKey) {
-        UnregisterEventHotKey(_carbonHotKey);
-        _carbonHotKey = NULL;
-    }
-}
-
-@end
-
-#pragma mark - Carbon magic
-
-NSMutableDictionary *MASRegisteredHotKeys()
-{
-    static NSMutableDictionary *shared = nil;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        shared = [NSMutableDictionary dictionary];
-    });
-    return shared;
-}
-
-#pragma mark -
-
-FourCharCode const kMASShortcutSignature = 'MASS';
-
-BOOL InstallHotkeyWithShortcut(MASShortcut *shortcut, UInt32 *outCarbonHotKeyID, EventHotKeyRef *outCarbonHotKey)
-{
-    if ((shortcut == nil) || !InstallCommonEventHandler()) return NO;
-
-    static UInt32 sCarbonHotKeyID = 0;
-	EventHotKeyID hotKeyID = { .signature = kMASShortcutSignature, .id = ++ sCarbonHotKeyID };
-    EventHotKeyRef carbonHotKey = NULL;
-    if (RegisterEventHotKey(shortcut.carbonKeyCode, shortcut.carbonFlags, hotKeyID, GetEventDispatcherTarget(), kEventHotKeyExclusive, &carbonHotKey) != noErr) {
-        return NO;
-    }
-
-    if (outCarbonHotKeyID) *outCarbonHotKeyID = hotKeyID.id;
-    if (outCarbonHotKey) *outCarbonHotKey = carbonHotKey;
-    return YES;
-}
-
-static OSStatus CarbonCallback(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData)
-{
-	if (GetEventClass(inEvent) != kEventClassKeyboard) return noErr;
-
-	EventHotKeyID hotKeyID;
-	OSStatus status = GetEventParameter(inEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID), NULL, &hotKeyID);
-	if (status != noErr) return status;
-
-	if (hotKeyID.signature != kMASShortcutSignature) return noErr;
-
-    [MASRegisteredHotKeys() enumerateKeysAndObjectsUsingBlock:^(id key, MASShortcutHotKey *hotKey, BOOL *stop) {
-        if (hotKeyID.id == hotKey.carbonHotKeyID) {
-            if (hotKey.handler) {
-                hotKey.handler();
-            }
-            *stop = YES;
-        }
-    }];
-
-	return noErr;
-}
-
-#pragma mark -
-
-static EventHandlerRef sEventHandler = NULL;
-
-BOOL InstallCommonEventHandler()
-{
-    if (sEventHandler == NULL) {
-        EventTypeSpec hotKeyPressedSpec = { .eventClass = kEventClassKeyboard, .eventKind = kEventHotKeyPressed };
-        OSStatus status = InstallEventHandler(GetEventDispatcherTarget(), CarbonCallback, 1, &hotKeyPressedSpec, NULL, &sEventHandler);
-        if (status != noErr) {
-            sEventHandler = NULL;
-            return NO;
-        }
-    }
-    return YES;
-}
-
-void UninstallEventHandler()
-{
-    if (sEventHandler) {
-        RemoveEventHandler(sEventHandler);
-        sEventHandler = NULL;
-    }
-}
diff --git a/Pods/MASShortcut/MASShortcut+UserDefaults.h b/Pods/MASShortcut/MASShortcut+UserDefaults.h
deleted file mode 100644
index 9f2ecb9..0000000
--- a/Pods/MASShortcut/MASShortcut+UserDefaults.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#import "MASShortcut.h"
-
-@interface MASShortcut (UserDefaults)
-
-+ (void)registerGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler;
-+ (void)unregisterGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey;
-+ (void)setGlobalShortcut:(MASShortcut *)shortcut forUserDefaultsKey:(NSString *)userDefaultsKey;
-
-@end
diff --git a/Pods/MASShortcut/MASShortcut+UserDefaults.m b/Pods/MASShortcut/MASShortcut+UserDefaults.m
deleted file mode 100644
index ac4fc3d..0000000
--- a/Pods/MASShortcut/MASShortcut+UserDefaults.m
+++ /dev/null
@@ -1,104 +0,0 @@
-#import "MASShortcut+UserDefaults.h"
-#import "MASShortcut+Monitoring.h"
-
-@interface MASShortcutUserDefaultsHotKey : NSObject
-
-@property (nonatomic, readonly) NSString *userDefaultsKey;
-@property (nonatomic, copy) void (^handler)();
-@property (nonatomic, weak) id monitor;
-
-- (id)initWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler;
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcut (UserDefaults)
-
-+ (NSMutableDictionary *)registeredUserDefaultsHotKeys
-{
-    static NSMutableDictionary *shared = nil;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        shared = [NSMutableDictionary dictionary];
-    });
-    return shared;
-}
-
-+ (void)registerGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler;
-{
-    MASShortcutUserDefaultsHotKey *hotKey = [[MASShortcutUserDefaultsHotKey alloc] initWithUserDefaultsKey:userDefaultsKey handler:handler];
-    [[self registeredUserDefaultsHotKeys] setObject:hotKey forKey:userDefaultsKey];
-}
-
-+ (void)unregisterGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey
-{
-    NSMutableDictionary *registeredHotKeys = [self registeredUserDefaultsHotKeys];
-    [registeredHotKeys removeObjectForKey:userDefaultsKey];
-}
-
-+ (void)setGlobalShortcut:(MASShortcut *)shortcut forUserDefaultsKey:(NSString *)userDefaultsKey
-{
-    NSData *shortcutData = shortcut.data;
-    if (shortcutData)
-        [[NSUserDefaults standardUserDefaults] setObject:shortcutData forKey:userDefaultsKey];
-    else
-        [[NSUserDefaults standardUserDefaults] removeObjectForKey:userDefaultsKey];
-}
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcutUserDefaultsHotKey {
-    NSString *_observableKeyPath;
-}
-
-@synthesize monitor = _monitor;
-@synthesize handler = _handler;
-@synthesize userDefaultsKey = _userDefaultsKey;
-
-#pragma mark -
-
-void *MASShortcutUserDefaultsContext = &MASShortcutUserDefaultsContext;
-
-- (id)initWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler
-{
-    self = [super init];
-    if (self) {
-        _userDefaultsKey = userDefaultsKey.copy;
-        _handler = [handler copy];
-        _observableKeyPath = [@"values." stringByAppendingString:_userDefaultsKey];
-        [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:_observableKeyPath options:NSKeyValueObservingOptionInitial context:MASShortcutUserDefaultsContext];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:_observableKeyPath context:MASShortcutUserDefaultsContext];
-    [MASShortcut removeGlobalHotkeyMonitor:self.monitor];
-}
-
-#pragma mark -
-
-- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
-{
-    if (context == MASShortcutUserDefaultsContext) {
-        [MASShortcut removeGlobalHotkeyMonitor:self.monitor];
-        [self installHotKeyFromUserDefaults];
-    }
-    else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
-    }
-}
-
-- (void)installHotKeyFromUserDefaults
-{
-    NSData *data = [[NSUserDefaults standardUserDefaults] dataForKey:_userDefaultsKey];
-    MASShortcut *shortcut = [MASShortcut shortcutWithData:data];
-    if (shortcut == nil) return;
-    self.monitor = [MASShortcut addGlobalHotkeyMonitorWithShortcut:shortcut handler:self.handler];
-}
-
-@end
diff --git a/Pods/MASShortcut/MASShortcut.h b/Pods/MASShortcut/MASShortcut.h
deleted file mode 100644
index 06507f6..0000000
--- a/Pods/MASShortcut/MASShortcut.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#import <Carbon/Carbon.h>
-
-#define MASShortcutChar(char) [NSString stringWithFormat:@"%C", (unsigned short)(char)]
-#define MASShortcutClear(flags) (flags & (NSControlKeyMask | NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask))
-#define MASShortcutCarbonFlags(cocoaFlags) (\
-    (cocoaFlags & NSCommandKeyMask ? cmdKey : 0) | \
-    (cocoaFlags & NSAlternateKeyMask ? optionKey : 0) | \
-    (cocoaFlags & NSControlKeyMask ? controlKey : 0) | \
-    (cocoaFlags & NSShiftKeyMask ? shiftKey : 0))
-
-// These glyphs are missed in Carbon.h
-enum {
-    kMASShortcutGlyphEject = 0x23CF,
-    kMASShortcutGlyphClear = 0x2715,
-	kMASShortcutGlyphDeleteLeft = 0x232B,
-	kMASShortcutGlyphDeleteRight = 0x2326,
-    kMASShortcutGlyphLeftArrow = 0x2190,
-	kMASShortcutGlyphRightArrow = 0x2192,
-	kMASShortcutGlyphUpArrow = 0x2191,
-	kMASShortcutGlyphDownArrow = 0x2193,
-	kMASShortcutGlyphEscape = 0x238B,
-	kMASShortcutGlyphHelp = 0x003F,
-    kMASShortcutGlyphPageDown = 0x21DF,
-	kMASShortcutGlyphPageUp = 0x21DE,
-	kMASShortcutGlyphTabRight = 0x21E5,
-	kMASShortcutGlyphReturn = 0x2305,
-	kMASShortcutGlyphReturnR2L = 0x21A9,	
-	kMASShortcutGlyphPadClear = 0x2327,
-	kMASShortcutGlyphNorthwestArrow = 0x2196,
-	kMASShortcutGlyphSoutheastArrow = 0x2198,
-} MASShortcutGlyph;
-
-@interface MASShortcut : NSObject <NSCoding>
-
-@property (nonatomic) NSUInteger keyCode;
-@property (nonatomic) NSUInteger modifierFlags;
-@property (nonatomic, readonly) UInt32 carbonKeyCode;
-@property (nonatomic, readonly) UInt32 carbonFlags;
-@property (nonatomic, readonly) NSString *keyCodeString;
-@property (nonatomic, readonly) NSString *keyCodeStringForKeyEquivalent;
-@property (nonatomic, readonly) NSString *modifierFlagsString;
-@property (nonatomic, readonly) NSData *data;
-@property (nonatomic, readonly) BOOL shouldBypass;
-@property (nonatomic, readonly, getter = isValid) BOOL valid;
-
-- (id)initWithKeyCode:(NSUInteger)code modifierFlags:(NSUInteger)flags;
-
-+ (MASShortcut *)shortcutWithKeyCode:(NSUInteger)code modifierFlags:(NSUInteger)flags;
-+ (MASShortcut *)shortcutWithEvent:(NSEvent *)anEvent;
-+ (MASShortcut *)shortcutWithData:(NSData *)aData;
-
-- (BOOL)isTakenError:(NSError **)error;
-
-// The following API enable hotkeys with the Option key as the only modifier
-// For example, Option-G will not generate © and Option-R will not paste ®
-+ (void)setAllowsAnyHotkeyWithOptionModifier:(BOOL)allow;
-+ (BOOL)allowsAnyHotkeyWithOptionModifier;
-
-@end
diff --git a/Pods/MASShortcut/MASShortcut.m b/Pods/MASShortcut/MASShortcut.m
deleted file mode 100644
index 4e9888d..0000000
--- a/Pods/MASShortcut/MASShortcut.m
+++ /dev/null
@@ -1,345 +0,0 @@
-#import "MASShortcut.h"
-
-NSString *const MASShortcutKeyCode = @"KeyCode";
-NSString *const MASShortcutModifierFlags = @"ModifierFlags";
-
-@implementation MASShortcut {
-    NSUInteger _keyCode; // NSNotFound if empty
-    NSUInteger _modifierFlags; // 0 if empty
-}
-
-@synthesize modifierFlags = _modifierFlags;
-@synthesize keyCode = _keyCode;
-
-#pragma mark -
-
-- (void)encodeWithCoder:(NSCoder *)coder
-{
-    [coder encodeInteger:(self.keyCode != NSNotFound ? (NSInteger)self.keyCode : - 1) forKey:MASShortcutKeyCode];
-    [coder encodeInteger:(NSInteger)self.modifierFlags forKey:MASShortcutModifierFlags];
-}
-
-- (id)initWithCoder:(NSCoder *)decoder
-{
-    self = [super init];
-    if (self) {
-        NSInteger code = [decoder decodeIntegerForKey:MASShortcutKeyCode];
-        self.keyCode = (code < 0 ? NSNotFound : (NSUInteger)code);
-        self.modifierFlags = [decoder decodeIntegerForKey:MASShortcutModifierFlags];
-    }
-    return self;
-}
-
-- (id)initWithKeyCode:(NSUInteger)code modifierFlags:(NSUInteger)flags
-{
-    self = [super init];
-    if (self) {
-        _keyCode = code;
-        _modifierFlags = MASShortcutClear(flags);
-    }
-    return self;
-}
-
-+ (MASShortcut *)shortcutWithKeyCode:(NSUInteger)code modifierFlags:(NSUInteger)flags
-{
-    return [[self alloc] initWithKeyCode:code modifierFlags:flags];
-}
-
-+ (MASShortcut *)shortcutWithEvent:(NSEvent *)event
-{
-    return [[self alloc] initWithKeyCode:event.keyCode modifierFlags:event.modifierFlags];
-}
-
-+ (MASShortcut *)shortcutWithData:(NSData *)data
-{
-    id shortcut = (data ? [NSKeyedUnarchiver unarchiveObjectWithData:data] : nil);
-    return shortcut;
-}
-
-#pragma mark - Shortcut accessors
-
-- (NSData *)data
-{
-    return [NSKeyedArchiver archivedDataWithRootObject:self];
-}
-
-- (void)setModifierFlags:(NSUInteger)value
-{
-    _modifierFlags = MASShortcutClear(value);
-}
-
-- (UInt32)carbonKeyCode
-{
-    return (self.keyCode == NSNotFound ? 0 : (UInt32)self.keyCode);
-}
-
-- (UInt32)carbonFlags
-{
-    return MASShortcutCarbonFlags(self.modifierFlags);
-}
-
-- (NSString *)description
-{
-    return [NSString stringWithFormat:@"%@%@", self.modifierFlagsString, self.keyCodeString];
-}
-
-- (NSString *)keyCodeStringForKeyEquivalent
-{
-    NSString *keyCodeString = self.keyCodeString;
-    if (keyCodeString.length > 1) {
-        switch (self.keyCode) {
-            case kVK_F1: return MASShortcutChar(0xF704);
-            case kVK_F2: return MASShortcutChar(0xF705);
-            case kVK_F3: return MASShortcutChar(0xF706);
-            case kVK_F4: return MASShortcutChar(0xF707);
-            case kVK_F5: return MASShortcutChar(0xF708);
-            case kVK_F6: return MASShortcutChar(0xF709);
-            case kVK_F7: return MASShortcutChar(0xF70a);
-            case kVK_F8: return MASShortcutChar(0xF70b);
-            case kVK_F9: return MASShortcutChar(0xF70c);
-            case kVK_F10: return MASShortcutChar(0xF70d);
-            case kVK_F11: return MASShortcutChar(0xF70e);
-            case kVK_F12: return MASShortcutChar(0xF70f);
-            // From this point down I am guessing F13 etc come sequentially, I don't have a keyboard to test.
-            case kVK_F13: return MASShortcutChar(0xF710);
-            case kVK_F14: return MASShortcutChar(0xF711);
-            case kVK_F15: return MASShortcutChar(0xF712);
-            case kVK_F16: return MASShortcutChar(0xF713);
-            case kVK_F17: return MASShortcutChar(0xF714);
-            case kVK_F18: return MASShortcutChar(0xF715);
-            case kVK_F19: return MASShortcutChar(0xF716);
-            case kVK_Space: return MASShortcutChar(0x20);
-            default: return @"";
-        }
-    }
-    return keyCodeString.lowercaseString;
-}
-
-- (NSString *)keyCodeString
-{
-    // Some key codes don't have an equivalent
-    switch (self.keyCode) {
-        case NSNotFound: return @"";
-        case kVK_F1: return @"F1";
-        case kVK_F2: return @"F2";
-        case kVK_F3: return @"F3";
-        case kVK_F4: return @"F4";
-        case kVK_F5: return @"F5";
-        case kVK_F6: return @"F6";
-        case kVK_F7: return @"F7";
-        case kVK_F8: return @"F8";
-        case kVK_F9: return @"F9";
-        case kVK_F10: return @"F10";
-        case kVK_F11: return @"F11";
-        case kVK_F12: return @"F12";
-        case kVK_F13: return @"F13";
-        case kVK_F14: return @"F14";
-        case kVK_F15: return @"F15";
-        case kVK_F16: return @"F16";
-        case kVK_F17: return @"F17";
-        case kVK_F18: return @"F18";
-        case kVK_F19: return @"F19";
-        case kVK_Space: return NSLocalizedString(@"Space", @"Shortcut glyph name for SPACE key");
-        case kVK_Escape: return MASShortcutChar(kMASShortcutGlyphEscape);
-        case kVK_Delete: return MASShortcutChar(kMASShortcutGlyphDeleteLeft);
-        case kVK_ForwardDelete: return MASShortcutChar(kMASShortcutGlyphDeleteRight);
-        case kVK_LeftArrow: return MASShortcutChar(kMASShortcutGlyphLeftArrow);
-        case kVK_RightArrow: return MASShortcutChar(kMASShortcutGlyphRightArrow);
-        case kVK_UpArrow: return MASShortcutChar(kMASShortcutGlyphUpArrow);
-        case kVK_DownArrow: return MASShortcutChar(kMASShortcutGlyphDownArrow);
-        case kVK_Help: return MASShortcutChar(kMASShortcutGlyphHelp);
-        case kVK_PageUp: return MASShortcutChar(kMASShortcutGlyphPageUp);
-        case kVK_PageDown: return MASShortcutChar(kMASShortcutGlyphPageDown);
-        case kVK_Tab: return MASShortcutChar(kMASShortcutGlyphTabRight);
-        case kVK_Return: return MASShortcutChar(kMASShortcutGlyphReturnR2L);
-            
-        // Keypad
-        case kVK_ANSI_Keypad0: return @"0";
-        case kVK_ANSI_Keypad1: return @"1";
-        case kVK_ANSI_Keypad2: return @"2";
-        case kVK_ANSI_Keypad3: return @"3";
-        case kVK_ANSI_Keypad4: return @"4";
-        case kVK_ANSI_Keypad5: return @"5";
-        case kVK_ANSI_Keypad6: return @"6";
-        case kVK_ANSI_Keypad7: return @"7";
-        case kVK_ANSI_Keypad8: return @"8";
-        case kVK_ANSI_Keypad9: return @"9";
-        case kVK_ANSI_KeypadDecimal: return @".";
-        case kVK_ANSI_KeypadMultiply: return @"*";
-        case kVK_ANSI_KeypadPlus: return @"+";
-        case kVK_ANSI_KeypadClear: return MASShortcutChar(kMASShortcutGlyphPadClear);
-        case kVK_ANSI_KeypadDivide: return @"/";
-        case kVK_ANSI_KeypadEnter: return MASShortcutChar(kMASShortcutGlyphReturn);
-        case kVK_ANSI_KeypadMinus: return @"–";
-        case kVK_ANSI_KeypadEquals: return @"=";
-            
-        // Hardcode
-        case 119: return MASShortcutChar(kMASShortcutGlyphSoutheastArrow);
-        case 115: return MASShortcutChar(kMASShortcutGlyphNorthwestArrow);
-    }
-    
-    // Everything else should be printable so look it up in the current keyboard
-    OSStatus error = noErr;
-    NSString *keystroke = nil;
-    TISInputSourceRef inputSource = TISCopyCurrentKeyboardLayoutInputSource();
-    if (inputSource) {
-        CFDataRef layoutDataRef = TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData);
-        if (layoutDataRef) {
-            UCKeyboardLayout *layoutData = (UCKeyboardLayout *)CFDataGetBytePtr(layoutDataRef);
-            UniCharCount length = 0;
-            UniChar  chars[256] = { 0 };
-            UInt32 deadKeyState = 0;
-            error = UCKeyTranslate(layoutData, (UInt16)self.keyCode, kUCKeyActionDisplay, 0, // No modifiers
-                                   LMGetKbdType(), kUCKeyTranslateNoDeadKeysMask, &deadKeyState,
-                                   sizeof(chars) / sizeof(UniChar), &length, chars);
-            keystroke = ((error == noErr) && length ? [NSString stringWithCharacters:chars length:length] : @"");
-        }
-        CFRelease(inputSource);
-    }
-    
-    // Validate keystroke
-    if (keystroke.length) {
-        static NSMutableCharacterSet *validChars = nil;
-        if (validChars == nil) {
-            validChars = [[NSMutableCharacterSet alloc] init];
-            [validChars formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
-            [validChars formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
-            [validChars formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];
-        }
-        for (NSUInteger i = 0, length = keystroke.length; i < length; i++) {
-            if (![validChars characterIsMember:[keystroke characterAtIndex:i]]) {
-                keystroke = @"";
-                break;
-            }
-        }
-    }
-    
-    // Finally, we've got a shortcut!
-    return keystroke.uppercaseString;
-}
-
-- (NSString *)modifierFlagsString
-{
-    unichar chars[4];
-    NSUInteger count = 0;
-    // These are in the same order as the menu manager shows them
-    if (self.modifierFlags & NSControlKeyMask) chars[count++] = kControlUnicode;
-    if (self.modifierFlags & NSAlternateKeyMask) chars[count++] = kOptionUnicode;
-    if (self.modifierFlags & NSShiftKeyMask) chars[count++] = kShiftUnicode;
-    if (self.modifierFlags & NSCommandKeyMask) chars[count++] = kCommandUnicode;
-    return (count ? [NSString stringWithCharacters:chars length:count] : @"");
-}
-
-#pragma mark - Validation logic
-
-- (BOOL)shouldBypass
-{
-    NSString *codeString = self.keyCodeString;
-    return (self.modifierFlags == NSCommandKeyMask) && ([codeString isEqualToString:@"W"] || [codeString isEqualToString:@"Q"]);
-}
-
-BOOL MASShortcutAllowsAnyHotkeyWithOptionModifier = NO;
-
-+ (void)setAllowsAnyHotkeyWithOptionModifier:(BOOL)allow
-{
-    MASShortcutAllowsAnyHotkeyWithOptionModifier = allow;
-}
-
-+ (BOOL)allowsAnyHotkeyWithOptionModifier
-{
-    return MASShortcutAllowsAnyHotkeyWithOptionModifier;
-}
-
-- (BOOL)isValid
-{
-    // Allow any function key with any combination of modifiers
-    BOOL includesFunctionKey = ((_keyCode == kVK_F1) || (_keyCode == kVK_F2) || (_keyCode == kVK_F3) || (_keyCode == kVK_F4) ||
-                                (_keyCode == kVK_F5) || (_keyCode == kVK_F6) || (_keyCode == kVK_F7) || (_keyCode == kVK_F8) ||
-                                (_keyCode == kVK_F9) || (_keyCode == kVK_F10) || (_keyCode == kVK_F11) || (_keyCode == kVK_F12) ||
-                                (_keyCode == kVK_F13) || (_keyCode == kVK_F14) || (_keyCode == kVK_F15) || (_keyCode == kVK_F16) ||
-                                (_keyCode == kVK_F17) || (_keyCode == kVK_F18) || (_keyCode == kVK_F19) || (_keyCode == kVK_F20));
-    if (includesFunctionKey) return YES;
-
-    // Do not allow any other key without modifiers
-    BOOL hasModifierFlags = (_modifierFlags > 0);
-    if (!hasModifierFlags) return NO;
-
-    // Allow any hotkey containing Control or Command modifier
-    BOOL includesCommand = ((_modifierFlags & NSCommandKeyMask) > 0);
-    BOOL includesControl = ((_modifierFlags & NSControlKeyMask) > 0);
-    if (includesCommand || includesControl) return YES;
-
-    // Allow Option key only in selected cases
-    BOOL includesOption = ((_modifierFlags & NSAlternateKeyMask) > 0);
-    if (includesOption) {
-
-        // Always allow Option-Space and Option-Escape because they do not have any bind system commands
-        if ((_keyCode == kVK_Space) || (_keyCode == kVK_Escape)) return YES;
-
-        // Allow Option modifier with any key even if it will break the system binding
-        if ([[self class] allowsAnyHotkeyWithOptionModifier]) return YES;
-    }
-
-    // The hotkey does not have any modifiers or violates system bindings
-    return NO;
-}
-
-- (BOOL)isKeyEquivalent:(NSString *)keyEquivalent flags:(NSUInteger)flags takenInMenu:(NSMenu *)menu error:(NSError **)outError
-{
-    for (NSMenuItem *menuItem in menu.itemArray) {
-        if (menuItem.hasSubmenu && [self isKeyEquivalent:keyEquivalent flags:flags takenInMenu:menuItem.submenu error:outError]) return YES;
-        
-        BOOL equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask) == flags);
-        BOOL equalHotkeyLowercase = [menuItem.keyEquivalent.lowercaseString isEqualToString:keyEquivalent];
-        
-        // Check if the cases are different, we know ours is lower and that shift is included in our modifiers
-        // If theirs is capitol, we need to add shift to their modifiers
-        if (equalHotkeyLowercase && ![menuItem.keyEquivalent isEqualToString:keyEquivalent]) {
-            equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask | NSShiftKeyMask) == flags);
-        }
-        
-        if (equalFlags && equalHotkeyLowercase) {
-            if (outError) {
-                NSString *format = NSLocalizedString(@"This shortcut cannot be used because it is already used by the menu item ‘%@’.",
-                                                     @"Message for alert when shortcut is already used");
-                NSDictionary *info = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:format, menuItem.title]
-                                                                 forKey:NSLocalizedDescriptionKey];
-                *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:info];
-            }
-            return YES;
-        }
-    }
-    return NO;
-}
-
-- (BOOL)isTakenError:(NSError **)outError
-{
-	CFArrayRef globalHotKeys;
-	if (CopySymbolicHotKeys(&globalHotKeys) == noErr) {
-
-        // Enumerate all global hotkeys and check if any of them matches current shortcut
-        for (CFIndex i = 0, count = CFArrayGetCount(globalHotKeys); i < count; i++) {
-            CFDictionaryRef hotKeyInfo = CFArrayGetValueAtIndex(globalHotKeys, i);
-            CFNumberRef code = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyCode);
-            CFNumberRef flags = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyModifiers);
-
-            if (([(__bridge NSNumber *)code unsignedIntegerValue] == self.keyCode) &&
-                ([(__bridge NSNumber *)flags unsignedIntegerValue] == self.carbonFlags)) {
-
-                if (outError) {
-                    NSString *description = NSLocalizedString(@"This combination cannot be used because it is already used by a system-wide "
-                                                              @"keyboard shortcut.\nIf you really want to use this key combination, most shortcuts "
-                                                              @"can be changed in the Keyboard & Mouse panel in System Preferences.",
-                                                              @"Message for alert when shortcut is already used by the system");
-                    NSDictionary *info = [NSDictionary dictionaryWithObject:description forKey:NSLocalizedDescriptionKey];
-                    *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:info];
-                }
-                return YES;
-            }
-        }
-        CFRelease(globalHotKeys);
-    }
-    return [self isKeyEquivalent:self.keyCodeStringForKeyEquivalent flags:self.modifierFlags takenInMenu:[NSApp mainMenu] error:outError];
-}
-
-@end
diff --git a/Pods/MASShortcut/MASShortcutView+UserDefaults.h b/Pods/MASShortcut/MASShortcutView+UserDefaults.h
deleted file mode 100644
index 05d3c5b..0000000
--- a/Pods/MASShortcut/MASShortcutView+UserDefaults.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#import "MASShortcutView.h"
-
-@interface MASShortcutView (UserDefaults)
-
-@property (nonatomic, copy) NSString *associatedUserDefaultsKey;
-
-@end
diff --git a/Pods/MASShortcut/MASShortcutView+UserDefaults.m b/Pods/MASShortcut/MASShortcutView+UserDefaults.m
deleted file mode 100644
index bbe1dd2..0000000
--- a/Pods/MASShortcut/MASShortcutView+UserDefaults.m
+++ /dev/null
@@ -1,130 +0,0 @@
-#import "MASShortcutView+UserDefaults.h"
-#import "MASShortcut.h"
-#import <objc/runtime.h>
-
-@interface MASShortcutDefaultsObserver : NSObject
-
-@property (nonatomic, readonly) NSString *userDefaultsKey;
-@property (nonatomic, readonly, weak) MASShortcutView *shortcutView;
-
-- (id)initWithShortcutView:(MASShortcutView *)shortcutView userDefaultsKey:(NSString *)userDefaultsKey;
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcutView (UserDefaults)
-
-void *MASAssociatedDefaultsObserver = &MASAssociatedDefaultsObserver;
-
-- (NSString *)associatedUserDefaultsKey
-{
-    MASShortcutDefaultsObserver *defaultsObserver = objc_getAssociatedObject(self, MASAssociatedDefaultsObserver);
-    return defaultsObserver.userDefaultsKey;
-}
-
-- (void)setAssociatedUserDefaultsKey:(NSString *)associatedUserDefaultsKey
-{
-    // First, stop observing previous shortcut view
-    objc_setAssociatedObject(self, MASAssociatedDefaultsObserver, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-
-    if (associatedUserDefaultsKey.length == 0) return;
-
-    // Next, start observing current shortcut view
-    MASShortcutDefaultsObserver *defaultsObserver = [[MASShortcutDefaultsObserver alloc] initWithShortcutView:self userDefaultsKey:associatedUserDefaultsKey];
-    objc_setAssociatedObject(self, MASAssociatedDefaultsObserver, defaultsObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-}
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcutDefaultsObserver {
-    MASShortcut *_originalShortcut;
-    BOOL _internalPreferenceChange;
-    BOOL _internalShortcutChange;
-}
-
-@synthesize userDefaultsKey = _userDefaultsKey;
-@synthesize shortcutView = _shortcutView;
-
-#pragma mark -
-
-- (id)initWithShortcutView:(MASShortcutView *)shortcutView userDefaultsKey:(NSString *)userDefaultsKey
-{
-    self = [super init];
-    if (self) {
-        _originalShortcut = shortcutView.shortcutValue;
-        _shortcutView = shortcutView;
-        _userDefaultsKey = userDefaultsKey.copy;
-        [self startObservingShortcutView];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    // __weak _shortcutView is not yet deallocated because it refers MASShortcutDefaultsObserver
-    [self stopObservingShortcutView];
-}
-
-#pragma mark -
-
-void *kShortcutValueObserver = &kShortcutValueObserver;
-
-- (void)startObservingShortcutView
-{
-    // Read initial shortcut value from user preferences
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSData *data = [defaults dataForKey:_userDefaultsKey];
-    _shortcutView.shortcutValue = [MASShortcut shortcutWithData:data];
-
-    // Observe user preferences to update shortcut value when it changed
-    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:defaults];
-
-    // Observe the keyboard shortcut that user inputs by hand
-    [_shortcutView addObserver:self forKeyPath:@"shortcutValue" options:0 context:kShortcutValueObserver];
-}
-
-- (void)userDefaultsDidChange:(NSNotification *)note
-{
-    // Ignore notifications posted from -[self observeValueForKeyPath:]
-    if (_internalPreferenceChange) return;
-
-    _internalShortcutChange = YES;
-    NSData *data = [note.object dataForKey:_userDefaultsKey];
-    _shortcutView.shortcutValue = [MASShortcut shortcutWithData:data];
-    _internalShortcutChange = NO;
-}
-
-- (void)stopObservingShortcutView
-{
-    // Stop observing keyboard hotkeys entered by user in the shortcut view
-    [_shortcutView removeObserver:self forKeyPath:@"shortcutValue" context:kShortcutValueObserver];
-
-    // Stop observing user preferences
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:[NSUserDefaults standardUserDefaults]];
-
-    // Restore original hotkey in the shortcut view
-    _shortcutView.shortcutValue = _originalShortcut;
-}
-
-- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
-{
-    if (context == kShortcutValueObserver) {
-        if (_internalShortcutChange) return;
-        MASShortcut *shortcut = [object valueForKey:keyPath];
-        _internalPreferenceChange = YES;
-
-        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-        [defaults setObject:(shortcut.data ?: [NSKeyedArchiver archivedDataWithRootObject:nil]) forKey:_userDefaultsKey];
-        [defaults synchronize];
-
-        _internalPreferenceChange = NO;
-    }
-    else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
-    }
-}
-
-@end
diff --git a/Pods/MASShortcut/MASShortcutView.h b/Pods/MASShortcut/MASShortcutView.h
deleted file mode 100644
index 13163d4..0000000
--- a/Pods/MASShortcut/MASShortcutView.h
+++ /dev/null
@@ -1,20 +0,0 @@
-@class MASShortcut;
-
-typedef enum {
-    MASShortcutViewAppearanceDefault = 0,  // Height = 19 px
-    MASShortcutViewAppearanceTexturedRect, // Height = 25 px
-    MASShortcutViewAppearanceRounded       // Height = 43 px
-} MASShortcutViewAppearance;
-
-@interface MASShortcutView : NSView
-
-@property (nonatomic, strong) MASShortcut *shortcutValue;
-@property (nonatomic, getter = isRecording) BOOL recording;
-@property (nonatomic, getter = isEnabled) BOOL enabled;
-@property (nonatomic, copy) void (^shortcutValueChange)(MASShortcutView *sender);
-@property (nonatomic) MASShortcutViewAppearance appearance;
-
-/// Returns custom class for drawing control.
-+ (Class)shortcutCellClass;
-
-@end
diff --git a/Pods/MASShortcut/MASShortcutView.m b/Pods/MASShortcut/MASShortcutView.m
deleted file mode 100644
index 82f4b4b..0000000
--- a/Pods/MASShortcut/MASShortcutView.m
+++ /dev/null
@@ -1,439 +0,0 @@
-#import "MASShortcutView.h"
-#import "MASShortcut.h"
-
-#define HINT_BUTTON_WIDTH 23.0
-#define BUTTON_FONT_SIZE 11.0
-#define SEGMENT_CHROME_WIDTH 6.0
-
-#pragma mark -
-
-@interface MASShortcutView () // Private accessors
-
-@property (nonatomic, getter = isHinting) BOOL hinting;
-@property (nonatomic, copy) NSString *shortcutPlaceholder;
-
-@end
-
-#pragma mark -
-
-@implementation MASShortcutView {
-    NSButtonCell *_shortcutCell;
-    NSInteger _shortcutToolTipTag;
-    NSInteger _hintToolTipTag;
-    NSTrackingArea *_hintArea;
-}
-
-@synthesize enabled = _enabled;
-@synthesize hinting = _hinting;
-@synthesize shortcutValue = _shortcutValue;
-@synthesize shortcutPlaceholder = _shortcutPlaceholder;
-@synthesize shortcutValueChange = _shortcutValueChange;
-@synthesize recording = _recording;
-@synthesize appearance = _appearance;
-
-#pragma mark -
-
-+ (Class)shortcutCellClass
-{
-    return [NSButtonCell class];
-}
-
-- (id)initWithFrame:(CGRect)frameRect
-{
-    self = [super initWithFrame:frameRect];
-    if (self) {
-        _shortcutCell = [[[self.class shortcutCellClass] alloc] init];
-        _shortcutCell.buttonType = NSPushOnPushOffButton;
-        _shortcutCell.font = [[NSFontManager sharedFontManager] convertFont:_shortcutCell.font toSize:BUTTON_FONT_SIZE];
-        _enabled = YES;
-        [self resetShortcutCellStyle];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    [self activateEventMonitoring:NO];
-    [self activateResignObserver:NO];
-}
-
-#pragma mark - Public accessors
-
-- (void)setEnabled:(BOOL)flag
-{
-    if (_enabled != flag) {
-        _enabled = flag;
-        [self updateTrackingAreas];
-        self.recording = NO;
-        [self setNeedsDisplay:YES];
-    }
-}
-
-- (void)setAppearance:(MASShortcutViewAppearance)appearance
-{
-    if (_appearance != appearance) {
-        _appearance = appearance;
-        [self resetShortcutCellStyle];
-        [self setNeedsDisplay:YES];
-    }
-}
-
-- (void)resetShortcutCellStyle
-{
-    switch (_appearance) {
-        case MASShortcutViewAppearanceDefault: {
-            _shortcutCell.bezelStyle = NSRoundRectBezelStyle;
-            break;
-        }
-        case MASShortcutViewAppearanceTexturedRect: {
-            _shortcutCell.bezelStyle = NSTexturedRoundedBezelStyle;
-            break;
-        }
-        case MASShortcutViewAppearanceRounded: {
-            _shortcutCell.bezelStyle = NSRoundedBezelStyle;
-            break;
-        }
-    }
-}
-
-- (void)setRecording:(BOOL)flag
-{
-    // Only one recorder can be active at the moment
-    static MASShortcutView *currentRecorder = nil;
-    if (flag && (currentRecorder != self)) {
-        currentRecorder.recording = NO;
-        currentRecorder = flag ? self : nil;
-    }
-    
-    // Only enabled view supports recording
-    if (flag && !self.enabled) return;
-    
-    if (_recording != flag) {
-        _recording = flag;
-        self.shortcutPlaceholder = nil;
-        [self resetToolTips];
-        [self activateEventMonitoring:_recording];
-        [self activateResignObserver:_recording];
-        [self setNeedsDisplay:YES];
-    }
-}
-
-- (void)setShortcutValue:(MASShortcut *)shortcutValue
-{
-    _shortcutValue = shortcutValue;
-    [self resetToolTips];
-    [self setNeedsDisplay:YES];
-
-    if (self.shortcutValueChange) {
-        self.shortcutValueChange(self);
-    }
-}
-
-- (void)setShortcutPlaceholder:(NSString *)shortcutPlaceholder
-{
-    _shortcutPlaceholder = shortcutPlaceholder.copy;
-    [self setNeedsDisplay:YES];
-}
-
-#pragma mark - Drawing
-
-- (BOOL)isFlipped
-{
-    return YES;
-}
-
-- (void)drawInRect:(CGRect)frame withTitle:(NSString *)title alignment:(NSTextAlignment)alignment state:(NSInteger)state
-{
-    _shortcutCell.title = title;
-    _shortcutCell.alignment = alignment;
-    _shortcutCell.state = state;
-    _shortcutCell.enabled = self.enabled;
-
-    switch (_appearance) {
-        case MASShortcutViewAppearanceDefault: {
-            [_shortcutCell drawWithFrame:frame inView:self];
-            break;
-        }
-        case MASShortcutViewAppearanceTexturedRect: {
-            [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self];
-            break;
-        }
-        case MASShortcutViewAppearanceRounded: {
-            [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self];
-            break;
-        }
-    }
-}
-
-- (void)drawRect:(CGRect)dirtyRect
-{
-    if (self.shortcutValue) {
-        [self drawInRect:self.bounds withTitle:MASShortcutChar(self.recording ? kMASShortcutGlyphEscape : kMASShortcutGlyphDeleteLeft)
-               alignment:NSRightTextAlignment state:NSOffState];
-        
-        CGRect shortcutRect;
-        [self getShortcutRect:&shortcutRect hintRect:NULL];
-        NSString *title = (self.recording
-                           ? (_hinting
-                              ? NSLocalizedString(@"Use Old Shortcut", @"Cancel action button for non-empty shortcut in recording state")
-                              : (self.shortcutPlaceholder.length > 0
-                                 ? self.shortcutPlaceholder
-                                 : NSLocalizedString(@"Type New Shortcut", @"Non-empty shortcut button in recording state")))
-                           : _shortcutValue ? _shortcutValue.description : @"");
-        [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:self.isRecording ? NSOnState : NSOffState];
-    }
-    else {
-        if (self.recording)
-        {
-            [self drawInRect:self.bounds withTitle:MASShortcutChar(kMASShortcutGlyphEscape) alignment:NSRightTextAlignment state:NSOffState];
-            
-            CGRect shortcutRect;
-            [self getShortcutRect:&shortcutRect hintRect:NULL];
-            NSString *title = (_hinting
-                               ? NSLocalizedString(@"Cancel", @"Cancel action button in recording state")
-                               : (self.shortcutPlaceholder.length > 0
-                                  ? self.shortcutPlaceholder
-                                  : NSLocalizedString(@"Type Shortcut", @"Empty shortcut button in recording state")));
-            [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:NSOnState];
-        }
-        else
-        {
-            [self drawInRect:self.bounds withTitle:NSLocalizedString(@"Record Shortcut", @"Empty shortcut button in normal state")
-                   alignment:NSCenterTextAlignment state:NSOffState];
-        }
-    }
-}
-
-#pragma mark - Mouse handling
-
-- (void)getShortcutRect:(CGRect *)shortcutRectRef hintRect:(CGRect *)hintRectRef
-{
-    CGRect shortcutRect, hintRect;
-    CGFloat hintButtonWidth = HINT_BUTTON_WIDTH;
-    switch (self.appearance) {
-        case MASShortcutViewAppearanceTexturedRect: hintButtonWidth += 2.0; break;
-        case MASShortcutViewAppearanceRounded: hintButtonWidth += 3.0; break;
-        default: break;
-    }
-    CGRectDivide(self.bounds, &hintRect, &shortcutRect, hintButtonWidth, CGRectMaxXEdge);
-    if (shortcutRectRef)  *shortcutRectRef = shortcutRect;
-    if (hintRectRef) *hintRectRef = hintRect;
-}
-
-- (BOOL)locationInShortcutRect:(CGPoint)location
-{
-    CGRect shortcutRect;
-    [self getShortcutRect:&shortcutRect hintRect:NULL];
-    return CGRectContainsPoint(shortcutRect, [self convertPoint:location fromView:nil]);
-}
-
-- (BOOL)locationInHintRect:(CGPoint)location
-{
-    CGRect hintRect;
-    [self getShortcutRect:NULL hintRect:&hintRect];
-    return CGRectContainsPoint(hintRect, [self convertPoint:location fromView:nil]);
-}
-
-- (void)mouseDown:(NSEvent *)event
-{
-    if (self.enabled) {
-        if (self.shortcutValue) {
-            if (self.recording) {
-                if ([self locationInHintRect:event.locationInWindow]) {
-                    self.recording = NO;
-                }
-            }
-            else {
-                if ([self locationInShortcutRect:event.locationInWindow]) {
-                    self.recording = YES;
-                }
-                else {
-                    self.shortcutValue = nil;
-                }
-            }
-        }
-        else {
-            if (self.recording) {
-                if ([self locationInHintRect:event.locationInWindow]) {
-                    self.recording = NO;
-                }
-            }
-            else {
-                self.recording = YES;
-            }
-        }
-    }
-    else {
-        [super mouseDown:event];
-    }
-}
-
-#pragma mark - Handling mouse over
-
-- (void)updateTrackingAreas
-{
-    [super updateTrackingAreas];
-    
-    if (_hintArea) {
-        [self removeTrackingArea:_hintArea];
-        _hintArea = nil;
-    }
-    
-    // Forbid hinting if view is disabled
-    if (!self.enabled) return;
-    
-    CGRect hintRect;
-    [self getShortcutRect:NULL hintRect:&hintRect];
-    NSTrackingAreaOptions options = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingAssumeInside);
-    _hintArea = [[NSTrackingArea alloc] initWithRect:hintRect options:options owner:self userInfo:nil];
-    [self addTrackingArea:_hintArea];
-}
-
-- (void)setHinting:(BOOL)flag
-{
-    if (_hinting != flag) {
-        _hinting = flag;
-        [self setNeedsDisplay:YES];
-    }
-}
-
-- (void)mouseEntered:(NSEvent *)event
-{
-    self.hinting = YES;
-}
-
-- (void)mouseExited:(NSEvent *)event
-{
-    self.hinting = NO;
-}
-
-void *kUserDataShortcut = &kUserDataShortcut;
-void *kUserDataHint = &kUserDataHint;
-
-- (void)resetToolTips
-{
-    if (_shortcutToolTipTag) {
-        [self removeToolTip:_shortcutToolTipTag], _shortcutToolTipTag = 0;
-    }
-    if (_hintToolTipTag) {
-        [self removeToolTip:_hintToolTipTag], _hintToolTipTag = 0;
-    }
-    
-    if ((self.shortcutValue == nil) || self.recording || !self.enabled) return;
-
-    CGRect shortcutRect, hintRect;
-    [self getShortcutRect:&shortcutRect hintRect:&hintRect];
-    _shortcutToolTipTag = [self addToolTipRect:shortcutRect owner:self userData:kUserDataShortcut];
-    _hintToolTipTag = [self addToolTipRect:hintRect owner:self userData:kUserDataHint];
-}
-
-- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(CGPoint)point userData:(void *)data
-{
-    if (data == kUserDataShortcut) {
-        return NSLocalizedString(@"Click to record new shortcut", @"Tooltip for non-empty shortcut button");
-    }
-    else if (data == kUserDataHint) {
-        return NSLocalizedString(@"Delete shortcut", @"Tooltip for hint button near the non-empty shortcut");
-    }
-    return nil;
-}
-
-#pragma mark - Event monitoring
-
-- (void)activateEventMonitoring:(BOOL)shouldActivate
-{
-    static BOOL isActive = NO;
-    if (isActive == shouldActivate) return;
-    isActive = shouldActivate;
-    
-    static id eventMonitor = nil;
-    if (shouldActivate) {
-        __weak MASShortcutView *weakSelf = self;
-        NSEventMask eventMask = (NSKeyDownMask | NSFlagsChangedMask);
-        eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^(NSEvent *event) {
-
-            MASShortcut *shortcut = [MASShortcut shortcutWithEvent:event];
-            if ((shortcut.keyCode == kVK_Delete) || (shortcut.keyCode == kVK_ForwardDelete)) {
-                // Delete shortcut
-                weakSelf.shortcutValue = nil;
-                weakSelf.recording = NO;
-                event = nil;
-            }
-            else if (shortcut.keyCode == kVK_Escape) {
-                // Cancel recording
-                weakSelf.recording = NO;
-                event = nil;
-            }
-            else if (shortcut.shouldBypass) {
-                // Command + W, Command + Q, ESC should deactivate recorder
-                weakSelf.recording = NO;
-            }
-            else {
-                // Verify possible shortcut
-                if (shortcut.keyCodeString.length > 0) {
-                    if (shortcut.valid) {
-                        // Verify that shortcut is not used
-                        NSError *error = nil;
-                        if ([shortcut isTakenError:&error]) {
-                            // Prevent cancel of recording when Alert window is key
-                            [weakSelf activateResignObserver:NO];
-                            [weakSelf activateEventMonitoring:NO];
-                            NSString *format = NSLocalizedString(@"The key combination %@ cannot be used",
-                                                                 @"Title for alert when shortcut is already used");
-                            NSAlert* alert = [[NSAlert alloc]init];
-                            alert.messageText = [NSString stringWithFormat:format, shortcut];
-                            alert.informativeText = error.localizedDescription;
-                            alert.alertStyle = NSWarningAlertStyle;
-                            weakSelf.recording = NO;
-                            [alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
-                                weakSelf.shortcutPlaceholder = nil;
-                                [weakSelf activateResignObserver:YES];
-                                [weakSelf activateEventMonitoring:YES];
-                                weakSelf.recording = YES;
-                            }];
-                        }
-                        else {
-                            weakSelf.shortcutValue = shortcut;
-                            weakSelf.recording = NO;
-                        }
-                    }
-                    else {
-                        // Key press with or without SHIFT is not valid input
-                        NSBeep();
-                    }
-                }
-                else {
-                    // User is playing with modifier keys
-                    weakSelf.shortcutPlaceholder = shortcut.modifierFlagsString;
-                }
-                event = nil;
-            }
-            return event;
-        }];
-    }
-    else {
-        [NSEvent removeMonitor:eventMonitor];
-    }
-}
-
-- (void)activateResignObserver:(BOOL)shouldActivate
-{
-    static BOOL isActive = NO;
-    if (isActive == shouldActivate) return;
-    isActive = shouldActivate;
-    
-    static id observer = nil;
-    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
-    if (shouldActivate) {
-        __weak MASShortcutView *weakSelf = self;
-        observer = [notificationCenter addObserverForName:NSWindowDidResignKeyNotification object:self.window
-                                                queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) {
-                                                    weakSelf.recording = NO;
-                                                }];
-    }
-    else {
-        [notificationCenter removeObserver:observer];
-    }
-}
-
-@end
diff --git a/Pods/MASShortcut/README.md b/Pods/MASShortcut/README.md
deleted file mode 100644
index bbdf2c2..0000000
--- a/Pods/MASShortcut/README.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Intro
-
-Some time ago Cocoa developers used a brilliant framework [ShortcutRecorder](http://wafflesoftware.net/shortcut/) for managing keyboard shortcuts in application preferences. However, it became incompatible with a new plugin architecture of Xcode 4.
-
-The project MASShortcut introduces modern API and user interface for recording, storing and using global keyboard shortcuts. All code is compatible with Xcode 4.3, Mac OS X 10.7 and the sandboxed environment.
-
-# Usage
-
-I hope, it is really easy:
-
-```objective-c
-// Drop a custom view into XIB, set its class to MASShortcutView and its height to 19. If you select another appearance style look up the correct values in MASShortcutView.h
-@property (nonatomic, weak) IBOutlet MASShortcutView *shortcutView;
-	
-// Think up a preference key to store a global shortcut between launches
-NSString *const kPreferenceGlobalShortcut = @"GlobalShortcut";
-
-// Assign the preference key and the shortcut view will take care of persistence
-self.shortcutView.associatedUserDefaultsKey = kPreferenceGlobalShortcut;
-
-// Execute your block of code automatically when user triggers a shortcut from preferences
-[MASShortcut registerGlobalShortcutWithUserDefaultsKey:kPreferenceGlobalShortcut handler:^{
-    // Let me know if you find a better or more convenient API.
-}];
-```
-
-To set an example, I made a  demo project: [MASShortcutDemo](https://github.com/shpakovski/MASShortcutDemo). Enjoy!
-
-#Notifications
-By registering for KVO notifications from `NSUserDefaultsController`, you can get a callback whenever a user changes the shortcut, allowing you to perform any UI updates, or other code handling tasks.
-
-This is just as easy to implement:
-    
-```objective-c
-// Declare an ivar for key path in the user defaults controller
-NSString *_observableKeyPath;
-    
-// Make a global context reference
-void *kGlobalShortcutContext = &kGlobalShortcutContext;
-    
-// Implement when loading view
-_observableKeyPath = [@"values." stringByAppendingString:kPreferenceGlobalShortcut];
-[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:_observableKeyPath
-                                                             options:NSKeyValueObservingOptionInitial
-                                                             context:kGlobalShortcutContext];
-
-// Capture the KVO change and do something
-- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)obj
-                        change:(NSDictionary *)change context:(void *)ctx
-{
-    if (ctx == kGlobalShortcutContext) {
-        NSLog(@"Shortcut has changed");
-    }
-    else {
-        [super observeValueForKeyPath:keyPath ofObject:obj change:change context:ctx];
-    }
-}
-
-// Do not forget to remove the observer
-[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self
-                                                             forKeyPath:_observableKeyPath
-                                                                context:kGlobalShortcutContext];
-```
-
-# Non-ARC Version
-
-If you like retain/release, please check out these forks: [heardrwt/MASShortcut](https://github.com/heardrwt/MASShortcut) and [chendo/MASShortcut](https://github.com/chendo/MASShortcut). However, the preferred way is to enable the `-fobjc-arc` in Xcode source options.
-
-# Copyright
-
-MASShortcut is licensed under the 2-clause BSD license.
diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock
deleted file mode 100644
index 719e6d7..0000000
--- a/Pods/Manifest.lock
+++ /dev/null
@@ -1,37 +0,0 @@
-PODS:
-  - ISO8601DateFormatter (0.7)
-  - MASShortcut (1.2.3)
-  - RHPreferences (1.0.0)
-  - Sparkle (1.13.1)
-  - StartAtLoginController (0.0.1)
-  - WebViewJavascriptBridge (5.0.5)
-
-DEPENDENCIES:
-  - ISO8601DateFormatter (~> 0.7)
-  - MASShortcut (from `https://github.com/xhacker/MASShortcut.git`, branch `menubar-webkit`)
-  - RHPreferences (~> 1.0)
-  - Sparkle (~> 1.13)
-  - StartAtLoginController (~> 0.0.1)
-  - WebViewJavascriptBridge (~> 5.0)
-
-EXTERNAL SOURCES:
-  MASShortcut:
-    :branch: menubar-webkit
-    :git: https://github.com/xhacker/MASShortcut.git
-
-CHECKOUT OPTIONS:
-  MASShortcut:
-    :commit: e54886366d753c75d8bbe07d1a7dd42af69f70fd
-    :git: https://github.com/xhacker/MASShortcut.git
-
-SPEC CHECKSUMS:
-  ISO8601DateFormatter: ab926648eebe497f4d167c0fd083992f959f1274
-  MASShortcut: 534bf89dfd1fb013580accdc3b5d2341f0749dc0
-  RHPreferences: 6871f9614347f4b45197c51f7c93c3cde2744ce8
-  Sparkle: 2fbd47b869621d1e679c7554e3e19dda02104818
-  StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
-  WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
-
-PODFILE CHECKSUM: e0eb9f4d6740610df4a8ad44e676343009803cc4
-
-COCOAPODS: 1.1.1
diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj
deleted file mode 100644
index 9fd2faa..0000000
--- a/Pods/Pods.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,1163 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		06DEF87B3F74B3BDD497AA1B58A591E8 /* ISO8601DateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
-		099FF02F91C103E7EB9FEAA95FDA1865 /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		0AAD3F1A3513E6302638DB21A5C686D6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		0B02B78DAEA00B4EFD97A6B5DEB47CFD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		0DFEAA39ACF4CD35738E3A6A2EFFE985 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		1630DC1951EF4F01F9BF7C92277713E0 /* RHPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		232A85F5668F85CC863EF7A9C5EB7806 /* RHPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
-		276BE92A73ACEBB6FBDB677C6DB79179 /* StartAtLoginController-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */; };
-		284F97193D8DFC30B5E09A2467AFF859 /* WKWebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		307AF494C44C3B03D41BF53A17F90FAC /* MASShortcutView+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		392DC00755985E727BBBDF305B22919B /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3B68CC68BCD794BEB3D9BF1AEC46E491 /* StartAtLoginController.h in Headers */ = {isa = PBXBuildFile; fileRef = 465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		490170C7B684819125C5D0B3144C48F0 /* MASShortcut+Monitoring.h in Headers */ = {isa = PBXBuildFile; fileRef = 8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		49DB848489A454335772EC4AC3EF19BA /* WebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		516FEF3867EE0EB73955B1FCBB8D70AC /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */; };
-		53DD37407AB7C949F460B353EE4C79E7 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		56AEA368E9F13473089B05F5EAE7A825 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */; };
-		590FD082B06F85831F48053F5279EDA0 /* MASShortcutView+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		666474F683617399EC47ABAD21C5A5F1 /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		6AB607BAAEFBD78D8046E0AB769DF50E /* MASShortcut+UserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		82BE347936BA909D1229180A62C4EBAC /* WebViewJavascriptBridge_JS.h in Headers */ = {isa = PBXBuildFile; fileRef = 62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		85E5DBEFB2B361BF802D4F83B0B9951D /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		A14EE0351FB9DF7954A3A4CC64E39BD9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		A45C95308F93724650447321012F58BB /* StartAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		A4E8732161509BAB60525ED77EEECE71 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 70A7AF6C657223298378356780081E78 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		C0DE2E1FC64474C7900800AF86F5B10D /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		C2BCC6D89C731E05A6FA021E273179EA /* RHPreferences-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */; };
-		C3216A2D96E821D120FCA7B47FF38F22 /* MASShortcut+UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		C38CF90D07859A45CCCA120DBFBCA425 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		C460B0181597DE0A1D6F2F498FE043CD /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */; };
-		C4F7D5A7BE0F2CCFA63C83436B40B181 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */; };
-		D7137E57D11E0B725F2A937A90EA74C2 /* Pods-quark-shell-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */; };
-		D740839FCD6361E10AE5462DBEB4E153 /* MASShortcut+Monitoring.m in Sources */ = {isa = PBXBuildFile; fileRef = 31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		DD0EEB8EAB4A9A1E023085029415C0A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */; };
-		E0F6FD1E10963EA7F454D00BD33AF147 /* ISO8601DateFormatter-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */; };
-		E72C2B0472108257A1C54E33F0C3EC2B /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; };
-		EEC7D7F9F45667B8854AF12F610EE2BE /* ISO8601DateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F1A4C183D414DAE35772059E4648E791 /* WebViewJavascriptBridgeBase.h in Headers */ = {isa = PBXBuildFile; fileRef = C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F82D2728A0328942861AF97EE663389F /* RHPreferencesWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F86A1F1CA9ED89FE6D643CC25DC69E7A /* WebViewJavascriptBridge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
-		3315DBE637FA220512EC80759AFB781F /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = B0267AE73E97C7576F08F4911FEFECD5;
-			remoteInfo = ISO8601DateFormatter;
-		};
-		39AADAFB0E68C57FD4FE32D74F2C489E /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = ECCCB42E94B9425098451F868F013C54;
-			remoteInfo = StartAtLoginController;
-		};
-		6552E1E9853B96752F3DCB1E4F19E677 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 2CD3F2A4EA1E4AECB9A7744A7B612941;
-			remoteInfo = WebViewJavascriptBridge;
-		};
-		717016437144947F49EB30A76215EA5C /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = BC33E7E7C814AFB79D6412EEA7DA84E7;
-			remoteInfo = RHPreferences;
-		};
-		E5029213AEB8EB44231F50DB086BE4A6 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 6C863F6C9AB214C752194D5A06B943DB;
-			remoteInfo = MASShortcut;
-		};
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
-		053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferences.h; path = RHPreferences/RHPreferences.h; sourceTree = "<group>"; };
-		06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = "<group>"; };
-		09E02674DBDFC9AA28B038BF782FEB54 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
-		0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+UserDefaults.h"; sourceTree = "<group>"; };
-		0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = StartAtLoginController.xcconfig; sourceTree = "<group>"; };
-		0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RHPreferencesWindowController.m; path = RHPreferences/RHPreferencesWindowController.m; sourceTree = "<group>"; };
-		0ECC539C94F019D36E29CAAB646D7043 /* StartAtLoginController-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StartAtLoginController-prefix.pch"; sourceTree = "<group>"; };
-		17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridgeBase.m; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m; sourceTree = "<group>"; };
-		27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/ServiceManagement.framework; sourceTree = DEVELOPER_DIR; };
-		2826BE8CC1C37F0682A11D91B0430AE4 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = "<group>"; };
-		2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-quark-shell.release.xcconfig"; sourceTree = "<group>"; };
-		2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = "<group>"; };
-		31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+Monitoring.m"; sourceTree = "<group>"; };
-		36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
-		3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ISO8601DateFormatter.xcconfig; sourceTree = "<group>"; };
-		465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = StartAtLoginController.h; sourceTree = "<group>"; };
-		4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge_JS.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m; sourceTree = "<group>"; };
-		4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WebViewJavascriptBridge-dummy.m"; sourceTree = "<group>"; };
-		526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; };
-		53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RHPreferences.xcconfig; sourceTree = "<group>"; };
-		59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ISO8601DateFormatter.h; sourceTree = "<group>"; };
-		61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcutView+UserDefaults.m"; sourceTree = "<group>"; };
-		62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge_JS.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h; sourceTree = "<group>"; };
-		65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMASShortcut.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		70A7AF6C657223298378356780081E78 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcutView.m; sourceTree = "<group>"; };
-		797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge.m; sourceTree = "<group>"; };
-		7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; };
-		7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WebViewJavascriptBridge.xcconfig; sourceTree = "<group>"; };
-		8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut+Monitoring.h"; sourceTree = "<group>"; };
-		8372FB2D7342DA57AF4C9CAC82D0D281 /* Pods-quark-shell-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-quark-shell-resources.sh"; sourceTree = "<group>"; };
-		855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libISO8601DateFormatter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		88C13C090AB0AB273FEB9989262B6888 /* ISO8601DateFormatter-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ISO8601DateFormatter-prefix.pch"; sourceTree = "<group>"; };
-		91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StartAtLoginController-dummy.m"; sourceTree = "<group>"; };
-		92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcut.h; sourceTree = "<group>"; };
-		93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
-		942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RHPreferences-dummy.m"; sourceTree = "<group>"; };
-		993B0D66EA64986DFD0D9C00FB336F25 /* Pods-quark-shell-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-quark-shell-acknowledgements.markdown"; sourceTree = "<group>"; };
-		A3CA658717B68A3765D3B5D34E448CB3 /* RHPreferencesWindow.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RHPreferencesWindow.xib; path = RHPreferences/RHPreferencesWindow.xib; sourceTree = "<group>"; };
-		A4513538D92EB56F1358ADF52369E2FE /* Pods-quark-shell-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-quark-shell-frameworks.sh"; sourceTree = "<group>"; };
-		A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = StartAtLoginController.m; sourceTree = "<group>"; };
-		AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WKWebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.m; sourceTree = "<group>"; };
-		B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-quark-shell.a"; sourceTree = BUILT_PRODUCTS_DIR; };
-		BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MASShortcutView.h; sourceTree = "<group>"; };
-		C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridgeBase.h; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h; sourceTree = "<group>"; };
-		CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge.h; sourceTree = "<group>"; };
-		CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-quark-shell-dummy.m"; sourceTree = "<group>"; };
-		CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
-		CF383F1A79400C257CBFA7A67E41350E /* WebViewJavascriptBridge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WebViewJavascriptBridge-prefix.pch"; sourceTree = "<group>"; };
-		D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcutView+UserDefaults.h"; sourceTree = "<group>"; };
-		DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStartAtLoginController.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WKWebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.h; sourceTree = "<group>"; };
-		E1AB417A0D9ED7F2CD63090377DB9040 /* Pods-quark-shell-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-quark-shell-acknowledgements.plist"; sourceTree = "<group>"; };
-		E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ISO8601DateFormatter-dummy.m"; sourceTree = "<group>"; };
-		EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut+UserDefaults.m"; sourceTree = "<group>"; };
-		EAC3DE54D1B6A835C1B78FBD3DCE4921 /* RHPreferences-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RHPreferences-prefix.pch"; sourceTree = "<group>"; };
-		EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RHPreferencesWindowController.h; path = RHPreferences/RHPreferencesWindowController.h; sourceTree = "<group>"; };
-		F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ISO8601DateFormatter.m; sourceTree = "<group>"; };
-		F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRHPreferences.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWebViewJavascriptBridge.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MASShortcut.m; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		0529A2EAFF13066EC933C13943C180FD /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				C38CF90D07859A45CCCA120DBFBCA425 /* Cocoa.framework in Frameworks */,
-				C4F7D5A7BE0F2CCFA63C83436B40B181 /* ServiceManagement.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		32DC1C17E8FFE5DE9CDC1128799AD387 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A14EE0351FB9DF7954A3A4CC64E39BD9 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		3D2ECDD8D4B24F7B4821BED3BBCEE1C1 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				0DFEAA39ACF4CD35738E3A6A2EFFE985 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		4D8BB006D1CA179BB186E782687AA0F9 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				0B02B78DAEA00B4EFD97A6B5DEB47CFD /* Cocoa.framework in Frameworks */,
-				C460B0181597DE0A1D6F2F498FE043CD /* WebKit.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		820E7F281D04108C63DB266C51AB64E4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				0AAD3F1A3513E6302638DB21A5C686D6 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				56AEA368E9F13473089B05F5EAE7A825 /* Carbon.framework in Frameworks */,
-				DD0EEB8EAB4A9A1E023085029415C0A1 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		08BB01761EC8C516100E7E0A97EDD3DC /* Pods-quark-shell */ = {
-			isa = PBXGroup;
-			children = (
-				993B0D66EA64986DFD0D9C00FB336F25 /* Pods-quark-shell-acknowledgements.markdown */,
-				E1AB417A0D9ED7F2CD63090377DB9040 /* Pods-quark-shell-acknowledgements.plist */,
-				CE3D10FB529AFDCD1205F7331B34E6F2 /* Pods-quark-shell-dummy.m */,
-				A4513538D92EB56F1358ADF52369E2FE /* Pods-quark-shell-frameworks.sh */,
-				8372FB2D7342DA57AF4C9CAC82D0D281 /* Pods-quark-shell-resources.sh */,
-				CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */,
-				2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */,
-			);
-			name = "Pods-quark-shell";
-			path = "Target Support Files/Pods-quark-shell";
-			sourceTree = "<group>";
-		};
-		14407E388F5CF5B72358DFD27AC8D970 /* Sparkle */ = {
-			isa = PBXGroup;
-			children = (
-				CC6A7ED911C6EAC2FBE75BCF5C203AC2 /* Frameworks */,
-			);
-			path = Sparkle;
-			sourceTree = "<group>";
-		};
-		329F045FAE67A7F73A6FEE768CB5E209 /* StartAtLoginController */ = {
-			isa = PBXGroup;
-			children = (
-				465207E5125E23BDB4A965CD073DB71E /* StartAtLoginController.h */,
-				A76E4AF78CF97D0BF8438CACF0C4E1A1 /* StartAtLoginController.m */,
-				FB8D3CCD4FA92C14BFC348627E7C9C04 /* Support Files */,
-			);
-			path = StartAtLoginController;
-			sourceTree = "<group>";
-		};
-		344B6258D5AD934EADD72E7771F640F3 /* Pods */ = {
-			isa = PBXGroup;
-			children = (
-				590C195643EF65A29D8E1FD206BF40F1 /* ISO8601DateFormatter */,
-				4A77AC04034A5504019ECD18BA4B8EA0 /* MASShortcut */,
-				DB3BF09A82C2C615B20149388337F474 /* RHPreferences */,
-				14407E388F5CF5B72358DFD27AC8D970 /* Sparkle */,
-				329F045FAE67A7F73A6FEE768CB5E209 /* StartAtLoginController */,
-				7A99B3504D105AC6B4A58AEB7F17EDBC /* WebViewJavascriptBridge */,
-			);
-			name = Pods;
-			sourceTree = "<group>";
-		};
-		4A77AC04034A5504019ECD18BA4B8EA0 /* MASShortcut */ = {
-			isa = PBXGroup;
-			children = (
-				92FE9B5CECFA9116E0DB46521B837ADB /* MASShortcut.h */,
-				F91491A111610B48448F4AF5177E2669 /* MASShortcut.m */,
-				8260AB09548C7B767D834256728FEF24 /* MASShortcut+Monitoring.h */,
-				31EECE0BAC969B523E4B15567C38CD92 /* MASShortcut+Monitoring.m */,
-				0C4910D76599CA33A8E103813C517669 /* MASShortcut+UserDefaults.h */,
-				EA924CB679EB72EF9B05B4B02B259D06 /* MASShortcut+UserDefaults.m */,
-				BA78B6E7BFE4D1CFE3849A6CEC37020A /* MASShortcutView.h */,
-				70A7AF6C657223298378356780081E78 /* MASShortcutView.m */,
-				D5F2603CBED6E042EA1EEC535C0538CB /* MASShortcutView+UserDefaults.h */,
-				61ABA89766E41A73D7F66D9F8C0E8FD1 /* MASShortcutView+UserDefaults.m */,
-				F950E3F86D7FBBA9DF5B2079A7FF5AEE /* Support Files */,
-			);
-			path = MASShortcut;
-			sourceTree = "<group>";
-		};
-		590C195643EF65A29D8E1FD206BF40F1 /* ISO8601DateFormatter */ = {
-			isa = PBXGroup;
-			children = (
-				59C4C56766505BC4A25FD8CC23C7202A /* ISO8601DateFormatter.h */,
-				F2D66B9C708CAA385619799BF1D0253D /* ISO8601DateFormatter.m */,
-				7223518E207BCE09F21BAD97C2FE2561 /* Support Files */,
-			);
-			path = ISO8601DateFormatter;
-			sourceTree = "<group>";
-		};
-		5CB80EE500CF0EDE6374242CE620E981 /* OS X */ = {
-			isa = PBXGroup;
-			children = (
-				526D6C3C02EB4788E4B75847F36C3249 /* Carbon.framework */,
-				36418C26F2F6280876C9CCC52A791794 /* Cocoa.framework */,
-				27B0D755CFCC02EA4DE7C773CB29DBFA /* ServiceManagement.framework */,
-				7B78F34599DDABD2B763C16DA06F3E96 /* WebKit.framework */,
-			);
-			name = "OS X";
-			sourceTree = "<group>";
-		};
-		6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */,
-				65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */,
-				B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */,
-				F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */,
-				DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */,
-				F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		7223518E207BCE09F21BAD97C2FE2561 /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */,
-				E71BBC0A8600C493C852274D547695F6 /* ISO8601DateFormatter-dummy.m */,
-				88C13C090AB0AB273FEB9989262B6888 /* ISO8601DateFormatter-prefix.pch */,
-			);
-			name = "Support Files";
-			path = "../Target Support Files/ISO8601DateFormatter";
-			sourceTree = "<group>";
-		};
-		7A99B3504D105AC6B4A58AEB7F17EDBC /* WebViewJavascriptBridge */ = {
-			isa = PBXGroup;
-			children = (
-				CE388EFBBA1A1A116DC365B9C06B9BEB /* WebViewJavascriptBridge.h */,
-				797E0B48091B03BB96540EA68035E02E /* WebViewJavascriptBridge.m */,
-				62855D7F5FC8A072F20AFE2D31F05B3A /* WebViewJavascriptBridge_JS.h */,
-				4A0A92A23A7D2292D27F92A227CB3DB3 /* WebViewJavascriptBridge_JS.m */,
-				C0EEBF6207B8074541F1C1B2A4164E89 /* WebViewJavascriptBridgeBase.h */,
-				17934FB706FAB46BDC6C2A0D65D6C8A7 /* WebViewJavascriptBridgeBase.m */,
-				E1A39861D356C475975CC7D2C94E3CF2 /* WKWebViewJavascriptBridge.h */,
-				AA868B4DDDA0D8BAB4D5F241CD2DA355 /* WKWebViewJavascriptBridge.m */,
-				F5BADD0B257928349B9478EECD5FBA25 /* Support Files */,
-			);
-			path = WebViewJavascriptBridge;
-			sourceTree = "<group>";
-		};
-		7DB346D0F39D3F0E887471402A8071AB = {
-			isa = PBXGroup;
-			children = (
-				93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
-				CD75D5B60FCA72FBF7F9C770460B2C26 /* Frameworks */,
-				344B6258D5AD934EADD72E7771F640F3 /* Pods */,
-				6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */,
-				F36B0C1FC55104B0B11431840A55DC9C /* Targets Support Files */,
-			);
-			sourceTree = "<group>";
-		};
-		84561B48C7A29789A9DD0046B9C2F59C /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */,
-				942BF9F667B18BDB43C5A40F98F34B97 /* RHPreferences-dummy.m */,
-				EAC3DE54D1B6A835C1B78FBD3DCE4921 /* RHPreferences-prefix.pch */,
-			);
-			name = "Support Files";
-			path = "../Target Support Files/RHPreferences";
-			sourceTree = "<group>";
-		};
-		CC6A7ED911C6EAC2FBE75BCF5C203AC2 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				09E02674DBDFC9AA28B038BF782FEB54 /* Sparkle.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		CD75D5B60FCA72FBF7F9C770460B2C26 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				5CB80EE500CF0EDE6374242CE620E981 /* OS X */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		D6C4EA75204A53000BFC8993CA08BD2D /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-				A3CA658717B68A3765D3B5D34E448CB3 /* RHPreferencesWindow.xib */,
-			);
-			name = Resources;
-			sourceTree = "<group>";
-		};
-		DB3BF09A82C2C615B20149388337F474 /* RHPreferences */ = {
-			isa = PBXGroup;
-			children = (
-				053E5389CD56C7D4DFE66D7FE08ADAD8 /* RHPreferences.h */,
-				EB414E30123D832B73E7D8EEDD3E8837 /* RHPreferencesWindowController.h */,
-				0E379D94F1C3836AC97712346A2A8B41 /* RHPreferencesWindowController.m */,
-				D6C4EA75204A53000BFC8993CA08BD2D /* Resources */,
-				84561B48C7A29789A9DD0046B9C2F59C /* Support Files */,
-			);
-			path = RHPreferences;
-			sourceTree = "<group>";
-		};
-		F36B0C1FC55104B0B11431840A55DC9C /* Targets Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				08BB01761EC8C516100E7E0A97EDD3DC /* Pods-quark-shell */,
-			);
-			name = "Targets Support Files";
-			sourceTree = "<group>";
-		};
-		F5BADD0B257928349B9478EECD5FBA25 /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */,
-				4B85BA861E7124BF4B561B7A2397D185 /* WebViewJavascriptBridge-dummy.m */,
-				CF383F1A79400C257CBFA7A67E41350E /* WebViewJavascriptBridge-prefix.pch */,
-			);
-			name = "Support Files";
-			path = "../Target Support Files/WebViewJavascriptBridge";
-			sourceTree = "<group>";
-		};
-		F950E3F86D7FBBA9DF5B2079A7FF5AEE /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */,
-				2BC4E343E37D6A6B63895A13B3BA3210 /* MASShortcut-dummy.m */,
-				2826BE8CC1C37F0682A11D91B0430AE4 /* MASShortcut-prefix.pch */,
-			);
-			name = "Support Files";
-			path = "../Target Support Files/MASShortcut";
-			sourceTree = "<group>";
-		};
-		FB8D3CCD4FA92C14BFC348627E7C9C04 /* Support Files */ = {
-			isa = PBXGroup;
-			children = (
-				0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */,
-				91194AD686552CD08FA247646B332F0B /* StartAtLoginController-dummy.m */,
-				0ECC539C94F019D36E29CAAB646D7043 /* StartAtLoginController-prefix.pch */,
-			);
-			name = "Support Files";
-			path = "../Target Support Files/StartAtLoginController";
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		40ED6FADF4979BE4546095303CC0C557 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				49DB848489A454335772EC4AC3EF19BA /* WebViewJavascriptBridge.h in Headers */,
-				82BE347936BA909D1229180A62C4EBAC /* WebViewJavascriptBridge_JS.h in Headers */,
-				F1A4C183D414DAE35772059E4648E791 /* WebViewJavascriptBridgeBase.h in Headers */,
-				284F97193D8DFC30B5E09A2467AFF859 /* WKWebViewJavascriptBridge.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		6BB9D8BFA1AAA5DEEC897DAA57CF4BFF /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				490170C7B684819125C5D0B3144C48F0 /* MASShortcut+Monitoring.h in Headers */,
-				6AB607BAAEFBD78D8046E0AB769DF50E /* MASShortcut+UserDefaults.h in Headers */,
-				099FF02F91C103E7EB9FEAA95FDA1865 /* MASShortcut.h in Headers */,
-				307AF494C44C3B03D41BF53A17F90FAC /* MASShortcutView+UserDefaults.h in Headers */,
-				392DC00755985E727BBBDF305B22919B /* MASShortcutView.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		8424D30A2480DA224EDEF8FCF45BEBEA /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				EEC7D7F9F45667B8854AF12F610EE2BE /* ISO8601DateFormatter.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CCD4AB1E0729E9301411F45B5600A590 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1630DC1951EF4F01F9BF7C92277713E0 /* RHPreferences.h in Headers */,
-				F82D2728A0328942861AF97EE663389F /* RHPreferencesWindowController.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CD3AE719FDE0C490646CA3E416EA720E /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				3B68CC68BCD794BEB3D9BF1AEC46E491 /* StartAtLoginController.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
-		2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 9486CFB1B75A4A77405085F9BCC95C09 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */;
-			buildPhases = (
-				CAABD3BD4EC6F77064E2D595609FCA85 /* Sources */,
-				4D8BB006D1CA179BB186E782687AA0F9 /* Frameworks */,
-				40ED6FADF4979BE4546095303CC0C557 /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = WebViewJavascriptBridge;
-			productName = WebViewJavascriptBridge;
-			productReference = F80D88A4642E370B65B7348070ED9425 /* libWebViewJavascriptBridge.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 38809F9F9BB800C6E5FA6E2822BB8F7A /* Build configuration list for PBXNativeTarget "MASShortcut" */;
-			buildPhases = (
-				6DE104C7FFAE03B0BEACB2DD219D4E92 /* Sources */,
-				8A69F45CECAACEDAADE454C855A28BC1 /* Frameworks */,
-				6BB9D8BFA1AAA5DEEC897DAA57CF4BFF /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = MASShortcut;
-			productName = MASShortcut;
-			productReference = 65E6B1F683E96B063813B6ADB25E5F58 /* libMASShortcut.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 6BE723EBBD599DAAC6F54AE696E7C154 /* Build configuration list for PBXNativeTarget "ISO8601DateFormatter" */;
-			buildPhases = (
-				146531E9FE32904454800D77ED369E22 /* Sources */,
-				820E7F281D04108C63DB266C51AB64E4 /* Frameworks */,
-				8424D30A2480DA224EDEF8FCF45BEBEA /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = ISO8601DateFormatter;
-			productName = ISO8601DateFormatter;
-			productReference = 855B12943ECD6177AAD36396C30528D4 /* libISO8601DateFormatter.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		BA8C63DC1F2001BD8FCF3128DD015C9F /* Pods-quark-shell */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 0B3E5210C2872F358BB1D26E957AABB9 /* Build configuration list for PBXNativeTarget "Pods-quark-shell" */;
-			buildPhases = (
-				D052FC7286ED4290D70B2D99A00F8F6F /* Sources */,
-				32DC1C17E8FFE5DE9CDC1128799AD387 /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				5D0ECE9F485900871CCE03FAE3DB1C7B /* PBXTargetDependency */,
-				01A187221F343BBEFE49E284B9246A5D /* PBXTargetDependency */,
-				8E63B7398A2E57BA05A31E3D6E2F683B /* PBXTargetDependency */,
-				CE8B0C5DCA326E0E8CB5C02157C0B3DB /* PBXTargetDependency */,
-				88DBD7B98B71B0981EC3AC27C3D6AA8B /* PBXTargetDependency */,
-			);
-			name = "Pods-quark-shell";
-			productName = "Pods-quark-shell";
-			productReference = B2DFBF081DFDF0E45DD7520C07ECD2C9 /* libPods-quark-shell.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 396EAD206E44264AB2C49AADC3BB03E1 /* Build configuration list for PBXNativeTarget "RHPreferences" */;
-			buildPhases = (
-				440068E9D7AB2112EFCB47706FA0BE66 /* Sources */,
-				3D2ECDD8D4B24F7B4821BED3BBCEE1C1 /* Frameworks */,
-				CCD4AB1E0729E9301411F45B5600A590 /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = RHPreferences;
-			productName = RHPreferences;
-			productReference = F5E95E6322999FBD6C7FF12EBA7F421C /* libRHPreferences.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 497F04E1E9A28CD279FD0F9C0BE2234C /* Build configuration list for PBXNativeTarget "StartAtLoginController" */;
-			buildPhases = (
-				A9EB347B62BC2FB5887F32D706C63B1B /* Sources */,
-				0529A2EAFF13066EC933C13943C180FD /* Frameworks */,
-				CD3AE719FDE0C490646CA3E416EA720E /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = StartAtLoginController;
-			productName = StartAtLoginController;
-			productReference = DCEA2E8AEC343781583BD22506B4B438 /* libStartAtLoginController.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		D41D8CD98F00B204E9800998ECF8427E /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastSwiftUpdateCheck = 0730;
-				LastUpgradeCheck = 0700;
-			};
-			buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-			);
-			mainGroup = 7DB346D0F39D3F0E887471402A8071AB;
-			productRefGroup = 6F4BFBF5D79E56F1CF94B89FB59CDA25 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */,
-				6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */,
-				BA8C63DC1F2001BD8FCF3128DD015C9F /* Pods-quark-shell */,
-				BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */,
-				ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */,
-				2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
-		146531E9FE32904454800D77ED369E22 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				E0F6FD1E10963EA7F454D00BD33AF147 /* ISO8601DateFormatter-dummy.m in Sources */,
-				06DEF87B3F74B3BDD497AA1B58A591E8 /* ISO8601DateFormatter.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		440068E9D7AB2112EFCB47706FA0BE66 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				C2BCC6D89C731E05A6FA021E273179EA /* RHPreferences-dummy.m in Sources */,
-				232A85F5668F85CC863EF7A9C5EB7806 /* RHPreferencesWindowController.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		6DE104C7FFAE03B0BEACB2DD219D4E92 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				D740839FCD6361E10AE5462DBEB4E153 /* MASShortcut+Monitoring.m in Sources */,
-				C3216A2D96E821D120FCA7B47FF38F22 /* MASShortcut+UserDefaults.m in Sources */,
-				516FEF3867EE0EB73955B1FCBB8D70AC /* MASShortcut-dummy.m in Sources */,
-				85E5DBEFB2B361BF802D4F83B0B9951D /* MASShortcut.m in Sources */,
-				590FD082B06F85831F48053F5279EDA0 /* MASShortcutView+UserDefaults.m in Sources */,
-				A4E8732161509BAB60525ED77EEECE71 /* MASShortcutView.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A9EB347B62BC2FB5887F32D706C63B1B /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				276BE92A73ACEBB6FBDB677C6DB79179 /* StartAtLoginController-dummy.m in Sources */,
-				A45C95308F93724650447321012F58BB /* StartAtLoginController.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		CAABD3BD4EC6F77064E2D595609FCA85 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				F86A1F1CA9ED89FE6D643CC25DC69E7A /* WebViewJavascriptBridge-dummy.m in Sources */,
-				53DD37407AB7C949F460B353EE4C79E7 /* WebViewJavascriptBridge.m in Sources */,
-				666474F683617399EC47ABAD21C5A5F1 /* WebViewJavascriptBridge_JS.m in Sources */,
-				E72C2B0472108257A1C54E33F0C3EC2B /* WebViewJavascriptBridgeBase.m in Sources */,
-				C0DE2E1FC64474C7900800AF86F5B10D /* WKWebViewJavascriptBridge.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		D052FC7286ED4290D70B2D99A00F8F6F /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				D7137E57D11E0B725F2A937A90EA74C2 /* Pods-quark-shell-dummy.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		01A187221F343BBEFE49E284B9246A5D /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = MASShortcut;
-			target = 6C863F6C9AB214C752194D5A06B943DB /* MASShortcut */;
-			targetProxy = E5029213AEB8EB44231F50DB086BE4A6 /* PBXContainerItemProxy */;
-		};
-		5D0ECE9F485900871CCE03FAE3DB1C7B /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = ISO8601DateFormatter;
-			target = B0267AE73E97C7576F08F4911FEFECD5 /* ISO8601DateFormatter */;
-			targetProxy = 3315DBE637FA220512EC80759AFB781F /* PBXContainerItemProxy */;
-		};
-		88DBD7B98B71B0981EC3AC27C3D6AA8B /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = WebViewJavascriptBridge;
-			target = 2CD3F2A4EA1E4AECB9A7744A7B612941 /* WebViewJavascriptBridge */;
-			targetProxy = 6552E1E9853B96752F3DCB1E4F19E677 /* PBXContainerItemProxy */;
-		};
-		8E63B7398A2E57BA05A31E3D6E2F683B /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = RHPreferences;
-			target = BC33E7E7C814AFB79D6412EEA7DA84E7 /* RHPreferences */;
-			targetProxy = 717016437144947F49EB30A76215EA5C /* PBXContainerItemProxy */;
-		};
-		CE8B0C5DCA326E0E8CB5C02157C0B3DB /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = StartAtLoginController;
-			target = ECCCB42E94B9425098451F868F013C54 /* StartAtLoginController */;
-			targetProxy = 39AADAFB0E68C57FD4FE32D74F2C489E /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
-		0D485120B673120F54038788B9D91341 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		0EC07801F64DA50C03421F488457C4FE /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 06655C46DF60D81A607D9C319CB03414 /* MASShortcut.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		12047A998462735DDFBA995939FE9FD6 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		16828ADA0E97068F98FE7635747FB7C3 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.7;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		25E8E116DC81A93C31F970334E477AC7 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 3DE993D1FB22DC067F802946DCCCB38E /* ISO8601DateFormatter.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.7;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		26B105CEE0A4139ADD853CCAC28846D1 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 2991B0A7300A5A4D98212F121100539E /* Pods-quark-shell.release.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				MACH_O_TYPE = staticlib;
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PODS_ROOT = "$(SRCROOT)";
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				SDKROOT = macosx;
-				SKIP_INSTALL = YES;
-			};
-			name = Release;
-		};
-		3527ACD78F78C1C7EBD99A82A285520F /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		4ECF5F3A7DCBE32E59B23B0C7F362504 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGNING_REQUIRED = NO;
-				COPY_PHASE_STRIP = YES;
-				ENABLE_NS_ASSERTIONS = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"POD_CONFIGURATION_RELEASE=1",
-					"$(inherited)",
-				);
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
-				STRIP_INSTALLED_PRODUCT = NO;
-				SYMROOT = "${SRCROOT}/../build";
-				VALIDATE_PRODUCT = YES;
-			};
-			name = Release;
-		};
-		5DC599EC8FEE1F00CFEC41A607D13085 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = CF1B8BBF96F6BEC33AF5E9C00AAA9624 /* Pods-quark-shell.debug.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				MACH_O_TYPE = staticlib;
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PODS_ROOT = "$(SRCROOT)";
-				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				SDKROOT = macosx;
-				SKIP_INSTALL = YES;
-			};
-			name = Debug;
-		};
-		A07B54679CB1271836F6DD61D8B92434 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 53C34A215B9CAF7E9CBA278272FF3748 /* RHPreferences.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/RHPreferences/RHPreferences-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		C269F16C69C874215FB299057455A930 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGNING_REQUIRED = NO;
-				COPY_PHASE_STRIP = NO;
-				ENABLE_TESTABILITY = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"POD_CONFIGURATION_DEBUG=1",
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.9;
-				ONLY_ACTIVE_ARCH = YES;
-				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
-				STRIP_INSTALLED_PRODUCT = NO;
-				SYMROOT = "${SRCROOT}/../build";
-			};
-			name = Debug;
-		};
-		C5DE1599F06F07CDAE96F08D5054107A /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = "";
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		E03FE4273D4C4D1542A355B2CDC3A5A4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 0C74DDA12621AC8E51DD1FFC47D0E966 /* StartAtLoginController.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		F273CF5E4C5DA08522DE9668C2B0CA7A /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 7B7DF90B4C9945A116C1EBD16C847868 /* WebViewJavascriptBridge.xcconfig */;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
-				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				EXECUTABLE_PREFIX = lib;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch";
-				MACOSX_DEPLOYMENT_TARGET = "";
-				MTL_ENABLE_DEBUG_INFO = YES;
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOLFLAGS = "";
-				PRIVATE_HEADERS_FOLDER_PATH = "";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				PUBLIC_HEADERS_FOLDER_PATH = "";
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		0B3E5210C2872F358BB1D26E957AABB9 /* Build configuration list for PBXNativeTarget "Pods-quark-shell" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				5DC599EC8FEE1F00CFEC41A607D13085 /* Debug */,
-				26B105CEE0A4139ADD853CCAC28846D1 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				C269F16C69C874215FB299057455A930 /* Debug */,
-				4ECF5F3A7DCBE32E59B23B0C7F362504 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		38809F9F9BB800C6E5FA6E2822BB8F7A /* Build configuration list for PBXNativeTarget "MASShortcut" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				0EC07801F64DA50C03421F488457C4FE /* Debug */,
-				0D485120B673120F54038788B9D91341 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		396EAD206E44264AB2C49AADC3BB03E1 /* Build configuration list for PBXNativeTarget "RHPreferences" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				12047A998462735DDFBA995939FE9FD6 /* Debug */,
-				A07B54679CB1271836F6DD61D8B92434 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		497F04E1E9A28CD279FD0F9C0BE2234C /* Build configuration list for PBXNativeTarget "StartAtLoginController" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				3527ACD78F78C1C7EBD99A82A285520F /* Debug */,
-				E03FE4273D4C4D1542A355B2CDC3A5A4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		6BE723EBBD599DAAC6F54AE696E7C154 /* Build configuration list for PBXNativeTarget "ISO8601DateFormatter" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				25E8E116DC81A93C31F970334E477AC7 /* Debug */,
-				16828ADA0E97068F98FE7635747FB7C3 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		9486CFB1B75A4A77405085F9BCC95C09 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				F273CF5E4C5DA08522DE9668C2B0CA7A /* Debug */,
-				C5DE1599F06F07CDAE96F08D5054107A /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
-}
diff --git a/Pods/RHPreferences/LICENSE b/Pods/RHPreferences/LICENSE
deleted file mode 100644
index 356d7d2..0000000
--- a/Pods/RHPreferences/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-RHPreferences
-
-Copyright (c) 2012 Richard Heard. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Pods/RHPreferences/README.md b/Pods/RHPreferences/README.md
deleted file mode 100644
index 78f7ff6..0000000
--- a/Pods/RHPreferences/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-## RHPreferences
-An OS X Window Controller that makes it easy to provide a standard Preferences window with multiple tabs in your application.
-
-It also provides:
-* Auto resizing between different sized tab views (With animation)
-* Custom NSToolbarItem support
-* Persistance of the last used tab
-* Support for placeholder NSToolbarItems (eg NSToolbarFlexibleSpaceItemIdentifier & NSToolbarShowFontsItemIdentifier)
-
-![Example Preferences Window.](https://github.com/heardrwt/RHPreferences/raw/master/Preferences.png )
-
-
-## RHPreferencesWindowController Interface
-<pre>
-
-@interface RHPreferencesWindowController : NSWindowController <NSToolbarDelegate>
-
-//init
--(id)initWithViewControllers:(NSArray*)controllers;
--(id)initWithViewControllers:(NSArray*)controllers andTitle:(NSString*)title;
-
-//properties
-@property (copy) NSString *windowTitle;
-@property (assign) BOOL windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController; //defaults to YES
-
-@property (retain) IBOutlet NSToolbar *toolbar;
-@property (retain) IBOutlet NSArray *viewControllers; //controllers should implement RHPreferencesViewControllerProtocol
-
-@property (assign) NSUInteger selectedIndex;
-@property (assign) NSViewController <RHPreferencesViewControllerProtocol> *selectedViewController;
-
--(NSViewController <RHPreferencesViewControllerProtocol>*)viewControllerWithIdentifier:(NSString*)identifier;
-
-//you can include these placeholder controllers amongst your array of view controllers to show their respective items in the toolbar
-+(id)separatorPlaceholderController;        // NSToolbarSeparatorItemIdentifier
-+(id)flexibleSpacePlaceholderController;    // NSToolbarFlexibleSpaceItemIdentifier
-+(id)spacePlaceholderController;            // NSToolbarSpaceItemIdentifier
-
-+(id)showColorsPlaceholderController;       // NSToolbarShowColorsItemIdentifier
-+(id)showFontsPlaceholderController;        // NSToolbarShowFontsItemIdentifier
-+(id)customizeToolbarPlaceholderController; // NSToolbarCustomizeToolbarItemIdentifier
-+(id)printPlaceholderController;            // NSToolbarPrintItemIdentifier
-
-@end
-
-</pre>
-
-## NSViewController Preferences Protocol
-<pre>
-
-// Implement this protocol on your view controller so that RHPreferencesWindow knows what to show in the tabbar. Label, image etc.
-@protocol RHPreferencesViewControllerProtocol <NSObject>
-@required
-
-@property (nonatomic, readonly, retain) NSString *identifier;
-@property (nonatomic, readonly, retain) NSImage *toolbarItemImage;
-@property (nonatomic, readonly, retain) NSString *toolbarItemLabel;
-
-@optional
-
-@property (nonatomic, readonly, retain) NSToolbarItem *toolbarItem; //optional, overrides the above 3 properties. allows for custom tabbar items.
-
-//methods called when switching between tabs
--(void)viewWillAppear;
--(void)viewDidAppear;
--(void)viewWillDisappear;
--(void)viewDidDisappear;
-
--(NSView*)initialKeyView;   // keyboard focus view on tab switch...
-
-@end
-
-</pre>
-
-## Licence
-Released under the Modified BSD License. 
-(Attribution Required)
-<pre>
-RHPreferences
-
-Copyright (c) 2012 Richard Heard. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</pre>
-
-
-### Version Support
-This Framework code compiles and has been tested on OS X 10.6 - 10.8
-
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferences-Prefix.pch b/Pods/RHPreferences/RHPreferences/RHPreferences-Prefix.pch
deleted file mode 100644
index f359359..0000000
--- a/Pods/RHPreferences/RHPreferences/RHPreferences-Prefix.pch
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Prefix header for all source files of the 'RHPreferences' target in the 'RHPreferences' project
-//
-
-#ifdef __OBJC__
-    #import <Cocoa/Cocoa.h>
-#endif
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferences.h b/Pods/RHPreferences/RHPreferences/RHPreferences.h
deleted file mode 100644
index 6587c77..0000000
--- a/Pods/RHPreferences/RHPreferences/RHPreferences.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-//  RHPreferences.h
-//  RHPreferences
-//
-//  Created by Richard Heard on 23/05/12.
-//  Copyright (c) 2012 Richard Heard. All rights reserved.
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions
-//  are met:
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//  derived from this software without specific prior written permission.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-//  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-//  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-//  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-#import <Foundation/Foundation.h>
-#import "RHPreferencesWindowController.h"
-
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferencesWindow.xib b/Pods/RHPreferences/RHPreferences/RHPreferencesWindow.xib
deleted file mode 100644
index 7a64664..0000000
--- a/Pods/RHPreferences/RHPreferences/RHPreferencesWindow.xib
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
-	<data>
-		<int key="IBDocument.SystemTarget">1060</int>
-		<string key="IBDocument.SystemVersion">11D50b</string>
-		<string key="IBDocument.InterfaceBuilderVersion">2182</string>
-		<string key="IBDocument.AppKitVersion">1138.32</string>
-		<string key="IBDocument.HIToolboxVersion">568.00</string>
-		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
-			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">2182</string>
-		</object>
-		<array key="IBDocument.IntegratedClassDependencies">
-			<string>NSToolbarFlexibleSpaceItem</string>
-			<string>NSWindowTemplate</string>
-			<string>NSView</string>
-			<string>NSToolbar</string>
-			<string>NSCustomObject</string>
-			<string>NSToolbarSpaceItem</string>
-		</array>
-		<array key="IBDocument.PluginDependencies">
-			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-		</array>
-		<object class="NSMutableDictionary" key="IBDocument.Metadata">
-			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
-			<integer value="1" key="NS.object.0"/>
-		</object>
-		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
-			<object class="NSCustomObject" id="1001">
-				<string key="NSClassName">RHPreferencesWindowController</string>
-			</object>
-			<object class="NSCustomObject" id="1003">
-				<string key="NSClassName">FirstResponder</string>
-			</object>
-			<object class="NSCustomObject" id="1004">
-				<string key="NSClassName">NSApplication</string>
-			</object>
-			<object class="NSWindowTemplate" id="1005">
-				<int key="NSWindowStyleMask">4099</int>
-				<int key="NSWindowBacking">2</int>
-				<string key="NSWindowRect">{{478, 490}, {480, 270}}</string>
-				<int key="NSWTFlags">544736256</int>
-				<string key="NSWindowTitle">Preferences</string>
-				<string key="NSWindowClass">NSWindow</string>
-				<object class="NSToolbar" key="NSViewClass" id="1042986138">
-					<object class="NSMutableString" key="NSToolbarIdentifier">
-						<characters key="NS.bytes">9B61CE83-FDFD-4E4C-ACCF-B7218A759A15</characters>
-					</object>
-					<nil key="NSToolbarDelegate"/>
-					<bool key="NSToolbarPrefersToBeShown">YES</bool>
-					<bool key="NSToolbarShowsBaselineSeparator">YES</bool>
-					<bool key="NSToolbarAllowsUserCustomization">NO</bool>
-					<bool key="NSToolbarAutosavesConfiguration">YES</bool>
-					<int key="NSToolbarDisplayMode">1</int>
-					<int key="NSToolbarSizeMode">1</int>
-					<dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
-						<object class="NSToolbarFlexibleSpaceItem" key="NSToolbarFlexibleSpaceItem" id="520603063">
-							<string key="NSToolbarItemIdentifier">NSToolbarFlexibleSpaceItem</string>
-							<string key="NSToolbarItemLabel"/>
-							<string key="NSToolbarItemPaletteLabel">Flexible Space</string>
-							<nil key="NSToolbarItemToolTip"/>
-							<nil key="NSToolbarItemView"/>
-							<nil key="NSToolbarItemImage"/>
-							<nil key="NSToolbarItemTarget"/>
-							<nil key="NSToolbarItemAction"/>
-							<string key="NSToolbarItemMinSize">{1, 5}</string>
-							<string key="NSToolbarItemMaxSize">{20000, 32}</string>
-							<bool key="NSToolbarItemEnabled">YES</bool>
-							<bool key="NSToolbarItemAutovalidates">YES</bool>
-							<int key="NSToolbarItemTag">-1</int>
-							<bool key="NSToolbarIsUserRemovable">YES</bool>
-							<int key="NSToolbarItemVisibilityPriority">0</int>
-							<object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
-								<bool key="NSIsDisabled">YES</bool>
-								<bool key="NSIsSeparator">YES</bool>
-								<string key="NSTitle"/>
-								<string key="NSKeyEquiv"/>
-								<int key="NSKeyEquivModMask">1048576</int>
-								<int key="NSMnemonicLoc">2147483647</int>
-								<object class="NSCustomResource" key="NSOnImage" id="40800764">
-									<string key="NSClassName">NSImage</string>
-									<string key="NSResourceName">NSMenuCheckmark</string>
-								</object>
-								<object class="NSCustomResource" key="NSMixedImage" id="747061447">
-									<string key="NSClassName">NSImage</string>
-									<string key="NSResourceName">NSMenuMixedState</string>
-								</object>
-							</object>
-						</object>
-						<object class="NSToolbarSpaceItem" key="NSToolbarSpaceItem" id="460930771">
-							<string key="NSToolbarItemIdentifier">NSToolbarSpaceItem</string>
-							<string key="NSToolbarItemLabel"/>
-							<string key="NSToolbarItemPaletteLabel">Space</string>
-							<nil key="NSToolbarItemToolTip"/>
-							<nil key="NSToolbarItemView"/>
-							<nil key="NSToolbarItemImage"/>
-							<nil key="NSToolbarItemTarget"/>
-							<nil key="NSToolbarItemAction"/>
-							<string key="NSToolbarItemMinSize">{32, 5}</string>
-							<string key="NSToolbarItemMaxSize">{32, 32}</string>
-							<bool key="NSToolbarItemEnabled">YES</bool>
-							<bool key="NSToolbarItemAutovalidates">YES</bool>
-							<int key="NSToolbarItemTag">-1</int>
-							<bool key="NSToolbarIsUserRemovable">YES</bool>
-							<int key="NSToolbarItemVisibilityPriority">0</int>
-							<object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
-								<bool key="NSIsDisabled">YES</bool>
-								<bool key="NSIsSeparator">YES</bool>
-								<string key="NSTitle"/>
-								<string key="NSKeyEquiv"/>
-								<int key="NSKeyEquivModMask">1048576</int>
-								<int key="NSMnemonicLoc">2147483647</int>
-								<reference key="NSOnImage" ref="40800764"/>
-								<reference key="NSMixedImage" ref="747061447"/>
-							</object>
-						</object>
-					</dictionary>
-					<array key="NSToolbarIBAllowedItems">
-						<reference ref="460930771"/>
-						<reference ref="520603063"/>
-					</array>
-					<array key="NSToolbarIBDefaultItems" id="0"/>
-					<reference key="NSToolbarIBSelectableItems" ref="0"/>
-				</object>
-				<nil key="NSUserInterfaceItemIdentifier"/>
-				<object class="NSView" key="NSWindowView" id="1006">
-					<reference key="NSNextResponder"/>
-					<int key="NSvFlags">256</int>
-					<string key="NSFrameSize">{480, 270}</string>
-					<reference key="NSSuperview"/>
-					<reference key="NSWindow"/>
-				</object>
-				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
-				<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
-				<bool key="NSWindowIsRestorable">NO</bool>
-			</object>
-		</array>
-		<object class="IBObjectContainer" key="IBDocument.Objects">
-			<array class="NSMutableArray" key="connectionRecords">
-				<object class="IBConnectionRecord">
-					<object class="IBOutletConnection" key="connection">
-						<string key="label">window</string>
-						<reference key="source" ref="1001"/>
-						<reference key="destination" ref="1005"/>
-					</object>
-					<int key="connectionID">3</int>
-				</object>
-				<object class="IBConnectionRecord">
-					<object class="IBOutletConnection" key="connection">
-						<string key="label">toolbar</string>
-						<reference key="source" ref="1001"/>
-						<reference key="destination" ref="1042986138"/>
-					</object>
-					<int key="connectionID">15</int>
-				</object>
-				<object class="IBConnectionRecord">
-					<object class="IBOutletConnection" key="connection">
-						<string key="label">delegate</string>
-						<reference key="source" ref="1005"/>
-						<reference key="destination" ref="1001"/>
-					</object>
-					<int key="connectionID">4</int>
-				</object>
-				<object class="IBConnectionRecord">
-					<object class="IBOutletConnection" key="connection">
-						<string key="label">delegate</string>
-						<reference key="source" ref="1042986138"/>
-						<reference key="destination" ref="1001"/>
-					</object>
-					<int key="connectionID">14</int>
-				</object>
-			</array>
-			<object class="IBMutableOrderedSet" key="objectRecords">
-				<array key="orderedObjects">
-					<object class="IBObjectRecord">
-						<int key="objectID">0</int>
-						<reference key="object" ref="0"/>
-						<reference key="children" ref="1000"/>
-						<nil key="parent"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">-2</int>
-						<reference key="object" ref="1001"/>
-						<reference key="parent" ref="0"/>
-						<string key="objectName">File's Owner</string>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">-1</int>
-						<reference key="object" ref="1003"/>
-						<reference key="parent" ref="0"/>
-						<string key="objectName">First Responder</string>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">-3</int>
-						<reference key="object" ref="1004"/>
-						<reference key="parent" ref="0"/>
-						<string key="objectName">Application</string>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">1</int>
-						<reference key="object" ref="1005"/>
-						<array class="NSMutableArray" key="children">
-							<reference ref="1006"/>
-							<reference ref="1042986138"/>
-						</array>
-						<reference key="parent" ref="0"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">2</int>
-						<reference key="object" ref="1006"/>
-						<array class="NSMutableArray" key="children"/>
-						<reference key="parent" ref="1005"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">5</int>
-						<reference key="object" ref="1042986138"/>
-						<array class="NSMutableArray" key="children">
-							<reference ref="460930771"/>
-							<reference ref="520603063"/>
-						</array>
-						<reference key="parent" ref="1005"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">6</int>
-						<reference key="object" ref="460930771"/>
-						<reference key="parent" ref="1042986138"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">9</int>
-						<reference key="object" ref="520603063"/>
-						<reference key="parent" ref="1042986138"/>
-					</object>
-				</array>
-			</object>
-			<dictionary class="NSMutableDictionary" key="flattenedProperties">
-				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<boolean value="YES" key="1.IBNSWindowAutoPositionCentersHorizontal"/>
-				<boolean value="NO" key="1.IBNSWindowAutoPositionCentersVertical"/>
-				<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="1.IBWindowTemplateEditedContentRect">{{357, 418}, {480, 270}}</string>
-				<boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/>
-				<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			</dictionary>
-			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
-			<nil key="activeLocalization"/>
-			<dictionary class="NSMutableDictionary" key="localizations"/>
-			<nil key="sourceID"/>
-			<int key="maxID">18</int>
-		</object>
-		<object class="IBClassDescriber" key="IBDocument.Classes">
-			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
-				<object class="IBPartialClassDescription">
-					<string key="className">RHPreferencesWindowController</string>
-					<string key="superclassName">NSWindowController</string>
-					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">selectToolbarItem:</string>
-						<string key="NS.object.0">NSToolbarItem</string>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">selectToolbarItem:</string>
-						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">selectToolbarItem:</string>
-							<string key="candidateClassName">NSToolbarItem</string>
-						</object>
-					</object>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="toolbar">NSToolbar</string>
-						<string key="viewControllers">NSArray</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="toolbar">
-							<string key="name">toolbar</string>
-							<string key="candidateClassName">NSToolbar</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="viewControllers">
-							<string key="name">viewControllers</string>
-							<string key="candidateClassName">NSArray</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">./Classes/RHPreferencesWindowController.h</string>
-					</object>
-				</object>
-			</array>
-		</object>
-		<int key="IBDocument.localizationMode">0</int>
-		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
-		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
-			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
-			<real value="1060" key="NS.object.0"/>
-		</object>
-		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
-		<int key="IBDocument.defaultPropertyAccessControl">3</int>
-		<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
-			<string key="NSMenuCheckmark">{11, 11}</string>
-			<string key="NSMenuMixedState">{10, 3}</string>
-		</dictionary>
-	</data>
-</archive>
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.h b/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.h
deleted file mode 100644
index 4532215..0000000
--- a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.h
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-//  RHPreferencesWindowController.h
-//  RHPreferences
-//
-//  Created by Richard Heard on 10/04/12.
-//  Copyright (c) 2012 Richard Heard. All rights reserved.
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions
-//  are met:
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//  derived from this software without specific prior written permission.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-//  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-//  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-//  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-#import <Cocoa/Cocoa.h>
-
-@protocol RHPreferencesViewControllerProtocol;
-
-@interface RHPreferencesWindowController : NSWindowController <NSToolbarDelegate>{
-
-    NSArray *_viewControllers;
-    NSToolbar *_toolbar;
-    NSArray *_toolbarItems;
-    
-    NSViewController<RHPreferencesViewControllerProtocol> *_selectedViewController;
-    NSString *_unloadedWindowTitle;
-    BOOL _windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController;
-
-}
-
-//init
--(id)initWithViewControllers:(NSArray*)controllers;
--(id)initWithViewControllers:(NSArray*)controllers andTitle:(NSString*)title;
-
-//properties
-@property (copy) NSString *windowTitle;
-@property (assign) BOOL windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController; //defaults to YES
-
-@property (retain) IBOutlet NSToolbar *toolbar;
-@property (retain) IBOutlet NSArray *viewControllers; //controllers should implement RHPreferencesViewControllerProtocol
-
-@property (assign) NSUInteger selectedIndex;
-@property (assign) NSViewController <RHPreferencesViewControllerProtocol> *selectedViewController;
-
--(NSViewController <RHPreferencesViewControllerProtocol>*)viewControllerWithIdentifier:(NSString*)identifier;
-
-//you can include these placeholder controllers amongst your array of view controllers to show their respective items in the toolbar
-+(id)separatorPlaceholderController;        // NSToolbarSeparatorItemIdentifier
-+(id)flexibleSpacePlaceholderController;    // NSToolbarFlexibleSpaceItemIdentifier
-+(id)spacePlaceholderController;            // NSToolbarSpaceItemIdentifier
-
-+(id)showColorsPlaceholderController;       // NSToolbarShowColorsItemIdentifier
-+(id)showFontsPlaceholderController;        // NSToolbarShowFontsItemIdentifier
-+(id)customizeToolbarPlaceholderController; // NSToolbarCustomizeToolbarItemIdentifier
-+(id)printPlaceholderController;            // NSToolbarPrintItemIdentifier
-
-@end
-
-
-
-// Implement this protocol on your view controller so that RHPreferencesWindow knows what to show in the tabbar. Label, image etc.
-@protocol RHPreferencesViewControllerProtocol <NSObject>
-@required
-
-@property (nonatomic, readonly, retain) NSString *identifier;
-@property (nonatomic, readonly, retain) NSImage *toolbarItemImage;
-@property (nonatomic, readonly, retain) NSString *toolbarItemLabel;
-
-@optional
-
-@property (nonatomic, readonly, retain) NSToolbarItem *toolbarItem; //optional, overrides the above 3 properties. allows for custom tabbar items.
-
-//methods called when switching between tabs
--(void)viewWillAppear;
--(void)viewDidAppear;
--(void)viewWillDisappear;
--(void)viewDidDisappear;
-
--(NSView*)initialKeyView;   // keyboard focus view on tab switch...
-
-@end
diff --git a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m b/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
deleted file mode 100644
index 29cb731..0000000
--- a/Pods/RHPreferences/RHPreferences/RHPreferencesWindowController.m
+++ /dev/null
@@ -1,487 +0,0 @@
-//
-//  RHPreferencesWindowController.m
-//  RHPreferences
-//
-//  Created by Richard Heard on 10/04/12.
-//  Copyright (c) 2012 Richard Heard. All rights reserved.
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions
-//  are met:
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//  derived from this software without specific prior written permission.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-//  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-//  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-//  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-#import "RHPreferencesWindowController.h"
-
-static NSString * const RHPreferencesWindowControllerSelectedItemIdentifier = @"RHPreferencesWindowControllerSelectedItemIdentifier";
-static const CGFloat RHPreferencesWindowControllerResizeAnimationDurationPer100Pixels = 0.13f;
-
-#pragma mark - Custom Item Placeholder Controller
-@interface RHPreferencesCustomPlaceholderController : NSObject <RHPreferencesViewControllerProtocol> {
-    NSString *_identifier;
-}
-+(id)controllerWithIdentifier:(NSString*)identifier;
-@property (readwrite, nonatomic, retain) NSString *identifier;
-@end
-
-@implementation RHPreferencesCustomPlaceholderController
-@synthesize identifier=_identifier;
-+(id)controllerWithIdentifier:(NSString*)identifier{
-    RHPreferencesCustomPlaceholderController * placeholder = [[[RHPreferencesCustomPlaceholderController alloc] init] autorelease];
-    placeholder.identifier = identifier;
-    return placeholder;
-}
--(NSToolbarItem*)toolbarItem{
-    NSToolbarItem *item = [[[NSToolbarItem alloc] initWithItemIdentifier:_identifier] autorelease];
-    return item;
-}
--(NSString*)identifier{
-    return _identifier;
-}
--(NSImage*)toolbarItemImage{
-    return nil;
-}
--(NSString*)toolbarItemLabel{
-    return nil;
-}
-@end
-
-
-#pragma mark - RHPreferencesWindowController
-
-@interface RHPreferencesWindowController ()
-
-//items
--(NSToolbarItem*)toolbarItemWithItemIdentifier:(NSString*)identifier;
--(NSToolbarItem*)newToolbarItemForViewController:(NSViewController<RHPreferencesViewControllerProtocol>*)controller;
--(void)reloadToolbarItems;
--(IBAction)selectToolbarItem:(NSToolbarItem*)itemToBeSelected;
--(NSArray*)toolbarItemIdentifiers;
-
-//NSWindowController methods
--(void)resizeWindowForContentSize:(NSSize)size duration:(CGFloat)duration;
-
-@end
-
-@implementation RHPreferencesWindowController 
-
-@synthesize toolbar=_toolbar;
-@synthesize viewControllers=_viewControllers;
-@synthesize windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController=_windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController;
-
-#pragma mark - setup
--(id)initWithViewControllers:(NSArray*)controllers {
-    return [self initWithViewControllers:controllers andTitle:nil];
-}
-
--(id)initWithViewControllers:(NSArray*)controllers andTitle:(NSString*)title{
-    self = [super initWithWindowNibName:@"RHPreferencesWindow"];
-    if (self){
-        
-        //default settings
-        _windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController = YES;
-
-        //store the controllers
-        [self setViewControllers:controllers];
-        _unloadedWindowTitle = [title copy];
-        
-    }
-    
-    return self;
-}
-
-#pragma mark - properties
-
--(NSString*)windowTitle{
-    return [self isWindowLoaded] ? self.window.title : _unloadedWindowTitle;
-}
--(void)setWindowTitle:(NSString *)windowTitle{
-    if ([self isWindowLoaded]){
-        self.window.title = windowTitle;
-    } else {
-        [_unloadedWindowTitle release];
-        _unloadedWindowTitle = [windowTitle copy];
-    }
-}
-
--(NSArray*)viewControllers{
-    return [[_viewControllers retain] autorelease];
-}
-
--(void)setViewControllers:(NSArray *)viewControllers{
-    if (_viewControllers != viewControllers){
-        NSUInteger oldSelectedIndex = [self selectedIndex];
-        
-        [_viewControllers autorelease];
-        _viewControllers = [viewControllers retain];
-        
-        //update the selected controller if we had one previously.
-        if (_selectedViewController){
-            if ([_viewControllers containsObject:_selectedViewController]){
-                //cool, nothing to do
-            } else {
-                [self setSelectedIndex:oldSelectedIndex]; //reset the currently selected view controller
-            }
-        } else {
-            //initial launch state (need to select previously selected tab)
-            
-            //set the selected controller 
-            NSViewController *selectedController = [self viewControllerWithIdentifier:[[NSUserDefaults standardUserDefaults] stringForKey:RHPreferencesWindowControllerSelectedItemIdentifier]];
-            if (selectedController){
-                [self setSelectedViewController:(id)selectedController];
-            } else {
-                [self setSelectedIndex:0]; // unknown, default to zero. 
-            }
-
-        }
-
-        [self reloadToolbarItems];
-    }
-}
-
--(NSViewController<RHPreferencesViewControllerProtocol>*)selectedViewController{
-    return [[_selectedViewController retain] autorelease];
-}
-
--(void)setSelectedViewController:(NSViewController<RHPreferencesViewControllerProtocol> *)new{
-    //alias
-    NSViewController *old = _selectedViewController;
-
-    //stash
-    _selectedViewController = new; //weak because we retain it in our array
-
-    //stash to defaults also
-    [[NSUserDefaults standardUserDefaults] setObject:[self toolbarItemIdentifierForViewController:new] forKey:RHPreferencesWindowControllerSelectedItemIdentifier];
-    
-    //bail if not yet loaded
-    if (![self isWindowLoaded]){
-        return;
-    }    
-    
-    if (old != new){
-                
-        //notify the old vc that its going away
-        if ([old respondsToSelector:@selector(viewWillDisappear)]){
-            [(id)old viewWillDisappear];
-        }
-        
-        [old.view removeFromSuperview];
-        
-        if ([old respondsToSelector:@selector(viewDidDisappear)]){
-            [(id)old viewDidDisappear];
-        }
-        
-        //notify the new vc of its appearance
-        if ([new respondsToSelector:@selector(viewWillAppear)]){
-            [(id)new viewWillAppear];
-        }   
-                
-        //resize to Preferred window size for given view (duration is determined by difference between current and new sizes)
-        float hDifference = fabs(new.view.bounds.size.height - old.view.bounds.size.height);
-        float wDifference = fabs(new.view.bounds.size.width - old.view.bounds.size.width);
-        float difference = MAX(hDifference, wDifference);
-        float duration = MAX(RHPreferencesWindowControllerResizeAnimationDurationPer100Pixels * ( difference / 100), 0.10); // we always want a slight animation        
-        [self resizeWindowForContentSize:new.view.bounds.size duration:duration];
-
-        double delayInSeconds = duration + 0.02; // +.02 to give time for resize to finish before appearing
-        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
-        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
-
-            //make sure our "new" vc is still the selected vc before we add it as a subview, otherwise it's possible we could add more than one vc to the window. (the user has likely clicked to another tab during resizing.)
-            if (_selectedViewController == new){
-                [self.window.contentView addSubview:new.view];
-                
-                if ([new respondsToSelector:@selector(viewDidAppear)]){
-                    [(id)new viewDidAppear];
-                }
-
-                //if there is a initialKeyView set it as key
-                if ([new respondsToSelector:@selector(initialKeyView)]){
-                    [[new initialKeyView] becomeFirstResponder];
-                }
-            }
-        });
-        
-
-        [new.view setFrameOrigin:NSMakePoint(0, 0)]; // force our view to a 0,0 origin, fixed in the lower right corner.
-        [new.view setAutoresizingMask:NSViewMaxXMargin|NSViewMaxYMargin];
-        
-        //set the currently selected toolbar item
-        [_toolbar setSelectedItemIdentifier:[self toolbarItemIdentifierForViewController:new]];
-                
-        //if we should auto-update window title, do it now 
-        if (_windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController){
-            NSString *identifier = [self toolbarItemIdentifierForViewController:new];
-            NSString *title = [[self toolbarItemWithItemIdentifier:identifier] label];
-            if (title)[self setWindowTitle:title];
-        }
-    }
-}
-
--(NSUInteger)selectedIndex{
-    return [_viewControllers indexOfObject:[self selectedViewController]];
-}
-
--(void)setSelectedIndex:(NSUInteger)selectedIndex{
-    id newSelection = (selectedIndex >= [_viewControllers count]) ? [_viewControllers lastObject] : [_viewControllers objectAtIndex:selectedIndex];
-    [self setSelectedViewController:newSelection];
-}
-
--(NSViewController <RHPreferencesViewControllerProtocol>*)viewControllerWithIdentifier:(NSString*)identifier{
-    for (NSViewController <RHPreferencesViewControllerProtocol>* vc in _viewControllers){
-
-        //set the toolbar back to the current controllers selection
-        if ([vc respondsToSelector:@selector(toolbarItem)] && [[[vc toolbarItem] itemIdentifier] isEqualToString:identifier]){
-            return vc;
-        } 
-        
-        if ([[vc identifier] isEqualToString:identifier]){
-            return vc;
-        }
-    }    
-    return nil;
-}
-
-
-#pragma mark - View Controller Methods
-
--(void)resizeWindowForContentSize:(NSSize)size duration:(CGFloat)duration{
-    NSWindow *window = [self window];
-    
-    NSRect frame = [window contentRectForFrameRect:[window frame]];
-    
-    CGFloat newX = NSMinX(frame) + (0.5* (NSWidth(frame) - size.width));
-    NSRect newFrame = [window frameRectForContentRect:NSMakeRect(newX, NSMaxY(frame) - size.height, size.width, size.height)];
-    
-    if (duration > 0.0f){
-        [NSAnimationContext beginGrouping];
-        [[NSAnimationContext currentContext] setDuration:duration];
-            [[window animator] setFrame:newFrame display:YES];
-        [NSAnimationContext endGrouping];
-    } else {
-        [window setFrame:newFrame display:YES];
-    }
-
-}
-
-
-#pragma mark - Toolbar Items
-
--(NSToolbarItem*)toolbarItemWithItemIdentifier:(NSString*)identifier{
-    for (NSToolbarItem *item in _toolbarItems){
-        if ([[item itemIdentifier] isEqualToString:identifier]){
-            return item;
-        }
-    }    
-    return nil;
-}
-
--(NSString*)toolbarItemIdentifierForViewController:(NSViewController*)controller{
-    if ([controller respondsToSelector:@selector(toolbarItem)]){
-        NSToolbarItem *item = [(id)controller toolbarItem];
-        if (item){
-            return item.itemIdentifier;
-        }
-    }
-    
-    if ([controller respondsToSelector:@selector(identifier)]){
-        return [(id)controller identifier];
-    }
-    
-    return nil;
-}
-
-
--(NSToolbarItem*)newToolbarItemForViewController:(NSViewController<RHPreferencesViewControllerProtocol>*)controller{
-    //if the controller wants to provide a toolbar item, return that
-    if ([controller respondsToSelector:@selector(toolbarItem)]){
-        NSToolbarItem *item = [controller toolbarItem];
-        if (item){
-            item = [item copy]; //we copy the item because it needs to be unique for a specific toolbar
-            item.target = self;
-            item.action = @selector(selectToolbarItem:);
-            return item;
-        }
-    }
-
-    //otherwise, default to creation of a new item.
-    
-    NSToolbarItem *new = [[NSToolbarItem alloc] initWithItemIdentifier:controller.identifier];
-    new.image = controller.toolbarItemImage;
-    new.label = controller.toolbarItemLabel;
-    new.target = self;
-    new.action = @selector(selectToolbarItem:);    
-    return new;
-}
-
--(void)reloadToolbarItems{
-    NSMutableArray *newItems = [NSMutableArray arrayWithCapacity:[_viewControllers count]];
-    
-    for (NSViewController<RHPreferencesViewControllerProtocol>* vc in _viewControllers){
-
-        NSToolbarItem *insertItem = [self toolbarItemWithItemIdentifier:vc.identifier];
-        if (!insertItem){
-            //create a new one
-            insertItem = [[self newToolbarItemForViewController:vc] autorelease];
-        }
-        [newItems addObject:insertItem];
-    }
-    
-    [_toolbarItems release];
-    _toolbarItems = [[NSArray arrayWithArray:newItems] retain];
-}
-
-
--(IBAction)selectToolbarItem:(NSToolbarItem*)itemToBeSelected{
-    if ([_selectedViewController commitEditing] && [[NSUserDefaultsController sharedUserDefaultsController] commitEditing]){
-        NSUInteger index = [_toolbarItems indexOfObject:itemToBeSelected];
-        if (index != NSNotFound){
-            [self setSelectedViewController:[_viewControllers objectAtIndex:index]];
-        }
-    } else {
-        //set the toolbar back to the current controllers selection
-        if ([_selectedViewController respondsToSelector:@selector(toolbarItem)] && [[_selectedViewController toolbarItem] itemIdentifier]){
-            [_toolbar setSelectedItemIdentifier:[[_selectedViewController toolbarItem] itemIdentifier]];
-        } else if ([_selectedViewController respondsToSelector:@selector(identifier)]){
-            [_toolbar setSelectedItemIdentifier:[_selectedViewController identifier]];
-        }
-
-    }
-}
-
--(NSArray*)toolbarItemIdentifiers{
-    NSMutableArray *identifiers = [NSMutableArray arrayWithCapacity:[_viewControllers count]];
-    
-    for (id viewController in _viewControllers){
-        [identifiers addObject:[self toolbarItemIdentifierForViewController:viewController]];
-    }
-    
-    return [NSArray arrayWithArray:identifiers];
-}
-
-#pragma mark - Custom Placeholder Controller Toolbar Items
-
-+(id)separatorPlaceholderController{
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarSeparatorItemIdentifier];
-}
-+(id)flexibleSpacePlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarFlexibleSpaceItemIdentifier];
-}
-+(id)spacePlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarSpaceItemIdentifier]; 
-}
-+(id)showColorsPlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarShowColorsItemIdentifier]; 
-}
-+(id)showFontsPlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarShowFontsItemIdentifier]; 
-}
-+(id)customizeToolbarPlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarCustomizeToolbarItemIdentifier]; 
-}
-+(id)printPlaceholderController{ 
-    return [RHPreferencesCustomPlaceholderController controllerWithIdentifier:NSToolbarPrintItemIdentifier]; 
-}
-
-#pragma mark - NSWindowController
-
--(void)loadWindow{
-    [super loadWindow];
-    
-    if (_unloadedWindowTitle){
-        self.window.title = _unloadedWindowTitle;
-        [_unloadedWindowTitle release]; _unloadedWindowTitle = nil;
-    }
-    
-    if (_selectedViewController){
-        
-        //add the view to the windows content view
-        if ([_selectedViewController respondsToSelector:@selector(viewWillAppear)]){
-            [_selectedViewController viewWillAppear];
-        }        
-        
-        [self.window.contentView addSubview:[_selectedViewController view]];
-        
-        if ([_selectedViewController respondsToSelector:@selector(viewDidAppear)]){
-            [_selectedViewController viewDidAppear];
-        }        
-        
-        //resize to Preferred window size for given view    
-        [self resizeWindowForContentSize:_selectedViewController.view.bounds.size duration:0.0f];
-        
-        [_selectedViewController.view setFrameOrigin:NSMakePoint(0, 0)];
-        [_selectedViewController.view setAutoresizingMask:NSViewMaxXMargin|NSViewMaxYMargin];
-        
-        
-        //set the current controllers tab to selected    
-        [_toolbar setSelectedItemIdentifier:[self toolbarItemIdentifierForViewController:_selectedViewController]];
-        
-        //if there is a initialKeyView set it as key
-        if ([_selectedViewController respondsToSelector:@selector(initialKeyView)]){
-            [[_selectedViewController initialKeyView] becomeFirstResponder];
-        }
-        
-        //if we should auto-update window title, do it now 
-        if (_windowTitleShouldAutomaticlyUpdateToReflectSelectedViewController){
-            NSString *identifier = [self toolbarItemIdentifierForViewController:_selectedViewController];
-            NSString *title = [[self toolbarItemWithItemIdentifier:identifier] label];
-            if (title)[self setWindowTitle:title];
-        }
-    }
-}
-
--(void)windowDidLoad{
-    [super windowDidLoad];
-}
-
-#pragma mark - NSWindowDelegate
-
--(BOOL)windowShouldClose:(id)sender{
-    if (_selectedViewController){
-        return [_selectedViewController commitEditing];
-    }
-    
-    return YES;
-}
-
--(void)windowWillClose:(NSNotification *)notification{
-    // steal firstResponder away from text fields, to commit editing to bindings
-    [self.window makeFirstResponder:self];
-}
-
-#pragma mark - NSToolbarDelegate
-
--(NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag{
-   return [self toolbarItemWithItemIdentifier:itemIdentifier];
-}
-
--(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar{
-    return [self toolbarItemIdentifiers];
-}
-
--(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar{
-    return [self toolbarItemIdentifiers];
-}
-
--(NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar{
-    return [self toolbarItemIdentifiers];
-}
-
-@end
diff --git a/Pods/Sparkle/LICENSE b/Pods/Sparkle/LICENSE
deleted file mode 100644
index f4020f8..0000000
--- a/Pods/Sparkle/LICENSE
+++ /dev/null
@@ -1,60 +0,0 @@
-Copyright (c) 2006-2013 Andy Matuschak.
-Copyright (c) 2009-2013 Elgato Systems GmbH.
-Copyright (c) 2011-2014 Kornel Lesiński.
-Copyright (c) 2014 C.W. Betts.
-Copyright (c) 2014 Petroules Corporation.
-Copyright (c) 2014 Big Nerd Ranch.
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-=================
-EXTERNAL LICENSES
-=================
-
-bspatch.c and bsdiff.c, from bsdiff 4.3 <http://www.daemonology.net/bsdiff/>:
-    Copyright (c) 2003-2005 Colin Percival.
-
-sais.c and sais.c, from sais-lite (2010/08/07) <https://sites.google.com/site/yuta256/sais>:
-    Copyright (c) 2008-2010 Yuta Mori.
-
-SUDSAVerifier.m:
-    Copyright (c) 2011 Mark Hamlin.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/Pods/Sparkle/Sparkle.framework.dSYM/Contents/Info.plist b/Pods/Sparkle/Sparkle.framework.dSYM/Contents/Info.plist
deleted file mode 100644
index 26b388d..0000000
--- a/Pods/Sparkle/Sparkle.framework.dSYM/Contents/Info.plist
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-	<dict>
-		<key>CFBundleDevelopmentRegion</key>
-		<string>English</string>
-		<key>CFBundleIdentifier</key>
-		<string>com.apple.xcode.dsym.org.sparkle-project.Sparkle</string>
-		<key>CFBundleInfoDictionaryVersion</key>
-		<string>6.0</string>
-		<key>CFBundlePackageType</key>
-		<string>dSYM</string>
-		<key>CFBundleSignature</key>
-		<string>????</string>
-		<key>CFBundleShortVersionString</key>
-		<string>1.13.1</string>
-		<key>CFBundleVersion</key>
-		<string>1.13.1</string>
-	</dict>
-</plist>
diff --git a/Pods/Sparkle/Sparkle.framework.dSYM/Contents/Resources/DWARF/Sparkle b/Pods/Sparkle/Sparkle.framework.dSYM/Contents/Resources/DWARF/Sparkle
deleted file mode 100644
index c7738c09a873166506daca70e42cf9207f424a5b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Headers b/Pods/Sparkle/Sparkle.framework/Headers
deleted file mode 120000
index a177d2a..0000000
--- a/Pods/Sparkle/Sparkle.framework/Headers
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Headers
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Modules b/Pods/Sparkle/Sparkle.framework/Modules
deleted file mode 120000
index 5736f31..0000000
--- a/Pods/Sparkle/Sparkle.framework/Modules
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Modules
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/PrivateHeaders b/Pods/Sparkle/Sparkle.framework/PrivateHeaders
deleted file mode 120000
index d8e5645..0000000
--- a/Pods/Sparkle/Sparkle.framework/PrivateHeaders
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/PrivateHeaders
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Resources b/Pods/Sparkle/Sparkle.framework/Resources
deleted file mode 120000
index 953ee36..0000000
--- a/Pods/Sparkle/Sparkle.framework/Resources
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Resources
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Sparkle b/Pods/Sparkle/Sparkle.framework/Sparkle
deleted file mode 120000
index b2c5273..0000000
--- a/Pods/Sparkle/Sparkle.framework/Sparkle
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Sparkle
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcast.h
deleted file mode 100644
index 8f3efc8..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcast.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-//  SUAppcast.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 3/12/06.
-//  Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUAPPCAST_H
-#define SUAPPCAST_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-
-@class SUAppcastItem;
-SU_EXPORT @interface SUAppcast : NSObject<NSURLDownloadDelegate>
-
-@property (copy) NSString *userAgentString;
-@property (copy) NSDictionary *httpHeaders;
-
-- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err;
-
-@property (readonly, copy) NSArray *items;
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
deleted file mode 100644
index 86843bf..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-//  SUAppcastItem.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 3/12/06.
-//  Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUAPPCASTITEM_H
-#define SUAPPCASTITEM_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-
-SU_EXPORT @interface SUAppcastItem : NSObject
-@property (copy, readonly) NSString *title;
-@property (copy, readonly) NSDate *date;
-@property (copy, readonly) NSString *itemDescription;
-@property (strong, readonly) NSURL *releaseNotesURL;
-@property (copy, readonly) NSString *DSASignature;
-@property (copy, readonly) NSString *minimumSystemVersion;
-@property (copy, readonly) NSString *maximumSystemVersion;
-@property (strong, readonly) NSURL *fileURL;
-@property (copy, readonly) NSString *versionString;
-@property (copy, readonly) NSString *displayVersionString;
-@property (copy, readonly) NSDictionary *deltaUpdates;
-@property (strong, readonly) NSURL *infoURL;
-
-// Initializes with data from a dictionary provided by the RSS class.
-- (instancetype)initWithDictionary:(NSDictionary *)dict;
-- (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error;
-
-@property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate;
-@property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate;
-@property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate;
-
-// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.
-@property (readonly, copy) NSDictionary *propertiesDictionary;
-
-- (NSURL *)infoURL;
-
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUErrors.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUErrors.h
deleted file mode 100644
index d73aadb..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUErrors.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  SUErrors.h
-//  Sparkle
-//
-//  Created by C.W. Betts on 10/13/14.
-//  Copyright (c) 2014 Sparkle Project. All rights reserved.
-//
-
-#ifndef SUERRORS_H
-#define SUERRORS_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-
-/**
- * Error domain used by Sparkle
- */
-SU_EXPORT extern NSString *const SUSparkleErrorDomain;
-
-typedef NS_ENUM(OSStatus, SUError) {
-    // Appcast phase errors.
-    SUAppcastParseError = 1000,
-    SUNoUpdateError = 1001,
-    SUAppcastError = 1002,
-    SURunningFromDiskImageError = 1003,
-    
-    // Downlaod phase errors.
-    SUTemporaryDirectoryError = 2000,
-    
-    // Extraction phase errors.
-    SUUnarchivingError = 3000,
-    SUSignatureError = 3001,
-    
-    // Installation phase errors.
-    SUFileCopyFailure = 4000,
-    SUAuthenticationFailure = 4001,
-    SUMissingUpdateError = 4002,
-    SUMissingInstallerToolError = 4003,
-    SURelaunchError = 4004,
-    SUInstallationError = 4005,
-    SUDowngradeError = 4006,
-    
-    // System phase errors
-    SUSystemPowerOffError = 5000
-};
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUExport.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUExport.h
deleted file mode 100644
index 3e3f8a1..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUExport.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-//  SUExport.h
-//  Sparkle
-//
-//  Created by Jake Petroules on 2014-08-23.
-//  Copyright (c) 2014 Sparkle Project. All rights reserved.
-//
-
-#ifndef SUEXPORT_H
-#define SUEXPORT_H
-
-#ifdef BUILDING_SPARKLE
-#define SU_EXPORT __attribute__((visibility("default")))
-#else
-#define SU_EXPORT
-#endif
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h
deleted file mode 100644
index d7f2a48..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  SUStandardVersionComparator.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 12/21/07.
-//  Copyright 2007 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUSTANDARDVERSIONCOMPARATOR_H
-#define SUSTANDARDVERSIONCOMPARATOR_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-#import "SUVersionComparisonProtocol.h"
-
-/*!
-    Sparkle's default version comparator.
-
-    This comparator is adapted from MacPAD, by Kevin Ballard.
-    It's "dumb" in that it does essentially string comparison,
-    in components split by character type.
-*/
-SU_EXPORT @interface SUStandardVersionComparator : NSObject <SUVersionComparison>
-
-/*!
-    Returns a singleton instance of the comparator.
-*/
-+ (SUStandardVersionComparator *)defaultComparator;
-
-/*!
-    Compares version strings through textual analysis.
-
-    See the implementation for more details.
-*/
-- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUUpdater.h
deleted file mode 100644
index ed0072a..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUUpdater.h
+++ /dev/null
@@ -1,364 +0,0 @@
-//
-//  SUUpdater.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 1/4/06.
-//  Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUUPDATER_H
-#define SUUPDATER_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-#import "SUVersionComparisonProtocol.h"
-#import "SUVersionDisplayProtocol.h"
-
-@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;
-
-@protocol SUUpdaterDelegate;
-
-/*!
-    The main API in Sparkle for controlling the update mechanism.
-
-    This class is used to configure the update paramters as well as manually
-    and automatically schedule and control checks for updates.
- */
-SU_EXPORT @interface SUUpdater : NSObject
-
-@property (unsafe_unretained) IBOutlet id<SUUpdaterDelegate> delegate;
-
-+ (SUUpdater *)sharedUpdater;
-+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
-- (instancetype)initForBundle:(NSBundle *)bundle;
-
-@property (readonly, strong) NSBundle *hostBundle;
-@property (strong, readonly) NSBundle *sparkleBundle;
-
-@property BOOL automaticallyChecksForUpdates;
-
-@property NSTimeInterval updateCheckInterval;
-
-/*!
- * The URL of the appcast used to download update information.
- *
- * This property must be called on the main thread.
- */
-@property (copy) NSURL *feedURL;
-
-@property (nonatomic, copy) NSString *userAgentString;
-
-@property (copy) NSDictionary *httpHeaders;
-
-@property BOOL sendsSystemProfile;
-
-@property BOOL automaticallyDownloadsUpdates;
-
-/*!
-    Explicitly checks for updates and displays a progress dialog while doing so.
-
-    This method is meant for a main menu item.
-    Connect any menu item to this action in Interface Builder,
-    and Sparkle will check for updates and report back its findings verbosely
-    when it is invoked.
- */
-- (IBAction)checkForUpdates:(id)sender;
-
-/*!
-    Checks for updates, but does not display any UI unless an update is found.
-
-    This is meant for programmatically initating a check for updates. That is,
-    it will display no UI unless it actually finds an update, in which case it
-    proceeds as usual.
-
-    If the fully automated updating is turned on, however, this will invoke that
-    behavior, and if an update is found, it will be downloaded and prepped for
-    installation.
- */
-- (void)checkForUpdatesInBackground;
-
-/*!
-    Checks for updates and, if available, immediately downloads and installs them.
-    A progress dialog is shown but the user will never be prompted to read the
-    release notes.
-    
-    You may want to respond to the userDidCancelDownload delegate method in case
-    the user clicks the "Cancel" button while the update is downloading.
- */
-- (void)installUpdatesIfAvailable;
-
-/*!
-    Returns the date of last update check.
-
-    \returns \c nil if no check has been performed.
- */
-@property (readonly, copy) NSDate *lastUpdateCheckDate;
-
-/*!
-    Begins a "probing" check for updates which will not actually offer to
-    update to that version.
-
-    However, the delegate methods
-    SUUpdaterDelegate::updater:didFindValidUpdate: and
-    SUUpdaterDelegate::updaterDidNotFindUpdate: will be called,
-    so you can use that information in your UI.
- */
-- (void)checkForUpdateInformation;
-
-/*!
-    Appropriately schedules or cancels the update checking timer according to
-    the preferences for time interval and automatic checks.
-
-    This call does not change the date of the next check,
-    but only the internal NSTimer.
- */
-- (void)resetUpdateCycle;
-
-@property (readonly) BOOL updateInProgress;
-
-@end
-
-// -----------------------------------------------------------------------------
-// SUUpdater Notifications for events that might be interesting to more than just the delegate
-// The updater will be the notification object
-// -----------------------------------------------------------------------------
-SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification;
-SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification;
-SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification;
-SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification;
-#define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification;
-#define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification;
-
-// Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo
-SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey;
-// Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo
-SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey;
-
-// -----------------------------------------------------------------------------
-//	SUUpdater Delegate:
-// -----------------------------------------------------------------------------
-
-/*!
-    Provides methods to control the behavior of an SUUpdater object.
- */
-@protocol SUUpdaterDelegate <NSObject>
-@optional
-
-/*!
-    Returns whether to allow Sparkle to pop up.
-
-    For example, this may be used to prevent Sparkle from interrupting a setup assistant.
-
-    \param updater The SUUpdater instance.
- */
-- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)updater;
-
-/*!
-    Returns additional parameters to append to the appcast URL's query string.
-
-    This is potentially based on whether or not Sparkle will also be sending along the system profile.
-
-    \param updater The SUUpdater instance.
-    \param sendingProfile Whether the system profile will also be sent.
-
-    \return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
- */
-- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
-
-/*!
-    Returns a custom appcast URL.
-
-    Override this to dynamically specify the entire URL.
-
-    \param updater The SUUpdater instance.
- */
-- (NSString *)feedURLStringForUpdater:(SUUpdater *)updater;
-
-/*!
-    Returns whether Sparkle should prompt the user about automatic update checks.
-
-    Use this to override the default behavior.
-
-    \param updater The SUUpdater instance.
- */
-- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)updater;
-
-/*!
-    Called after Sparkle has downloaded the appcast from the remote server.
-
-    Implement this if you want to do some special handling with the appcast once it finishes loading.
-
-    \param updater The SUUpdater instance.
-    \param appcast The appcast that was downloaded from the remote server.
- */
-- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
-
-/*!
-    Returns the item in the appcast corresponding to the update that should be installed.
-
-    If you're using special logic or extensions in your appcast,
-    implement this to use your own logic for finding a valid update, if any,
-    in the given appcast.
-
-    \param appcast The appcast that was downloaded from the remote server.
-    \param updater The SUUpdater instance.
- */
-- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)updater;
-
-/*!
-    Called when a valid update is found by the update driver.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that is proposed to be installed.
- */
-- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item;
-
-/*!
-    Called when a valid update is not found.
-
-    \param updater The SUUpdater instance.
- */
-- (void)updaterDidNotFindUpdate:(SUUpdater *)updater;
-
-/*!
-    Called immediately before downloading the specified update.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that is proposed to be downloaded.
-    \param request The mutable URL request that will be used to download the update.
- */
-- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request;
-
-/*!
-    Called after the specified update failed to download.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that failed to download.
-    \param error The error generated by the failed download.
- */
-- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error;
-
-/*!
-    Called when the user clicks the cancel button while and update is being downloaded.
-
-    \param updater The SUUpdater instance.
- */
-- (void)userDidCancelDownload:(SUUpdater *)updater;
-
-/*!
-    Called immediately before installing the specified update.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that is proposed to be installed.
- */
-- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item;
-
-/*!
-    Returns whether the relaunch should be delayed in order to perform other tasks.
-
-    This is not called if the user didn't relaunch on the previous update,
-    in that case it will immediately restart.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that is proposed to be installed.
-    \param invocation The invocation that must be completed before continuing with the relaunch.
-
-    \return \c YES to delay the relaunch until \p invocation is invoked.
- */
-- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvoking:(NSInvocation *)invocation;
-
-/*!
-    Returns whether the application should be relaunched at all.
-
-    Some apps \b cannot be relaunched under certain circumstances.
-    This method can be used to explicitly prevent a relaunch.
-
-    \param updater The SUUpdater instance.
- */
-- (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater;
-
-/*!
-    Called immediately before relaunching.
-
-    \param updater The SUUpdater instance.
- */
-- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;
-
-/*!
-    Returns an object that compares version numbers to determine their arithmetic relation to each other.
-
-    This method allows you to provide a custom version comparator.
-    If you don't implement this method or return \c nil,
-    the standard version comparator will be used.
-
-    \sa SUStandardVersionComparator
-
-    \param updater The SUUpdater instance.
- */
-- (id<SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
-
-/*!
-    Returns an object that formats version numbers for display to the user.
-
-    If you don't implement this method or return \c nil,
-    the standard version formatter will be used.
-
-    \sa SUUpdateAlert
-
-    \param updater The SUUpdater instance.
- */
-- (id<SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
-
-/*!
-    Returns the path which is used to relaunch the client after the update is installed.
-
-    The default is the path of the host bundle.
-
-    \param updater The SUUpdater instance.
- */
-- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;
-
-/*!
-    Called before an updater shows a modal alert window,
-    to give the host the opportunity to hide attached windows that may get in the way.
-
-    \param updater The SUUpdater instance.
- */
-- (void)updaterWillShowModalAlert:(SUUpdater *)updater;
-
-/*!
-    Called after an updater shows a modal alert window,
-    to give the host the opportunity to hide attached windows that may get in the way.
-
-    \param updater The SUUpdater instance.
- */
-- (void)updaterDidShowModalAlert:(SUUpdater *)updater;
-
-/*!
-    Called when an update is scheduled to be silently installed on quit.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that is proposed to be installed.
-    \param invocation Can be used to trigger an immediate silent install and relaunch.
- */
-- (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation;
-
-/*!
-    Calls after an update that was scheduled to be silently installed on quit has been canceled.
-
-    \param updater The SUUpdater instance.
-    \param item The appcast item corresponding to the update that was proposed to be installed.
- */
-- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item;
-
-/*!
-    Called after an update is aborted due to an error.
-
-    \param updater The SUUpdater instance.
-    \param error The error that caused the abort
- */
-- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error;
-
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
deleted file mode 100644
index 10c4266..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-//  SUVersionComparisonProtocol.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 12/21/07.
-//  Copyright 2007 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUVERSIONCOMPARISONPROTOCOL_H
-#define SUVERSIONCOMPARISONPROTOCOL_H
-
-#import <Cocoa/Cocoa.h>
-#import "SUExport.h"
-
-/*!
-    Provides version comparison facilities for Sparkle.
-*/
-@protocol SUVersionComparison
-
-/*!
-    An abstract method to compare two version strings.
-
-    Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a,
-    and NSOrderedSame if they are equivalent.
-*/
-- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD!
-
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
deleted file mode 100644
index 97fae4c..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-//  SUVersionDisplayProtocol.h
-//  EyeTV
-//
-//  Created by Uli Kusterer on 08.12.09.
-//  Copyright 2009 Elgato Systems GmbH. All rights reserved.
-//
-
-#import <Cocoa/Cocoa.h>
-#import "SUExport.h"
-
-/*!
-    Applies special display formatting to version numbers.
-*/
-@protocol SUVersionDisplay
-
-/*!
-    Formats two version strings.
-
-    Both versions are provided so that important distinguishing information
-    can be displayed while also leaving out unnecessary/confusing parts.
-*/
-- (void)formatVersion:(NSString **)inOutVersionA andVersion:(NSString **)inOutVersionB;
-
-@end
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/Sparkle.h b/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/Sparkle.h
deleted file mode 100644
index 20ed697..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Headers/Sparkle.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-//  Sparkle.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
-//  Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SPARKLE_H
-#define SPARKLE_H
-
-#import <Cocoa/Cocoa.h>
-
-// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
-// there are name-space collisions) so we can list all of them to start with:
-
-#import "SUAppcast.h"
-#import "SUAppcastItem.h"
-#import "SUStandardVersionComparator.h"
-#import "SUUpdater.h"
-#import "SUVersionComparisonProtocol.h"
-#import "SUVersionDisplayProtocol.h"
-#import "SUErrors.h"
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Modules/module.modulemap b/Pods/Sparkle/Sparkle.framework/Versions/A/Modules/module.modulemap
deleted file mode 100644
index af3fe6d..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Modules/module.modulemap
+++ /dev/null
@@ -1,6 +0,0 @@
-framework module Sparkle {
-  umbrella header "Sparkle.h"
-
-  export *
-  module * { export * }
-}
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h b/Pods/Sparkle/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h
deleted file mode 100644
index 6397fe7..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-//  SUUnarchiver.h
-//  Sparkle
-//
-//  Created by Andy Matuschak on 3/16/06.
-//  Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SUUNARCHIVER_H
-#define SUUNARCHIVER_H
-
-#import <Foundation/Foundation.h>
-
-@class SUHost;
-@protocol SUUnarchiverDelegate;
-
-@interface SUUnarchiver : NSObject
-
-@property (copy, readonly) NSString *archivePath;
-@property (copy, readonly) NSString *updateHostBundlePath;
-@property (weak) id<SUUnarchiverDelegate> delegate;
-
-+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)host;
-
-- (void)start;
-@end
-
-@protocol SUUnarchiverDelegate <NSObject>
-- (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver;
-- (void)unarchiverDidFail:(SUUnarchiver *)unarchiver;
-@optional
-- (void)unarchiver:(SUUnarchiver *)unarchiver extractedProgress:(double)progress;
-@end
-
-#endif
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist
deleted file mode 100644
index 26a0212..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>BuildMachineOSBuild</key>
-	<string>15E27e</string>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>Autoupdate</string>
-	<key>CFBundleIconFile</key>
-	<string>AppIcon</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.sparkle-project.Sparkle.Autoupdate</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.13.1 git-2afc553</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleSupportedPlatforms</key>
-	<array>
-		<string>MacOSX</string>
-	</array>
-	<key>CFBundleVersion</key>
-	<string>1.13.1</string>
-	<key>DTCompiler</key>
-	<string>com.apple.compilers.llvm.clang.1_0</string>
-	<key>DTPlatformBuild</key>
-	<string>7C68</string>
-	<key>DTPlatformVersion</key>
-	<string>GM</string>
-	<key>DTSDKBuild</key>
-	<string>15C43</string>
-	<key>DTSDKName</key>
-	<string>macosx10.11</string>
-	<key>DTXcode</key>
-	<string>0720</string>
-	<key>DTXcodeBuild</key>
-	<string>7C68</string>
-	<key>LSBackgroundOnly</key>
-	<string>1</string>
-	<key>LSMinimumSystemVersion</key>
-	<string>10.7</string>
-	<key>LSUIElement</key>
-	<string>1</string>
-	<key>NSMainNibFile</key>
-	<string>MainMenu</string>
-	<key>NSPrincipalClass</key>
-	<string>NSApplication</string>
-</dict>
-</plist>
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate
deleted file mode 100755
index 7caea3d5f503cfac5dd2907cee299bf319c37f2b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo
deleted file mode 100644
index bd04210..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo
+++ /dev/null
@@ -1 +0,0 @@
-APPL????
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns
deleted file mode 100644
index 75c7c379f94c38d64cb160da894f3f41149cc34b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib
deleted file mode 100644
index 30f3c2c4d1f6e3a63dd1df160ac5abec8443ced8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings
deleted file mode 100644
index 057e2f821b9215bcf4755e524f97481337bc2139..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ca.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ca.lproj/Sparkle.strings
deleted file mode 100644
index cc238f685a321f7ef105799b6358566680865100..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings
deleted file mode 100644
index 6ca360d15c3713443a051078b8b78f63a3c902d7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings
deleted file mode 100644
index 266c0693a65da63215c843a44683cc97c58f58d8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings
deleted file mode 100644
index f99c8c0e15421cdcc3f588db2fbbd54f0c5e8b7b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings
deleted file mode 100644
index 394c159c033535562bc2331e33519afc1d89ab24..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings
deleted file mode 100644
index f427ad69757ad19452ee2b20663f2de21bb5a39f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings
deleted file mode 100644
index 8922b3213e3a9a8f5de982f84330b80e6a8cd56f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fi.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fi.lproj/Sparkle.strings
deleted file mode 100644
index 32d3107f92c5818ce9200dbfa6ac7557386daca5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings
deleted file mode 100644
index 6577569feb5a6d42e00687e463ce9e6c5cff7491..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/he.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/he.lproj/Sparkle.strings
deleted file mode 100644
index 99124ccc883a905ef09fa95908aeecfb0d3bc758..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings
deleted file mode 100644
index 74ae72802ab6eea84ff81f1c2b06038d91a854ec..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings
deleted file mode 100644
index f7fb93581c1f605eabf34ce774f53153f802f8d0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings
deleted file mode 100644
index 1925ba49ba6ca45875e261be25205e196d09547b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings
deleted file mode 100644
index c6ecfbacb49ef0207da2d81d045abb60b41acf05..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings
deleted file mode 100644
index 25e207938302eca2f2264dd4158f52c2d0ac1c97..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings
deleted file mode 100644
index de38912253dc032215601ad3b25edd3d2dc564d1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings
deleted file mode 100644
index e366e3bf1c3af220a30e6511eb0d91b68dd920a4..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
deleted file mode 100644
index 300fc86abbd16d76fbda6f5510bfe2ba97bb5bcf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings
deleted file mode 100644
index d3eddf75d7ae2e72906e373c358556da79d9a289..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings
deleted file mode 100644
index 28a407bc99316ddd09ddaede03725dd0eafc2adb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings
deleted file mode 100644
index d5cb607305cd82251f35ce457cbac19bbb7509b2..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings
deleted file mode 100644
index 949fb16ef581590fe705483512d69812b8d44c4a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings
deleted file mode 100644
index c1ce5a04ef8b34a40093dfe3f0e194d24eb4f6c0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings
deleted file mode 100644
index e65ac55916230e88d83954d796de62b90c9803a1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings
deleted file mode 100644
index fc728fd554695c0f04861bce32d3fc4961fed783..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings
deleted file mode 100644
index c41e3dba0ea2936072ebf80b28bebc3ec8448a9a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings
deleted file mode 100644
index 521656d3887f753baed755bd7845e5a0b38a0504..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings
deleted file mode 100644
index 0e91210e5ed31beb52fcd2324d3db6c4408ea851..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings
deleted file mode 100644
index ea8c82f97f3208c9b6f8beca72610bbacba390cb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Info.plist b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Info.plist
deleted file mode 100644
index aba6f81..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/Info.plist
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>BuildMachineOSBuild</key>
-	<string>15E27e</string>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>Sparkle</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.sparkle-project.Sparkle</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>Sparkle</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.13.1 git-2afc553</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleSupportedPlatforms</key>
-	<array>
-		<string>MacOSX</string>
-	</array>
-	<key>CFBundleVersion</key>
-	<string>1.13.1</string>
-	<key>DTCompiler</key>
-	<string>com.apple.compilers.llvm.clang.1_0</string>
-	<key>DTPlatformBuild</key>
-	<string>7C68</string>
-	<key>DTPlatformVersion</key>
-	<string>GM</string>
-	<key>DTSDKBuild</key>
-	<string>15C43</string>
-	<key>DTSDKName</key>
-	<string>macosx10.11</string>
-	<key>DTXcode</key>
-	<string>0720</string>
-	<key>DTXcodeBuild</key>
-	<string>7C68</string>
-</dict>
-</plist>
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
deleted file mode 100644
index 1f75b24..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
+++ /dev/null
@@ -1,314 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>ADP2,1</key>
-	<string>Developer Transition Kit</string>
-	<key>iMac1,1</key>
-	<string>iMac G3 (Rev A-D)</string>
-	<key>iMac4,1</key>
-	<string>iMac (Core Duo)</string>
-	<key>iMac4,2</key>
-	<string>iMac for Education (17 inch, Core Duo)</string>
-	<key>iMac5,1</key>
-	<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>
-	<key>iMac5,2</key>
-	<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>
-	<key>iMac6,1</key>
-	<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>
-	<key>iMac7,1</key>
-	<string>iMac Intel Core 2 Duo (aluminum enclosure)</string>
-	<key>iMac8,1</key>
-	<string>iMac (Core 2 Duo, 20 or 24 inch, Early 2008 )</string>
-	<key>iMac9,1</key>
-	<string>iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 )</string>
-	<key>iMac10,1</key>
-	<string>iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 )</string>
-	<key>iMac11,1</key>
-	<string>iMac (Core i5 or i7, 27 inch Late 2009)</string>
-	<key>iMac11,2</key>
-	<string>21.5&quot; iMac (mid 2010)</string>
-	<key>iMac11,3</key>
-	<string>iMac (Core i5 or i7, 27 inch Mid 2010)</string>
-	<key>iMac12,1</key>
-	<string>iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011)</string>
-	<key>iMac12,2</key>
-	<string>iMac (Core i5 or i7, 27 inch Mid 2011)</string>
-	<key>iMac13,1</key>
-	<string>iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013)</string>
-	<key>iMac13,2</key>
-	<string>iMac (Core i5 or i7, 27 inch Late 2012)</string>
-	<key>iMac14,1</key>
-	<string>iMac (Core i5, 21.5 inch Late 2013)</string>
-	<key>iMac14,2</key>
-	<string>iMac (Core i5 or i7, 27 inch Late 2013)</string>
-	<key>iMac14,3</key>
-	<string>iMac (Core i5 or i7, 21.5 inch Late 2013)</string>
-	<key>iMac14,4</key>
-	<string>iMac (Core i5, 21.5 inch Mid 2014)</string>
-	<key>iMac15,1</key>
-	<string>iMac (Retina 5K Core i5 or i7, 27 inch Late 2014 or Mid 2015)</string>
-	<key>iMac16,1</key>
-	<string>iMac (Core i5, 21,5 inch Late 2015)</string>
-	<key>iMac16,2</key>
-	<string>iMac (Retina 4K Core i5 or i7, 21.5 inch Late 2015)</string>
-	<key>iMac17,1</key>
-	<string>iMac (Retina 5K Core i5 or i7, 27 inch Late 2015)</string>
-	<key>MacBook1,1</key>
-	<string>MacBook (Core Duo)</string>
-	<key>MacBook2,1</key>
-	<string>MacBook (Core 2 Duo)</string>
-	<key>MacBook4,1</key>
-	<string>MacBook (Core 2 Duo Feb 2008)</string>
-	<key>MacBook5,1</key>
-	<string>MacBook (Core 2 Duo, Late 2008, Unibody)</string>
-	<key>MacBook5,2</key>
-	<string>MacBook (Core 2 Duo, Early 2009, White)</string>
-	<key>MacBook6,1</key>
-	<string>MacBook (Core 2 Duo, Late 2009, Unibody)</string>
-	<key>MacBook7,1</key>
-	<string>MacBook (Core 2 Duo, Mid 2010, White)</string>
-	<key>MacBook8,1</key>
-	<string>MacBook (Core M, 12 inch, Early 2015)</string>
-	<key>MacBookAir1,1</key>
-	<string>MacBook Air (Core 2 Duo, 13 inch, Early 2008)</string>
-	<key>MacBookAir2,1</key>
-	<string>MacBook Air (Core 2 Duo, 13 inch, Mid 2009)</string>
-	<key>MacBookAir3,1</key>
-	<string>MacBook Air (Core 2 Duo, 11 inch, Late 2010)</string>
-	<key>MacBookAir3,2</key>
-	<string>MacBook Air (Core 2 Duo, 13 inch, Late 2010)</string>
-	<key>MacBookAir4,1</key>
-	<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2011)</string>
-	<key>MacBookAir4,2</key>
-	<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2011)</string>
-	<key>MacBookAir5,1</key>
-	<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2012)</string>
-	<key>MacBookAir5,2</key>
-	<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2012)</string>
-	<key>MacBookAir6,1</key>
-	<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014)</string>
-	<key>MacBookAir6,2</key>
-	<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014)</string>
-	<key>MacBookAir7,1</key>
-	<string>MacBook Air (Core i5 or i7, 11 inch, Early 2015)</string>
-	<key>MacBookAir7,2</key>
-	<string>MacBook Air (Core i5 or i7, 13 inch, Early 2015)</string>
-	<key>MacBookPro1,1</key>
-	<string>MacBook Pro Core Duo (15-inch)</string>
-	<key>MacBookPro1,2</key>
-	<string>MacBook Pro Core Duo (17-inch)</string>
-	<key>MacBookPro2,1</key>
-	<string>MacBook Pro Core 2 Duo (17-inch)</string>
-	<key>MacBookPro2,2</key>
-	<string>MacBook Pro Core 2 Duo (15-inch)</string>
-	<key>MacBookPro3,1</key>
-	<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>
-	<key>MacBookPro3,2</key>
-	<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>
-	<key>MacBookPro4,1</key>
-	<string>MacBook Pro (Core 2 Duo Feb 2008)</string>
-	<key>MacBookPro5,1</key>
-	<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
-	<key>MacBookPro5,2</key>
-	<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
-	<key>MacBookPro5,3</key>
-	<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
-	<key>MacBookPro5,4</key>
-	<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
-	<key>MacBookPro5,5</key>
-	<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
-	<key>MacBookPro6,1</key>
-	<string>MacBook Pro Intel Core i5, Intel Core i7 (mid 2010)</string>
-	<key>MacBookPro6,2</key>
-	<string>MacBook Pro Intel Core i5, Intel Core i7 (mid 2010)</string>
-	<key>MacBookPro7,1</key>
-	<string>MacBook Pro Intel Core 2 Duo (mid 2010)</string>
-	<key>MacBookPro8,1</key>
-	<string>MacBook Pro Intel Core i5, Intel Core i7, 13&quot; (early 2011)</string>
-	<key>MacBookPro8,2</key>
-	<string>MacBook Pro Intel Core i7, 15&quot; (early 2011)</string>
-	<key>MacBookPro8,3</key>
-	<string>MacBook Pro Intel Core i7, 17&quot; (early 2011)</string>
-	<key>MacBookPro9,1</key>
-	<string>MacBook Pro (15-inch, Mid 2012)</string>
-	<key>MacBookPro9,2</key>
-	<string>MacBook Pro (13-inch, Mid 2012)</string>
-	<key>MacBookPro10,1</key>
-	<string>MacBook Pro (Retina, Mid 2012)</string>
-	<key>MacBookPro10,2</key>
-	<string>MacBook Pro (Retina, 13-inch, Late 2012)</string>
-	<key>MacBookPro11,1</key>
-	<string>MacBook Pro (Retina, 13-inch, Late 2013)</string>
-	<key>MacBookPro11,2</key>
-	<string>MacBook Pro (Retina, 15-inch, Late 2013)</string>
-	<key>MacBookPro11,3</key>
-	<string>MacBook Pro (Retina, 15-inch, Late 2013)</string>
-	<key>MacbookPro11,4</key>
-	<string>MacBook Pro (Retina, 15-inch, Mid 2015)</string>
-	<key>MacbookPro11,5</key>
-	<string>MacBook Pro (Retina, 15-inch, Mid 2015)</string>
-	<key>MacbookPro12,1 </key>
-	<string>MacBook Pro (Retina, 13-inch, Early 2015)</string>
-	<key>Macmini1,1</key>
-	<string>Mac Mini (Core Solo/Duo)</string>
-	<key>Macmini2,1</key>
-	<string>Mac mini Intel Core</string>
-	<key>Macmini3,1</key>
-	<string>Mac mini Intel Core</string>
-	<key>Macmini4,1</key>
-	<string>Mac mini Intel Core (Mid 2010)</string>
-	<key>Macmini5,1</key>
-	<string>Mac mini (Core i5, Mid 2011)</string>
-	<key>Macmini5,2</key>
-	<string>Mac mini (Core i5 or Core i7, Mid 2011)</string>
-	<key>Macmini5,3</key>
-	<string>Mac mini (Core i7, Server, Mid 2011)</string>
-	<key>Macmini6,1</key>
-	<string>Mac mini (Core i5, Late 2012)</string>
-	<key>Macmini6,2</key>
-	<string>Mac mini (Core i7, Normal or Server, Late 2012)</string>
-	<key>Macmini7,1</key>
-	<string>Mac mini (Core i5 or Core i7, Late 2014)</string>
-	<key>MacPro1,1,Quad</key>
-	<string>Mac Pro</string>
-	<key>MacPro1,1</key>
-	<string>Mac Pro (four-core)</string>
-	<key>MacPro2,1</key>
-	<string>Mac Pro (eight-core)</string>
-	<key>MacPro3,1</key>
-	<string>Mac Pro (January 2008 4- or 8- core &quot;Harpertown&quot;)</string>
-	<key>MacPro4,1</key>
-	<string>Mac Pro (March 2009)</string>
-	<key>MacPro5,1</key>
-	<string>Mac Pro (2010 or 2012)</string>
-	<key>MacPro6,1</key>
-	<string>Mac Pro (Late 2013)</string>
-	<key>PowerBook1,1</key>
-	<string>PowerBook G3</string>
-	<key>PowerBook2,1</key>
-	<string>iBook G3</string>
-	<key>PowerBook2,2</key>
-	<string>iBook G3 (FireWire)</string>
-	<key>PowerBook2,3</key>
-	<string>iBook G3</string>
-	<key>PowerBook2,4</key>
-	<string>iBook G3</string>
-	<key>PowerBook3,1</key>
-	<string>PowerBook G3 (FireWire)</string>
-	<key>PowerBook3,2</key>
-	<string>PowerBook G4</string>
-	<key>PowerBook3,3</key>
-	<string>PowerBook G4 (Gigabit Ethernet)</string>
-	<key>PowerBook3,4</key>
-	<string>PowerBook G4 (DVI)</string>
-	<key>PowerBook3,5</key>
-	<string>PowerBook G4 (1GHz / 867MHz)</string>
-	<key>PowerBook4,1</key>
-	<string>iBook G3 (Dual USB, Late 2001)</string>
-	<key>PowerBook4,2</key>
-	<string>iBook G3 (16MB VRAM)</string>
-	<key>PowerBook4,3</key>
-	<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>
-	<key>PowerBook5,1</key>
-	<string>PowerBook G4 (17 inch)</string>
-	<key>PowerBook5,2</key>
-	<string>PowerBook G4 (15 inch FW 800)</string>
-	<key>PowerBook5,3</key>
-	<string>PowerBook G4 (17-inch 1.33GHz)</string>
-	<key>PowerBook5,4</key>
-	<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>
-	<key>PowerBook5,5</key>
-	<string>PowerBook G4 (17-inch 1.5GHz)</string>
-	<key>PowerBook5,6</key>
-	<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>
-	<key>PowerBook5,7</key>
-	<string>PowerBook G4 (17-inch 1.67GHz)</string>
-	<key>PowerBook5,8</key>
-	<string>PowerBook G4 (Double layer SD, 15 inch)</string>
-	<key>PowerBook5,9</key>
-	<string>PowerBook G4 (Double layer SD, 17 inch)</string>
-	<key>PowerBook6,1</key>
-	<string>PowerBook G4 (12 inch)</string>
-	<key>PowerBook6,2</key>
-	<string>PowerBook G4 (12 inch, DVI)</string>
-	<key>PowerBook6,3</key>
-	<string>iBook G4</string>
-	<key>PowerBook6,4</key>
-	<string>PowerBook G4 (12 inch 1.33GHz)</string>
-	<key>PowerBook6,5</key>
-	<string>iBook G4 (Early-Late 2004)</string>
-	<key>PowerBook6,7</key>
-	<string>iBook G4 (Mid 2005)</string>
-	<key>PowerBook6,8</key>
-	<string>PowerBook G4 (12 inch 1.5GHz)</string>
-	<key>PowerMac1,1</key>
-	<string>Power Macintosh G3 (Blue &amp; White)</string>
-	<key>PowerMac1,2</key>
-	<string>Power Macintosh G4 (PCI Graphics)</string>
-	<key>PowerMac2,1</key>
-	<string>iMac G3 (Slot-loading CD-ROM)</string>
-	<key>PowerMac2,2</key>
-	<string>iMac G3 (Summer 2000)</string>
-	<key>PowerMac3,1</key>
-	<string>Power Macintosh G4 (AGP Graphics)</string>
-	<key>PowerMac3,2</key>
-	<string>Power Macintosh G4 (AGP Graphics)</string>
-	<key>PowerMac3,3</key>
-	<string>Power Macintosh G4 (Gigabit Ethernet)</string>
-	<key>PowerMac3,4</key>
-	<string>Power Macintosh G4 (Digital Audio)</string>
-	<key>PowerMac3,5</key>
-	<string>Power Macintosh G4 (Quick Silver)</string>
-	<key>PowerMac3,6</key>
-	<string>Power Macintosh G4 (Mirrored Drive Door)</string>
-	<key>PowerMac4,1</key>
-	<string>iMac G3 (Early/Summer 2001)</string>
-	<key>PowerMac4,2</key>
-	<string>iMac G4 (Flat Panel)</string>
-	<key>PowerMac4,4</key>
-	<string>eMac</string>
-	<key>PowerMac4,5</key>
-	<string>iMac G4 (17-inch Flat Panel)</string>
-	<key>PowerMac5,1</key>
-	<string>Power Macintosh G4 Cube</string>
-	<key>PowerMac5,2</key>
-	<string>Power Mac G4 Cube</string>
-	<key>PowerMac6,1</key>
-	<string>iMac G4 (USB 2.0)</string>
-	<key>PowerMac6,3</key>
-	<string>iMac G4 (20-inch Flat Panel)</string>
-	<key>PowerMac6,4</key>
-	<string>eMac (USB 2.0, 2005)</string>
-	<key>PowerMac7,2</key>
-	<string>Power Macintosh G5</string>
-	<key>PowerMac7,3</key>
-	<string>Power Macintosh G5</string>
-	<key>PowerMac8,1</key>
-	<string>iMac G5</string>
-	<key>PowerMac8,2</key>
-	<string>iMac G5 (Ambient Light Sensor)</string>
-	<key>PowerMac9,1</key>
-	<string>Power Macintosh G5 (Late 2005)</string>
-	<key>PowerMac10,1</key>
-	<string>Mac Mini G4</string>
-	<key>PowerMac10,2</key>
-	<string>Mac Mini (Late 2005)</string>
-	<key>PowerMac11,2</key>
-	<string>Power Macintosh G5 (Late 2005)</string>
-	<key>PowerMac12,1</key>
-	<string>iMac G5 (iSight)</string>
-	<key>RackMac1,1</key>
-	<string>Xserve G4</string>
-	<key>RackMac1,2</key>
-	<string>Xserve G4 (slot-loading, cluster node)</string>
-	<key>RackMac3,1</key>
-	<string>Xserve G5</string>
-	<key>Xserve1,1</key>
-	<string>Xserve (Intel Xeon)</string>
-	<key>Xserve2,1</key>
-	<string>Xserve (January 2008 quad-core)</string>
-	<key>Xserve3,1</key>
-	<string>Xserve (early 2009)</string>
-</dict>
-</plist>
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUStatus.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/SUStatus.nib
deleted file mode 100644
index 30f3c2c4d1f6e3a63dd1df160ac5abec8443ced8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 46d10f10df6c3dc89e88b3229cd2505747f284ea..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 1fafb0334bda8daa78419b9d533f39c37d398c46..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index f93d74b0aa1a63422c62738512cc847651d3e36c..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
deleted file mode 100644
index 057e2f821b9215bcf4755e524f97481337bc2139..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings
deleted file mode 100644
index cc238f685a321f7ef105799b6358566680865100..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 4b32c51654b737d3e1fdb7b771d716168764d868..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 122c0e03a3795fe3dbae886109ba3d81e762e592..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 26ec0254849cd3cf3f2fac77c153c2860cf3ea8e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
deleted file mode 100644
index 6ca360d15c3713443a051078b8b78f63a3c902d7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index a1fbef90bb9a12518db38554fa7fa3e832236fea..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 05bf2cb333fe7793d90a8dfc0dc2e29d4a4bdb11..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 21fca7b92f4972e1b50874cc8e7e29983c35c4e5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
deleted file mode 100644
index 266c0693a65da63215c843a44683cc97c58f58d8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 66360626f477e99f38165b29e1471ef32435c464..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
deleted file mode 100644
index a457c2f643078c1f19e21fa8cb2ce29e14b0ed36..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 92499cbb12a667ba96930698d50d47c843db50ea..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
deleted file mode 100644
index f99c8c0e15421cdcc3f588db2fbbd54f0c5e8b7b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index a3db760fe9d1a3a898fe43048b15003dfd0bdd18..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 20302af0e810d59df7413508814766d8cbd59f38..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 157168bbc45bcb2025f5ca94dd673ea5251a649d..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings
deleted file mode 100644
index 394c159c033535562bc2331e33519afc1d89ab24..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index df090b491f3131ac3c4653777badcc9b988c4f8a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 7ed2647971759844a839020a777886ee16e92137..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 9c0c887c0ed8bc11356d02df4f441b7d277ab331..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
deleted file mode 100644
index f427ad69757ad19452ee2b20663f2de21bb5a39f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 4fc4bbc4f790fd35d0796866fb51c7bbe6151456..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 5ae5adefa115c69f3f3232a3cbcdbd76ec981f48..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 8006f904a35099bc9167620466f37d45d70c4a3c..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
deleted file mode 100644
index 8922b3213e3a9a8f5de982f84330b80e6a8cd56f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings
deleted file mode 100644
index 32d3107f92c5818ce9200dbfa6ac7557386daca5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index bc13d0c06c81faa50e4f1404a05506619fa8324e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
deleted file mode 100644
index f8f1f1c37f799b47ef73cecac3e8d8149d6e8001..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 7b2b40e6c955bffa0063af91151859413bff4270..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
deleted file mode 100644
index 6577569feb5a6d42e00687e463ce9e6c5cff7491..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr_CA.lproj b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
deleted file mode 120000
index f9834a3..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
+++ /dev/null
@@ -1 +0,0 @@
-fr.lproj
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings
deleted file mode 100644
index 99124ccc883a905ef09fa95908aeecfb0d3bc758..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 3550df4c34d6bd559f73a3f4b1a0ae9fa89194e0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 683ad629d6361f507ea33a98d301df3972172323..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 6551540dee74d58a785249ef17fa845620764026..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
deleted file mode 100644
index 74ae72802ab6eea84ff81f1c2b06038d91a854ec..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 74eb0267e72576f714a2290118fea9195b6f12a0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
deleted file mode 100644
index a7bc37b45bd1d4fb2e524cd0c786d0da60e461cd..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 7581873f9867acd1077b8bd7359f47da5b64c92e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
deleted file mode 100644
index f7fb93581c1f605eabf34ce774f53153f802f8d0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 7207576b38fde389599ba9b21914378f79d347d1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 5479c403ae68ecb811dfc77a19626c3bdfda740b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 67c837f1ff6cdac9775d593b2a5c0a00a06fea9e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
deleted file mode 100644
index 1925ba49ba6ca45875e261be25205e196d09547b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 95105afd5b2aef0ec6afe4ebd2d209c69ae477e8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 5a815712879ce26b67c8d013fe39d18bb9762bfe..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 8cecd70a4901aa4c1946dfefe6c3efcd27306465..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings
deleted file mode 100644
index c6ecfbacb49ef0207da2d81d045abb60b41acf05..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index ab9491fb0f986cef00b1a676e3da78ab068cd1f0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 14bcaf7264f78e29a215d4a0e1815224fd2eee6a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 54e248f9a8ada3c5b726d3d50c31c1c617dcdcc1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings
deleted file mode 100644
index 25e207938302eca2f2264dd4158f52c2d0ac1c97..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index f60fb1d0bf53e9579f7ee1d1e2306c721ca245f7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 7da34c239ef3bc038d5496cbddc03b6b233744a7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 516751a65e3590074b6ff28dc4d2c6f25cdffbf5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings
deleted file mode 100644
index de38912253dc032215601ad3b25edd3d2dc564d1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index a7ae98316f8c3f8d431f0bb7c7c6e24e1d3c20ad..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
deleted file mode 100644
index d7a2f0f9d3e38efd4ac593933cc34dcf09899e45..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 616cf6a058d3cd63e970ca25a9611b55ed0c2714..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings
deleted file mode 100644
index e366e3bf1c3af220a30e6511eb0d91b68dd920a4..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt.lproj b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt.lproj
deleted file mode 120000
index 3c1c9f6..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt.lproj
+++ /dev/null
@@ -1 +0,0 @@
-pt_BR.lproj
\ No newline at end of file
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index c04684b2e32de548d64a39421a2548e33a5e1b91..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
deleted file mode 100644
index c0831eed546ffb59c0689ad23b6fde8b8fbf3531..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index da41ed28e35dafdcaece3fd7c5f2ff7b25a69f03..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
deleted file mode 100644
index 300fc86abbd16d76fbda6f5510bfe2ba97bb5bcf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index a7c83d717b2b951fd56e273799229d08e9daeac6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 7ae5322387248317ffe05ca2d12b6c672e7111b2..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 9864c7aa93808526a6a2f52038d467ac7108d794..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings
deleted file mode 100644
index d3eddf75d7ae2e72906e373c358556da79d9a289..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index eace82c800f2e87c942f377fc650bd32ea3fe8d6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
deleted file mode 100644
index e22df981990edd70ed152b33655e8c1c0e1d1e01..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index fbb2a4bfb67f660b4979d7d0ce6d8667da0973c6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
deleted file mode 100644
index 28a407bc99316ddd09ddaede03725dd0eafc2adb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index df2f8172a660d80e51581072496b2bf79784fe30..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 1e69dbe4778bd81265f03cee10bde46623061fd3..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index b85d061738e41486d5a68683be26a46d1d47855d..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
deleted file mode 100644
index d5cb607305cd82251f35ce457cbac19bbb7509b2..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index c6aa94507a013be0b93988d2381e0fc42fd83d19..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 5ce8b5ffc721f9270e6bd9797f54f48dda64e18b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index fc3a83ce1a9371b0f908e101b2d3e2296838e156..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings
deleted file mode 100644
index 949fb16ef581590fe705483512d69812b8d44c4a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 58d1b2798ac5700272d00d4fd9cf23a6ee63ac52..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
deleted file mode 100644
index b3ff81800f2f56af6883631fde023abb3f6bfa12..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 02738220fcc84ffc9dacdc832d884e424e89221e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
deleted file mode 100644
index c1ce5a04ef8b34a40093dfe3f0e194d24eb4f6c0..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 84a4996a75c051c484b59c1ae383feb84e77b100..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
deleted file mode 100644
index a89378cb0febecd1d4779af45e22d6e86f299c8c..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index d2abca1ec4dbfac1967d8842b680428b71a94aaf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings
deleted file mode 100644
index e65ac55916230e88d83954d796de62b90c9803a1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index f16caf04fa0789a405a5a9d21eb320daf2f44705..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 31295fc38caec4f8c9a162ab9efb7cbfd9affdde..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index 6f575498dfa5d2571b51f6d5f6cf6c2cc13326e2..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
deleted file mode 100644
index fc728fd554695c0f04861bce32d3fc4961fed783..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 08c15cbe415f62b7834c33a42c069c14189aa273..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
deleted file mode 100644
index cc72ff88c89e012d9e101614eba12ecf768bd658..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index aa2c54debab83ed53f972ed043a21abc09393441..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
deleted file mode 100644
index c41e3dba0ea2936072ebf80b28bebc3ec8448a9a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index 987d91502ae92b9148f3a46c23d0fe4a43922f27..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 1a77ccfc5d9b8a1ae3f243679f923e37416152dd..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index bdce46213cfd7f7ced1751b4b031c0ce0218e1e9..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
deleted file mode 100644
index 521656d3887f753baed755bd7845e5a0b38a0504..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index d4e07287a0da1cda9d9f48a258c07ab6c960a02f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 0bf6286372de176731a07b280f0260f0f638c33d..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index b371b0dfb515f698e3913edbc4df9b74dd6aa8f5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings
deleted file mode 100644
index 0e91210e5ed31beb52fcd2324d3db6c4408ea851..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
deleted file mode 100644
index e204c1a4e733fcae2f2f9ec38fce57f1adc2d1bf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
deleted file mode 100644
index 5f242053f91fe935a7e601f8b7e20bbdd9e7ff76..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
deleted file mode 100644
index fb32ddc941c0188b7b5784915bac1ab95baac9d1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings b/Pods/Sparkle/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings
deleted file mode 100644
index ea8c82f97f3208c9b6f8beca72610bbacba390cb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/A/Sparkle b/Pods/Sparkle/Sparkle.framework/Versions/A/Sparkle
deleted file mode 100755
index 158a2592318b6f0553eca1ed3ee1dbac7a149e06..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Pods/Sparkle/Sparkle.framework/Versions/Current b/Pods/Sparkle/Sparkle.framework/Versions/Current
deleted file mode 120000
index 8c7e5a6..0000000
--- a/Pods/Sparkle/Sparkle.framework/Versions/Current
+++ /dev/null
@@ -1 +0,0 @@
-A
\ No newline at end of file
diff --git a/Pods/StartAtLoginController/README.md b/Pods/StartAtLoginController/README.md
deleted file mode 100644
index ae88afc..0000000
--- a/Pods/StartAtLoginController/README.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# StartAtLoginController
-
-Easy to use controller that makes use of the [Cocoa ServiceManagement APIs][SM]. This is the required way to do login items for sandboxed applications (required for all Mac App Store apps) and works in non-sandboxed applications as well.
-
-It's been tested on 10.7 and 10.8 (and should work on 10.6.6+). Entries set by this class do not appear in the Accounts Panel of System Preferences.
-
-## HOW-TO
-
-### Helper Bundle
-
-You must create an instance of the controller and set its bundle identifier to use to your helper bundle. (It must point to a helper bundle that has LSBackgroundOnly or LSUIElement set to YES in its Info.plist and put this bundle in Contents/Library/LoginItems).
-
-For sandboxed apps, sign it with the same entitlements and developer id. Also, your can only be launched at login if it has been copied to `/Applications`.
-
-Here is an example of a helper bundle:
-
-	- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
-	{
-		NSString *appPath = [[[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]  stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]; 
-		// get to the waaay top. Goes through LoginItems, Library, Contents, Applications
-		[[NSWorkspace sharedWorkspace] launchApplication:appPath];
-		[NSApp terminate:nil];
-	}
-	
-You can find a decent tutorial about this at [Tim Schröder's blog post "The Launch At Login Sandbox Project"][Tutorial].
-	
-### Main Application
-
-Then in your application
-
- * add the framework `ServiceManagement` and 
- * add the files `StartAtLoginController.{h,m}`
- 
-to your main app's target. You can use the controller either in code or with the interface builder.
-
-#### Programmatically
-
-When using in code, create an instance of `StartAtLoginController` by providing the helper app's bundle identifier:
-
-	StartAtLoginController *loginController = [[StartAtLoginController alloc] initWithIdentifier:@"your.app.helpers.bundle.id"];
-	
-Now, you can manipulate the Services Entry:
-
-	loginController.startAtLogin = YES; // adds the entry into LaunchServices and activates it
-	//
-	loginController.enabled = NO; // disables the entry on the services list
-	//
-	BOOL startsAtLogin = [loginController startAtLogin]; // gets the current enabled state
-	
-#### Interface Builder
-
-If you want to use the interface builder
-
- * Place a NSObject (the blue box) into the nib window
- * From the Inspector - **Identity Tab**
-   * Set the Class to `StartAtLoginController`
-   * Add the user defined runtime attribute `identifier` of type `String` and set it to your helper app's bundle identifier
- * Place a Checkbox on your Window/View
- * From the Inspector - **Bindings Tab**
-   * Unroll the > Value item
-   * Bind to `StartAtLoginController` with the Model Key Path `startAtLogin`
-
-## REQUIREMENTS
-
-Works only on 10.6.6 or later.
-
-## LICENSE
-
-This is licensed under MIT. Here is some legal jargon:
-
-Copyright (c) 2011 Alex Zielenski
-Copyright (c) 2012 Travis Tilley
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-[SM]: http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html
-[Tutorial]: http://blog.timschroeder.net/2012/07/03/the-launch-at-login-sandbox-project/
\ No newline at end of file
diff --git a/Pods/StartAtLoginController/StartAtLoginController.h b/Pods/StartAtLoginController/StartAtLoginController.h
deleted file mode 100644
index 2af541f..0000000
--- a/Pods/StartAtLoginController/StartAtLoginController.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2011 Alex Zielenski
-// Copyright (c) 2012 Travis Tilley
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense,  and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-#import <Foundation/Foundation.h>
-
-@interface StartAtLoginController : NSObject {
-    NSString *_identifier;
-    NSURL    *_url;
-    BOOL _enabled;
-}
-
-@property (assign, nonatomic, readwrite)   BOOL startAtLogin;
-@property (assign, nonatomic, readwrite)   BOOL enabled;
-@property (copy, nonatomic, readwrite)     NSString *identifier;
-
--(id)initWithIdentifier:(NSString*)identifier;
-
-@end
diff --git a/Pods/StartAtLoginController/StartAtLoginController.m b/Pods/StartAtLoginController/StartAtLoginController.m
deleted file mode 100644
index e1875ac..0000000
--- a/Pods/StartAtLoginController/StartAtLoginController.m
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2011 Alex Zielenski
-// Copyright (c) 2012 Travis Tilley
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense,  and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-#import "StartAtLoginController.h"
-#import <ServiceManagement/ServiceManagement.h>
-
-@implementation StartAtLoginController
-
-@synthesize identifier = _identifier;
-
-#if !__has_feature(objc_arc)
-- (void)dealloc {
-    self.identifier = nil;
-    [super dealloc];
-}
-#endif
-
-+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
-    BOOL automatic = NO;
-    
-    if ([theKey isEqualToString:@"startAtLogin"]) {
-        automatic = NO;
-    } else if ([theKey isEqualToString:@"enabled"]) {
-        automatic = NO;
-    } else {
-        automatic=[super automaticallyNotifiesObserversForKey:theKey];
-    }
-    
-    return automatic;
-}
-
--(id)initWithIdentifier:(NSString*)identifier {
-    self = [self init];
-    if(self) {
-        self.identifier = identifier;
-    }
-    return self;
-}
-
--(void)setIdentifier:(NSString *)identifier {
-    _identifier = identifier;
-    [self startAtLogin];
-#if !defined(NDEBUG)
-    NSLog(@"Launcher '%@' %@ configured to start at login",
-          self.identifier, (_enabled ? @"is" : @"is not"));
-#endif
-}
-
-- (BOOL)startAtLogin {
-    if (!_identifier)
-        return NO;
-    
-    BOOL isEnabled  = NO;
-    
-    // the easy and sane method (SMJobCopyDictionary) can pose problems when sandboxed. -_-
-    CFArrayRef cfJobDicts = SMCopyAllJobDictionaries(kSMDomainUserLaunchd);
-    NSArray* jobDicts = CFBridgingRelease(cfJobDicts);
-    
-    if (jobDicts && [jobDicts count] > 0) {
-        for (NSDictionary* job in jobDicts) {
-            if ([_identifier isEqualToString:[job objectForKey:@"Label"]]) {
-                isEnabled = [[job objectForKey:@"OnDemand"] boolValue];
-                break;
-            }
-        }
-    }
-    
-    if (isEnabled != _enabled) {
-        [self willChangeValueForKey:@"enabled"];
-        _enabled = isEnabled;
-        [self didChangeValueForKey:@"enabled"];
-    }
-    
-    return isEnabled;
-}
-
-- (void)setStartAtLogin:(BOOL)flag {
-    if (!_identifier)
-        return;
-    
-    [self willChangeValueForKey:@"startAtLogin"];
-    
-    if (!SMLoginItemSetEnabled((__bridge CFStringRef)_identifier, (flag) ? true : false)) {
-        NSLog(@"SMLoginItemSetEnabled failed!");
-        
-        [self willChangeValueForKey:@"enabled"];
-        _enabled = NO;
-        [self didChangeValueForKey:@"enabled"];
-    } else {
-        [self willChangeValueForKey:@"enabled"];
-        _enabled = YES;
-        [self didChangeValueForKey:@"enabled"];
-    }
-    
-    [self didChangeValueForKey:@"startAtLogin"];
-}
-
-- (BOOL)enabled
-{
-    return _enabled;
-}
-
-- (void)setEnabled:(BOOL)enabled
-{
-    [self setStartAtLogin:enabled];
-}
-
-@end
diff --git a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-dummy.m b/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-dummy.m
deleted file mode 100644
index 8038746..0000000
--- a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_ISO8601DateFormatter : NSObject
-@end
-@implementation PodsDummy_ISO8601DateFormatter
-@end
diff --git a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch b/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch
deleted file mode 100644
index b9c163b..0000000
--- a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter-prefix.pch	
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
diff --git a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig b/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig
deleted file mode 100644
index 7f08449..0000000
--- a/Pods/Target Support Files/ISO8601DateFormatter/ISO8601DateFormatter.xcconfig	
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m b/Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m
deleted file mode 100644
index 0757dcc..0000000
--- a/Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_MASShortcut : NSObject
-@end
-@implementation PodsDummy_MASShortcut
-@end
diff --git a/Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch b/Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch
deleted file mode 100644
index b9c163b..0000000
--- a/Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch	
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
diff --git a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig b/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig
deleted file mode 100644
index 773f68b..0000000
--- a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig	
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MASShortcut
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MASShortcut" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = -framework "Carbon"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown
deleted file mode 100644
index d3b6803..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.markdown	
+++ /dev/null
@@ -1,181 +0,0 @@
-# Acknowledgements
-This application makes use of the following third party libraries:
-
-## ISO8601DateFormatter
-
-Copyright © 2006–2013 Peter Hosey
- All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-Neither the name of Peter Hosey nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## MASShortcut
-
-Copyright (c) 2012-2013, Vadim Shpakovski
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## RHPreferences
-
-Copyright (c) 2012 Richard Heard. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-## Sparkle
-
-Copyright (c) 2006-2013 Andy Matuschak.
-Copyright (c) 2009-2013 Elgato Systems GmbH.
-Copyright (c) 2011-2014 Kornel Lesiński.
-Copyright (c) 2014 C.W. Betts.
-Copyright (c) 2014 Petroules Corporation.
-Copyright (c) 2014 Big Nerd Ranch.
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-=================
-EXTERNAL LICENSES
-=================
-
-bspatch.c and bsdiff.c, from bsdiff 4.3 <http://www.daemonology.net/bsdiff/>:
-    Copyright (c) 2003-2005 Colin Percival.
-
-sais.c and sais.c, from sais-lite (2010/08/07) <https://sites.google.com/site/yuta256/sais>:
-    Copyright (c) 2008-2010 Yuta Mori.
-
-SUDSAVerifier.m:
-    Copyright (c) 2011 Mark Hamlin.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-
-## StartAtLoginController
-
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the 'Software'), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
-
-
-## WebViewJavascriptBridge
-
-Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Generated by CocoaPods - https://cocoapods.org
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist
deleted file mode 100644
index 6ceb37a..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-acknowledgements.plist	
+++ /dev/null
@@ -1,241 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>PreferenceSpecifiers</key>
-	<array>
-		<dict>
-			<key>FooterText</key>
-			<string>This application makes use of the following third party libraries:</string>
-			<key>Title</key>
-			<string>Acknowledgements</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Copyright &#169; 2006&#8211;2013 Peter Hosey
- All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-Neither the name of Peter Hosey nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</string>
-			<key>License</key>
-			<string>BSD</string>
-			<key>Title</key>
-			<string>ISO8601DateFormatter</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Copyright (c) 2012-2013, Vadim Shpakovski
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</string>
-			<key>Title</key>
-			<string>MASShortcut</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Copyright (c) 2012 Richard Heard. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</string>
-			<key>License</key>
-			<string>Modified BSD</string>
-			<key>Title</key>
-			<string>RHPreferences</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Copyright (c) 2006-2013 Andy Matuschak.
-Copyright (c) 2009-2013 Elgato Systems GmbH.
-Copyright (c) 2011-2014 Kornel Lesi&#324;ski.
-Copyright (c) 2014 C.W. Betts.
-Copyright (c) 2014 Petroules Corporation.
-Copyright (c) 2014 Big Nerd Ranch.
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-=================
-EXTERNAL LICENSES
-=================
-
-bspatch.c and bsdiff.c, from bsdiff 4.3 &lt;http://www.daemonology.net/bsdiff/&gt;:
-    Copyright (c) 2003-2005 Colin Percival.
-
-sais.c and sais.c, from sais-lite (2010/08/07) &lt;https://sites.google.com/site/yuta256/sais&gt;:
-    Copyright (c) 2008-2010 Yuta Mori.
-
-SUDSAVerifier.m:
-    Copyright (c) 2011 Mark Hamlin.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-</string>
-			<key>License</key>
-			<string>MIT</string>
-			<key>Title</key>
-			<string>Sparkle</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the 'Software'), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
-</string>
-			<key>License</key>
-			<string>MIT</string>
-			<key>Title</key>
-			<string>StartAtLoginController</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-</string>
-			<key>License</key>
-			<string>MIT</string>
-			<key>Title</key>
-			<string>WebViewJavascriptBridge</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>Generated by CocoaPods - https://cocoapods.org</string>
-			<key>Title</key>
-			<string></string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
-	</array>
-	<key>StringsTable</key>
-	<string>Acknowledgements</string>
-	<key>Title</key>
-	<string>Acknowledgements</string>
-</dict>
-</plist>
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m
deleted file mode 100644
index f22c812..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_Pods_quark_shell : NSObject
-@end
-@implementation PodsDummy_Pods_quark_shell
-@end
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh
deleted file mode 100755
index 21a96fd..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-frameworks.sh	
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/sh
-set -e
-
-echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-
-SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
-
-install_framework()
-{
-  if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
-    local source="${BUILT_PRODUCTS_DIR}/$1"
-  elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
-    local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
-  elif [ -r "$1" ]; then
-    local source="$1"
-  fi
-
-  local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-
-  if [ -L "${source}" ]; then
-      echo "Symlinked..."
-      source="$(readlink "${source}")"
-  fi
-
-  # use filter instead of exclude so missing patterns dont' throw errors
-  echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
-  rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
-
-  local basename
-  basename="$(basename -s .framework "$1")"
-  binary="${destination}/${basename}.framework/${basename}"
-  if ! [ -r "$binary" ]; then
-    binary="${destination}/${basename}"
-  fi
-
-  # Strip invalid architectures so "fat" simulator / device frameworks work on device
-  if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
-    strip_invalid_archs "$binary"
-  fi
-
-  # Resign the code if required by the build settings to avoid unstable apps
-  code_sign_if_enabled "${destination}/$(basename "$1")"
-
-  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
-  if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
-    local swift_runtime_libs
-    swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u  && exit ${PIPESTATUS[0]})
-    for lib in $swift_runtime_libs; do
-      echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
-      rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
-      code_sign_if_enabled "${destination}/${lib}"
-    done
-  fi
-}
-
-# Signs a framework with the provided identity
-code_sign_if_enabled() {
-  if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
-    # Use the current code_sign_identitiy
-    echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
-    echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\""
-    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1"
-  fi
-}
-
-# Strip invalid architectures
-strip_invalid_archs() {
-  binary="$1"
-  # Get architectures for current file
-  archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
-  stripped=""
-  for arch in $archs; do
-    if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then
-      # Strip non-valid architectures in-place
-      lipo -remove "$arch" -output "$binary" "$binary" || exit 1
-      stripped="$stripped $arch"
-    fi
-  done
-  if [[ "$stripped" ]]; then
-    echo "Stripped $binary of architectures:$stripped"
-  fi
-}
-
-
-if [[ "$CONFIGURATION" == "Debug" ]]; then
-  install_framework "${PODS_ROOT}/Sparkle/Sparkle.framework"
-fi
-if [[ "$CONFIGURATION" == "Release" ]]; then
-  install_framework "${PODS_ROOT}/Sparkle/Sparkle.framework"
-fi
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh
deleted file mode 100755
index e3b67f1..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell-resources.sh	
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/bin/sh
-set -e
-
-mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-
-RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
-> "$RESOURCES_TO_COPY"
-
-XCASSET_FILES=()
-
-case "${TARGETED_DEVICE_FAMILY}" in
-  1,2)
-    TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
-    ;;
-  1)
-    TARGET_DEVICE_ARGS="--target-device iphone"
-    ;;
-  2)
-    TARGET_DEVICE_ARGS="--target-device ipad"
-    ;;
-  *)
-    TARGET_DEVICE_ARGS="--target-device mac"
-    ;;
-esac
-
-install_resource()
-{
-  if [[ "$1" = /* ]] ; then
-    RESOURCE_PATH="$1"
-  else
-    RESOURCE_PATH="${PODS_ROOT}/$1"
-  fi
-  if [[ ! -e "$RESOURCE_PATH" ]] ; then
-    cat << EOM
-error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
-EOM
-    exit 1
-  fi
-  case $RESOURCE_PATH in
-    *.storyboard)
-      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
-      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
-      ;;
-    *.xib)
-      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
-      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
-      ;;
-    *.framework)
-      echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
-      ;;
-    *.xcdatamodel)
-      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\""
-      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
-      ;;
-    *.xcdatamodeld)
-      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\""
-      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
-      ;;
-    *.xcmappingmodel)
-      echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\""
-      xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
-      ;;
-    *.xcassets)
-      ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
-      XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
-      ;;
-    *)
-      echo "$RESOURCE_PATH"
-      echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
-      ;;
-  esac
-}
-if [[ "$CONFIGURATION" == "Debug" ]]; then
-  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
-fi
-if [[ "$CONFIGURATION" == "Release" ]]; then
-  install_resource "RHPreferences/RHPreferences/RHPreferencesWindow.xib"
-fi
-
-mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
-  mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-fi
-rm -f "$RESOURCES_TO_COPY"
-
-if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
-then
-  # Find all other xcassets (this unfortunately includes those of path pods and other targets).
-  OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
-  while read line; do
-    if [[ $line != "${PODS_ROOT}*" ]]; then
-      XCASSET_FILES+=("$line")
-    fi
-  done <<<"$OTHER_XCASSETS"
-
-  printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
-fi
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig
deleted file mode 100644
index 934d233..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig	
+++ /dev/null
@@ -1,11 +0,0 @@
-ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle"
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
-LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RHPreferences" "$PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -l"WebViewJavascriptBridge" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle" -framework "WebKit"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}/Pods
diff --git a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig b/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig
deleted file mode 100644
index 934d233..0000000
--- a/Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig	
+++ /dev/null
@@ -1,11 +0,0 @@
-ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Sparkle"
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
-LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ISO8601DateFormatter" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RHPreferences" "$PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" -isystem "${PODS_ROOT}/Headers/Public/MASShortcut" -isystem "${PODS_ROOT}/Headers/Public/RHPreferences" -isystem "${PODS_ROOT}/Headers/Public/Sparkle" -isystem "${PODS_ROOT}/Headers/Public/StartAtLoginController" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatter" -l"MASShortcut" -l"RHPreferences" -l"StartAtLoginController" -l"WebViewJavascriptBridge" -framework "Carbon" -framework "Cocoa" -framework "ServiceManagement" -framework "Sparkle" -framework "WebKit"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}/Pods
diff --git a/Pods/Target Support Files/RHPreferences/RHPreferences-dummy.m b/Pods/Target Support Files/RHPreferences/RHPreferences-dummy.m
deleted file mode 100644
index 5e8b3cb..0000000
--- a/Pods/Target Support Files/RHPreferences/RHPreferences-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_RHPreferences : NSObject
-@end
-@implementation PodsDummy_RHPreferences
-@end
diff --git a/Pods/Target Support Files/RHPreferences/RHPreferences-prefix.pch b/Pods/Target Support Files/RHPreferences/RHPreferences-prefix.pch
deleted file mode 100644
index 3259298..0000000
--- a/Pods/Target Support Files/RHPreferences/RHPreferences-prefix.pch	
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
-//
-// Prefix header for all source files of the 'RHPreferences' target in the 'RHPreferences' project
-//
-
-#ifdef __OBJC__
-    #import <Cocoa/Cocoa.h>
-#endif
diff --git a/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig b/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig
deleted file mode 100644
index ed5dc20..0000000
--- a/Pods/Target Support Files/RHPreferences/RHPreferences.xcconfig	
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RHPreferences
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RHPreferences" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = -framework "Cocoa"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-dummy.m b/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-dummy.m
deleted file mode 100644
index 4ecdb19..0000000
--- a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_StartAtLoginController : NSObject
-@end
-@implementation PodsDummy_StartAtLoginController
-@end
diff --git a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch b/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch
deleted file mode 100644
index b9c163b..0000000
--- a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController-prefix.pch	
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
diff --git a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig b/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig
deleted file mode 100644
index be459c0..0000000
--- a/Pods/Target Support Files/StartAtLoginController/StartAtLoginController.xcconfig	
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/StartAtLoginController
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/StartAtLoginController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = -framework "ServiceManagement"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m
deleted file mode 100644
index 6c5914c..0000000
--- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m	
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_WebViewJavascriptBridge : NSObject
-@end
-@implementation PodsDummy_WebViewJavascriptBridge
-@end
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch
deleted file mode 100644
index b9c163b..0000000
--- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch	
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig
deleted file mode 100644
index 4717295..0000000
--- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig	
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/MASShortcut" "${PODS_ROOT}/Headers/Public/RHPreferences" "${PODS_ROOT}/Headers/Public/Sparkle" "${PODS_ROOT}/Headers/Public/StartAtLoginController" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge"
-OTHER_LDFLAGS = -framework "WebKit"
-PODS_BUILD_DIR = $BUILD_DIR
-PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
diff --git a/Pods/WebViewJavascriptBridge/LICENSE b/Pods/WebViewJavascriptBridge/LICENSE
deleted file mode 100644
index 56b0824..0000000
--- a/Pods/WebViewJavascriptBridge/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Pods/WebViewJavascriptBridge/README.md b/Pods/WebViewJavascriptBridge/README.md
deleted file mode 100644
index ab7af42..0000000
--- a/Pods/WebViewJavascriptBridge/README.md
+++ /dev/null
@@ -1,219 +0,0 @@
-WebViewJavascriptBridge
-=======================
-
-[![Build Status](https://travis-ci.org/marcuswestin/WebViewJavascriptBridge.svg)](https://travis-ci.org/marcuswestin/WebViewJavascriptBridge)
-
-An iOS/OSX bridge for sending messages between Obj-C and JavaScript in UIWebViews/WebViews.
-
-Who uses WebViewJavascriptBridge?
----------------------------------
-WebViewJavascriptBridge is used by a range of companies and projects. This is a small and incomplete sample list:
-
-- [Facebook Messenger](https://www.facebook.com/mobile/messenger)
-- [Facebook Paper](https://facebook.com/paper)
-- [Yardsale](http://www.getyardsale.com/)
-- [EverTrue](http://www.evertrue.com/)
-- [Game Insight](http://www.game-insight.com/)
-- [Sush.io](http://www.sush.io)
-- [Imbed](http://imbed.github.io/)
-- [CareZone](https://carezone.com)
-- [Hemlig](http://www.hemlig.co)
-- [Altralogica](http://www.altralogica.it)
-- [鼎盛中华](https://itunes.apple.com/us/app/ding-sheng-zhong-hua/id537273940?mt=8)
-- [FRIL](https://fril.jp)
-- [留白·WHITE](http://liubaiapp.com)
-
-Installation (iOS & OSX)
-------------------------
-
-### Installation with CocoaPods
-Add this to your [podfile](https://guides.cocoapods.org/using/getting-started.html) and run `pod install` to install:
-
-```ruby
-`pod 'WebViewJavascriptBridge', '~> 5.0'`
-```
-
-### Manual installation
-
-Drag the `WebViewJavascriptBridge` folder into your project.
-
-In the dialog that appears, uncheck "Copy items into destination group's folder" and select "Create groups for any folders".
-
-Examples
---------
-
-See the `Example Apps/` folder. Open either the iOS or OSX project and hit run to see it in action.
-
-To use a WebViewJavascriptBridge in your own project:
-
-Usage
------
-
-1) Import the header file and declare an ivar property:
-
-```objc
-#import "WebViewJavascriptBridge.h"
-```
-
-...
-
-```objc
-@property WebViewJavascriptBridge* bridge;
-```
-
-2) Instantiate WebViewJavascriptBridge with a UIWebView (iOS) or WebView (OSX):
-
-```objc
-self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
-```
-
-3) Register a handler in ObjC, and call a JS handler:
-
-```objc
-[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {
-	NSLog(@"ObjC Echo called with: %@", data);
-	responseCallback(data);
-}];
-[self.bridge callHandler:@"JS Echo" responseCallback:^(id responseData) {
-	NSLog(@"ObjC received response: %@", responseData);
-}];
-```
-
-4) Copy and paste `setupWebViewJavascriptBridge` into your JS:
-	
-```javascript
-function setupWebViewJavascriptBridge(callback) {
-	if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
-	if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
-	window.WVJBCallbacks = [callback];
-	var WVJBIframe = document.createElement('iframe');
-	WVJBIframe.style.display = 'none';
-	WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
-	document.documentElement.appendChild(WVJBIframe);
-	setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
-}
-```
-
-5) Finally, call `setupWebViewJavascriptBridge` and then use the bridge to register handlers and call ObjC handlers:
-
-```javascript
-setupWebViewJavascriptBridge(function(bridge) {
-	
-	/* Initialize your app here */
-
-	bridge.registerHandler('JS Echo', function(data, responseCallback) {
-		console.log("JS Echo called with:", data)
-		responseCallback(data)
-	})
-	bridge.callHandler('ObjC Echo', function responseCallback(responseData) {
-		console.log("JS received response:", responseData)
-	})
-})
-```
-
-WKWebView Support (iOS 8+ & OS 10.10+)
---------------------------------------
-
-(WARNING: WKWebView still has [bugs and missing network APIs.](https://github.com/ShingoFukuyama/WKWebViewTips/blob/master/README.md) It may not be a simple drop-in replacement).
-
-WebViewJavascriptBridge supports [WKWebView](http://nshipster.com/wkwebkit/) for iOS 8 and OSX Yosemite. In order to use WKWebView you need to instantiate the `WKWebViewJavascriptBridge`. The rest of the `WKWebViewJavascriptBridge` API is the same as `WebViewJavascriptBridge`.
-
-1) Import the header file:
-
-```objc
-#import "WKWebViewJavascriptBridge.h"
-```
-
-2) Instantiate WKWebViewJavascriptBridge and with a WKWebView object
-
-```objc
-WKWebViewJavascriptBridge* bridge = [WKWebViewJavascriptBridge bridgeForWebView:webView];
-```
-
-Contributors & Forks
---------------------
-Contributors: https://github.com/marcuswestin/WebViewJavascriptBridge/graphs/contributors
-
-Forks: https://github.com/marcuswestin/WebViewJavascriptBridge/network/members
-
-API Reference
--------------
-
-### ObjC API
-
-##### `[WebViewJavascriptBridge bridgeForWebView:(UIWebView/WebView*)webview`
-
-Create a javascript bridge for the given web view.
-
-Example:
-
-```objc	
-[WebViewJavascriptBridge bridgeForWebView:webView];
-```
-
-##### `[bridge registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler]`
-
-Register a handler called `handlerName`. The javascript can then call this handler with `WebViewJavascriptBridge.callHandler("handlerName")`.
-
-Example:
-
-```objc
-[self.bridge registerHandler:@"getScreenHeight" handler:^(id data, WVJBResponseCallback responseCallback) {
-	responseCallback([NSNumber numberWithInt:[UIScreen mainScreen].bounds.size.height]);
-}];
-[self.bridge registerHandler:@"log" handler:^(id data, WVJBResponseCallback responseCallback) {
-	NSLog(@"Log: %@", data);
-}];
-
-```
-
-##### `[bridge callHandler:(NSString*)handlerName data:(id)data]`
-##### `[bridge callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)callback]`
-
-Call the javascript handler called `handlerName`. If a `responseCallback` block is given the javascript handler can respond.
-
-Example:
-
-```objc
-[self.bridge callHandler:@"showAlert" data:@"Hi from ObjC to JS!"];
-[self.bridge callHandler:@"getCurrentPageUrl" data:nil responseCallback:^(id responseData) {
-	NSLog(@"Current UIWebView page URL is: %@", responseData);
-}];
-```
-
-#### `[bridge setWebViewDelegate:UIWebViewDelegate*)webViewDelegate]`
-
-Optionally, set a `UIWebViewDelegate` if you need to respond to the [web view's lifecycle events](http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html).
-
-
-
-
-### Javascript API
-
-##### `bridge.registerHandler("handlerName", function(responseData) { ... })`
-
-Register a handler called `handlerName`. The ObjC can then call this handler with `[bridge callHandler:"handlerName" data:@"Foo"]` and `[bridge callHandler:"handlerName" data:@"Foo" responseCallback:^(id responseData) { ... }]`
-
-Example:
-
-```javascript
-bridge.registerHandler("showAlert", function(data) { alert(data) })
-bridge.registerHandler("getCurrentPageUrl", function(data, responseCallback) {
-	responseCallback(document.location.toString())
-})
-```
-
-
-##### `bridge.callHander("handlerName", data)`
-##### `bridge.callHander("handlerName", data, function responseCallback(responseData) { ... })`
-
-Call an ObjC handler called `handlerName`. If a `responseCallback` function is given the ObjC handler can respond.
-
-Example:
-
-```javascript
-bridge.callHandler("Log", "Foo")
-bridge.callHandler("getScreenHeight", null, function(response) {
-	alert('Screen height:' + response)
-})
-```
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
deleted file mode 100644
index 99859f0..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-//  WKWebViewJavascriptBridge.h
-//
-//  Created by @LokiMeyburg on 10/15/14.
-//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
-//
-
-#if (__MAC_OS_X_VERSION_MAX_ALLOWED > __MAC_10_9 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_1)
-#define supportsWKWebKit
-#endif
-
-#if defined(supportsWKWebKit )
-
-#import <Foundation/Foundation.h>
-#import "WebViewJavascriptBridgeBase.h"
-#import <WebKit/WebKit.h>
-
-@interface WKWebViewJavascriptBridge : NSObject<WKNavigationDelegate, WebViewJavascriptBridgeBaseDelegate>
-
-+ (instancetype)bridgeForWebView:(WKWebView*)webView;
-+ (void)enableLogging;
-
-- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
-- (void)callHandler:(NSString*)handlerName;
-- (void)callHandler:(NSString*)handlerName data:(id)data;
-- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
-- (void)reset;
-- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate;
-
-@end
-
-#endif
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
deleted file mode 100644
index 88679fb..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m
+++ /dev/null
@@ -1,172 +0,0 @@
-//
-//  WKWebViewJavascriptBridge.m
-//
-//  Created by @LokiMeyburg on 10/15/14.
-//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
-//
-
-
-#import "WKWebViewJavascriptBridge.h"
-
-#if defined(supportsWKWebKit)
-
-@implementation WKWebViewJavascriptBridge {
-    WKWebView* _webView;
-    id<WKNavigationDelegate> _webViewDelegate;
-    long _uniqueId;
-    WebViewJavascriptBridgeBase *_base;
-}
-
-/* API
- *****/
-
-+ (void)enableLogging { [WebViewJavascriptBridgeBase enableLogging]; }
-
-+ (instancetype)bridgeForWebView:(WKWebView*)webView {
-    WKWebViewJavascriptBridge* bridge = [[self alloc] init];
-    [bridge _setupInstance:webView];
-    [bridge reset];
-    return bridge;
-}
-
-- (void)send:(id)data {
-    [self send:data responseCallback:nil];
-}
-
-- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
-    [_base sendData:data responseCallback:responseCallback handlerName:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName {
-    [self callHandler:handlerName data:nil responseCallback:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName data:(id)data {
-    [self callHandler:handlerName data:data responseCallback:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
-    [_base sendData:data responseCallback:responseCallback handlerName:handlerName];
-}
-
-- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
-    _base.messageHandlers[handlerName] = [handler copy];
-}
-
-- (void)reset {
-    [_base reset];
-}
-
-- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate {
-    _webViewDelegate = webViewDelegate;
-}
-
-/* Internals
- ***********/
-
-- (void)dealloc {
-    _base = nil;
-    _webView = nil;
-    _webViewDelegate = nil;
-    _webView.navigationDelegate = nil;
-}
-
-
-/* WKWebView Specific Internals
- ******************************/
-
-- (void) _setupInstance:(WKWebView*)webView {
-    _webView = webView;
-    _webView.navigationDelegate = self;
-    _base = [[WebViewJavascriptBridgeBase alloc] init];
-    _base.delegate = self;
-}
-
-
-- (void)WKFlushMessageQueue {
-    [_webView evaluateJavaScript:[_base webViewJavascriptFetchQueyCommand] completionHandler:^(NSString* result, NSError* error) {
-        if (error != nil) {
-            NSLog(@"WebViewJavascriptBridge: WARNING: Error when trying to fetch data from WKWebView: %@", error);
-        }
-        [_base flushMessageQueue:result];
-    }];
-}
-
-- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
-{
-    if (webView != _webView) { return; }
-    
-    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFinishNavigation:)]) {
-        [strongDelegate webView:webView didFinishNavigation:navigation];
-    }
-}
-
-
-- (void)webView:(WKWebView *)webView
-decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
-decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
-    if (webView != _webView) { return; }
-    NSURL *url = navigationAction.request.URL;
-    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
-
-    if ([_base isCorrectProcotocolScheme:url]) {
-        if ([_base isBridgeLoadedURL:url]) {
-            [_base injectJavascriptFile];
-        } else if ([_base isQueueMessageURL:url]) {
-            [self WKFlushMessageQueue];
-        } else {
-            [_base logUnkownMessage:url];
-        }
-        decisionHandler(WKNavigationActionPolicyCancel);
-    }
-    
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) {
-        [_webViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
-    } else {
-        decisionHandler(WKNavigationActionPolicyAllow);
-    }
-}
-
-- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
-    if (webView != _webView) { return; }
-    
-    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)]) {
-        [strongDelegate webView:webView didStartProvisionalNavigation:navigation];
-    }
-}
-
-
-- (void)webView:(WKWebView *)webView
-didFailNavigation:(WKNavigation *)navigation
-      withError:(NSError *)error {
-    if (webView != _webView) { return; }
-    
-    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailNavigation:withError:)]) {
-        [strongDelegate webView:webView didFailNavigation:navigation withError:error];
-    }
-}
-
-- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
-    if (webView != _webView) { return; }
-    
-    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailProvisionalNavigation:withError:)]) {
-        [strongDelegate webView:webView didFailProvisionalNavigation:navigation withError:error];
-    }
-}
-
-- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand
-{
-    [_webView evaluateJavaScript:javascriptCommand completionHandler:nil];
-    return NULL;
-}
-
-
-
-@end
-
-
-#endif
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
deleted file mode 100755
index aff0553..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-//  WebViewJavascriptBridge.h
-//  ExampleApp-iOS
-//
-//  Created by Marcus Westin on 6/14/13.
-//  Copyright (c) 2013 Marcus Westin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "WebViewJavascriptBridgeBase.h"
-
-#if defined __MAC_OS_X_VERSION_MAX_ALLOWED
-    #import <WebKit/WebKit.h>
-    #define WVJB_PLATFORM_OSX
-    #define WVJB_WEBVIEW_TYPE WebView
-    #define WVJB_WEBVIEW_DELEGATE_TYPE NSObject<WebViewJavascriptBridgeBaseDelegate>
-    #define WVJB_WEBVIEW_DELEGATE_INTERFACE NSObject<WebViewJavascriptBridgeBaseDelegate, WebPolicyDelegate>
-#elif defined __IPHONE_OS_VERSION_MAX_ALLOWED
-    #import <UIKit/UIWebView.h>
-    #define WVJB_PLATFORM_IOS
-    #define WVJB_WEBVIEW_TYPE UIWebView
-    #define WVJB_WEBVIEW_DELEGATE_TYPE NSObject<UIWebViewDelegate>
-    #define WVJB_WEBVIEW_DELEGATE_INTERFACE NSObject<UIWebViewDelegate, WebViewJavascriptBridgeBaseDelegate>
-#endif
-
-@interface WebViewJavascriptBridge : WVJB_WEBVIEW_DELEGATE_INTERFACE
-
-+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView;
-+ (void)enableLogging;
-+ (void)setLogMaxLength:(int)length;
-
-- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
-- (void)callHandler:(NSString*)handlerName;
-- (void)callHandler:(NSString*)handlerName data:(id)data;
-- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
-- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate;
-@end
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
deleted file mode 100755
index 20e88d4..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.m
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-//  WebViewJavascriptBridge.m
-//  ExampleApp-iOS
-//
-//  Created by Marcus Westin on 6/14/13.
-//  Copyright (c) 2013 Marcus Westin. All rights reserved.
-//
-
-#import "WebViewJavascriptBridge.h"
-
-#if __has_feature(objc_arc_weak)
-    #define WVJB_WEAK __weak
-#else
-    #define WVJB_WEAK __unsafe_unretained
-#endif
-
-@implementation WebViewJavascriptBridge {
-    WVJB_WEAK WVJB_WEBVIEW_TYPE* _webView;
-    WVJB_WEAK id _webViewDelegate;
-    long _uniqueId;
-    WebViewJavascriptBridgeBase *_base;
-}
-
-/* API
- *****/
-
-+ (void)enableLogging { [WebViewJavascriptBridgeBase enableLogging]; }
-+ (void)setLogMaxLength:(int)length { [WebViewJavascriptBridgeBase setLogMaxLength:length]; }
-
-+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView {
-    WebViewJavascriptBridge* bridge = [[self alloc] init];
-    [bridge _platformSpecificSetup:webView];
-    return bridge;
-}
-
-- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate {
-    _webViewDelegate = webViewDelegate;
-}
-
-- (void)send:(id)data {
-    [self send:data responseCallback:nil];
-}
-
-- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
-    [_base sendData:data responseCallback:responseCallback handlerName:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName {
-    [self callHandler:handlerName data:nil responseCallback:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName data:(id)data {
-    [self callHandler:handlerName data:data responseCallback:nil];
-}
-
-- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
-    [_base sendData:data responseCallback:responseCallback handlerName:handlerName];
-}
-
-- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
-    _base.messageHandlers[handlerName] = [handler copy];
-}
-
-/* Platform agnostic internals
- *****************************/
-
-- (void)dealloc {
-    [self _platformSpecificDealloc];
-    _base = nil;
-    _webView = nil;
-    _webViewDelegate = nil;
-}
-
-- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand
-{
-    return [_webView stringByEvaluatingJavaScriptFromString:javascriptCommand];
-}
-
-/* Platform specific internals: OSX
- **********************************/
-#if defined WVJB_PLATFORM_OSX
-
-- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView {
-    _webView = webView;
-    
-    _webView.policyDelegate = self;
-    
-    _base = [[WebViewJavascriptBridgeBase alloc] init];
-    _base.delegate = self;
-}
-
-- (void) _platformSpecificDealloc {
-    _webView.policyDelegate = nil;
-}
-
-- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
-{
-    if (webView != _webView) { return; }
-    
-    NSURL *url = [request URL];
-    if ([_base isCorrectProcotocolScheme:url]) {
-        if ([_base isBridgeLoadedURL:url]) {
-            [_base injectJavascriptFile];
-        } else if ([_base isQueueMessageURL:url]) {
-            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
-            [_base flushMessageQueue:messageQueueString];
-        } else {
-            [_base logUnkownMessage:url];
-        }
-        [listener ignore];
-    } else if (_webViewDelegate && [_webViewDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)]) {
-        [_webViewDelegate webView:webView decidePolicyForNavigationAction:actionInformation request:request frame:frame decisionListener:listener];
-    } else {
-        [listener use];
-    }
-}
-
-
-
-/* Platform specific internals: iOS
- **********************************/
-#elif defined WVJB_PLATFORM_IOS
-
-- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView {
-    _webView = webView;
-    _webView.delegate = self;
-    _base = [[WebViewJavascriptBridgeBase alloc] init];
-    _base.delegate = self;
-}
-
-- (void) _platformSpecificDealloc {
-    _webView.delegate = nil;
-}
-
-- (void)webViewDidFinishLoad:(UIWebView *)webView {
-    if (webView != _webView) { return; }
-    
-    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
-        [strongDelegate webViewDidFinishLoad:webView];
-    }
-}
-
-- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
-    if (webView != _webView) { return; }
-    
-    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
-        [strongDelegate webView:webView didFailLoadWithError:error];
-    }
-}
-
-- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
-    if (webView != _webView) { return YES; }
-    NSURL *url = [request URL];
-    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
-    if ([_base isCorrectProcotocolScheme:url]) {
-        if ([_base isBridgeLoadedURL:url]) {
-            [_base injectJavascriptFile];
-        } else if ([_base isQueueMessageURL:url]) {
-            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
-            [_base flushMessageQueue:messageQueueString];
-        } else {
-            [_base logUnkownMessage:url];
-        }
-        return NO;
-    } else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
-        return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
-    } else {
-        return YES;
-    }
-}
-
-- (void)webViewDidStartLoad:(UIWebView *)webView {
-    if (webView != _webView) { return; }
-    
-    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
-    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
-        [strongDelegate webViewDidStartLoad:webView];
-    }
-}
-
-#endif
-
-@end
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
deleted file mode 100755
index 16b23c7..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-//  WebViewJavascriptBridgeBase.h
-//
-//  Created by @LokiMeyburg on 10/15/14.
-//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-#define kCustomProtocolScheme @"wvjbscheme"
-#define kQueueHasMessage      @"__WVJB_QUEUE_MESSAGE__"
-#define kBridgeLoaded         @"__BRIDGE_LOADED__"
-
-typedef void (^WVJBResponseCallback)(id responseData);
-typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback);
-typedef NSDictionary WVJBMessage;
-
-@protocol WebViewJavascriptBridgeBaseDelegate <NSObject>
-- (NSString*) _evaluateJavascript:(NSString*)javascriptCommand;
-@end
-
-@interface WebViewJavascriptBridgeBase : NSObject
-
-
-@property (assign) id <WebViewJavascriptBridgeBaseDelegate> delegate;
-@property (strong, nonatomic) NSMutableArray* startupMessageQueue;
-@property (strong, nonatomic) NSMutableDictionary* responseCallbacks;
-@property (strong, nonatomic) NSMutableDictionary* messageHandlers;
-@property (strong, nonatomic) WVJBHandler messageHandler;
-
-+ (void)enableLogging;
-+ (void)setLogMaxLength:(int)length;
-- (void)reset;
-- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName;
-- (void)flushMessageQueue:(NSString *)messageQueueString;
-- (void)injectJavascriptFile;
-- (BOOL)isCorrectProcotocolScheme:(NSURL*)url;
-- (BOOL)isQueueMessageURL:(NSURL*)urll;
-- (BOOL)isBridgeLoadedURL:(NSURL*)urll;
-- (void)logUnkownMessage:(NSURL*)url;
-- (NSString *)webViewJavascriptCheckCommand;
-- (NSString *)webViewJavascriptFetchQueyCommand;
-
-@end
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
deleted file mode 100755
index f290a48..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m
+++ /dev/null
@@ -1,214 +0,0 @@
-//
-//  WebViewJavascriptBridgeBase.m
-//
-//  Created by @LokiMeyburg on 10/15/14.
-//  Copyright (c) 2014 @LokiMeyburg. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "WebViewJavascriptBridgeBase.h"
-#import "WebViewJavascriptBridge_JS.h"
-
-@implementation WebViewJavascriptBridgeBase {
-    id _webViewDelegate;
-    long _uniqueId;
-}
-
-static bool logging = false;
-static int logMaxLength = 500;
-
-+ (void)enableLogging { logging = true; }
-+ (void)setLogMaxLength:(int)length { logMaxLength = length;}
-
--(id)init {
-    self = [super init];
-    self.messageHandlers = [NSMutableDictionary dictionary];
-    self.startupMessageQueue = [NSMutableArray array];
-    self.responseCallbacks = [NSMutableDictionary dictionary];
-    _uniqueId = 0;
-    return(self);
-}
-
-- (void)dealloc {
-    self.startupMessageQueue = nil;
-    self.responseCallbacks = nil;
-    self.messageHandlers = nil;
-}
-
-- (void)reset {
-    self.startupMessageQueue = [NSMutableArray array];
-    self.responseCallbacks = [NSMutableDictionary dictionary];
-    _uniqueId = 0;
-}
-
-- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName {
-    NSMutableDictionary* message = [NSMutableDictionary dictionary];
-    
-    if (data) {
-        message[@"data"] = data;
-    }
-    
-    if (responseCallback) {
-        NSString* callbackId = [NSString stringWithFormat:@"objc_cb_%ld", ++_uniqueId];
-        self.responseCallbacks[callbackId] = [responseCallback copy];
-        message[@"callbackId"] = callbackId;
-    }
-    
-    if (handlerName) {
-        message[@"handlerName"] = handlerName;
-    }
-    [self _queueMessage:message];
-}
-
-- (void)flushMessageQueue:(NSString *)messageQueueString{
-    if (messageQueueString == nil || messageQueueString.length == 0) {
-        NSLog(@"WebViewJavascriptBridge: WARNING: ObjC got nil while fetching the message queue JSON from webview. This can happen if the WebViewJavascriptBridge JS is not currently present in the webview, e.g if the webview just loaded a new page.");
-        return;
-    }
-
-    id messages = [self _deserializeMessageJSON:messageQueueString];
-    for (WVJBMessage* message in messages) {
-        if (![message isKindOfClass:[WVJBMessage class]]) {
-            NSLog(@"WebViewJavascriptBridge: WARNING: Invalid %@ received: %@", [message class], message);
-            continue;
-        }
-        [self _log:@"RCVD" json:message];
-        
-        NSString* responseId = message[@"responseId"];
-        if (responseId) {
-            WVJBResponseCallback responseCallback = _responseCallbacks[responseId];
-            responseCallback(message[@"responseData"]);
-            [self.responseCallbacks removeObjectForKey:responseId];
-        } else {
-            WVJBResponseCallback responseCallback = NULL;
-            NSString* callbackId = message[@"callbackId"];
-            if (callbackId) {
-                responseCallback = ^(id responseData) {
-                    if (responseData == nil) {
-                        responseData = [NSNull null];
-                    }
-                    
-                    WVJBMessage* msg = @{ @"responseId":callbackId, @"responseData":responseData };
-                    [self _queueMessage:msg];
-                };
-            } else {
-                responseCallback = ^(id ignoreResponseData) {
-                    // Do nothing
-                };
-            }
-            
-            WVJBHandler handler = self.messageHandlers[message[@"handlerName"]];
-            
-            if (!handler) {
-                NSLog(@"WVJBNoHandlerException, No handler for message from JS: %@", message);
-                continue;
-            }
-            
-            handler(message[@"data"], responseCallback);
-        }
-    }
-}
-
-- (void)injectJavascriptFile {
-    NSString *js = WebViewJavascriptBridge_js();
-    [self _evaluateJavascript:js];
-    if (self.startupMessageQueue) {
-        NSArray* queue = self.startupMessageQueue;
-        self.startupMessageQueue = nil;
-        for (id queuedMessage in queue) {
-            [self _dispatchMessage:queuedMessage];
-        }
-    }
-}
-
--(BOOL)isCorrectProcotocolScheme:(NSURL*)url {
-    if([[url scheme] isEqualToString:kCustomProtocolScheme]){
-        return YES;
-    } else {
-        return NO;
-    }
-}
-
--(BOOL)isQueueMessageURL:(NSURL*)url {
-    if([[url host] isEqualToString:kQueueHasMessage]){
-        return YES;
-    } else {
-        return NO;
-    }
-}
-
--(BOOL)isBridgeLoadedURL:(NSURL*)url {
-    return ([[url scheme] isEqualToString:kCustomProtocolScheme] && [[url host] isEqualToString:kBridgeLoaded]);
-}
-
--(void)logUnkownMessage:(NSURL*)url {
-    NSLog(@"WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@://%@", kCustomProtocolScheme, [url path]);
-}
-
--(NSString *)webViewJavascriptCheckCommand {
-    return @"typeof WebViewJavascriptBridge == \'object\';";
-}
-
--(NSString *)webViewJavascriptFetchQueyCommand {
-    return @"WebViewJavascriptBridge._fetchQueue();";
-}
-
-// Private
-// -------------------------------------------
-
-- (void) _evaluateJavascript:(NSString *)javascriptCommand {
-    [self.delegate _evaluateJavascript:javascriptCommand];
-}
-
-- (void)_queueMessage:(WVJBMessage*)message {
-    if (self.startupMessageQueue) {
-        [self.startupMessageQueue addObject:message];
-    } else {
-        [self _dispatchMessage:message];
-    }
-}
-
-- (void)_dispatchMessage:(WVJBMessage*)message {
-    NSString *messageJSON = [self _serializeMessage:message pretty:NO];
-    [self _log:@"SEND" json:messageJSON];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"];
-    messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"];
-    
-    NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON];
-    if ([[NSThread currentThread] isMainThread]) {
-        [self _evaluateJavascript:javascriptCommand];
-
-    } else {
-        dispatch_sync(dispatch_get_main_queue(), ^{
-            [self _evaluateJavascript:javascriptCommand];
-        });
-    }
-}
-
-- (NSString *)_serializeMessage:(id)message pretty:(BOOL)pretty{
-    return [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:message options:(NSJSONWritingOptions)(pretty ? NSJSONWritingPrettyPrinted : 0) error:nil] encoding:NSUTF8StringEncoding];
-}
-
-- (NSArray*)_deserializeMessageJSON:(NSString *)messageJSON {
-    return [NSJSONSerialization JSONObjectWithData:[messageJSON dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
-}
-
-- (void)_log:(NSString *)action json:(id)json {
-    if (!logging) { return; }
-    if (![json isKindOfClass:[NSString class]]) {
-        json = [self _serializeMessage:json pretty:YES];
-    }
-    if ([json length] > logMaxLength) {
-        NSLog(@"WVJB %@: %@ [...]", action, [json substringToIndex:logMaxLength]);
-    } else {
-        NSLog(@"WVJB %@: %@", action, json);
-    }
-}
-
-@end
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
deleted file mode 100644
index 6cb1cb9..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#import <Foundation/Foundation.h>
-
-NSString * WebViewJavascriptBridge_js();
\ No newline at end of file
diff --git a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m b/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m
deleted file mode 100644
index 3a494dd..0000000
--- a/Pods/WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m
+++ /dev/null
@@ -1,123 +0,0 @@
-// This file contains the source for the Javascript side of the
-// WebViewJavascriptBridge. It is plaintext, but converted to an NSString
-// via some preprocessor tricks.
-//
-// Previous implementations of WebViewJavascriptBridge loaded the javascript source
-// from a resource. This worked fine for app developers, but library developers who
-// included the bridge into their library, awkwardly had to ask consumers of their
-// library to include the resource, violating their encapsulation. By including the
-// Javascript as a string resource, the encapsulation of the library is maintained.
-
-#import "WebViewJavascriptBridge_JS.h"
-
-NSString * WebViewJavascriptBridge_js() {
-	#define __wvjb_js_func__(x) #x
-	
-	// BEGIN preprocessorJSCode
-	static NSString * preprocessorJSCode = @__wvjb_js_func__(
-;(function() {
-	if (window.WebViewJavascriptBridge) {
-		return;
-	}
-	window.WebViewJavascriptBridge = {
-		registerHandler: registerHandler,
-		callHandler: callHandler,
-		_fetchQueue: _fetchQueue,
-		_handleMessageFromObjC: _handleMessageFromObjC
-	};
-
-	var messagingIframe;
-	var sendMessageQueue = [];
-	var messageHandlers = {};
-	
-	var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme';
-	var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__';
-	
-	var responseCallbacks = {};
-	var uniqueId = 1;
-
-	function registerHandler(handlerName, handler) {
-		messageHandlers[handlerName] = handler;
-	}
-	
-	function callHandler(handlerName, data, responseCallback) {
-		if (arguments.length == 2 && typeof data == 'function') {
-			responseCallback = data;
-			data = null;
-		}
-		_doSend({ handlerName:handlerName, data:data }, responseCallback);
-	}
-	
-	function _doSend(message, responseCallback) {
-		if (responseCallback) {
-			var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime();
-			responseCallbacks[callbackId] = responseCallback;
-			message['callbackId'] = callbackId;
-		}
-		sendMessageQueue.push(message);
-		messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
-	}
-
-	function _fetchQueue() {
-		var messageQueueString = JSON.stringify(sendMessageQueue);
-		sendMessageQueue = [];
-		return messageQueueString;
-	}
-
-	function _dispatchMessageFromObjC(messageJSON) {
-		setTimeout(function _timeoutDispatchMessageFromObjC() {
-			var message = JSON.parse(messageJSON);
-			var messageHandler;
-			var responseCallback;
-
-			if (message.responseId) {
-				responseCallback = responseCallbacks[message.responseId];
-				if (!responseCallback) {
-					return;
-				}
-				responseCallback(message.responseData);
-				delete responseCallbacks[message.responseId];
-			} else {
-				if (message.callbackId) {
-					var callbackResponseId = message.callbackId;
-					responseCallback = function(responseData) {
-						_doSend({ responseId:callbackResponseId, responseData:responseData });
-					};
-				}
-				
-				var handler = messageHandlers[message.handlerName];
-				try {
-					handler(message.data, responseCallback);
-				} catch(exception) {
-					console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception);
-				}
-				if (!handler) {
-					console.log("WebViewJavascriptBridge: WARNING: no handler for message from ObjC:", message);
-				}
-			}
-		});
-	}
-	
-	function _handleMessageFromObjC(messageJSON) {
-        _dispatchMessageFromObjC(messageJSON);
-	}
-
-	messagingIframe = document.createElement('iframe');
-	messagingIframe.style.display = 'none';
-	messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
-	document.documentElement.appendChild(messagingIframe);
-
-	setTimeout(_callWVJBCallbacks, 0);
-	function _callWVJBCallbacks() {
-		var callbacks = window.WVJBCallbacks;
-		delete window.WVJBCallbacks;
-		for (var i=0; i<callbacks.length; i++) {
-			callbacks[i](WebViewJavascriptBridge);
-		}
-	}
-})();
-	); // END preprocessorJSCode
-
-	#undef __wvjb_js_func__
-	return preprocessorJSCode;
-};
\ No newline at end of file
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 3ada280..014371d 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -82,10 +82,17 @@ - (void)setupWebView
     _webView.layer.cornerRadius = 5.0;
     _webView.layer.masksToBounds = YES;
     
+    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+    
     NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
+- (void)applicationWillBecomeActive:(NSNotification *)notification
+{
+    [self showWindow];
+}
+
 - (void)windowDidResignKey:(NSNotification *)notification
 {
     if (!self.pinned) {
diff --git a/quark-shell/QSHPreferencesViewController.h b/quark-shell/QSHPreferencesViewController.h
index 88e4551..fbaa61b 100644
--- a/quark-shell/QSHPreferencesViewController.h
+++ b/quark-shell/QSHPreferencesViewController.h
@@ -8,6 +8,7 @@
 
 #import <Cocoa/Cocoa.h>
 #import <RHPreferences.h>
+#import <MASShortcut/Shortcut.h>
 #import "QSHWebView.h"
 #import "QSHWebViewDelegate.h"
 
diff --git a/quark-shell/QSHPreferencesViewController.m b/quark-shell/QSHPreferencesViewController.m
index dbb1040..a5b718e 100644
--- a/quark-shell/QSHPreferencesViewController.m
+++ b/quark-shell/QSHPreferencesViewController.m
@@ -7,8 +7,6 @@
 //
 
 #import "QSHPreferencesViewController.h"
-#import <MASShortcutView.h>
-#import <MASShortcut.h>
 
 @interface QSHPreferencesViewController ()
 
@@ -16,7 +14,7 @@ @interface QSHPreferencesViewController ()
 @property (nonatomic) NSImage *toolbarItemImage;
 @property (nonatomic) NSString *toolbarItemLabel;
 @property (nonatomic) NSInteger height;
-@property (nonatomic, weak) id delegate;
+@property (nonatomic, weak) QSHWebViewDelegate* delegate;
 
 @end
 
@@ -76,21 +74,14 @@ - (void)addNativeComponent:(NSDictionary *)component
         CGFloat yFlipped = self.view.frame.size.height - [component[@"options"][@"y"] doubleValue] - height;
 
         MASShortcutView *shortcutView = [[MASShortcutView alloc] initWithFrame:NSMakeRect(x, yFlipped, width, height)];
-        if (component[@"options"][@"keycode"]) {
-            NSUInteger keycode = [component[@"options"][@"keycode"] unsignedIntegerValue];
-            NSUInteger flags = [component[@"options"][@"modifierFlags"] unsignedIntegerValue];
-            MASShortcut *shortcut = [MASShortcut shortcutWithKeyCode:keycode modifierFlags:flags];
-            shortcutView.shortcutValue = shortcut;
-        }
         
-        shortcutView.shortcutValueChange = ^(MASShortcutView *sender) {
-            [self.webView.bridge callHandler:@"testJavascriptHandler" data:@
-            { @"component":component,
-              @"args": @[@([sender.shortcutValue keyCode]),
-                         @([sender.shortcutValue modifierFlags])
-                        ]
-            }];
-        };
+        NSString *shortcutDefaultsKey = [@"shortcut_" stringByAppendingString:component[@"options"][@"id"]];
+        
+        shortcutView.associatedUserDefaultsKey = shortcutDefaultsKey;
+        
+        [[MASShortcutBinder sharedBinder] bindShortcutWithDefaultsKey:shortcutDefaultsKey toAction:^{
+            [self.delegate.mainBridge callHandler:@"onQuarkShortcut" data:component[@"options"][@"id"] ];
+        }];
 
         [self.view addSubview:shortcutView];
     }
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 1bf4bcb..33703ac 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -8,6 +8,7 @@
 
 #import <Foundation/Foundation.h>
 #import <WebKit/WebKit.h>
+#import <MASShortcut/Shortcut.h>
 #import "QSHStatusItemView.h"
 #import "QSHAppDelegate.h"
 #import "WKWebViewJavascriptBridge.h"
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 8b6523f..8dca5a2 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -9,7 +9,6 @@
 #import "QSHWebViewDelegate.h"
 #import "QSHPreferencesViewController.h"
 #import "QSHWebViewWindowController.h"
-#import <MASShortcut+Monitoring.h>
 #import <RHPreferences.h>
 #import <Sparkle/Sparkle.h>
 #import <ISO8601DateFormatter.h>
@@ -300,21 +299,22 @@ - (void)addKeyboardShortcut:(NSArray *)args
         return;
     }
 
-    NSString *callbackId = [shortcutObj valueForKey:@"callback"];
+    NSString *callbackId = [shortcutObj valueForKey:@"id"];
+    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
     MASShortcut *shortcut = [MASShortcut shortcutWithKeyCode:keycode modifierFlags:flags];
-    [MASShortcut removeGlobalHotkeyMonitor:shortcut.description];
-    [MASShortcut addGlobalHotkeyMonitorWithShortcut:shortcut handler:^{
-        [self.mainBridge callHandler:@"onQuarkShortcut" data:callbackId];
-    }];
+    // FIXME: value my not be the shortcut object
+    [userPreferences setObject:shortcut forKey:[@"values.shortcut_" stringByAppendingString:callbackId]];
+    [userPreferences synchronize];
 }
 
 - (void)clearKeyboardShortcut
 {
-    [MASShortcut clearGlobalHotkeyMonitor];
+    [[MASShortcutMonitor sharedMonitor] unregisterAllShortcuts];
 }
 
-- (void)setupPreferences:(NSArray *)preferencesArray
+- (void)setupPreferences:(NSArray *)args
 {
+    NSArray *preferencesArray = args[0];
     NSMutableArray *viewControllers = [NSMutableArray array];
 	for (NSDictionary *preferences in preferencesArray) {
         NSInteger height = preferences[@"height"] ? [preferences[@"height"] integerValue]: kPreferencesDefaultHeight;
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 4c94173..268976e 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -66,14 +66,30 @@ setupWebViewJavascriptBridge(function(bridge) {
   window.bridge = bridge;
 
   setupQuarkWithBridge(bridge);
-  // TODO: implement quark.onMessage('name', function(data) {})
+
+  // Message
+  window.quark.msgSubscribers = [];
+  window.quark.onMessage = function(fn) {
+    window.quark.shortcutSubscribers.push(fn)
+  };
   bridge.registerHandler('onQuarkMessage', function(data) {
-    console.error('quark emitted', data)
+    quark.msgSubscribers.forEach(function(fn){
+      fn(data);
+    })
   });
-                             
-  // TODO: implement quark.onShortcut('id', function() {})
-  bridge.registerHandler('onQuarkShortcut', function(id) {
-    console.error('shortcut triggered', id)
+  
+  // Shortcut
+  window.quark.shortcutSubscribers = [];
+  window.quark.onShortcut = function(id, fn) {
+    window.quark.shortcutSubscribers.push({id, callback: fn})
+  };
+  bridge.registerHandler('onQuarkShortcut', function(data) {
+    console.log('onQuarkShortcut', data);
+    quark.shortcutSubscribers.forEach(function(subscriber){
+      if(subscriber['id'] == data){
+        subscriber['callback']();
+      }
+    })
   });
 
   if (window.onQuarkLoaded){
diff --git a/sample/index.js b/sample/index.js
index b8362a6..bf318d4 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -106,37 +106,33 @@ $(function() {
   });
 
 function setupPref(){
-    quark.setupPref([
+  quark.setupPreferences([
     {"label": "General", "identifier": "general", "icon": "NSPreferencesGeneral", "height": 192},
     {"label": "Account", "identifier": "account", "icon": "NSUserAccounts", "height": 102},
-    {"label": "Shortcut", "identifier": "shortcut", "icon": "NSAdvanced", "height": 80,
-    "nativeComponents": [{
-                         type: "ShortcutRecorder",
-                         options: {
-                         x: 140,
-                         y: 28,
-                         keycode: 0x7A, // F1 key
-                         modifierFlags: 0, // no modifier key
-                         onChange: function (keycode, modifierFlags) {
-                         console.log("New shortcut:", keycode, modifierFlags)
-                         quark.clearKeyboardShortcut()
-                         quark.addKeyboardShortcut({
-                                                   keycode: keycode,
-                                                   modifierFlags: modifierFlags,
-                                                   callback: function () {
-                                                   console.log("wow")
-                                                   quark.togglePopup()
-                                                   }
-                                                   })
-                         }
-                         }
-                         }]
-    }]);
+    {
+      "label": "Shortcut",
+      "identifier": "shortcut",
+      "icon": "NSAdvanced",
+      "height": 80,
+      "nativeComponents": [{
+                        type: "ShortcutRecorder",
+                        options: {
+                          x: 140,
+                          y: 28,
+                          id: "start_pomo"
+                        }
+                        }]
+    }]
+  );
+
 }
 
 onQuarkLoaded = function () {
     quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
     quark.pin();
+    quark.onShortcut('start_pomo', function(data) {
+      quark.notify({title: 'onQuarkShortcut', content: "start_pomo", popupOnClick: true});
+    })
 }
 
 function showConfirm() {

From b6126bfdfd9a79bd2c003e088e71b39595e4e11b Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 4 Nov 2016 19:25:51 +0800
Subject: [PATCH 13/43] setAutoStart and fix borderView

---
 quark-shell/QSHWebViewDelegate.m  | 7 ++++++-
 quark-shell/QSHWindowBorderView.m | 8 ++++----
 quark-shell/Quark.js              | 2 +-
 sample/index.html                 | 3 +++
 sample/index.js                   | 4 ++++
 5 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 8dca5a2..a73c9c9 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -232,7 +232,12 @@ - (void)changeLabel:(NSArray *)args
 
 - (void)setLaunchAtLogin:(NSArray *)args
 {
-    BOOL launchAtLogin = args[0];
+    BOOL launchAtLogin;
+    if ([args[0]  isEqual: @"true"]){
+        launchAtLogin = true;
+    }else{
+        launchAtLogin = false;
+    }
     
     StartAtLoginController *loginController = [[StartAtLoginController alloc] initWithIdentifier:@"com.hackplan.quark-shell-helper"];
     loginController.startAtLogin = launchAtLogin;
diff --git a/quark-shell/QSHWindowBorderView.m b/quark-shell/QSHWindowBorderView.m
index bc7e3c0..2cbab53 100644
--- a/quark-shell/QSHWindowBorderView.m
+++ b/quark-shell/QSHWindowBorderView.m
@@ -8,7 +8,7 @@
 
 #import "QSHWindowBorderView.h"
 
-static const CGFloat marginTop = -5;
+static const CGFloat marginTop = 5;
 static const CGFloat roundedRectangleCornerRadius = 5;
 static const CGFloat arrowHeight = 10;
 static const CGFloat arrowWidth = 20;
@@ -25,14 +25,14 @@ - (id)initWithFrame:(NSRect)frame
 
 - (NSRect)innerFrame
 {
-    return NSMakeRect(0, marginTop, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
+    return NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight - marginTop);
 }
 
 - (void)drawRect:(NSRect)dirtyRect
 {
     [super drawRect:dirtyRect];
-
-    NSRect roundedRectangleRect = NSMakeRect(0, marginTop, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight);
+    
+    NSRect roundedRectangleRect = NSMakeRect(0, 0, NSWidth(self.bounds), NSHeight(self.bounds) - arrowHeight - marginTop);
     NSRect roundedRectangleInnerRect = NSInsetRect(roundedRectangleRect, roundedRectangleCornerRadius, roundedRectangleCornerRadius);
     NSBezierPath *roundedRectanglePath = [NSBezierPath bezierPath];
     [roundedRectanglePath appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(roundedRectangleInnerRect), NSMinY(roundedRectangleInnerRect)) radius: roundedRectangleCornerRadius startAngle:180 endAngle:270];
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 268976e..ec3e010 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -53,7 +53,7 @@ function setupQuarkWithBridge(bridge) {
 
   window.quark.setLaunchAtLogin = function (shouldLaunchAtLogin) {
     shouldLaunchAtLogin = !!shouldLaunchAtLogin
-    bridge.callHandler('quark', {'method': 'setLaunchAtLogin', 'args': [shouldLaunchAtLogin]})
+    bridge.callHandler('quark', {'method': 'setLaunchAtLogin', 'args': [shouldLaunchAtLogin.toString()]})
   }
 
   window.quark.emit = function (options) {
diff --git a/sample/index.html b/sample/index.html
index b365fb7..a137ffa 100644
--- a/sample/index.html
+++ b/sample/index.html
@@ -95,6 +95,9 @@ <h1>
       <button onclick="showPrompt()">Prompt</button>
       <button onclick="quark.quit()">Quit</button>
     </p>
+    <p>
+      <button onclick="setupPref()">Set Pref</button>
+    </p>
   </div>
   <canvas id="icon"></canvas>
   <canvas id="highlighted-icon"></canvas>
diff --git a/sample/index.js b/sample/index.js
index bf318d4..5af5e59 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -150,6 +150,10 @@ function showPrompt() {
   quark.notify({title: 'Quark Shell', content: content, popupOnClick: true})
 }
 
+function setAutoStart(){
+  quark.setLaunchAtLogin(true)
+}
+
 function setIcon() {
     var iconCanvas = document.getElementById('icon')
     iconCanvas.width = 40

From 349b8327ff047e0ce66e35eaa15f64bbae9af4e3 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 4 Nov 2016 21:18:15 +0800
Subject: [PATCH 14/43] fix quark ready

---
 quark-shell.xcodeproj/project.pbxproj |  4 ++++
 quark-shell/QSHWebView.m              | 11 +++++++--
 quark-shell/Quark.js                  | 32 +++++++++++++++------------
 quark-shell/QuarkHeader.js            | 11 +++++++++
 sample/index.js                       | 14 ++++++------
 5 files changed, 49 insertions(+), 23 deletions(-)
 create mode 100644 quark-shell/QuarkHeader.js

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index 181be8b..f01f3c7 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -31,6 +31,7 @@
 		1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF6371D18E9FF430099B508 /* QSHWebViewDelegate.m */; };
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
+		8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
 		8AC4ABDF1DC4D5810026D522 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91FA5918E25F3C00AA8B7E /* WebKit.framework */; };
@@ -116,6 +117,7 @@
 		1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHPreferencesViewController.m; sourceTree = "<group>"; };
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
+		8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = QuarkHeader.js; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
 		8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWebView.m; sourceTree = "<group>"; };
 		8AC4ABDD1DC48AAD0026D522 /* Quark.js */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.javascript; path = Quark.js; sourceTree = "<group>"; tabWidth = 4; };
@@ -220,6 +222,7 @@
 				1AA896721964FB1800E4FDAC /* QSHWebViewWindowController.xib */,
 				1A9A456C1A1C93C600C98589 /* NSWindow+Fade.h */,
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
+				8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */,
 				8AC4ABDD1DC48AAD0026D522 /* Quark.js */,
 				1A91F9FA18E2530B00AA8B7E /* Images.xcassets */,
 				8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */,
@@ -413,6 +416,7 @@
 				1AA896741964FB1800E4FDAC /* QSHWebViewWindowController.xib in Resources */,
 				1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */,
 				8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */,
+				8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */,
 				1A91F9F918E2530B00AA8B7E /* MainMenu.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
diff --git a/quark-shell/QSHWebView.m b/quark-shell/QSHWebView.m
index 2fd01dc..aa03498 100644
--- a/quark-shell/QSHWebView.m
+++ b/quark-shell/QSHWebView.m
@@ -15,6 +15,11 @@ + (NSString *)quarkSourceScript
     return [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Quark" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
 }
 
++ (NSString *)quarkHeaderScript
+{
+    return [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"QuarkHeader" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
+}
+
 + (WKWebViewConfiguration *)webViewConfiguration
 {
     static WKWebViewConfiguration *configuration = nil;
@@ -22,9 +27,11 @@ + (WKWebViewConfiguration *)webViewConfiguration
     if (configuration == nil) {
         configuration = [[WKWebViewConfiguration alloc] init];
         
-        WKUserScript *script = [[WKUserScript alloc] initWithSource:[self quarkSourceScript] injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
+        WKUserScript *headerScript = [[WKUserScript alloc] initWithSource:[self quarkHeaderScript] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
+        WKUserScript *footerScript = [[WKUserScript alloc] initWithSource:[self quarkSourceScript] injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
         
-        [configuration.userContentController addUserScript:script];
+        [configuration.userContentController addUserScript:headerScript];
+        [configuration.userContentController addUserScript:footerScript];
     }
     
     return configuration;
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index ec3e010..998dc07 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -10,8 +10,6 @@ function setupWebViewJavascriptBridge(callback) {
 }
 
 function setupQuarkWithBridge(bridge) {
-  window.quark = {};
-
   var setMethods = function (methods, needOptions) {
     function makeMethod(method, needOptions) {
       if (needOptions){
@@ -27,7 +25,7 @@ function setupQuarkWithBridge(bridge) {
 
     var i;
     for (i = 0; i < methods.length; i++) {
-      window.quark[methods[i]] = makeMethod(methods[i], needOptions);
+      quark[methods[i]] = makeMethod(methods[i], needOptions);
     }
   }
 
@@ -47,16 +45,16 @@ function setupQuarkWithBridge(bridge) {
     'resizePopup'
   ], true);
 
-  window.quark.closeWindow = function (options) {
+  quark.closeWindow = function (options) {
     bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
   }
 
-  window.quark.setLaunchAtLogin = function (shouldLaunchAtLogin) {
+  quark.setLaunchAtLogin = function (shouldLaunchAtLogin) {
     shouldLaunchAtLogin = !!shouldLaunchAtLogin
     bridge.callHandler('quark', {'method': 'setLaunchAtLogin', 'args': [shouldLaunchAtLogin.toString()]})
   }
 
-  window.quark.emit = function (options) {
+  quark.emit = function (options) {
     bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
   }
   
@@ -68,9 +66,9 @@ setupWebViewJavascriptBridge(function(bridge) {
   setupQuarkWithBridge(bridge);
 
   // Message
-  window.quark.msgSubscribers = [];
-  window.quark.onMessage = function(fn) {
-    window.quark.shortcutSubscribers.push(fn)
+  quark.msgSubscribers = [];
+  quark.onMessage = function(fn) {
+    quark.shortcutSubscribers.push(fn)
   };
   bridge.registerHandler('onQuarkMessage', function(data) {
     quark.msgSubscribers.forEach(function(fn){
@@ -79,9 +77,9 @@ setupWebViewJavascriptBridge(function(bridge) {
   });
   
   // Shortcut
-  window.quark.shortcutSubscribers = [];
-  window.quark.onShortcut = function(id, fn) {
-    window.quark.shortcutSubscribers.push({id, callback: fn})
+  quark.shortcutSubscribers = [];
+  quark.onShortcut = function(id, fn) {
+    quark.shortcutSubscribers.push({id, callback: fn})
   };
   bridge.registerHandler('onQuarkShortcut', function(data) {
     console.log('onQuarkShortcut', data);
@@ -92,7 +90,13 @@ setupWebViewJavascriptBridge(function(bridge) {
     })
   });
 
-  if (window.onQuarkLoaded){
-    window.onQuarkLoaded()
+  if (quark.readyList.length > 0){
+    quark.readyList.forEach(function(fn){
+      fn()
+    })
+    quark.readyList = []
   }
+
+  quark.isReady = true
+
 })
diff --git a/quark-shell/QuarkHeader.js b/quark-shell/QuarkHeader.js
new file mode 100644
index 0000000..49a8552
--- /dev/null
+++ b/quark-shell/QuarkHeader.js
@@ -0,0 +1,11 @@
+window.quark = {
+  isReady: false
+}
+quark.readyList = []
+quark.ready = function (fn) {
+  if (quark.isReady){
+    fn()
+  } else {
+    quark.readyList.push(fn)
+  }
+}
\ No newline at end of file
diff --git a/sample/index.js b/sample/index.js
index 5af5e59..af78470 100644
--- a/sample/index.js
+++ b/sample/index.js
@@ -127,13 +127,13 @@ function setupPref(){
 
 }
 
-onQuarkLoaded = function () {
-    quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
-    quark.pin();
-    quark.onShortcut('start_pomo', function(data) {
-      quark.notify({title: 'onQuarkShortcut', content: "start_pomo", popupOnClick: true});
-    })
-}
+quark.ready(function () {
+  quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true});
+  quark.pin();
+  quark.onShortcut('start_pomo', function(data) {
+    quark.notify({title: 'onQuarkShortcut', content: "start_pomo", popupOnClick: true});
+  })
+})
 
 function showConfirm() {
   var content;

From 6d8503df29f48bb9f5fe43e936a53a98d6eed313 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 5 Nov 2016 10:53:45 +0800
Subject: [PATCH 15/43] RHPreferences -> MASPreferences

---
 Podfile                                    |  2 +-
 Podfile.lock                               | 17 +++++++++++++----
 quark-shell/QSHPreferencesViewController.h |  4 ++--
 quark-shell/QSHWebViewDelegate.m           |  8 ++++----
 4 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/Podfile b/Podfile
index 1d0d739..826d683 100644
--- a/Podfile
+++ b/Podfile
@@ -4,7 +4,7 @@ source 'https://github.com/CocoaPods/Specs.git'
 
 target 'quark-shell' do
   pod 'MASShortcut', '~> 2.3.6'
-  pod 'RHPreferences', '~> 1.0'
+  pod 'MASPreferences', :git=> 'git@github.com:shpakovski/MASPreferences.git'
   pod 'Sparkle', '~> 1.13'
   pod 'ISO8601DateFormatter', '~> 0.7'
   pod 'StartAtLoginController', '~> 0.0.1'
diff --git a/Podfile.lock b/Podfile.lock
index 5e7d93c..8305bc7 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,27 +1,36 @@
 PODS:
   - ISO8601DateFormatter (0.8)
+  - MASPreferences (1.2)
   - MASShortcut (2.3.6)
-  - RHPreferences (1.0.0)
   - Sparkle (1.14.0)
   - StartAtLoginController (0.0.1)
   - WebViewJavascriptBridge (5.0.5)
 
 DEPENDENCIES:
   - ISO8601DateFormatter (~> 0.7)
+  - MASPreferences (from `git@github.com:shpakovski/MASPreferences.git`)
   - MASShortcut (~> 2.3.6)
-  - RHPreferences (~> 1.0)
   - Sparkle (~> 1.13)
   - StartAtLoginController (~> 0.0.1)
   - WebViewJavascriptBridge (~> 5.0)
 
+EXTERNAL SOURCES:
+  MASPreferences:
+    :git: git@github.com:shpakovski/MASPreferences.git
+
+CHECKOUT OPTIONS:
+  MASPreferences:
+    :commit: d0c45f3848d1d9bade4cb513312ee9aad0cfe32f
+    :git: git@github.com:shpakovski/MASPreferences.git
+
 SPEC CHECKSUMS:
   ISO8601DateFormatter: 4551b6ce4f83185425f583b0b3feb3c7b59b942c
+  MASPreferences: 4ff5ced14f2ae0aada927579816c07fa6840f2e8
   MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa
-  RHPreferences: 6871f9614347f4b45197c51f7c93c3cde2744ce8
   Sparkle: ccd95233b12a3e3d4eeb55ff01dd4c8bb8188b07
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
   WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-PODFILE CHECKSUM: 699cfe5aa1afb8c30201f5e2e256967a66c3435b
+PODFILE CHECKSUM: b1b3ad8690c78de1975a40c5d75d0a8ba2bc9eed
 
 COCOAPODS: 1.1.1
diff --git a/quark-shell/QSHPreferencesViewController.h b/quark-shell/QSHPreferencesViewController.h
index fbaa61b..01c712e 100644
--- a/quark-shell/QSHPreferencesViewController.h
+++ b/quark-shell/QSHPreferencesViewController.h
@@ -7,12 +7,12 @@
 //
 
 #import <Cocoa/Cocoa.h>
-#import <RHPreferences.h>
+#import <MASPreferences/MASPreferences.h>
 #import <MASShortcut/Shortcut.h>
 #import "QSHWebView.h"
 #import "QSHWebViewDelegate.h"
 
-@interface QSHPreferencesViewController : NSViewController <RHPreferencesViewControllerProtocol>
+@interface QSHPreferencesViewController : NSViewController <MASPreferencesViewController>
 
 @property (nonatomic, strong) QSHWebView *webView;
 
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index a73c9c9..1430173 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -9,7 +9,7 @@
 #import "QSHWebViewDelegate.h"
 #import "QSHPreferencesViewController.h"
 #import "QSHWebViewWindowController.h"
-#import <RHPreferences.h>
+#import <MASPreferences/MASPreferences.h>
 #import <Sparkle/Sparkle.h>
 #import <ISO8601DateFormatter.h>
 #import <StartAtLoginController.h>
@@ -24,7 +24,7 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
     BOOL debug;
 }
 
-@property (nonatomic) NSWindowController *preferencesWindowController;
+@property (nonatomic) MASPreferencesWindowController *preferencesWindowController;
 @property (nonatomic) NSMutableArray *windows;
 
 @end
@@ -337,8 +337,8 @@ - (void)setupPreferences:(NSArray *)args
         [viewControllers addObject:vc];
 	}
 
-    NSString *title = @"Preferences";
-    self.preferencesWindowController = [[RHPreferencesWindowController alloc] initWithViewControllers:viewControllers andTitle:title];
+    NSString *title = NSLocalizedString(@"Preferences", @"Common title for Preferences window");
+    self.preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:viewControllers title:title];
 }
 
 - (void)openPreferences

From b1aad6b6dfd4231a95bb94acc1c0e312aadd0c9d Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 5 Nov 2016 14:04:28 +0800
Subject: [PATCH 16/43] using customized version of MASPreferences

---
 Podfile      |  2 +-
 Podfile.lock | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/Podfile b/Podfile
index 826d683..076523b 100644
--- a/Podfile
+++ b/Podfile
@@ -4,7 +4,7 @@ source 'https://github.com/CocoaPods/Specs.git'
 
 target 'quark-shell' do
   pod 'MASShortcut', '~> 2.3.6'
-  pod 'MASPreferences', :git=> 'git@github.com:shpakovski/MASPreferences.git'
+  pod 'MASPreferences', :git=> 'git@github.com:HackPlan/MASPreferences.git'
   pod 'Sparkle', '~> 1.13'
   pod 'ISO8601DateFormatter', '~> 0.7'
   pod 'StartAtLoginController', '~> 0.0.1'
diff --git a/Podfile.lock b/Podfile.lock
index 8305bc7..af22310 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -8,7 +8,7 @@ PODS:
 
 DEPENDENCIES:
   - ISO8601DateFormatter (~> 0.7)
-  - MASPreferences (from `git@github.com:shpakovski/MASPreferences.git`)
+  - MASPreferences (from `git@github.com:HackPlan/MASPreferences.git`)
   - MASShortcut (~> 2.3.6)
   - Sparkle (~> 1.13)
   - StartAtLoginController (~> 0.0.1)
@@ -16,12 +16,12 @@ DEPENDENCIES:
 
 EXTERNAL SOURCES:
   MASPreferences:
-    :git: git@github.com:shpakovski/MASPreferences.git
+    :git: git@github.com:HackPlan/MASPreferences.git
 
 CHECKOUT OPTIONS:
   MASPreferences:
-    :commit: d0c45f3848d1d9bade4cb513312ee9aad0cfe32f
-    :git: git@github.com:shpakovski/MASPreferences.git
+    :commit: 9105849b1b53ba1be7bfb90f26294811bc50a77c
+    :git: git@github.com:HackPlan/MASPreferences.git
 
 SPEC CHECKSUMS:
   ISO8601DateFormatter: 4551b6ce4f83185425f583b0b3feb3c7b59b942c
@@ -31,6 +31,6 @@ SPEC CHECKSUMS:
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
   WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-PODFILE CHECKSUM: b1b3ad8690c78de1975a40c5d75d0a8ba2bc9eed
+PODFILE CHECKSUM: e07affa7fa239d12faf94712038684d35c8b781c
 
 COCOAPODS: 1.1.1

From af9f14f9f78e8ea04413540419db4eacabeb969c Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sat, 5 Nov 2016 14:05:09 +0800
Subject: [PATCH 17/43] always open the first view

---
 quark-shell/QSHWebViewDelegate.m | 1 +
 1 file changed, 1 insertion(+)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 1430173..b137fc2 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -339,6 +339,7 @@ - (void)setupPreferences:(NSArray *)args
 
     NSString *title = NSLocalizedString(@"Preferences", @"Common title for Preferences window");
     self.preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:viewControllers title:title];
+    [self.preferencesWindowController selectControllerAtIndex:0];
 }
 
 - (void)openPreferences

From d1dca8522da7337be303e1b2b0e4c24212f50e7a Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sun, 6 Nov 2016 02:21:04 +0800
Subject: [PATCH 18/43] dragable borderless window

---
 quark-shell.xcodeproj/project.pbxproj      |  6 ++
 quark-shell/QSHBorderlessWindow.h          | 13 ++++
 quark-shell/QSHBorderlessWindow.m          | 69 ++++++++++++++++++++++
 quark-shell/QSHWebViewWindowController.xib |  9 +--
 4 files changed, 93 insertions(+), 4 deletions(-)
 create mode 100644 quark-shell/QSHBorderlessWindow.h
 create mode 100644 quark-shell/QSHBorderlessWindow.m

diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index f01f3c7..335a156 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -32,6 +32,7 @@
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
 		8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */; };
+		8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
 		8AC4ABDF1DC4D5810026D522 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A91FA5918E25F3C00AA8B7E /* WebKit.framework */; };
@@ -118,6 +119,8 @@
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
 		8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = QuarkHeader.js; sourceTree = "<group>"; };
+		8A8D99B51DCE591F00AD735E /* QSHBorderlessWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QSHBorderlessWindow.h; sourceTree = "<group>"; };
+		8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHBorderlessWindow.m; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
 		8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWebView.m; sourceTree = "<group>"; };
 		8AC4ABDD1DC48AAD0026D522 /* Quark.js */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.javascript; path = Quark.js; sourceTree = "<group>"; tabWidth = 4; };
@@ -219,6 +222,8 @@
 				1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */,
 				1AA896701964FB1800E4FDAC /* QSHWebViewWindowController.h */,
 				1AA896711964FB1800E4FDAC /* QSHWebViewWindowController.m */,
+				8A8D99B51DCE591F00AD735E /* QSHBorderlessWindow.h */,
+				8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */,
 				1AA896721964FB1800E4FDAC /* QSHWebViewWindowController.xib */,
 				1A9A456C1A1C93C600C98589 /* NSWindow+Fade.h */,
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
@@ -509,6 +514,7 @@
 				8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */,
 				1A9A456E1A1C93C600C98589 /* NSWindow+Fade.m in Sources */,
 				1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */,
+				8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */,
 				1A91F9F618E2530B00AA8B7E /* QSHAppDelegate.m in Sources */,
 				1AA896731964FB1800E4FDAC /* QSHWebViewWindowController.m in Sources */,
 				1A91F9EF18E2530B00AA8B7E /* main.m in Sources */,
diff --git a/quark-shell/QSHBorderlessWindow.h b/quark-shell/QSHBorderlessWindow.h
new file mode 100644
index 0000000..ddd43cd
--- /dev/null
+++ b/quark-shell/QSHBorderlessWindow.h
@@ -0,0 +1,13 @@
+//
+//  QSHBorderlessWindow.h
+//  quark-shell
+//
+//  Created by Sun Liang on 06/11/2016.
+//  Copyright © 2016 HackPlan. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface BorderlessWindow : NSWindow
+
+@end
diff --git a/quark-shell/QSHBorderlessWindow.m b/quark-shell/QSHBorderlessWindow.m
new file mode 100644
index 0000000..d1dbc9e
--- /dev/null
+++ b/quark-shell/QSHBorderlessWindow.m
@@ -0,0 +1,69 @@
+//
+//  QSHBorderlessWindow.m
+//  quark-shell
+//
+//  Created by Sun Liang on 06/11/2016.
+//  Copyright © 2016 HackPlan. All rights reserved.
+//
+
+#import "QSHBorderlessWindow.h"
+
+@interface BorderlessWindow()
+
+@property (assign) NSPoint initialLocation;
+
+@end
+
+@implementation BorderlessWindow
+
+- (BOOL)canBecomeKeyWindow
+{
+    return YES;
+}
+
+- (BOOL)canBecomeMainWindow
+{
+    return YES;
+}
+
+- (void)sendEvent:(NSEvent *)theEvent
+{
+    if ([theEvent type] == NSLeftMouseDown)
+    {
+        [self mouseDown:theEvent];
+    }
+    else if ([theEvent type] == NSLeftMouseDragged)
+    {
+        [self mouseDragged:theEvent];
+    }
+    
+    [super sendEvent:theEvent];
+}
+
+- (void)mouseDown:(NSEvent *)theEvent
+{
+    self.initialLocation = [theEvent locationInWindow];
+}
+
+- (void)mouseDragged:(NSEvent *)theEvent
+{
+    NSPoint currentLocation;
+    NSPoint newOrigin;
+    
+    NSRect  screenFrame = [[NSScreen mainScreen] frame];
+    NSRect  windowFrame = [self frame];
+    
+    currentLocation = [NSEvent mouseLocation];
+    newOrigin.x = currentLocation.x - self.initialLocation.x;
+    newOrigin.y = currentLocation.y - self.initialLocation.y;
+    
+    // Don't let window get dragged up under the menu bar
+    if( (newOrigin.y+windowFrame.size.height) > (screenFrame.origin.y+screenFrame.size.height) ){
+        newOrigin.y=screenFrame.origin.y + (screenFrame.size.height-windowFrame.size.height);
+    }
+    
+    //go ahead and move the window to the new location
+    [self setFrameOrigin:newOrigin];
+}
+
+@end
diff --git a/quark-shell/QSHWebViewWindowController.xib b/quark-shell/QSHWebViewWindowController.xib
index ec5200b..6d82a05 100644
--- a/quark-shell/QSHWebViewWindowController.xib
+++ b/quark-shell/QSHWebViewWindowController.xib
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="QSHWebViewWindowController">
@@ -11,11 +12,11 @@
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="F0z-JX-Cv5">
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="BorderlessWindow">
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="196" y="240" width="480" height="270"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
             <view key="contentView" id="se5-gp-TjO">
                 <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
                 <autoresizingMask key="autoresizingMask"/>

From 3f8fb66279b3e024ec259fe177c006f216a2b1e6 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Sun, 6 Nov 2016 16:41:22 +0800
Subject: [PATCH 19/43] add windowId and support
 bringWindowToFrontInsteadOfClose

---
 quark-shell/QSHWebViewDelegate.m         | 22 +++++++++++++++++++++-
 quark-shell/QSHWebViewWindowController.h |  4 +++-
 quark-shell/QSHWebViewWindowController.m |  2 ++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index b137fc2..3fee3a9 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -361,11 +361,31 @@ - (void)newWindow:(NSArray *)args
 {
     NSDictionary *options = args[0];
     NSString *urlString = options[@"url"];
+    NSString *windowId = options[@"id"];
     CGFloat width = [options[@"width"] doubleValue];
     CGFloat height = [options[@"height"] doubleValue];
+    bool bringWindowToFrontInsteadOfCloseIt = options[@"toFront"];
     
     QSHWebViewWindowController *webViewWindowController;
-    webViewWindowController = [[QSHWebViewWindowController alloc] initWithURLString:urlString width:width height:height webDelegate:self];
+    webViewWindowController = [[QSHWebViewWindowController alloc] initWithURLString:urlString width:width height:height webDelegate:self windowId:windowId];
+    
+    // if window with same key exist, close it before open a new one
+    if (windowId){
+        
+        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"windowId == %@", windowId];
+        NSArray *existedWindows = [self.windows filteredArrayUsingPredicate:predicate];
+        
+        if ([existedWindows count] > 0){
+            for (QSHWebViewWindowController *window in existedWindows) {
+                if (bringWindowToFrontInsteadOfCloseIt){
+                    return [window.window makeKeyAndOrderFront:nil];
+                } else{
+                    [window close];
+                }
+            }
+        }
+    }
+    
     [self.windows addObject:webViewWindowController];
 
     if (options[@"x"] && options[@"y"]) {
diff --git a/quark-shell/QSHWebViewWindowController.h b/quark-shell/QSHWebViewWindowController.h
index 9a8859c..0454b33 100644
--- a/quark-shell/QSHWebViewWindowController.h
+++ b/quark-shell/QSHWebViewWindowController.h
@@ -13,10 +13,12 @@
 @interface QSHWebViewWindowController : NSWindowController
 
 @property (nonatomic, strong) QSHWebView *webView;
+@property (nonatomic) NSString *windowId;
 
 - (id)initWithURLString:(NSString *)URLString
                   width:(CGFloat)width
                  height:(CGFloat)height
-            webDelegate:(QSHWebViewDelegate *)webDelegate;
+            webDelegate:(QSHWebViewDelegate *)webDelegate
+               windowId:(NSString *)windowId;
 
 @end
diff --git a/quark-shell/QSHWebViewWindowController.m b/quark-shell/QSHWebViewWindowController.m
index 1cb35c6..cf78ad9 100644
--- a/quark-shell/QSHWebViewWindowController.m
+++ b/quark-shell/QSHWebViewWindowController.m
@@ -49,7 +49,9 @@ - (id)initWithURLString:(NSString *)urlString
                   width:(CGFloat)width
                  height:(CGFloat)height
             webDelegate:(QSHWebViewDelegate *)webDelegate
+               windowId:(NSString *)windowId
 {
+    self.windowId = windowId;
     self = [super initWithWindowNibName:@"QSHWebViewWindowController"];
     if (self) {
         [self.window setFrame:NSMakeRect(self.window.frame.origin.x, self.window.frame.origin.y, width, height) display:YES];

From c84235ccb468a5cd62abaf40513b6af7638cfba9 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Mon, 7 Nov 2016 14:06:00 +0800
Subject: [PATCH 20/43] add closeWindowById api

limit QSHBorderlessWindow dragable area to the top 30
---
 quark-shell/QSHBorderlessWindow.m  |  4 ++++
 quark-shell/QSHWebViewDelegate.m   | 16 ++++++++++++++++
 quark-shell/Quark.js               |  2 +-
 quark-shell/QuarkHeader.js         |  2 +-
 quark-shell/quark-shell-Info.plist |  5 +++++
 5 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHBorderlessWindow.m b/quark-shell/QSHBorderlessWindow.m
index d1dbc9e..9697292 100644
--- a/quark-shell/QSHBorderlessWindow.m
+++ b/quark-shell/QSHBorderlessWindow.m
@@ -53,6 +53,10 @@ - (void)mouseDragged:(NSEvent *)theEvent
     NSRect  screenFrame = [[NSScreen mainScreen] frame];
     NSRect  windowFrame = [self frame];
     
+    if (self.initialLocation.y < (windowFrame.size.height - 30)){
+        return;
+    }
+    
     currentLocation = [NSEvent mouseLocation];
     newOrigin.x = currentLocation.x - self.initialLocation.x;
     newOrigin.y = currentLocation.y - self.initialLocation.y;
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 3fee3a9..3ba4964 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -110,6 +110,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(closePreferences) ||
         selector == @selector(newWindow:) ||
         selector == @selector(closeWindow:) ||
+        selector == @selector(closeWindowById:) ||
         selector == @selector(pin) ||
         selector == @selector(unpin) ||
         selector == @selector(checkUpdate:) ||
@@ -423,6 +424,21 @@ - (void)newWindow:(NSArray *)args
     [webViewWindowController showWindow:nil];
 }
 
+- (void)closeWindowById:(NSArray *)args
+{
+    NSDictionary *options = args[0];
+    NSString *windowId = options[@"id"];
+    
+    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"windowId == %@", windowId];
+    NSArray *existedWindows = [self.windows filteredArrayUsingPredicate:predicate];
+    
+    if ([existedWindows count] > 0){
+        for (QSHWebViewWindowController *window in existedWindows) {
+            [window close];
+        }
+    }
+}
+
 - (void)closeWindow:(NSWindowController *)window
 {
     [window close];
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 998dc07..f77ee95 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -40,7 +40,7 @@ function setupQuarkWithBridge(bridge) {
   setMethods([
     'setupPreferences', 'notify',
     'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
-    'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow',
+    'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow', 'closeWindowById',
     'checkUpdate', 'checkUpdateInBackground',
     'resizePopup'
   ], true);
diff --git a/quark-shell/QuarkHeader.js b/quark-shell/QuarkHeader.js
index 49a8552..b26d7d7 100644
--- a/quark-shell/QuarkHeader.js
+++ b/quark-shell/QuarkHeader.js
@@ -8,4 +8,4 @@ quark.ready = function (fn) {
   } else {
     quark.readyList.push(fn)
   }
-}
\ No newline at end of file
+}
diff --git a/quark-shell/quark-shell-Info.plist b/quark-shell/quark-shell-Info.plist
index 84e3279..1fcf2c1 100644
--- a/quark-shell/quark-shell-Info.plist
+++ b/quark-shell/quark-shell-Info.plist
@@ -2,6 +2,11 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoadsInWebContent</key>
+		<true/>
+	</dict>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>en</string>
 	<key>CFBundleExecutable</key>

From d486f0b617dd2f58827a7b4d3af288d7b6d71c57 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Tue, 8 Nov 2016 15:03:12 +0800
Subject: [PATCH 21/43] quark.onWindowClose api

# Conflicts:
#	quark-shell/QSHWebViewDelegate.m
---
 quark-shell/QSHWebViewDelegate.m | 17 +++++++++++++++++
 quark-shell/Quark.js             | 13 ++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 3ba4964..5b40592 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -355,6 +355,7 @@ - (void)closePreferences
 
 - (void)removeWindowFromWindows:(QSHWebViewWindowController *)windowController
 {
+    [self.webView.bridge callHandler:@"onQuarkWindowClose" data:windowController.windowId];
     [self.windows removeObject:windowController];
 }
 
@@ -404,6 +405,22 @@ - (void)newWindow:(NSArray *)args
 
         [webViewWindowController.window setFrameOrigin:NSMakePoint(x, yFlipped)];
     }
+    
+    if (options[@"minWidth"] && options[@"minHeight"]){
+        NSSize minSize = NSMakeSize([options[@"minWidth"] doubleValue], [options[@"minHeight"] doubleValue]);
+        [webViewWindowController.window setMinSize:minSize];
+    }
+    
+    
+    if (options[@"resizable"] && [options[@"resizable"] boolValue] == NO) {
+        [webViewWindowController.window setStyleMask:[webViewWindowController.window styleMask] & ~NSResizableWindowMask];
+    }
+    
+    if (options[@"transparentTitle"] && [options[@"transparentTitle"] boolValue] == YES) {
+        webViewWindowController.window.styleMask = webViewWindowController.window.styleMask | NSWindowStyleMaskFullSizeContentView;
+        webViewWindowController.window.titleVisibility = NSWindowTitleHidden;
+            webViewWindowController.window.titlebarAppearsTransparent = YES;
+    }
 
     if (options[@"border"] && [options[@"border"] boolValue] == NO) {
         webViewWindowController.window.styleMask = NSBorderlessWindowMask;
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index f77ee95..87cf54c 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -68,13 +68,24 @@ setupWebViewJavascriptBridge(function(bridge) {
   // Message
   quark.msgSubscribers = [];
   quark.onMessage = function(fn) {
-    quark.shortcutSubscribers.push(fn)
+    quark.msgSubscribers.push(fn)
   };
   bridge.registerHandler('onQuarkMessage', function(data) {
     quark.msgSubscribers.forEach(function(fn){
       fn(data);
     })
   });
+                             
+  // windowClose
+  quark.closeSubscribers = [];
+  quark.onWindowClose = function(fn) {
+  quark.closeSubscribers.push(fn)
+  };
+  bridge.registerHandler('onQuarkWindowClose', function(data) {
+                        quark.closeSubscribers.forEach(function(fn){
+                                                     fn(data);
+                                                     })
+                        });
   
   // Shortcut
   quark.shortcutSubscribers = [];

From 87fed0dae8e0670f94a862ee1ca7ab70bac0777d Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Tue, 8 Nov 2016 16:28:57 +0800
Subject: [PATCH 22/43] add showDockIcon api

# Conflicts:
#	quark-shell/QSHAppDelegate.m
---
 quark-shell/QSHAppDelegate.h     |  1 +
 quark-shell/QSHAppDelegate.m     | 17 ++++++++++++++++-
 quark-shell/QSHWebViewDelegate.m |  7 +++++++
 quark-shell/Quark.js             |  2 +-
 4 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.h b/quark-shell/QSHAppDelegate.h
index f071bc9..537019a 100644
--- a/quark-shell/QSHAppDelegate.h
+++ b/quark-shell/QSHAppDelegate.h
@@ -20,5 +20,6 @@
 - (void)hideWindow;
 - (void)toggleWindow;
 - (void)resizeWindow:(CGSize)size;
+- (void)showDockIcon:(bool)showDockIcon;
 
 @end
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 014371d..1f4f603 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -82,12 +82,27 @@ - (void)setupWebView
     _webView.layer.cornerRadius = 5.0;
     _webView.layer.masksToBounds = YES;
     
-    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+    bool showDockIcon = [[NSUserDefaults standardUserDefaults] boolForKey:@"showDockIcon"];
+    if (showDockIcon != NO){
+        [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+    }
     
     NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
+- (void)showDockIcon:(bool)showDockIcon {
+    NSWindow *currentWindow = [NSApp keyWindow];
+    [[NSUserDefaults standardUserDefaults] setBool:showDockIcon forKey:@"showDockIcon"];
+    if (showDockIcon){
+        [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+    } else {
+        [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
+        [currentWindow performSelector:NSSelectorFromString(@"makeKeyAndOrderFront:") withObject:nil afterDelay:0.1];
+    }
+    
+}
+
 - (void)applicationWillBecomeActive:(NSNotification *)notification
 {
     [self showWindow];
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 5b40592..a290857 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -100,6 +100,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(changeLabel:) ||
         selector == @selector(resetMenubarIcon) ||
         selector == @selector(setLaunchAtLogin:) ||
+        selector == @selector(setShowDockIcon:) ||
         selector == @selector(notify:) ||
         selector == @selector(removeAllScheduledNotifications) ||
         selector == @selector(removeAllDeliveredNotifications) ||
@@ -231,6 +232,12 @@ - (void)changeLabel:(NSArray *)args
     self.statusItem.length = 20 + [label sizeWithAttributes:barTextAttributes].width + 10;
 }
 
+- (void)setShowDockIcon:(NSArray *)args
+{
+    bool showDockIcon = [args[0] boolValue];
+    [self.appDelegate showDockIcon:showDockIcon];
+}
+
 - (void)setLaunchAtLogin:(NSArray *)args
 {
     BOOL launchAtLogin;
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 87cf54c..506cefe 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -41,7 +41,7 @@ function setupQuarkWithBridge(bridge) {
     'setupPreferences', 'notify',
     'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
     'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow', 'closeWindowById',
-    'checkUpdate', 'checkUpdateInBackground',
+    'checkUpdate', 'checkUpdateInBackground', 'setShowDockIcon',
     'resizePopup'
   ], true);
 

From 51c0a969ed7ba43f7fefc06287dd01e2341052a8 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Tue, 8 Nov 2016 17:11:24 +0800
Subject: [PATCH 23/43] update quark.setPin api

---
 quark-shell/QSHAppDelegate.m     |  1 +
 quark-shell/QSHWebViewDelegate.m | 14 +++++---------
 quark-shell/Quark.js             |  3 +--
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 1f4f603..744b6d7 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -110,6 +110,7 @@ - (void)applicationWillBecomeActive:(NSNotification *)notification
 
 - (void)windowDidResignKey:(NSNotification *)notification
 {
+    self.pinned = [[NSUserDefaults standardUserDefaults] boolForKey:@"pinned"];
     if (!self.pinned) {
         [self hideWindow];
     }
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index a290857..da7da39 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -112,8 +112,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(newWindow:) ||
         selector == @selector(closeWindow:) ||
         selector == @selector(closeWindowById:) ||
-        selector == @selector(pin) ||
-        selector == @selector(unpin) ||
+        selector == @selector(setPin:) ||
         selector == @selector(checkUpdate:) ||
         selector == @selector(checkUpdateInBackground:) ||
         selector == @selector(emitMessage:) ||
@@ -468,14 +467,11 @@ - (void)closeWindow:(NSWindowController *)window
     [window close];
 }
 
-- (void)pin
+- (void)setPin:(NSArray *)args
 {
-    self.appDelegate.pinned = YES;
-}
-
-- (void)unpin
-{
-    self.appDelegate.pinned = NO;
+    bool pinned = [args[0] boolValue];
+    [[NSUserDefaults standardUserDefaults] setBool:pinned forKey:@"pinned"];
+    self.appDelegate.pinned = pinned;
 }
 
 - (void)checkUpdate:(NSString *)url
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 506cefe..2d498b1 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -33,12 +33,11 @@ function setupQuarkWithBridge(bridge) {
     'openPopup', 'closePopup', 'togglePopup',
     'resetMenubarIcon', 'removeAllScheduledNotifications', 'removeAllDeliveredNotifications',
     'clearKeyboardShortcut', 'openPreferences', 'closePreferences',
-    'pin', 'unpin',
     'quit'
   ], false);
 
   setMethods([
-    'setupPreferences', 'notify',
+    'setupPreferences', 'notify', 'setPin',
     'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
     'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow', 'closeWindowById',
     'checkUpdate', 'checkUpdateInBackground', 'setShowDockIcon',

From 12fff341b1877d3d690e15166ac1db44f04b5fe8 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Tue, 8 Nov 2016 19:26:49 +0800
Subject: [PATCH 24/43] fix quark.setLaunchAtLogin

---
 quark-shell/Quark.js | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 2d498b1..68aa21a 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -37,7 +37,7 @@ function setupQuarkWithBridge(bridge) {
   ], false);
 
   setMethods([
-    'setupPreferences', 'notify', 'setPin',
+    'setupPreferences', 'notify', 'setPin', 'setLaunchAtLogin',
     'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
     'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow', 'closeWindowById',
     'checkUpdate', 'checkUpdateInBackground', 'setShowDockIcon',
@@ -48,11 +48,6 @@ function setupQuarkWithBridge(bridge) {
     bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
   }
 
-  quark.setLaunchAtLogin = function (shouldLaunchAtLogin) {
-    shouldLaunchAtLogin = !!shouldLaunchAtLogin
-    bridge.callHandler('quark', {'method': 'setLaunchAtLogin', 'args': [shouldLaunchAtLogin.toString()]})
-  }
-
   quark.emit = function (options) {
     bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
   }

From d4a24977bc5562598696697f2ee39f6408cdfa80 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Tue, 8 Nov 2016 19:27:11 +0800
Subject: [PATCH 25/43] open mainWindow when dock icon is clicked

---
 quark-shell/QSHAppDelegate.m | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 744b6d7..9ac37c1 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -108,6 +108,14 @@ - (void)applicationWillBecomeActive:(NSNotification *)notification
     [self showWindow];
 }
 
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
+{
+    if (!flag) {
+        [self showWindow];
+    }
+    return true;
+}
+
 - (void)windowDidResignKey:(NSNotification *)notification
 {
     self.pinned = [[NSUserDefaults standardUserDefaults] boolForKey:@"pinned"];

From db38b1a8b6ae3e13b7e885ba08290ff4774fbf3e Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Wed, 9 Nov 2016 15:05:29 +0800
Subject: [PATCH 26/43] add new window option titleBarStyle

---
 quark-shell/QSHWebViewDelegate.m | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index da7da39..949833f 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -445,6 +445,14 @@ - (void)newWindow:(NSArray *)args
     }
 
     [webViewWindowController showWindow:nil];
+    
+    if ([options[@"titleBarStyle"] isEqual: @"hidden-inset"]){
+        [webViewWindowController.window setTitleVisibility:NSWindowTitleHidden];
+        NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"];
+        toolbar.showsBaselineSeparator = NO;
+        [webViewWindowController.window setToolbar:toolbar];
+    }
+
 }
 
 - (void)closeWindowById:(NSArray *)args

From 86be16906fbce33b2b819b7cb0fa666742fc9fcc Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 10 Nov 2016 02:22:26 +0800
Subject: [PATCH 27/43] init container

---
 Podfile                                       |   1 +
 Podfile.lock                                  |   7 +-
 app                                           |   1 -
 {sample => app}/index.html                    |   0
 {sample => app}/index.js                      |   0
 {sample => app}/jquery-2.1.0.min.js           |   0
 quark-shell.xcodeproj/project.pbxproj         |  62 ++++-
 .../AppSandboxFileAccess.h                    | 195 ++++++++++++++
 .../AppSandboxFileAccess.m                    | 240 ++++++++++++++++++
 ...ppSandboxFileAccessOpenSavePanelDelegate.h |  44 ++++
 ...ppSandboxFileAccessOpenSavePanelDelegate.m |  87 +++++++
 .../AppSandboxFileAccessPersist.h             |  45 ++++
 .../AppSandboxFileAccessPersist.m             |  79 ++++++
 quark-shell/Base.lproj/MainMenu.xib           |  17 +-
 quark-shell/QSCConfigure.xib                  |  95 +++++++
 quark-shell/QSCConfigureWindow.h              |  22 ++
 quark-shell/QSCConfigureWindow.m              |  95 +++++++
 quark-shell/QSHAppDelegate.h                  |   1 +
 quark-shell/QSHAppDelegate.m                  |  83 +++++-
 quark-shell/QSHWebViewDelegate.h              |   1 +
 quark-shell/QSHWebViewDelegate.m              |  16 ++
 quark-shell/quark-shell-Prefix.pch            |   4 +-
 quark-shell/quark-shell.entitlements          |   2 +
 sample/about.html                             |  29 ---
 sample/audio.aac                              | Bin 27350 -> 0 bytes
 sample/preferences/account.html               |  39 ---
 sample/preferences/general.html               |  56 ----
 sample/preferences/shortcut.html              |  28 --
 28 files changed, 1075 insertions(+), 174 deletions(-)
 delete mode 120000 app
 rename {sample => app}/index.html (100%)
 rename {sample => app}/index.js (100%)
 rename {sample => app}/jquery-2.1.0.min.js (100%)
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
 create mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
 create mode 100644 quark-shell/QSCConfigure.xib
 create mode 100644 quark-shell/QSCConfigureWindow.h
 create mode 100644 quark-shell/QSCConfigureWindow.m
 delete mode 100644 sample/about.html
 delete mode 100644 sample/audio.aac
 delete mode 100644 sample/preferences/account.html
 delete mode 100644 sample/preferences/general.html
 delete mode 100644 sample/preferences/shortcut.html

diff --git a/Podfile b/Podfile
index 076523b..fb2dbd9 100644
--- a/Podfile
+++ b/Podfile
@@ -9,4 +9,5 @@ target 'quark-shell' do
   pod 'ISO8601DateFormatter', '~> 0.7'
   pod 'StartAtLoginController', '~> 0.0.1'
   pod 'WebViewJavascriptBridge', '~> 5.0'
+  pod "GCDWebServer", "~> 3.0"
 end
\ No newline at end of file
diff --git a/Podfile.lock b/Podfile.lock
index af22310..be3f690 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,4 +1,7 @@
 PODS:
+  - GCDWebServer (3.3.3):
+    - GCDWebServer/Core (= 3.3.3)
+  - GCDWebServer/Core (3.3.3)
   - ISO8601DateFormatter (0.8)
   - MASPreferences (1.2)
   - MASShortcut (2.3.6)
@@ -7,6 +10,7 @@ PODS:
   - WebViewJavascriptBridge (5.0.5)
 
 DEPENDENCIES:
+  - GCDWebServer (~> 3.0)
   - ISO8601DateFormatter (~> 0.7)
   - MASPreferences (from `git@github.com:HackPlan/MASPreferences.git`)
   - MASShortcut (~> 2.3.6)
@@ -24,6 +28,7 @@ CHECKOUT OPTIONS:
     :git: git@github.com:HackPlan/MASPreferences.git
 
 SPEC CHECKSUMS:
+  GCDWebServer: 1c39a1f0763e4eb492bee021e4270fce097d3555
   ISO8601DateFormatter: 4551b6ce4f83185425f583b0b3feb3c7b59b942c
   MASPreferences: 4ff5ced14f2ae0aada927579816c07fa6840f2e8
   MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa
@@ -31,6 +36,6 @@ SPEC CHECKSUMS:
   StartAtLoginController: 9ff14295bab38f7cba164a838349f6c0a2d83020
   WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5
 
-PODFILE CHECKSUM: e07affa7fa239d12faf94712038684d35c8b781c
+PODFILE CHECKSUM: 6c0b029a17ad4a28f625ac9edb86a0334456bf48
 
 COCOAPODS: 1.1.1
diff --git a/app b/app
deleted file mode 120000
index eed7e79..0000000
--- a/app
+++ /dev/null
@@ -1 +0,0 @@
-sample
\ No newline at end of file
diff --git a/sample/index.html b/app/index.html
similarity index 100%
rename from sample/index.html
rename to app/index.html
diff --git a/sample/index.js b/app/index.js
similarity index 100%
rename from sample/index.js
rename to app/index.js
diff --git a/sample/jquery-2.1.0.min.js b/app/jquery-2.1.0.min.js
similarity index 100%
rename from sample/jquery-2.1.0.min.js
rename to app/jquery-2.1.0.min.js
diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index 335a156..9af2f61 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -32,6 +32,14 @@
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
 		8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */; };
+		8A5DB6131DD33F9B004AAA30 /* QSCConfigure.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB6121DD33F9B004AAA30 /* QSCConfigure.xib */; };
+		8A5DB6161DD33FF6004AAA30 /* QSCConfigureWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6151DD33FF6004AAA30 /* QSCConfigureWindow.m */; };
+		8A5DB61C1DD34266004AAA30 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB6191DD34266004AAA30 /* index.html */; };
+		8A5DB61D1DD34266004AAA30 /* index.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB61A1DD34266004AAA30 /* index.js */; };
+		8A5DB61E1DD34266004AAA30 /* jquery-2.1.0.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */; };
+		8A5DB6271DD37BC9004AAA30 /* AppSandboxFileAccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */; };
+		8A5DB6281DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */; };
+		8A5DB6291DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */; };
 		8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
@@ -72,10 +80,8 @@
 
 /* Begin PBXFileReference section */
 		02F1A3336EF3226FC19C4B96 /* Pods-quark-shell.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.release.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.release.xcconfig"; sourceTree = "<group>"; };
-		1A05BC371B0D8A0B00E5BCED /* quark-shell.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "quark-shell.entitlements"; sourceTree = "<group>"; };
 		1A42764819196B6F00815DC6 /* QSHWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWindow.h; sourceTree = "<group>"; };
 		1A42764919196B6F00815DC6 /* QSHWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWindow.m; sourceTree = "<group>"; };
-		1A75781C19B9A261002A9886 /* app */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app; sourceTree = "<group>"; };
 		1A82DE591903B095006AB37F /* QSHWindowBorderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWindowBorderView.h; sourceTree = "<group>"; };
 		1A82DE5A1903B095006AB37F /* QSHWindowBorderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHWindowBorderView.m; sourceTree = "<group>"; };
 		1A91F9DF18E2530B00AA8B7E /* quark-shell.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "quark-shell.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -119,6 +125,19 @@
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
 		8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = QuarkHeader.js; sourceTree = "<group>"; };
+		8A5DB6121DD33F9B004AAA30 /* QSCConfigure.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSCConfigure.xib; sourceTree = "<group>"; };
+		8A5DB6141DD33FF6004AAA30 /* QSCConfigureWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSCConfigureWindow.h; sourceTree = "<group>"; };
+		8A5DB6151DD33FF6004AAA30 /* QSCConfigureWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSCConfigureWindow.m; sourceTree = "<group>"; };
+		8A5DB6191DD34266004AAA30 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; };
+		8A5DB61A1DD34266004AAA30 /* index.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = index.js; sourceTree = "<group>"; };
+		8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jquery-2.1.0.min.js"; sourceTree = "<group>"; };
+		8A5DB6211DD37BC9004AAA30 /* AppSandboxFileAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccess.h; sourceTree = "<group>"; };
+		8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccess.m; sourceTree = "<group>"; };
+		8A5DB6231DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccessOpenSavePanelDelegate.h; sourceTree = "<group>"; };
+		8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccessOpenSavePanelDelegate.m; sourceTree = "<group>"; };
+		8A5DB6251DD37BC9004AAA30 /* AppSandboxFileAccessPersist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccessPersist.h; sourceTree = "<group>"; };
+		8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccessPersist.m; sourceTree = "<group>"; };
+		8A5DB62A1DD38B19004AAA30 /* quark-shell.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "quark-shell.entitlements"; sourceTree = "<group>"; };
 		8A8D99B51DCE591F00AD735E /* QSHBorderlessWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QSHBorderlessWindow.h; sourceTree = "<group>"; };
 		8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHBorderlessWindow.m; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
@@ -160,7 +179,6 @@
 		1A91F9D618E2530B00AA8B7E = {
 			isa = PBXGroup;
 			children = (
-				1A75781C19B9A261002A9886 /* app */,
 				1A91F9E818E2530B00AA8B7E /* quark-shell */,
 				1A91FA0618E2530C00AA8B7E /* quark-shellTests */,
 				1ADE93531B0F093E00D69828 /* quark-shell-helper */,
@@ -205,9 +223,11 @@
 		1A91F9E818E2530B00AA8B7E /* quark-shell */ = {
 			isa = PBXGroup;
 			children = (
-				1A05BC371B0D8A0B00E5BCED /* quark-shell.entitlements */,
+				8A5DB62A1DD38B19004AAA30 /* quark-shell.entitlements */,
+				8A5DB6181DD34266004AAA30 /* app */,
 				1A91F9F418E2530B00AA8B7E /* QSHAppDelegate.h */,
 				1A91F9F518E2530B00AA8B7E /* QSHAppDelegate.m */,
+				8A5DB6121DD33F9B004AAA30 /* QSCConfigure.xib */,
 				1A91F9F718E2530B00AA8B7E /* MainMenu.xib */,
 				1A42764819196B6F00815DC6 /* QSHWindow.h */,
 				1A42764919196B6F00815DC6 /* QSHWindow.m */,
@@ -222,6 +242,8 @@
 				1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */,
 				1AA896701964FB1800E4FDAC /* QSHWebViewWindowController.h */,
 				1AA896711964FB1800E4FDAC /* QSHWebViewWindowController.m */,
+				8A5DB6141DD33FF6004AAA30 /* QSCConfigureWindow.h */,
+				8A5DB6151DD33FF6004AAA30 /* QSCConfigureWindow.m */,
 				8A8D99B51DCE591F00AD735E /* QSHBorderlessWindow.h */,
 				8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */,
 				1AA896721964FB1800E4FDAC /* QSHWebViewWindowController.xib */,
@@ -229,6 +251,7 @@
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
 				8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */,
 				8AC4ABDD1DC48AAD0026D522 /* Quark.js */,
+				8A5DB6201DD37BC9004AAA30 /* AppSandboxFileAccess */,
 				1A91F9FA18E2530B00AA8B7E /* Images.xcassets */,
 				8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */,
 				8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */,
@@ -297,6 +320,29 @@
 			name = Pods;
 			sourceTree = "<group>";
 		};
+		8A5DB6181DD34266004AAA30 /* app */ = {
+			isa = PBXGroup;
+			children = (
+				8A5DB6191DD34266004AAA30 /* index.html */,
+				8A5DB61A1DD34266004AAA30 /* index.js */,
+				8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */,
+			);
+			path = app;
+			sourceTree = SOURCE_ROOT;
+		};
+		8A5DB6201DD37BC9004AAA30 /* AppSandboxFileAccess */ = {
+			isa = PBXGroup;
+			children = (
+				8A5DB6211DD37BC9004AAA30 /* AppSandboxFileAccess.h */,
+				8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */,
+				8A5DB6231DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.h */,
+				8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */,
+				8A5DB6251DD37BC9004AAA30 /* AppSandboxFileAccessPersist.h */,
+				8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */,
+			);
+			path = AppSandboxFileAccess;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -418,8 +464,12 @@
 				1A91F9ED18E2530B00AA8B7E /* InfoPlist.strings in Resources */,
 				1A91F9FB18E2530B00AA8B7E /* Images.xcassets in Resources */,
 				1A91F9F318E2530B00AA8B7E /* Credits.rtf in Resources */,
+				8A5DB6131DD33F9B004AAA30 /* QSCConfigure.xib in Resources */,
 				1AA896741964FB1800E4FDAC /* QSHWebViewWindowController.xib in Resources */,
+				8A5DB61C1DD34266004AAA30 /* index.html in Resources */,
+				8A5DB61D1DD34266004AAA30 /* index.js in Resources */,
 				1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */,
+				8A5DB61E1DD34266004AAA30 /* jquery-2.1.0.min.js in Resources */,
 				8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */,
 				8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */,
 				1A91F9F918E2530B00AA8B7E /* MainMenu.xib in Resources */,
@@ -514,13 +564,17 @@
 				8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */,
 				1A9A456E1A1C93C600C98589 /* NSWindow+Fade.m in Sources */,
 				1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */,
+				8A5DB6161DD33FF6004AAA30 /* QSCConfigureWindow.m in Sources */,
 				8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */,
 				1A91F9F618E2530B00AA8B7E /* QSHAppDelegate.m in Sources */,
 				1AA896731964FB1800E4FDAC /* QSHWebViewWindowController.m in Sources */,
+				8A5DB6271DD37BC9004AAA30 /* AppSandboxFileAccess.m in Sources */,
 				1A91F9EF18E2530B00AA8B7E /* main.m in Sources */,
 				1A82DE5B1903B095006AB37F /* QSHWindowBorderView.m in Sources */,
 				1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */,
 				1ABD40311912E3AB002A53FB /* QSHStatusItemView.m in Sources */,
+				8A5DB6281DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m in Sources */,
+				8A5DB6291DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m in Sources */,
 				1A42764A19196B6F00815DC6 /* QSHWindow.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
new file mode 100755
index 0000000..9e31898
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
@@ -0,0 +1,195 @@
+//
+//  AppSandboxFileAccess.h
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#import <Foundation/Foundation.h>
+@import AppKit;
+
+#pragma mark -
+#pragma mark AppSandboxFileAccessProtocol
+
+@protocol AppSandboxFileAccessProtocol<NSObject>
+
+@required
+- (NSData *)bookmarkDataForURL:(NSURL *)url;
+- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url;
+- (void)clearBookmarkDataForURL:(NSURL *)url;
+
+@end
+
+#pragma mark -
+#pragma mark AppSandboxFileAccess
+
+typedef void (^AppSandboxFileAccessBlock)();
+typedef void (^AppSandboxFileSecurityScopeBlock)(NSURL *securityScopedFileURL, NSData *bookmarkData);
+
+@interface AppSandboxFileAccess : NSObject
+
+/*! @brief The title of the NSOpenPanel displayed when asking permission to access a file.
+ Default: "Allow Access"
+ */
+@property (readwrite, copy, nonatomic) NSString *title;
+/*! @brief The message contained on the the NSOpenPanel displayed when asking permission to access a file.
+ Default: "[Application Name] needs to access this path to continue. Click Allow to continue."
+ */
+@property (readwrite, copy, nonatomic) NSString *message;
+/*! @brief The prompt button on the the NSOpenPanel displayed when asking permission to access a file. 
+ Default: "Allow"
+ */
+@property (readwrite, copy, nonatomic) NSString *prompt;
+
+/*! @brief This is an optional delegate object that can be provided to customize the persistance of bookmark data (e.g. in a Core Data database).
+ Default: nil (Default uses the AppSandboxFileAccessPersist class.)
+ */
+@property (nonatomic, weak) id <AppSandboxFileAccessProtocol> bookmarkPersistanceDelegate;
+
+/*! @brief Create the object with the default values. */
++ (AppSandboxFileAccess *)fileAccess;
+
+/*! @brief Initialise the object with the default values. */
+- (instancetype)init;
+
+/*! @brief Access a file path to read or write, automatically gaining permission from the user with NSOpenPanel if required
+ and using persisted permissions if possible.
+ 
+ @see accessFile:persistPermission:withBlock:
+ @see securityScopedURLForFilePath:persistPermission:bookmark:
+ 
+ @param path A file path, either a file or folder, that the caller needs access to.
+ @param persist If YES will save the permission for future calls.
+ @param block The block that will be given access to the file or folder.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)accessFilePath:(NSString *)path persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block;
+
+/*!
+ @warning Deprecated.
+ 
+ @see accessFilePath:persistPermission:withBlock:
+ 
+ @param path A file path, either a file or folder, that the caller needs access to.
+ @param block The block that will be given access to the file or folder.
+ @param persist If YES will save the permission for future calls.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)accessFilePath:(NSString *)path withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist __attribute__((deprecated("Use 'accessFilePath:persistPermission:withBlock:' instead.")));
+
+/*! @brief Access a file URL to read or write, automatically gaining permission from the user with NSOpenPanel if required
+ and using persisted permissions if possible.
+ 
+ @see requestAccessPermissionsForFileURL:persistPermission:withBlock:
+ 
+ @discussion Internally calls `requestAccessPermissionsForFileURL:persistPermission:withBlock:` and accesses the returned scoped URL if successful.
+ 
+ @discussion See `requestAccessPermissionsForFileURL:persistPermission:withBlock:` for detailed behaviour.
+ 
+ @param fileURL A file URL, either a file or folder, that the caller needs access to.
+ @param persist If YES will save the permission for future calls.
+ @param block The block that will be given access to the file or folder.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)accessFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block;
+
+/*!
+ @warning Deprecated.
+ 
+ @see accessFileURL:persistPermission:withBlock:
+ 
+ @param fileURL A file URL, either a file or folder, that the caller needs access to.
+ @param persist If YES will save the permission for future calls.
+ @param block The block that will be given access to the file or folder.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)accessFileURL:(NSURL *)fileURL withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist __attribute__((deprecated("Use 'accessFileURL:persistPermission:withBlock:' instead.")));
+
+/*! @brief Request access permission for a file path to read or write, automatically with NSOpenPanel if required
+ and using persisted permissions if possible.
+ 
+ @see securityScopedURLForFilePath:persistPermission:bookmark:
+ 
+ @param path A file path, either a file or folder, that the caller needs access to.
+ @param persist If YES will save the permission for future calls.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)requestAccessPermissionsForFilePath:(NSString *)filePath persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block;
+
+/*! @brief Request access permission for a file path to read or write, automatically with NSOpenPanel if required
+ and using persisted permissions if possible.
+ 
+ @discussion Use this function to access a file URL to either read or write in an application restricted by the App Sandbox.
+ This function will ask the user for permission if necessary using a well formed NSOpenPanel. The user will
+ have the option of approving access to the URL you specify, or a parent path for that URL. If persist is YES
+ the permission will be stored as a bookmark in NSUserDefaults and further calls to this function will
+ load the saved permission and not ask for permission again.
+ 
+ @discussion If the file URL does not exist, it's parent directory will be asked for permission instead, since permission
+ to the directory will be required to write the file. If the parent directory doesn't exist, it will ask for
+ permission of whatever part of the parent path exists.
+ 
+ @discussion Note: If the caller has permission to access a file because it was dropped onto the application or introduced
+ to the application in some other way, this function will not be aware of that permission and still prompt
+ the user. To prevent this, use the persistPermission function to persist a permission you've been given
+ whenever a user introduces a file to the application. E.g. when dropping a file onto the application window
+ or dock or when using an NSOpenPanel.
+ 
+ @param fileURL A file URL, either a file or folder, that the caller needs access to.
+ @param persist If YES will save the permission for future calls.
+ @param block The block that will be given access to the file or folder.
+ @return YES if permission was granted or already available, NO otherwise.
+ */
+- (BOOL)requestAccessPermissionsForFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block;
+
+/*! @brief Persist a security bookmark for the given path. The calling application must already have permission.
+ 
+ @see persistPermissionURL:
+ 
+ @param path The path with permission that will be persisted.
+ @return Bookmark data if permission was granted or already available, nil otherwise.
+ */
+- (NSData *)persistPermissionPath:(NSString *)path;
+
+/*! @brief Persist a security bookmark for the given URL. The calling application must already have permission.
+ 
+ @discussion Use this function to persist permission of a URL that has already been granted when a user introduced
+ a file to the calling application. E.g. by dropping the file onto the application window, or dock icon, 
+ or when using an NSOpenPanel.
+ 
+ Note: If the calling application does not have access to this file, this call will do nothing.
+ 
+ @param url The URL with permission that will be persisted.
+ @return Bookmark data if permission was granted or already available, nil otherwise.
+ */
+- (NSData *)persistPermissionURL:(NSURL *)url;
+
+@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
new file mode 100755
index 0000000..c8bd03a
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
@@ -0,0 +1,240 @@
+//
+//  AppSandboxFileAccess.m
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#import "AppSandboxFileAccess.h"
+#import "AppSandboxFileAccessPersist.h"
+#import "AppSandboxFileAccessOpenSavePanelDelegate.h"
+
+#if !__has_feature(objc_arc)
+#error ARC must be enabled!
+#endif
+
+#define CFBundleDisplayName @"CFBundleDisplayName"
+#define CFBundleName        @"CFBundleName"
+
+@interface AppSandboxFileAccess ()
+@property (nonatomic, strong) AppSandboxFileAccessPersist *defaultDelegate;
+@end
+
+@implementation AppSandboxFileAccess
+
++ (AppSandboxFileAccess *)fileAccess {
+	return [[AppSandboxFileAccess alloc] init];
+}
+
+- (instancetype)init {
+	self = [super init];
+	if (self) {
+		NSString *applicationName = [[NSBundle mainBundle] objectForInfoDictionaryKey:CFBundleDisplayName];
+		if (!applicationName) {
+			applicationName = [[NSBundle mainBundle] objectForInfoDictionaryKey:CFBundleName];
+		}
+		
+		self.title = NSLocalizedString(@"Allow Access", @"Sandbox Access panel title.");
+		NSString *formatString = NSLocalizedString(@"%@ needs to access this path to continue. Click Allow to continue.", @"Sandbox Access panel message.");
+		self.message = [NSString stringWithFormat:formatString, applicationName];
+		self.prompt = NSLocalizedString(@"Allow", @"Sandbox Access panel prompt.");
+		
+		// create default delegate object that persists bookmarks to user defaults
+		self.defaultDelegate = [[AppSandboxFileAccessPersist alloc] init];
+		self.bookmarkPersistanceDelegate = _defaultDelegate;
+	}
+	return self;
+}
+
+- (NSURL *)askPermissionForURL:(NSURL *)url {
+	NSParameterAssert(url);
+	
+	// this url will be the url allowed, it might be a parent url of the url passed in
+	__block NSURL *allowedURL = nil;
+	
+	// create delegate that will limit which files in the open panel can be selected, to ensure only a folder
+	// or file giving permission to the file requested can be selected
+	AppSandboxFileAccessOpenSavePanelDelegate *openPanelDelegate = [[AppSandboxFileAccessOpenSavePanelDelegate alloc] initWithFileURL:url];
+	
+	// check that the url exists, if it doesn't, find the parent path of the url that does exist and ask permission for that
+	NSFileManager *fileManager = [NSFileManager defaultManager];
+	NSString *path = [url path];
+	while (path.length > 1) { // give up when only '/' is left in the path or if we get to a path that exists
+		if ([fileManager fileExistsAtPath:path isDirectory:NULL]) {
+			break;
+		}
+		path = [path stringByDeletingLastPathComponent];
+	}
+	url = [NSURL fileURLWithPath:path];
+	
+	// display the open panel
+	dispatch_block_t displayOpenPanelBlock = ^{
+		NSOpenPanel *openPanel = [NSOpenPanel openPanel];
+		[openPanel setMessage:self.message];
+		[openPanel setCanCreateDirectories:NO];
+		[openPanel setCanChooseFiles:YES];
+		[openPanel setCanChooseDirectories:YES];
+		[openPanel setAllowsMultipleSelection:NO];
+		[openPanel setPrompt:self.prompt];
+		[openPanel setTitle:self.title];
+		[openPanel setShowsHiddenFiles:NO];
+		[openPanel setExtensionHidden:NO];
+		[openPanel setDirectoryURL:url];
+		[openPanel setDelegate:openPanelDelegate];
+		[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
+		NSInteger openPanelButtonPressed = [openPanel runModal];
+		if (openPanelButtonPressed == NSFileHandlingPanelOKButton) {
+			allowedURL = [openPanel URL];
+		}
+	};
+	if ([NSThread isMainThread]) {
+		displayOpenPanelBlock();
+	} else {
+		dispatch_sync(dispatch_get_main_queue(), displayOpenPanelBlock);
+	}
+
+	return allowedURL;
+}
+
+- (NSData *)persistPermissionPath:(NSString *)path {
+	NSParameterAssert(path);
+	
+	return [self persistPermissionURL:[NSURL fileURLWithPath:path]];
+}
+
+- (NSData *)persistPermissionURL:(NSURL *)url {
+	NSParameterAssert(url);
+	
+	// store the sandbox permissions
+	NSData *bookmarkData = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
+	if (bookmarkData) {
+		[self.bookmarkPersistanceDelegate setBookmarkData:bookmarkData forURL:url];
+	}
+	return bookmarkData;
+}
+
+- (BOOL)accessFilePath:(NSString *)path withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist {
+	// Deprecated. Use 'accessFilePath:persistPermission:withBlock:' instead.
+	return [self accessFilePath:path persistPermission:persist withBlock:block];
+}
+
+- (BOOL)accessFileURL:(NSURL *)fileURL withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist {
+	// Deprecated. Use 'accessFileURL:persistPermission:withBlock:' instead.
+	return [self accessFileURL:fileURL persistPermission:persist withBlock:block];
+}
+
+- (BOOL)accessFilePath:(NSString *)path persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block {
+	return [self accessFileURL:[NSURL fileURLWithPath:path] persistPermission:persist withBlock:block];
+}
+
+- (BOOL)accessFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block {
+	NSParameterAssert(fileURL);
+	NSParameterAssert(block);
+	
+	BOOL success = [self requestAccessPermissionsForFileURL:fileURL persistPermission:persist withBlock:^(NSURL *securityScopedFileURL, NSData *bookmarkData) {
+		// execute the block with the file access permissions
+		@try {
+			[securityScopedFileURL startAccessingSecurityScopedResource];
+			block();
+		} @finally {
+			[securityScopedFileURL stopAccessingSecurityScopedResource];
+		}
+	}];
+	
+	return success;
+}
+
+- (BOOL)requestAccessPermissionsForFilePath:(NSString *)filePath persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block {
+	NSParameterAssert(filePath);
+	
+	NSURL *fileURL = [NSURL fileURLWithPath:filePath];
+	return [self requestAccessPermissionsForFileURL:fileURL persistPermission:persist withBlock:block];
+}
+
+- (BOOL)requestAccessPermissionsForFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block {
+	NSParameterAssert(fileURL);
+	
+	NSURL *allowedURL = nil;
+	
+	// standardize the file url and remove any symlinks so that the url we lookup in bookmark data would match a url given by the askPermissionForURL method
+	fileURL = [[fileURL URLByStandardizingPath] URLByResolvingSymlinksInPath];
+	
+	// lookup bookmark data for this url, this will automatically load bookmark data for a parent path if we have it
+	NSData *bookmarkData = [self.bookmarkPersistanceDelegate bookmarkDataForURL:fileURL];
+	if (bookmarkData) {
+		// resolve the bookmark data into an NSURL object that will allow us to use the file
+		BOOL bookmarkDataIsStale;
+		allowedURL = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope|NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:&bookmarkDataIsStale error:NULL];
+		// if the bookmark data is stale we'll attempt to recreate it with the existing url object if possible (not guaranteed)
+		if (bookmarkDataIsStale) {
+			bookmarkData = nil;
+			[self.bookmarkPersistanceDelegate clearBookmarkDataForURL:fileURL];
+			if (allowedURL) {
+				bookmarkData = [self persistPermissionURL:allowedURL];
+				if (!bookmarkData) {
+					allowedURL = nil;
+				}
+			}
+		}
+	}
+	
+	// if allowed url is nil, we need to ask the user for permission
+	if (!allowedURL) {
+		allowedURL = [self askPermissionForURL:fileURL];
+		if (!allowedURL) {
+			// if the user did not give permission, exit out here
+			return NO;
+		}
+	}
+	
+	// if we have no bookmark data and we want to persist, we need to create it
+	if (persist && !bookmarkData) {
+		bookmarkData = [self persistPermissionURL:allowedURL];
+	}
+	
+	if (block) {
+		block(allowedURL, bookmarkData);
+	}
+	
+	return YES;
+}
+
+- (void)setBookmarkPersistanceDelegate:(NSObject<AppSandboxFileAccessProtocol> *)bookmarkPersistanceDelegate
+{
+	// revert to default delegate object if no delegate provided
+	if (bookmarkPersistanceDelegate == nil) {
+		_bookmarkPersistanceDelegate = self.defaultDelegate;
+	} else {
+		_bookmarkPersistanceDelegate = bookmarkPersistanceDelegate;
+	}
+}
+
+@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
new file mode 100755
index 0000000..3786982
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
@@ -0,0 +1,44 @@
+//
+//  AppSandboxFileAccessOpenSavePanelDelegate.h
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+#import <Foundation/Foundation.h>
+@import AppKit;
+
+@interface AppSandboxFileAccessOpenSavePanelDelegate : NSObject <NSOpenSavePanelDelegate>
+
+- (instancetype)initWithFileURL:(NSURL *)fileURL;
+
+@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
new file mode 100755
index 0000000..d07b7ce
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
@@ -0,0 +1,87 @@
+//
+//  AppSandboxFileAccessOpenSavePanelDelegate.m
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+#import "AppSandboxFileAccessOpenSavePanelDelegate.h"
+
+#if !__has_feature(objc_arc)
+#error ARC must be enabled!
+#endif
+
+@interface AppSandboxFileAccessOpenSavePanelDelegate ()
+
+@property (readwrite, strong, nonatomic) NSArray *pathComponents;
+
+@end
+
+@implementation AppSandboxFileAccessOpenSavePanelDelegate
+
+- (instancetype)initWithFileURL:(NSURL *)fileURL {
+	self = [super init];
+	if (self) {
+		NSParameterAssert(fileURL);
+		self.pathComponents = fileURL.pathComponents;
+	}
+	return self;
+}
+
+#pragma mark -- NSOpenSavePanelDelegate
+
+- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
+	NSParameterAssert(url);
+	
+	NSArray *pathComponents = self.pathComponents;
+	NSArray *otherPathComponents = url.pathComponents;
+	
+	// if the url passed in has more components, it could not be a parent path or a exact same path
+	if (otherPathComponents.count > pathComponents.count) {
+		return NO;
+	}
+	
+	// check that each path component in url, is the same as each corresponding component in self.url
+	for (NSUInteger i = 0; i < otherPathComponents.count; ++i) {
+		NSString *comp1 = otherPathComponents[i];
+		NSString *comp2 = pathComponents[i];
+		// not the same, therefore url is not a parent or exact match to self.url
+		if (![comp1 isEqualToString:comp2]) {
+			return NO;
+		}
+	}
+	
+	// there were no mismatches (or no components meaning url is root)
+	return YES;
+}
+
+@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
new file mode 100755
index 0000000..6031ee1
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
@@ -0,0 +1,45 @@
+//
+//  AppSandboxFileAccessPersist.h
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#import <Foundation/Foundation.h>
+#import "AppSandboxFileAccess.h"
+
+@interface AppSandboxFileAccessPersist : NSObject <AppSandboxFileAccessProtocol>
+
+- (NSData *)bookmarkDataForURL:(NSURL *)url;
+- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url;
+- (void)clearBookmarkDataForURL:(NSURL *)url;
+
+@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
new file mode 100755
index 0000000..cb09268
--- /dev/null
+++ b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
@@ -0,0 +1,79 @@
+//
+//  AppSandboxFileAccessPersist.m
+//  AppSandboxFileAccess
+//
+//  Created by Leigh McCulloch on 23/11/2013.
+//
+//  Copyright (c) 2013, Leigh McCulloch
+//  All rights reserved.
+//
+//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
+//
+//  Redistribution and use in source and binary forms, with or without
+//  modification, are permitted provided that the following conditions are
+//  met:
+//
+//  1. Redistributions of source code must retain the above copyright
+//  notice, this list of conditions and the following disclaimer.
+//
+//  2. Redistributions in binary form must reproduce the above copyright
+//  notice, this list of conditions and the following disclaimer in the
+//  documentation and/or other materials provided with the distribution.
+//
+//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#import "AppSandboxFileAccessPersist.h"
+
+#if !__has_feature(objc_arc)
+#error ARC must be enabled!
+#endif
+
+@implementation AppSandboxFileAccessPersist
+
++ (NSString *)keyForBookmarkDataForURL:(NSURL *)url {
+	NSString *urlStr = [url absoluteString];
+	return [NSString stringWithFormat:@"bd_%1$@", urlStr];
+}
+
+- (NSData *)bookmarkDataForURL:(NSURL *)url {
+	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+	
+	// loop through the bookmarks one path at a time down the URL
+	NSURL *subURL = url;
+	while ([subURL path].length > 1) { // give up when only '/' is left in the path
+		NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:subURL];
+		NSData *bookmark = [defaults dataForKey:key];
+		if (bookmark) { // if a bookmark is found, return it
+			return bookmark;
+		}
+		subURL = [subURL URLByDeletingLastPathComponent];
+	}
+	
+	// no bookmarks for the URL, or parent to the URL were found
+	return nil;
+}
+
+- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url {
+	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+	NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:url];
+	[defaults setObject:data forKey:key];
+}
+
+- (void)clearBookmarkDataForURL:(NSURL *)url {
+	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+	NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:url];
+	[defaults removeObjectForKey:key];
+}
+
+@end
diff --git a/quark-shell/Base.lproj/MainMenu.xib b/quark-shell/Base.lproj/MainMenu.xib
index a229147..596cb02 100644
--- a/quark-shell/Base.lproj/MainMenu.xib
+++ b/quark-shell/Base.lproj/MainMenu.xib
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -28,11 +29,11 @@
         </window>
         <menu title="Main Menu" systemMenu="main" id="tdM-1d-aZL">
             <items>
-                <menuItem title="Menubar WebKit" id="BQ6-OV-amQ">
+                <menuItem title="Quark Container" id="BQ6-OV-amQ">
                     <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Menubar WebKit" systemMenu="apple" id="nhy-Sa-7z1">
+                    <menu key="submenu" title="Quark Container" systemMenu="apple" id="nhy-Sa-7z1">
                         <items>
-                            <menuItem title="About Menubar WebKit" id="U4e-aq-VaD">
+                            <menuItem title="Configure" id="U4e-aq-VaD">
                                 <modifierMask key="keyEquivalentModifierMask"/>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="20d-gj-dDZ"/>
@@ -43,7 +44,7 @@
                                 <menu key="submenu" title="Services" systemMenu="services" id="NLl-pI-e6c"/>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="5sr-ed-yEb"/>
-                            <menuItem title="Hide Menubar WebKit" keyEquivalent="h" id="HGc-Jt-lN6">
+                            <menuItem title="Hide Quark Contatiner" keyEquivalent="h" id="HGc-Jt-lN6">
                                 <connections>
                                     <action selector="hide:" target="-1" id="VmP-I0-sBV"/>
                                 </connections>
@@ -55,7 +56,7 @@
                                 </connections>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="a0D-7j-vEC"/>
-                            <menuItem title="Quit Menubar WebKit" keyEquivalent="q" id="Iza-Zo-7D6">
+                            <menuItem title="Quit" keyEquivalent="q" id="Iza-Zo-7D6">
                                 <connections>
                                     <action selector="terminate:" target="-1" id="HgD-QZ-hES"/>
                                 </connections>
@@ -423,7 +424,7 @@
                     <modifierMask key="keyEquivalentModifierMask"/>
                     <menu key="submenu" title="Help" systemMenu="help" id="afv-7J-sB2">
                         <items>
-                            <menuItem title="quark-shell Help" keyEquivalent="?" id="iUl-3c-6aB"/>
+                            <menuItem title="Help" keyEquivalent="?" id="iUl-3c-6aB"/>
                         </items>
                     </menu>
                 </menuItem>
diff --git a/quark-shell/QSCConfigure.xib b/quark-shell/QSCConfigure.xib
new file mode 100644
index 0000000..cbbc117
--- /dev/null
+++ b/quark-shell/QSCConfigure.xib
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+        <capability name="stacking Non-gravity area distributions on NSStackView" minToolsVersion="7.0" minSystemVersion="10.11"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="QSCConfigureWindow">
+            <connections>
+                <outlet property="loadButton" destination="nDm-55-rot" id="Z3w-vj-67C"/>
+                <outlet property="makeButton" destination="1Si-75-s1W" id="HVY-4X-gdg"/>
+                <outlet property="pathInput" destination="w2x-ug-NfE" id="2Az-Lf-phG"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Configure" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="480" height="115"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
+                <rect key="frame" x="0.0" y="0.0" width="480" height="115"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="w2x-ug-NfE">
+                        <rect key="frame" x="120" y="67" width="280" height="22"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="60B-sG-TLH">
+                            <font key="font" metaFont="system"/>
+                            <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                        </textFieldCell>
+                    </textField>
+                    <imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="frm-zU-d02">
+                        <rect key="frame" x="80" y="64" width="32" height="32"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="NSFolder" id="Mef-Wz-v9Z"/>
+                    </imageView>
+                    <stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" fixedFrame="YES" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DXr-4P-PWe">
+                        <rect key="frame" x="120" y="38" width="198" height="21"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                        <subviews>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nDm-55-rot">
+                                <rect key="frame" x="-6" y="-7" width="70" height="32"/>
+                                <buttonCell key="cell" type="push" title="Load" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lNR-Yi-j4F">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                                <connections>
+                                    <action selector="loadButtonTapped:" target="-2" id="TqA-AB-eAb"/>
+                                </connections>
+                            </button>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Si-75-s1W">
+                                <rect key="frame" x="60" y="-7" width="73" height="32"/>
+                                <buttonCell key="cell" type="push" title="Make" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="luz-hf-Tta">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                                <connections>
+                                    <action selector="makeButtonTapped:" target="-2" id="YgK-w0-1OK"/>
+                                </connections>
+                            </button>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NjL-nv-3dv">
+                                <rect key="frame" x="129" y="-7" width="75" height="32"/>
+                                <buttonCell key="cell" type="push" title="Reset" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="RRV-iH-mdO">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                                <connections>
+                                    <action selector="resetButtonTapped:" target="-2" id="JEY-ES-l00"/>
+                                </connections>
+                            </button>
+                        </subviews>
+                        <visibilityPriorities>
+                            <integer value="1000"/>
+                            <integer value="1000"/>
+                            <integer value="1000"/>
+                        </visibilityPriorities>
+                        <customSpacing>
+                            <real value="3.4028234663852886e+38"/>
+                            <real value="3.4028234663852886e+38"/>
+                            <real value="3.4028234663852886e+38"/>
+                        </customSpacing>
+                    </stackView>
+                </subviews>
+            </view>
+            <point key="canvasLocation" x="157" y="102"/>
+        </window>
+    </objects>
+    <resources>
+        <image name="NSFolder" width="32" height="32"/>
+    </resources>
+</document>
diff --git a/quark-shell/QSCConfigureWindow.h b/quark-shell/QSCConfigureWindow.h
new file mode 100644
index 0000000..7b088b0
--- /dev/null
+++ b/quark-shell/QSCConfigureWindow.h
@@ -0,0 +1,22 @@
+//
+//  QSCConfigureWindow.h
+//  quark-shell
+//
+//  Created by Sun Liang on 2016/11/9.
+//  Copyright © 2016年 HackPlan. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
+#import "QSHAppDelegate.h"
+#import "AppSandboxFileAccess.h"
+
+@interface QSCConfigureWindow : NSWindowController
+
+@property (nonatomic, weak) QSHAppDelegate *appDelegate;
+
+- (IBAction)loadButtonTapped:(NSButton *)sender;
+- (IBAction)makeButtonTapped:(NSButton *)sender;
+- (IBAction)resetButtonTapped:(NSButton *)sender;
+@end
+
diff --git a/quark-shell/QSCConfigureWindow.m b/quark-shell/QSCConfigureWindow.m
new file mode 100644
index 0000000..acef997
--- /dev/null
+++ b/quark-shell/QSCConfigureWindow.m
@@ -0,0 +1,95 @@
+//
+//  QSCConfigureWindow.m
+//  quark-shell
+//
+//  Created by Sun Liang on 2016/11/9.
+//  Copyright © 2016年 HackPlan. All rights reserved.
+//
+
+#import "QSCConfigureWindow.h"
+
+@interface QSCConfigureWindow()
+@property (weak) IBOutlet NSButton *makeButton;
+@property (weak) IBOutlet NSButton *loadButton;
+@property (weak) IBOutlet NSTextField *pathInput;
+@property (weak) IBOutlet NSPathControl *folderPath;
+@property (nonatomic) NSURL *folderURL;
+@end
+
+@implementation QSCConfigureWindow
+
+- (id) init {
+    return [super initWithWindowNibName:@"QSCConfigure" owner:self];
+}
+
+- (IBAction)loadButtonTapped:(NSButton *)sender
+{
+    [self choseFolder];
+}
+
+- (IBAction)makeButtonTapped:(NSButton *)sender
+{
+    [[NSUserDefaults standardUserDefaults] setURL:_folderURL forKey:@"folder"];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    
+    [self.appDelegate reloadWebview];
+}
+
+- (IBAction)resetButtonTapped:(NSButton *)sender
+{
+    [[NSUserDefaults standardUserDefaults] setURL:nil forKey:@"folder"];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    
+    _folderURL = nil;
+    
+    [_pathInput setStringValue:@""];
+    
+    [self.appDelegate reloadWebview];
+}
+
+- (void)windowDidLoad {
+    [super windowDidLoad];
+    
+    _folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
+    if (_folderURL){
+        [_pathInput setStringValue:[_folderURL absoluteString]];
+    }
+}
+
+- (void)choseFolder {
+    AppSandboxFileAccess *fileAccess = [AppSandboxFileAccess fileAccess];
+    
+    NSOpenPanel* panel = [NSOpenPanel openPanel];
+    [panel setCanChooseDirectories:YES];
+    [panel setCanCreateDirectories:YES];
+    
+    [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){
+        if (result == NSFileHandlingPanelOKButton) {
+            NSArray* urls = [panel URLs];
+            for (NSURL *url in urls) {
+                if (url.isFileURL) {
+                    BOOL isDir = NO;
+                    // Verify that the file exists
+                    // and is indeed a directory (isDirectory is an out parameter)
+                    if ([[NSFileManager defaultManager] fileExistsAtPath: url.path isDirectory: &isDir]
+                        && isDir) {
+                        
+                        _folderURL = url;
+                        [fileAccess persistPermissionPath:[_folderURL absoluteString]];
+                        
+                        BOOL accessAllowed = [fileAccess accessFilePath:[_folderURL absoluteString] persistPermission:YES withBlock:^{
+                            [_pathInput setStringValue:[_folderURL absoluteString]];
+                            
+                        }];
+                        
+                        if (!accessAllowed) {
+                            NSLog(@"Sad Wookie");
+                        }
+                    }
+                }
+            }
+        }
+    }];
+}
+
+@end
diff --git a/quark-shell/QSHAppDelegate.h b/quark-shell/QSHAppDelegate.h
index 537019a..3349113 100644
--- a/quark-shell/QSHAppDelegate.h
+++ b/quark-shell/QSHAppDelegate.h
@@ -16,6 +16,7 @@
 @property (nonatomic, copy) void (^clickCallback)();
 @property (nonatomic, copy) void (^secondaryClickCallback)();
 
+- (void)reloadWebview;
 - (void)showWindow;
 - (void)hideWindow;
 - (void)toggleWindow;
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 9ac37c1..1449533 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -11,10 +11,12 @@
 #import "QSHAppDelegate.h"
 #import "QSHWindowBorderView.h"
 #import "QSHWebView.h"
+#import "QSCConfigureWindow.h"
 #import "QSHWebViewDelegate.h"
 #import "QSHStatusItemView.h"
 #import "NSWindow+Fade.h"
 #import "WKWebViewJavascriptBridge.h"
+#import <GCDWebServer/GCDWebServer.h>
 
 static const CGFloat kMinimumSpaceBetweenWindowAndScreenEdge = 10;
 
@@ -23,11 +25,14 @@ @interface QSHAppDelegate () <NSWindowDelegate>
 @property (nonatomic) NSStatusItem *statusItem;
 @property (nonatomic) QSHStatusItemView *statusItemView;
 @property (nonatomic) QSHWebViewDelegate *webViewDelegate;
+@property (nonatomic) QSCConfigureWindow *configureWindow;
 
 @end
 
 @implementation QSHAppDelegate {
     QSHWebView *_webView;
+    GCDWebServer* _webServer;
+    NSMutableDictionary* _webServerOptions;
 }
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
@@ -41,8 +46,22 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
     self.webViewDelegate.statusItem = self.statusItem;
     self.webViewDelegate.statusItemView = self.statusItemView;
     self.webViewDelegate.webView = _webView;
-//    _webView.navigationDelegate = self.webViewDelegate;
+
     _webView.UIDelegate = self.webViewDelegate;
+    
+    NSMenu *menu = [[[[NSApplication sharedApplication] mainMenu] itemAtIndex:0] submenu];
+    NSMenuItem *configureMenuItem = [menu itemAtIndex:0];
+    if (configureMenuItem)
+    {
+        [configureMenuItem setTarget:self];
+        [configureMenuItem setAction:@selector(openConfigure:)];
+    }
+}
+
+- (void)openConfigure:(id)sender {
+    _configureWindow = [[QSCConfigureWindow alloc] init];
+    _configureWindow.appDelegate = self;
+    [_configureWindow showWindow:nil];
 }
 
 - (void)setupStatusItemAndWindow
@@ -65,6 +84,51 @@ - (void)setupStatusItemAndWindow
     [self.window setBackgroundColor:[NSColor clearColor]];
 }
 
+- (void)setupWebserver
+{
+    _webServer = [[GCDWebServer alloc] init];
+    _webServerOptions = [NSMutableDictionary dictionary];
+    
+    NSString *directoryPath = [[QSHWebViewDelegate getRootURL] path];
+    NSLog(@"Start webserver at: %@", directoryPath);
+    // Add GET handler for local "www/" directory
+    [_webServer addGETHandlerForBasePath:@"/"
+                           directoryPath:directoryPath
+                           indexFilename:nil
+                                cacheAge:30
+                      allowRangeRequests:YES];
+    
+    // Initialize Server startup
+    [self startServer];
+    NSLog(@"Visit %@ in your web browser", _webServer.serverURL);
+}
+
+- (void)startServer
+{
+    NSError *error = nil;
+    
+    // Enable this option to force the Server also to run when suspended
+    //[_webServerOptions setObject:[NSNumber numberWithBool:NO] forKey:GCDWebServerOption_AutomaticallySuspendInBackground];
+    
+    [_webServerOptions setObject:[NSNumber numberWithBool:YES]
+                          forKey:GCDWebServerOption_BindToLocalhost];
+    
+    // Initialize Server listening port, initially trying 12344 for backwards compatibility
+    int httpPort = 12311;
+    
+    // Start Server
+    do {
+        [_webServerOptions setObject:[NSNumber numberWithInteger:httpPort++]
+                              forKey:GCDWebServerOption_Port];
+    } while(![_webServer startWithOptions:_webServerOptions error:&error]);
+    
+    if (error) {
+        NSLog(@"Error starting http daemon: %@", error);
+    } else {
+        NSLog(@"Started http daemon: %@ ", _webServer.serverURL);
+    }
+}
+
 - (void)setupWebView
 {
     QSHWindowBorderView *contentView = _window.contentView;
@@ -83,14 +147,21 @@ - (void)setupWebView
     _webView.layer.masksToBounds = YES;
     
     bool showDockIcon = [[NSUserDefaults standardUserDefaults] boolForKey:@"showDockIcon"];
-    if (showDockIcon != NO){
-        [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
-    }
-    
-    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:[[NSBundle mainBundle] resourceURL]];
+//    if (showDockIcon != NO){
+    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+//    }
+    [self setupWebserver];
+    NSURL *rootUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)_webServer.port]];
+    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:rootUrl];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
+- (void)reloadWebview
+{
+    [self hideWindow];
+    [self setupWebView];
+}
+
 - (void)showDockIcon:(bool)showDockIcon {
     NSWindow *currentWindow = [NSApp keyWindow];
     [[NSUserDefaults standardUserDefaults] setBool:showDockIcon forKey:@"showDockIcon"];
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 33703ac..0b62e07 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -25,6 +25,7 @@
 @property (nonatomic, weak) WKWebViewJavascriptBridge *mainBridge;
 
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
++ (NSURL *)getRootURL;
 
 + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate isMain:(BOOL)isMain;
 
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 949833f..6e29cc8 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -14,6 +14,7 @@
 #import <ISO8601DateFormatter.h>
 #import <StartAtLoginController.h>
 #import "WKWebViewJavascriptBridge.h"
+#import <GCDWebServer/GCDWebServer.h>
 
 static const NSInteger kPreferencesDefaultHeight = 192;
 
@@ -21,6 +22,7 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
     NSString *appVersion;
     NSString *appBundleVersion;
     NSString *platform;
+
     BOOL debug;
 }
 
@@ -37,6 +39,15 @@ + (void)initialize
     [[NSUserDefaults standardUserDefaults] synchronize];
 }
 
++ (NSURL *)getRootURL
+{
+    NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
+    if (folderURL){
+        return [folderURL absoluteURL];
+    }
+    return [[NSBundle mainBundle] resourceURL];
+}
+
 - (instancetype)init
 {
     self = [super init];
@@ -81,6 +92,11 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
     
     // Load Page
     [webview loadRequest:[NSURLRequest requestWithURL:url]];
+    
+//    NSURL *top = [NSURL URLWithString:[[url absoluteString] stringByDeletingLastPathComponent]];
+//    NSURL *newUrl = [NSURL URLWithString:[url absoluteString]];
+//    NSLog(@"toload: %@", newUrl);
+//    [webview loadFileURL:newUrl allowingReadAccessToURL:top];
 }
 
 #pragma mark WebScripting Protocol
diff --git a/quark-shell/quark-shell-Prefix.pch b/quark-shell/quark-shell-Prefix.pch
index e866e8a..40cd475 100644
--- a/quark-shell/quark-shell-Prefix.pch
+++ b/quark-shell/quark-shell-Prefix.pch
@@ -10,8 +10,8 @@
 #endif
 
 static NSString * const kRootPath = @"app/";
-static NSString * const kIndexPath = @"app/index.html";
-static NSString * const kPreferencesDirectory = @"app/preferences/";
+static NSString * const kIndexPath = @"index.html";
+static NSString * const kPreferencesDirectory = @"preferences/";
 
 #define IS_PRIOR_TO_10_9  (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9)
 #define IS_PRIOR_TO_10_10 (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10_Max)
diff --git a/quark-shell/quark-shell.entitlements b/quark-shell/quark-shell.entitlements
index a046386..85c03d7 100644
--- a/quark-shell/quark-shell.entitlements
+++ b/quark-shell/quark-shell.entitlements
@@ -8,5 +8,7 @@
 	<true/>
 	<key>com.apple.security.network.client</key>
 	<true/>
+	<key>com.apple.security.network.server</key>
+	<true/>
 </dict>
 </plist>
diff --git a/sample/about.html b/sample/about.html
deleted file mode 100644
index c2feced..0000000
--- a/sample/about.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>About Quark Shell</title>
-  <style>
-  html, body {
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    font-family: "Helvetica Neue";
-    text-align: center;
-  }
-  h1 {
-    color: #999;
-    margin-top: 100px;
-    font-size: 28px;
-  }
-  button {
-    margin-top: 60px;
-  }
-  </style>
-  <script type="text/javascript" src="jquery-2.1.0.min.js"></script>
-  <script type="text/javascript" src="index.js"></script>
-</head>
-<body>
-  <h1>Awesome Project!</h1>
-  <button onclick="quark.closeWindow()">Close</button>
-</body>
-</html>
diff --git a/sample/audio.aac b/sample/audio.aac
deleted file mode 100644
index e01b648f183ac773e548058c85fa9420052b565d..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/sample/preferences/account.html b/sample/preferences/account.html
deleted file mode 100644
index c38ac9c..0000000
--- a/sample/preferences/account.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Quark Shell</title>
-  <style>
-  html {
-    background-color: rgb(237, 237, 237);
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    -webkit-user-select: none;
-  }
-  body {
-    font-family: -apple-system-font, sans-serif;
-    margin: 0;
-    padding: 0;
-    height: 100%;
-    overflow: hidden;
-  }
-  p {
-    margin-top: 42px;
-    text-align: center;
-  }
-  a {
-    color: rgb(0, 129, 209);
-    text-decoration: none;
-    cursor: pointer;
-  }
-  a:hover {
-    text-decoration: underline;
-  }
-  </style>
-  <script type="text/javascript" src="../jquery-2.1.0.min.js"></script>
-  <script type="text/javascript" src="../index.js"></script>
-</head>
-<body>
-  <p><a onclick="notify({title: 'Quark Shell', content: 'It works!', popupOnClick: true})">quark object is also usable here.</a></p>
-</body>
-</html>
diff --git a/sample/preferences/general.html b/sample/preferences/general.html
deleted file mode 100644
index 901247c..0000000
--- a/sample/preferences/general.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Quark Shell</title>
-  <style>
-  html {
-    background-color: rgb(237, 237, 237);
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    -webkit-user-select: none;
-  }
-  body {
-    font-family: -apple-system-font, sans-serif;
-    margin: 0;
-    padding: 0;
-    height: 100%;
-    overflow: hidden;
-  }
-  p:first-child {
-    margin-top: 24px;
-  }
-  p {
-    font-size: 13px;
-    margin: 3px 0;
-  }
-  input {
-    font-size: 16px;
-    margin-left: 140px;
-    margin-right: 4px;
-  }
-  select {
-    font-size: 16px;
-  }
-  p.footnote {
-    margin-top: 40px;
-    margin-left: 20px;
-    font-size: 11px;
-  }
-  a {
-    color: rgb(0, 129, 209);
-    text-decoration: none;
-  }
-  a:hover {
-    text-decoration: underline;
-  }
-  </style>
-</head>
-<body>
-  <p><input type="checkbox">Star the project</p>
-  <p><input type="checkbox">Fork the project</p>
-  <p><input type="checkbox">Open a pull-request</p>
-  <p style="margin-left: 70px; margin-top: 14px;">Language: <select><option>System Language</option>></select></p>
-  <p class="footnote" style="margin-top: 32px;">Powered by <a href="https://github.com/HackPlan/quark-shell-mac">Quark Shell</a>, a <a href="http://pomotodo.com">Pomotodo</a> project.</p>
-</body>
-</html>
diff --git a/sample/preferences/shortcut.html b/sample/preferences/shortcut.html
deleted file mode 100644
index 62eea38..0000000
--- a/sample/preferences/shortcut.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Quark Shell</title>
-  <style>
-  html {
-    background-color: rgb(237, 237, 237);
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    -webkit-user-select: none;
-  }
-  body {
-    font-family: -apple-system-font, sans-serif;
-    margin: 0;
-    padding: 0;
-    height: 100%;
-    overflow: hidden;
-  }
-  p {
-    margin-top: 42px;
-    text-align: center;
-  }
-  </style>
-</head>
-<body>
-</body>
-</html>

From 559a8747d41a424053f67de84053403a4b63918c Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 10 Nov 2016 14:24:05 +0800
Subject: [PATCH 28/43] remove sandbox and add manifest

---
 app/icon.png                                  | Bin 0 -> 293 bytes
 app/quark-manifest.json                       |   9 +
 quark-shell.xcodeproj/project.pbxproj         |  32 +--
 .../AppSandboxFileAccess.h                    | 195 --------------
 .../AppSandboxFileAccess.m                    | 240 ------------------
 ...ppSandboxFileAccessOpenSavePanelDelegate.h |  44 ----
 ...ppSandboxFileAccessOpenSavePanelDelegate.m |  87 -------
 .../AppSandboxFileAccessPersist.h             |  45 ----
 .../AppSandboxFileAccessPersist.m             |  79 ------
 quark-shell/QSCConfigureWindow.h              |   1 -
 quark-shell/QSCConfigureWindow.m              |  13 +-
 quark-shell/QSHAppDelegate.m                  |  34 ++-
 quark-shell/quark-shell.entitlements          |  14 -
 13 files changed, 41 insertions(+), 752 deletions(-)
 create mode 100644 app/icon.png
 create mode 100644 app/quark-manifest.json
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
 delete mode 100755 quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
 delete mode 100644 quark-shell/quark-shell.entitlements

diff --git a/app/icon.png b/app/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8312ffd6aa3812fadf43d47931a31b026c772c1e
GIT binary patch
diff --git a/app/quark-manifest.json b/app/quark-manifest.json
new file mode 100644
index 0000000..c18c184
--- /dev/null
+++ b/app/quark-manifest.json
@@ -0,0 +1,9 @@
+{
+  "name": "QuarkContainer",
+  "popup": {
+    "width": 400,
+    "height": 600
+  },
+  "index": "index.html",
+  "status_icon": "icon.png"
+}
\ No newline at end of file
diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index 9af2f61..b9e0a3f 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -37,9 +37,6 @@
 		8A5DB61C1DD34266004AAA30 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB6191DD34266004AAA30 /* index.html */; };
 		8A5DB61D1DD34266004AAA30 /* index.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB61A1DD34266004AAA30 /* index.js */; };
 		8A5DB61E1DD34266004AAA30 /* jquery-2.1.0.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */; };
-		8A5DB6271DD37BC9004AAA30 /* AppSandboxFileAccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */; };
-		8A5DB6281DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */; };
-		8A5DB6291DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */; };
 		8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */; };
 		8AA4F6FC1DC1D68600F9C793 /* QSHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */; };
 		8AC4ABDE1DC48AAD0026D522 /* Quark.js in Resources */ = {isa = PBXBuildFile; fileRef = 8AC4ABDD1DC48AAD0026D522 /* Quark.js */; };
@@ -131,13 +128,6 @@
 		8A5DB6191DD34266004AAA30 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; };
 		8A5DB61A1DD34266004AAA30 /* index.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = index.js; sourceTree = "<group>"; };
 		8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jquery-2.1.0.min.js"; sourceTree = "<group>"; };
-		8A5DB6211DD37BC9004AAA30 /* AppSandboxFileAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccess.h; sourceTree = "<group>"; };
-		8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccess.m; sourceTree = "<group>"; };
-		8A5DB6231DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccessOpenSavePanelDelegate.h; sourceTree = "<group>"; };
-		8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccessOpenSavePanelDelegate.m; sourceTree = "<group>"; };
-		8A5DB6251DD37BC9004AAA30 /* AppSandboxFileAccessPersist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppSandboxFileAccessPersist.h; sourceTree = "<group>"; };
-		8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSandboxFileAccessPersist.m; sourceTree = "<group>"; };
-		8A5DB62A1DD38B19004AAA30 /* quark-shell.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "quark-shell.entitlements"; sourceTree = "<group>"; };
 		8A8D99B51DCE591F00AD735E /* QSHBorderlessWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QSHBorderlessWindow.h; sourceTree = "<group>"; };
 		8A8D99B61DCE595C00AD735E /* QSHBorderlessWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSHBorderlessWindow.m; sourceTree = "<group>"; };
 		8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSHWebView.h; sourceTree = "<group>"; };
@@ -223,7 +213,6 @@
 		1A91F9E818E2530B00AA8B7E /* quark-shell */ = {
 			isa = PBXGroup;
 			children = (
-				8A5DB62A1DD38B19004AAA30 /* quark-shell.entitlements */,
 				8A5DB6181DD34266004AAA30 /* app */,
 				1A91F9F418E2530B00AA8B7E /* QSHAppDelegate.h */,
 				1A91F9F518E2530B00AA8B7E /* QSHAppDelegate.m */,
@@ -251,7 +240,6 @@
 				1A9A456D1A1C93C600C98589 /* NSWindow+Fade.m */,
 				8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */,
 				8AC4ABDD1DC48AAD0026D522 /* Quark.js */,
-				8A5DB6201DD37BC9004AAA30 /* AppSandboxFileAccess */,
 				1A91F9FA18E2530B00AA8B7E /* Images.xcassets */,
 				8AA4F6FA1DC1D68600F9C793 /* QSHWebView.h */,
 				8AA4F6FB1DC1D68600F9C793 /* QSHWebView.m */,
@@ -330,19 +318,6 @@
 			path = app;
 			sourceTree = SOURCE_ROOT;
 		};
-		8A5DB6201DD37BC9004AAA30 /* AppSandboxFileAccess */ = {
-			isa = PBXGroup;
-			children = (
-				8A5DB6211DD37BC9004AAA30 /* AppSandboxFileAccess.h */,
-				8A5DB6221DD37BC9004AAA30 /* AppSandboxFileAccess.m */,
-				8A5DB6231DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.h */,
-				8A5DB6241DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m */,
-				8A5DB6251DD37BC9004AAA30 /* AppSandboxFileAccessPersist.h */,
-				8A5DB6261DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m */,
-			);
-			path = AppSandboxFileAccess;
-			sourceTree = "<group>";
-		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -418,7 +393,7 @@
 						DevelopmentTeam = 7676B49VAW;
 						SystemCapabilities = {
 							com.apple.Sandbox = {
-								enabled = 1;
+								enabled = 0;
 							};
 						};
 					};
@@ -568,13 +543,10 @@
 				8A8D99B71DCE595C00AD735E /* QSHBorderlessWindow.m in Sources */,
 				1A91F9F618E2530B00AA8B7E /* QSHAppDelegate.m in Sources */,
 				1AA896731964FB1800E4FDAC /* QSHWebViewWindowController.m in Sources */,
-				8A5DB6271DD37BC9004AAA30 /* AppSandboxFileAccess.m in Sources */,
 				1A91F9EF18E2530B00AA8B7E /* main.m in Sources */,
 				1A82DE5B1903B095006AB37F /* QSHWindowBorderView.m in Sources */,
 				1AF6371E18E9FF430099B508 /* QSHWebViewDelegate.m in Sources */,
 				1ABD40311912E3AB002A53FB /* QSHStatusItemView.m in Sources */,
-				8A5DB6281DD37BC9004AAA30 /* AppSandboxFileAccessOpenSavePanelDelegate.m in Sources */,
-				8A5DB6291DD37BC9004AAA30 /* AppSandboxFileAccessPersist.m in Sources */,
 				1A42764A19196B6F00815DC6 /* QSHWindow.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -731,7 +703,6 @@
 			baseConfigurationReference = 6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_ENTITLEMENTS = "quark-shell/quark-shell.entitlements";
 				CODE_SIGN_IDENTITY = "-";
 				COMBINE_HIDPI_IMAGES = YES;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
@@ -750,7 +721,6 @@
 			baseConfigurationReference = 02F1A3336EF3226FC19C4B96 /* Pods-quark-shell.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_ENTITLEMENTS = "quark-shell/quark-shell.entitlements";
 				CODE_SIGN_IDENTITY = "-";
 				COMBINE_HIDPI_IMAGES = YES;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
deleted file mode 100755
index 9e31898..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.h
+++ /dev/null
@@ -1,195 +0,0 @@
-//
-//  AppSandboxFileAccess.h
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#import <Foundation/Foundation.h>
-@import AppKit;
-
-#pragma mark -
-#pragma mark AppSandboxFileAccessProtocol
-
-@protocol AppSandboxFileAccessProtocol<NSObject>
-
-@required
-- (NSData *)bookmarkDataForURL:(NSURL *)url;
-- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url;
-- (void)clearBookmarkDataForURL:(NSURL *)url;
-
-@end
-
-#pragma mark -
-#pragma mark AppSandboxFileAccess
-
-typedef void (^AppSandboxFileAccessBlock)();
-typedef void (^AppSandboxFileSecurityScopeBlock)(NSURL *securityScopedFileURL, NSData *bookmarkData);
-
-@interface AppSandboxFileAccess : NSObject
-
-/*! @brief The title of the NSOpenPanel displayed when asking permission to access a file.
- Default: "Allow Access"
- */
-@property (readwrite, copy, nonatomic) NSString *title;
-/*! @brief The message contained on the the NSOpenPanel displayed when asking permission to access a file.
- Default: "[Application Name] needs to access this path to continue. Click Allow to continue."
- */
-@property (readwrite, copy, nonatomic) NSString *message;
-/*! @brief The prompt button on the the NSOpenPanel displayed when asking permission to access a file. 
- Default: "Allow"
- */
-@property (readwrite, copy, nonatomic) NSString *prompt;
-
-/*! @brief This is an optional delegate object that can be provided to customize the persistance of bookmark data (e.g. in a Core Data database).
- Default: nil (Default uses the AppSandboxFileAccessPersist class.)
- */
-@property (nonatomic, weak) id <AppSandboxFileAccessProtocol> bookmarkPersistanceDelegate;
-
-/*! @brief Create the object with the default values. */
-+ (AppSandboxFileAccess *)fileAccess;
-
-/*! @brief Initialise the object with the default values. */
-- (instancetype)init;
-
-/*! @brief Access a file path to read or write, automatically gaining permission from the user with NSOpenPanel if required
- and using persisted permissions if possible.
- 
- @see accessFile:persistPermission:withBlock:
- @see securityScopedURLForFilePath:persistPermission:bookmark:
- 
- @param path A file path, either a file or folder, that the caller needs access to.
- @param persist If YES will save the permission for future calls.
- @param block The block that will be given access to the file or folder.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)accessFilePath:(NSString *)path persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block;
-
-/*!
- @warning Deprecated.
- 
- @see accessFilePath:persistPermission:withBlock:
- 
- @param path A file path, either a file or folder, that the caller needs access to.
- @param block The block that will be given access to the file or folder.
- @param persist If YES will save the permission for future calls.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)accessFilePath:(NSString *)path withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist __attribute__((deprecated("Use 'accessFilePath:persistPermission:withBlock:' instead.")));
-
-/*! @brief Access a file URL to read or write, automatically gaining permission from the user with NSOpenPanel if required
- and using persisted permissions if possible.
- 
- @see requestAccessPermissionsForFileURL:persistPermission:withBlock:
- 
- @discussion Internally calls `requestAccessPermissionsForFileURL:persistPermission:withBlock:` and accesses the returned scoped URL if successful.
- 
- @discussion See `requestAccessPermissionsForFileURL:persistPermission:withBlock:` for detailed behaviour.
- 
- @param fileURL A file URL, either a file or folder, that the caller needs access to.
- @param persist If YES will save the permission for future calls.
- @param block The block that will be given access to the file or folder.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)accessFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block;
-
-/*!
- @warning Deprecated.
- 
- @see accessFileURL:persistPermission:withBlock:
- 
- @param fileURL A file URL, either a file or folder, that the caller needs access to.
- @param persist If YES will save the permission for future calls.
- @param block The block that will be given access to the file or folder.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)accessFileURL:(NSURL *)fileURL withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist __attribute__((deprecated("Use 'accessFileURL:persistPermission:withBlock:' instead.")));
-
-/*! @brief Request access permission for a file path to read or write, automatically with NSOpenPanel if required
- and using persisted permissions if possible.
- 
- @see securityScopedURLForFilePath:persistPermission:bookmark:
- 
- @param path A file path, either a file or folder, that the caller needs access to.
- @param persist If YES will save the permission for future calls.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)requestAccessPermissionsForFilePath:(NSString *)filePath persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block;
-
-/*! @brief Request access permission for a file path to read or write, automatically with NSOpenPanel if required
- and using persisted permissions if possible.
- 
- @discussion Use this function to access a file URL to either read or write in an application restricted by the App Sandbox.
- This function will ask the user for permission if necessary using a well formed NSOpenPanel. The user will
- have the option of approving access to the URL you specify, or a parent path for that URL. If persist is YES
- the permission will be stored as a bookmark in NSUserDefaults and further calls to this function will
- load the saved permission and not ask for permission again.
- 
- @discussion If the file URL does not exist, it's parent directory will be asked for permission instead, since permission
- to the directory will be required to write the file. If the parent directory doesn't exist, it will ask for
- permission of whatever part of the parent path exists.
- 
- @discussion Note: If the caller has permission to access a file because it was dropped onto the application or introduced
- to the application in some other way, this function will not be aware of that permission and still prompt
- the user. To prevent this, use the persistPermission function to persist a permission you've been given
- whenever a user introduces a file to the application. E.g. when dropping a file onto the application window
- or dock or when using an NSOpenPanel.
- 
- @param fileURL A file URL, either a file or folder, that the caller needs access to.
- @param persist If YES will save the permission for future calls.
- @param block The block that will be given access to the file or folder.
- @return YES if permission was granted or already available, NO otherwise.
- */
-- (BOOL)requestAccessPermissionsForFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block;
-
-/*! @brief Persist a security bookmark for the given path. The calling application must already have permission.
- 
- @see persistPermissionURL:
- 
- @param path The path with permission that will be persisted.
- @return Bookmark data if permission was granted or already available, nil otherwise.
- */
-- (NSData *)persistPermissionPath:(NSString *)path;
-
-/*! @brief Persist a security bookmark for the given URL. The calling application must already have permission.
- 
- @discussion Use this function to persist permission of a URL that has already been granted when a user introduced
- a file to the calling application. E.g. by dropping the file onto the application window, or dock icon, 
- or when using an NSOpenPanel.
- 
- Note: If the calling application does not have access to this file, this call will do nothing.
- 
- @param url The URL with permission that will be persisted.
- @return Bookmark data if permission was granted or already available, nil otherwise.
- */
-- (NSData *)persistPermissionURL:(NSURL *)url;
-
-@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
deleted file mode 100755
index c8bd03a..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccess.m
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-//  AppSandboxFileAccess.m
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#import "AppSandboxFileAccess.h"
-#import "AppSandboxFileAccessPersist.h"
-#import "AppSandboxFileAccessOpenSavePanelDelegate.h"
-
-#if !__has_feature(objc_arc)
-#error ARC must be enabled!
-#endif
-
-#define CFBundleDisplayName @"CFBundleDisplayName"
-#define CFBundleName        @"CFBundleName"
-
-@interface AppSandboxFileAccess ()
-@property (nonatomic, strong) AppSandboxFileAccessPersist *defaultDelegate;
-@end
-
-@implementation AppSandboxFileAccess
-
-+ (AppSandboxFileAccess *)fileAccess {
-	return [[AppSandboxFileAccess alloc] init];
-}
-
-- (instancetype)init {
-	self = [super init];
-	if (self) {
-		NSString *applicationName = [[NSBundle mainBundle] objectForInfoDictionaryKey:CFBundleDisplayName];
-		if (!applicationName) {
-			applicationName = [[NSBundle mainBundle] objectForInfoDictionaryKey:CFBundleName];
-		}
-		
-		self.title = NSLocalizedString(@"Allow Access", @"Sandbox Access panel title.");
-		NSString *formatString = NSLocalizedString(@"%@ needs to access this path to continue. Click Allow to continue.", @"Sandbox Access panel message.");
-		self.message = [NSString stringWithFormat:formatString, applicationName];
-		self.prompt = NSLocalizedString(@"Allow", @"Sandbox Access panel prompt.");
-		
-		// create default delegate object that persists bookmarks to user defaults
-		self.defaultDelegate = [[AppSandboxFileAccessPersist alloc] init];
-		self.bookmarkPersistanceDelegate = _defaultDelegate;
-	}
-	return self;
-}
-
-- (NSURL *)askPermissionForURL:(NSURL *)url {
-	NSParameterAssert(url);
-	
-	// this url will be the url allowed, it might be a parent url of the url passed in
-	__block NSURL *allowedURL = nil;
-	
-	// create delegate that will limit which files in the open panel can be selected, to ensure only a folder
-	// or file giving permission to the file requested can be selected
-	AppSandboxFileAccessOpenSavePanelDelegate *openPanelDelegate = [[AppSandboxFileAccessOpenSavePanelDelegate alloc] initWithFileURL:url];
-	
-	// check that the url exists, if it doesn't, find the parent path of the url that does exist and ask permission for that
-	NSFileManager *fileManager = [NSFileManager defaultManager];
-	NSString *path = [url path];
-	while (path.length > 1) { // give up when only '/' is left in the path or if we get to a path that exists
-		if ([fileManager fileExistsAtPath:path isDirectory:NULL]) {
-			break;
-		}
-		path = [path stringByDeletingLastPathComponent];
-	}
-	url = [NSURL fileURLWithPath:path];
-	
-	// display the open panel
-	dispatch_block_t displayOpenPanelBlock = ^{
-		NSOpenPanel *openPanel = [NSOpenPanel openPanel];
-		[openPanel setMessage:self.message];
-		[openPanel setCanCreateDirectories:NO];
-		[openPanel setCanChooseFiles:YES];
-		[openPanel setCanChooseDirectories:YES];
-		[openPanel setAllowsMultipleSelection:NO];
-		[openPanel setPrompt:self.prompt];
-		[openPanel setTitle:self.title];
-		[openPanel setShowsHiddenFiles:NO];
-		[openPanel setExtensionHidden:NO];
-		[openPanel setDirectoryURL:url];
-		[openPanel setDelegate:openPanelDelegate];
-		[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
-		NSInteger openPanelButtonPressed = [openPanel runModal];
-		if (openPanelButtonPressed == NSFileHandlingPanelOKButton) {
-			allowedURL = [openPanel URL];
-		}
-	};
-	if ([NSThread isMainThread]) {
-		displayOpenPanelBlock();
-	} else {
-		dispatch_sync(dispatch_get_main_queue(), displayOpenPanelBlock);
-	}
-
-	return allowedURL;
-}
-
-- (NSData *)persistPermissionPath:(NSString *)path {
-	NSParameterAssert(path);
-	
-	return [self persistPermissionURL:[NSURL fileURLWithPath:path]];
-}
-
-- (NSData *)persistPermissionURL:(NSURL *)url {
-	NSParameterAssert(url);
-	
-	// store the sandbox permissions
-	NSData *bookmarkData = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
-	if (bookmarkData) {
-		[self.bookmarkPersistanceDelegate setBookmarkData:bookmarkData forURL:url];
-	}
-	return bookmarkData;
-}
-
-- (BOOL)accessFilePath:(NSString *)path withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist {
-	// Deprecated. Use 'accessFilePath:persistPermission:withBlock:' instead.
-	return [self accessFilePath:path persistPermission:persist withBlock:block];
-}
-
-- (BOOL)accessFileURL:(NSURL *)fileURL withBlock:(AppSandboxFileAccessBlock)block persistPermission:(BOOL)persist {
-	// Deprecated. Use 'accessFileURL:persistPermission:withBlock:' instead.
-	return [self accessFileURL:fileURL persistPermission:persist withBlock:block];
-}
-
-- (BOOL)accessFilePath:(NSString *)path persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block {
-	return [self accessFileURL:[NSURL fileURLWithPath:path] persistPermission:persist withBlock:block];
-}
-
-- (BOOL)accessFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileAccessBlock)block {
-	NSParameterAssert(fileURL);
-	NSParameterAssert(block);
-	
-	BOOL success = [self requestAccessPermissionsForFileURL:fileURL persistPermission:persist withBlock:^(NSURL *securityScopedFileURL, NSData *bookmarkData) {
-		// execute the block with the file access permissions
-		@try {
-			[securityScopedFileURL startAccessingSecurityScopedResource];
-			block();
-		} @finally {
-			[securityScopedFileURL stopAccessingSecurityScopedResource];
-		}
-	}];
-	
-	return success;
-}
-
-- (BOOL)requestAccessPermissionsForFilePath:(NSString *)filePath persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block {
-	NSParameterAssert(filePath);
-	
-	NSURL *fileURL = [NSURL fileURLWithPath:filePath];
-	return [self requestAccessPermissionsForFileURL:fileURL persistPermission:persist withBlock:block];
-}
-
-- (BOOL)requestAccessPermissionsForFileURL:(NSURL *)fileURL persistPermission:(BOOL)persist withBlock:(AppSandboxFileSecurityScopeBlock)block {
-	NSParameterAssert(fileURL);
-	
-	NSURL *allowedURL = nil;
-	
-	// standardize the file url and remove any symlinks so that the url we lookup in bookmark data would match a url given by the askPermissionForURL method
-	fileURL = [[fileURL URLByStandardizingPath] URLByResolvingSymlinksInPath];
-	
-	// lookup bookmark data for this url, this will automatically load bookmark data for a parent path if we have it
-	NSData *bookmarkData = [self.bookmarkPersistanceDelegate bookmarkDataForURL:fileURL];
-	if (bookmarkData) {
-		// resolve the bookmark data into an NSURL object that will allow us to use the file
-		BOOL bookmarkDataIsStale;
-		allowedURL = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope|NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:&bookmarkDataIsStale error:NULL];
-		// if the bookmark data is stale we'll attempt to recreate it with the existing url object if possible (not guaranteed)
-		if (bookmarkDataIsStale) {
-			bookmarkData = nil;
-			[self.bookmarkPersistanceDelegate clearBookmarkDataForURL:fileURL];
-			if (allowedURL) {
-				bookmarkData = [self persistPermissionURL:allowedURL];
-				if (!bookmarkData) {
-					allowedURL = nil;
-				}
-			}
-		}
-	}
-	
-	// if allowed url is nil, we need to ask the user for permission
-	if (!allowedURL) {
-		allowedURL = [self askPermissionForURL:fileURL];
-		if (!allowedURL) {
-			// if the user did not give permission, exit out here
-			return NO;
-		}
-	}
-	
-	// if we have no bookmark data and we want to persist, we need to create it
-	if (persist && !bookmarkData) {
-		bookmarkData = [self persistPermissionURL:allowedURL];
-	}
-	
-	if (block) {
-		block(allowedURL, bookmarkData);
-	}
-	
-	return YES;
-}
-
-- (void)setBookmarkPersistanceDelegate:(NSObject<AppSandboxFileAccessProtocol> *)bookmarkPersistanceDelegate
-{
-	// revert to default delegate object if no delegate provided
-	if (bookmarkPersistanceDelegate == nil) {
-		_bookmarkPersistanceDelegate = self.defaultDelegate;
-	} else {
-		_bookmarkPersistanceDelegate = bookmarkPersistanceDelegate;
-	}
-}
-
-@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
deleted file mode 100755
index 3786982..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-//  AppSandboxFileAccessOpenSavePanelDelegate.h
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-#import <Foundation/Foundation.h>
-@import AppKit;
-
-@interface AppSandboxFileAccessOpenSavePanelDelegate : NSObject <NSOpenSavePanelDelegate>
-
-- (instancetype)initWithFileURL:(NSURL *)fileURL;
-
-@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
deleted file mode 100755
index d07b7ce..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessOpenSavePanelDelegate.m
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  AppSandboxFileAccessOpenSavePanelDelegate.m
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-#import "AppSandboxFileAccessOpenSavePanelDelegate.h"
-
-#if !__has_feature(objc_arc)
-#error ARC must be enabled!
-#endif
-
-@interface AppSandboxFileAccessOpenSavePanelDelegate ()
-
-@property (readwrite, strong, nonatomic) NSArray *pathComponents;
-
-@end
-
-@implementation AppSandboxFileAccessOpenSavePanelDelegate
-
-- (instancetype)initWithFileURL:(NSURL *)fileURL {
-	self = [super init];
-	if (self) {
-		NSParameterAssert(fileURL);
-		self.pathComponents = fileURL.pathComponents;
-	}
-	return self;
-}
-
-#pragma mark -- NSOpenSavePanelDelegate
-
-- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
-	NSParameterAssert(url);
-	
-	NSArray *pathComponents = self.pathComponents;
-	NSArray *otherPathComponents = url.pathComponents;
-	
-	// if the url passed in has more components, it could not be a parent path or a exact same path
-	if (otherPathComponents.count > pathComponents.count) {
-		return NO;
-	}
-	
-	// check that each path component in url, is the same as each corresponding component in self.url
-	for (NSUInteger i = 0; i < otherPathComponents.count; ++i) {
-		NSString *comp1 = otherPathComponents[i];
-		NSString *comp2 = pathComponents[i];
-		// not the same, therefore url is not a parent or exact match to self.url
-		if (![comp1 isEqualToString:comp2]) {
-			return NO;
-		}
-	}
-	
-	// there were no mismatches (or no components meaning url is root)
-	return YES;
-}
-
-@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
deleted file mode 100755
index 6031ee1..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  AppSandboxFileAccessPersist.h
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#import <Foundation/Foundation.h>
-#import "AppSandboxFileAccess.h"
-
-@interface AppSandboxFileAccessPersist : NSObject <AppSandboxFileAccessProtocol>
-
-- (NSData *)bookmarkDataForURL:(NSURL *)url;
-- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url;
-- (void)clearBookmarkDataForURL:(NSURL *)url;
-
-@end
diff --git a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m b/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
deleted file mode 100755
index cb09268..0000000
--- a/quark-shell/AppSandboxFileAccess/AppSandboxFileAccessPersist.m
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-//  AppSandboxFileAccessPersist.m
-//  AppSandboxFileAccess
-//
-//  Created by Leigh McCulloch on 23/11/2013.
-//
-//  Copyright (c) 2013, Leigh McCulloch
-//  All rights reserved.
-//
-//  BSD-2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-//
-//  Redistribution and use in source and binary forms, with or without
-//  modification, are permitted provided that the following conditions are
-//  met:
-//
-//  1. Redistributions of source code must retain the above copyright
-//  notice, this list of conditions and the following disclaimer.
-//
-//  2. Redistributions in binary form must reproduce the above copyright
-//  notice, this list of conditions and the following disclaimer in the
-//  documentation and/or other materials provided with the distribution.
-//
-//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-//  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-//  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-//  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-//  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#import "AppSandboxFileAccessPersist.h"
-
-#if !__has_feature(objc_arc)
-#error ARC must be enabled!
-#endif
-
-@implementation AppSandboxFileAccessPersist
-
-+ (NSString *)keyForBookmarkDataForURL:(NSURL *)url {
-	NSString *urlStr = [url absoluteString];
-	return [NSString stringWithFormat:@"bd_%1$@", urlStr];
-}
-
-- (NSData *)bookmarkDataForURL:(NSURL *)url {
-	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-	
-	// loop through the bookmarks one path at a time down the URL
-	NSURL *subURL = url;
-	while ([subURL path].length > 1) { // give up when only '/' is left in the path
-		NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:subURL];
-		NSData *bookmark = [defaults dataForKey:key];
-		if (bookmark) { // if a bookmark is found, return it
-			return bookmark;
-		}
-		subURL = [subURL URLByDeletingLastPathComponent];
-	}
-	
-	// no bookmarks for the URL, or parent to the URL were found
-	return nil;
-}
-
-- (void)setBookmarkData:(NSData *)data forURL:(NSURL *)url {
-	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-	NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:url];
-	[defaults setObject:data forKey:key];
-}
-
-- (void)clearBookmarkDataForURL:(NSURL *)url {
-	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-	NSString *key = [AppSandboxFileAccessPersist keyForBookmarkDataForURL:url];
-	[defaults removeObjectForKey:key];
-}
-
-@end
diff --git a/quark-shell/QSCConfigureWindow.h b/quark-shell/QSCConfigureWindow.h
index 7b088b0..135419d 100644
--- a/quark-shell/QSCConfigureWindow.h
+++ b/quark-shell/QSCConfigureWindow.h
@@ -9,7 +9,6 @@
 #import <Cocoa/Cocoa.h>
 #import <AppKit/AppKit.h>
 #import "QSHAppDelegate.h"
-#import "AppSandboxFileAccess.h"
 
 @interface QSCConfigureWindow : NSWindowController
 
diff --git a/quark-shell/QSCConfigureWindow.m b/quark-shell/QSCConfigureWindow.m
index acef997..341dac4 100644
--- a/quark-shell/QSCConfigureWindow.m
+++ b/quark-shell/QSCConfigureWindow.m
@@ -57,8 +57,6 @@ - (void)windowDidLoad {
 }
 
 - (void)choseFolder {
-    AppSandboxFileAccess *fileAccess = [AppSandboxFileAccess fileAccess];
-    
     NSOpenPanel* panel = [NSOpenPanel openPanel];
     [panel setCanChooseDirectories:YES];
     [panel setCanCreateDirectories:YES];
@@ -75,16 +73,7 @@ - (void)choseFolder {
                         && isDir) {
                         
                         _folderURL = url;
-                        [fileAccess persistPermissionPath:[_folderURL absoluteString]];
-                        
-                        BOOL accessAllowed = [fileAccess accessFilePath:[_folderURL absoluteString] persistPermission:YES withBlock:^{
-                            [_pathInput setStringValue:[_folderURL absoluteString]];
-                            
-                        }];
-                        
-                        if (!accessAllowed) {
-                            NSLog(@"Sad Wookie");
-                        }
+                        [_pathInput setStringValue:[_folderURL absoluteString]];
                     }
                 }
             }
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 1449533..58a15a5 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -90,12 +90,13 @@ - (void)setupWebserver
     _webServerOptions = [NSMutableDictionary dictionary];
     
     NSString *directoryPath = [[QSHWebViewDelegate getRootURL] path];
+    
     NSLog(@"Start webserver at: %@", directoryPath);
     // Add GET handler for local "www/" directory
     [_webServer addGETHandlerForBasePath:@"/"
                            directoryPath:directoryPath
                            indexFilename:nil
-                                cacheAge:30
+                                cacheAge:0
                       allowRangeRequests:YES];
     
     // Initialize Server startup
@@ -131,6 +132,32 @@ - (void)startServer
 
 - (void)setupWebView
 {
+    [self setupWebserver];
+    NSURL *rootUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)_webServer.port]];
+    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:rootUrl];
+    
+    // parse manifest
+    NSURL *manifestFilePath = [NSURL URLWithString:@"quark-manifest.json" relativeToURL:[QSHWebViewDelegate getRootURL]];
+    NSString *manifestContents = [NSString stringWithContentsOfFile:[manifestFilePath path] encoding:NSUTF8StringEncoding error:nil];
+    if (manifestContents == nil) {
+        NSLog(@"Error reading manifest file");
+    }
+    NSDictionary *manifest = [NSJSONSerialization JSONObjectWithData:[manifestContents dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
+    
+    if (manifest.count > 0){
+        if (manifest[@"popup"]){
+            CGRect frameRect = self.window.frame;
+            frameRect.size.width = [manifest[@"popup"][@"width"] doubleValue];
+            frameRect.size.height = [manifest[@"popup"][@"height"] doubleValue];
+            [self.window setFrame:frameRect display:NO];
+        }
+        if (manifest[@"status_icon"] != nil){
+            NSURL *iconFilePath = [NSURL URLWithString:manifest[@"status_icon"] relativeToURL:[QSHWebViewDelegate getRootURL]];
+            NSImage *iconImage = [[NSImage alloc] initWithContentsOfFile:[iconFilePath path]];
+            self.statusItem.button.image = iconImage;
+        }
+    }
+
     QSHWindowBorderView *contentView = _window.contentView;
     _webView = [[QSHWebView alloc] initWithFrame:contentView.innerFrame];
     [_webView setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)];
@@ -150,9 +177,8 @@ - (void)setupWebView
 //    if (showDockIcon != NO){
     [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
 //    }
-    [self setupWebserver];
-    NSURL *rootUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)_webServer.port]];
-    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:rootUrl];
+    
+    
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
diff --git a/quark-shell/quark-shell.entitlements b/quark-shell/quark-shell.entitlements
deleted file mode 100644
index 85c03d7..0000000
--- a/quark-shell/quark-shell.entitlements
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>com.apple.security.app-sandbox</key>
-	<true/>
-	<key>com.apple.security.files.user-selected.read-write</key>
-	<true/>
-	<key>com.apple.security.network.client</key>
-	<true/>
-	<key>com.apple.security.network.server</key>
-	<true/>
-</dict>
-</plist>

From 23dece995dc3b27f18ac993f746c25973aca563f Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 10 Nov 2016 14:46:27 +0800
Subject: [PATCH 29/43] support url as index path

---
 quark-shell/QSHAppDelegate.m     |  6 ++++--
 quark-shell/QSHWebViewDelegate.h |  1 +
 quark-shell/QSHWebViewDelegate.m | 16 ++++++++++++++++
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 58a15a5..694bcfe 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -134,7 +134,6 @@ - (void)setupWebView
 {
     [self setupWebserver];
     NSURL *rootUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)_webServer.port]];
-    NSURL *URL = [NSURL URLWithString:kIndexPath relativeToURL:rootUrl];
     
     // parse manifest
     NSURL *manifestFilePath = [NSURL URLWithString:@"quark-manifest.json" relativeToURL:[QSHWebViewDelegate getRootURL]];
@@ -156,6 +155,9 @@ - (void)setupWebView
             NSImage *iconImage = [[NSImage alloc] initWithContentsOfFile:[iconFilePath path]];
             self.statusItem.button.image = iconImage;
         }
+        if (manifest[@"index"] != nil){
+            [[NSUserDefaults standardUserDefaults] setURL:[NSURL URLWithString:manifest[@"index"]] forKey:@"indexPath"];
+        }
     }
 
     QSHWindowBorderView *contentView = _window.contentView;
@@ -178,7 +180,7 @@ - (void)setupWebView
     [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
 //    }
     
-    
+    NSURL *URL = [QSHWebViewDelegate getIndexURL];
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:URL webDelegate:self.webViewDelegate isMain:YES];
 }
 
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 0b62e07..44977db 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -26,6 +26,7 @@
 
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
 + (NSURL *)getRootURL;
++ (NSURL *)getIndexURL;
 
 + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate isMain:(BOOL)isMain;
 
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 6e29cc8..84534c9 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -48,6 +48,22 @@ + (NSURL *)getRootURL
     return [[NSBundle mainBundle] resourceURL];
 }
 
++ (NSURL *)getIndexURL
+{
+    NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
+    NSURL *indexURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"indexPath"];
+    if (indexURL && folderURL){
+        if ( [[indexURL absoluteString] containsString:@"http"] ){
+            return indexURL;
+        }
+        return [[folderURL absoluteURL] URLByAppendingPathComponent:[indexURL absoluteString] ];
+    }
+    if (folderURL){
+        return [folderURL absoluteURL];
+    }
+    return [[NSBundle mainBundle] resourceURL];
+}
+
 - (instancetype)init
 {
     self = [super init];

From 243037c6b0434442e3c381df8cfc004799b428e0 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 10 Nov 2016 21:06:33 +0800
Subject: [PATCH 30/43] fix load http as index

---
 app/index.html                           |  2 +-
 quark-shell.xcodeproj/project.pbxproj    | 12 ++++++++--
 quark-shell/QSHAppDelegate.m             |  2 +-
 quark-shell/QSHWebViewDelegate.h         |  1 +
 quark-shell/QSHWebViewDelegate.m         | 29 +++++++++++++++++-------
 quark-shell/QSHWebViewWindowController.m |  3 +--
 quark-shell/quark-shell-Info.plist       | 10 ++++----
 7 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/app/index.html b/app/index.html
index a137ffa..6874334 100644
--- a/app/index.html
+++ b/app/index.html
@@ -73,7 +73,7 @@ <h1>
     <p>
       <button onclick="quark.notify({title: 'Quark Shell', content: 'Hello World', popupOnClick: true})">Notify</button>
       <button onclick="quark.closePopup()">Close Popup</button>
-      <button onclick="quark.newWindow({url: 'about.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
+      <button onclick="quark.newWindow({url: 'index.html', width: 600, height: 400, x: 'center', y: 'center'})">New Window</button>
     </p>
     <p>
       <button onclick="quark.openPreferences()">Preferences</button>
diff --git a/quark-shell.xcodeproj/project.pbxproj b/quark-shell.xcodeproj/project.pbxproj
index b9e0a3f..f8506e8 100644
--- a/quark-shell.xcodeproj/project.pbxproj
+++ b/quark-shell.xcodeproj/project.pbxproj
@@ -32,6 +32,8 @@
 		1AFBA8BA19483E4900BEDA0A /* QSHPreferencesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B819483E4900BEDA0A /* QSHPreferencesViewController.m */; };
 		1AFBA8BB19483E4900BEDA0A /* QSHPreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */; };
 		8A2C271F1DCCC1E500E00C7D /* QuarkHeader.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */; };
+		8A31376F1DD45C710008CB51 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A31376D1DD45C710008CB51 /* icon.png */; };
+		8A3137701DD45C710008CB51 /* quark-manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A31376E1DD45C710008CB51 /* quark-manifest.json */; };
 		8A5DB6131DD33F9B004AAA30 /* QSCConfigure.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB6121DD33F9B004AAA30 /* QSCConfigure.xib */; };
 		8A5DB6161DD33FF6004AAA30 /* QSCConfigureWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A5DB6151DD33FF6004AAA30 /* QSCConfigureWindow.m */; };
 		8A5DB61C1DD34266004AAA30 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 8A5DB6191DD34266004AAA30 /* index.html */; };
@@ -122,6 +124,8 @@
 		1AFBA8B919483E4900BEDA0A /* QSHPreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSHPreferencesViewController.xib; sourceTree = "<group>"; };
 		6A4D4DE7AE621F1D463C1846 /* Pods-quark-shell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-quark-shell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-quark-shell/Pods-quark-shell.debug.xcconfig"; sourceTree = "<group>"; };
 		8A2C271E1DCCC1E500E00C7D /* QuarkHeader.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = QuarkHeader.js; sourceTree = "<group>"; };
+		8A31376D1DD45C710008CB51 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = "<group>"; };
+		8A31376E1DD45C710008CB51 /* quark-manifest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "quark-manifest.json"; sourceTree = "<group>"; };
 		8A5DB6121DD33F9B004AAA30 /* QSCConfigure.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QSCConfigure.xib; sourceTree = "<group>"; };
 		8A5DB6141DD33FF6004AAA30 /* QSCConfigureWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSCConfigureWindow.h; sourceTree = "<group>"; };
 		8A5DB6151DD33FF6004AAA30 /* QSCConfigureWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSCConfigureWindow.m; sourceTree = "<group>"; };
@@ -314,6 +318,8 @@
 				8A5DB6191DD34266004AAA30 /* index.html */,
 				8A5DB61A1DD34266004AAA30 /* index.js */,
 				8A5DB61B1DD34266004AAA30 /* jquery-2.1.0.min.js */,
+				8A31376D1DD45C710008CB51 /* icon.png */,
+				8A31376E1DD45C710008CB51 /* quark-manifest.json */,
 			);
 			path = app;
 			sourceTree = SOURCE_ROOT;
@@ -436,6 +442,8 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8A31376F1DD45C710008CB51 /* icon.png in Resources */,
+				8A3137701DD45C710008CB51 /* quark-manifest.json in Resources */,
 				1A91F9ED18E2530B00AA8B7E /* InfoPlist.strings in Resources */,
 				1A91F9FB18E2530B00AA8B7E /* Images.xcassets in Resources */,
 				1A91F9F318E2530B00AA8B7E /* Credits.rtf in Resources */,
@@ -710,7 +718,7 @@
 				INFOPLIST_FILE = "$(SRCROOT)/quark-shell/quark-shell-Info.plist";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				OTHER_CODE_SIGN_FLAGS = "--deep";
-				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.quark-container";
 				PRODUCT_NAME = "quark-shell";
 				WRAPPER_EXTENSION = app;
 			};
@@ -728,7 +736,7 @@
 				INFOPLIST_FILE = "$(SRCROOT)/quark-shell/quark-shell-Info.plist";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				OTHER_CODE_SIGN_FLAGS = "--deep";
-				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.$(PRODUCT_NAME:rfc1034identifier)";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.hackplan.quark-container";
 				PRODUCT_NAME = "quark-shell";
 				WRAPPER_EXTENSION = app;
 			};
diff --git a/quark-shell/QSHAppDelegate.m b/quark-shell/QSHAppDelegate.m
index 694bcfe..c700a22 100644
--- a/quark-shell/QSHAppDelegate.m
+++ b/quark-shell/QSHAppDelegate.m
@@ -136,7 +136,7 @@ - (void)setupWebView
     NSURL *rootUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)_webServer.port]];
     
     // parse manifest
-    NSURL *manifestFilePath = [NSURL URLWithString:@"quark-manifest.json" relativeToURL:[QSHWebViewDelegate getRootURL]];
+    NSURL *manifestFilePath = [NSURL URLWithString:@"quark-manifest.json" relativeToURL:[QSHWebViewDelegate getFolderURL]];
     NSString *manifestContents = [NSString stringWithContentsOfFile:[manifestFilePath path] encoding:NSUTF8StringEncoding error:nil];
     if (manifestContents == nil) {
         NSLog(@"Error reading manifest file");
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 44977db..42e11e0 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -27,6 +27,7 @@
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
 + (NSURL *)getRootURL;
 + (NSURL *)getIndexURL;
++ (NSURL *)getFolderURL;
 
 + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(QSHWebViewDelegate*)webDelegate isMain:(BOOL)isMain;
 
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 84534c9..090d63e 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -39,7 +39,7 @@ + (void)initialize
     [[NSUserDefaults standardUserDefaults] synchronize];
 }
 
-+ (NSURL *)getRootURL
++ (NSURL *)getFolderURL
 {
     NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
     if (folderURL){
@@ -48,22 +48,35 @@ + (NSURL *)getRootURL
     return [[NSBundle mainBundle] resourceURL];
 }
 
-+ (NSURL *)getIndexURL
++ (NSURL *)getRootURL
 {
-    NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
     NSURL *indexURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"indexPath"];
-    if (indexURL && folderURL){
-        if ( [[indexURL absoluteString] containsString:@"http"] ){
-            return indexURL;
-        }
-        return [[folderURL absoluteURL] URLByAppendingPathComponent:[indexURL absoluteString] ];
+    if ( indexURL != nil && [[indexURL absoluteString] containsString:@"http"] ){
+        return indexURL;
     }
+    NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
     if (folderURL){
         return [folderURL absoluteURL];
     }
     return [[NSBundle mainBundle] resourceURL];
 }
 
++ (NSURL *)getIndexURL
+{
+    NSURL *folderURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"folder"];
+    NSURL *indexURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"indexPath"];
+    if (folderURL == nil){
+        folderURL = [[NSBundle mainBundle] resourceURL];
+    }
+    if (indexURL == nil){
+        indexURL = [NSURL URLWithString:@"index.html"];
+    }
+    if ( [[indexURL absoluteString] containsString:@"http"] ){
+        return indexURL;
+    }
+    return [[folderURL absoluteURL] URLByAppendingPathComponent:[indexURL absoluteString] ];
+}
+
 - (instancetype)init
 {
     self = [super init];
diff --git a/quark-shell/QSHWebViewWindowController.m b/quark-shell/QSHWebViewWindowController.m
index cf78ad9..80bf703 100644
--- a/quark-shell/QSHWebViewWindowController.m
+++ b/quark-shell/QSHWebViewWindowController.m
@@ -57,8 +57,7 @@ - (id)initWithURLString:(NSString *)urlString
         [self.window setFrame:NSMakeRect(self.window.frame.origin.x, self.window.frame.origin.y, width, height) display:YES];
         self.window.animationBehavior = NSWindowAnimationBehaviorDocumentWindow;
 
-        NSString *fullURLString = [kRootPath stringByAppendingString:urlString];
-        NSURL *url = [NSURL URLWithString:fullURLString relativeToURL:[[NSBundle mainBundle] resourceURL]];
+        NSURL *url = [NSURL URLWithString:urlString relativeToURL:[QSHWebViewDelegate getRootURL]];
         
         [self _createViews];
         
diff --git a/quark-shell/quark-shell-Info.plist b/quark-shell/quark-shell-Info.plist
index 1fcf2c1..f26714c 100644
--- a/quark-shell/quark-shell-Info.plist
+++ b/quark-shell/quark-shell-Info.plist
@@ -2,11 +2,6 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
-	<key>NSAppTransportSecurity</key>
-	<dict>
-		<key>NSAllowsArbitraryLoadsInWebContent</key>
-		<true/>
-	</dict>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>en</string>
 	<key>CFBundleExecutable</key>
@@ -31,6 +26,11 @@
 	<string>${MACOSX_DEPLOYMENT_TARGET}</string>
 	<key>LSUIElement</key>
 	<true/>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoadsInWebContent</key>
+		<true/>
+	</dict>
 	<key>NSHumanReadableCopyright</key>
 	<string>Copyright © HackPlan. All rights reserved.</string>
 	<key>NSMainNibFile</key>

From 015d64ea63ba2e21ad8c8a656374db326037c776 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Mon, 12 Dec 2016 11:00:03 +0800
Subject: [PATCH 31/43] add pref APIs

---
 quark-shell/QSHWebViewDelegate.m | 32 +++++++++++++++++++++++++++++++-
 quark-shell/Quark.js             |  8 ++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 090d63e..77c9d92 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -111,12 +111,17 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
             if (![QSHWebViewDelegate isSelectorExcludedFromWebScript: method]) {
                 if (method == NSSelectorFromString(@"closeWindow:") ){
                     [webDelegate performSelector:method withObject: webview.parentWindow];
+                } else if (method == NSSelectorFromString(@"getPref:") ){
+                    NSArray *argsWithCallback = [args arrayByAddingObject:responseCallback];
+                    [webDelegate performSelector:method withObject: argsWithCallback];
+                } else if (method == NSSelectorFromString(@"setPref:") ){
+                    NSArray *argsWithCallback = [args arrayByAddingObject:responseCallback];
+                    [webDelegate performSelector:method withObject: argsWithCallback];
                 } else {
                     [webDelegate performSelector:method withObject: args];
                 }
             }
         }
-        responseCallback(@"Response from testObjcCallback");
     }];
     
     // Load Page
@@ -158,6 +163,8 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(closeWindow:) ||
         selector == @selector(closeWindowById:) ||
         selector == @selector(setPin:) ||
+        selector == @selector(getPref:) ||
+        selector == @selector(setPref:) ||
         selector == @selector(checkUpdate:) ||
         selector == @selector(checkUpdateInBackground:) ||
         selector == @selector(emitMessage:) ||
@@ -282,6 +289,29 @@ - (void)setShowDockIcon:(NSArray *)args
     [self.appDelegate showDockIcon:showDockIcon];
 }
 
+- (void)getPref:(NSArray *)args
+{
+    NSString *key = args[0];
+    WVJBResponseCallback responseCallback = args[1];
+    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
+    NSString *value = [userPreferences stringForKey:key];
+    responseCallback(value);
+}
+
+- (void)setPref:(NSArray *)args
+{
+    NSString *key = args[0];
+    NSString *value = args[1];
+    if (!([value length] > 0)) {
+        value = @"";
+    }
+    WVJBResponseCallback responseCallback = args[2];
+    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
+    [userPreferences setObject:value forKey:key];
+    [userPreferences synchronize];
+    responseCallback(value);
+}
+
 - (void)setLaunchAtLogin:(NSArray *)args
 {
     BOOL launchAtLogin;
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 68aa21a..0848608 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -52,6 +52,14 @@ function setupQuarkWithBridge(bridge) {
     bridge.callHandler('quark', {'method': 'emitMessage', 'args': [options]})
   }
   
+  quark.getPref = function (key, callback) {
+    bridge.callHandler('quark', {'method': 'getPref', 'args': [key]}, callback);
+  }
+  
+  quark.setPref = function (key, value, callback) {
+    bridge.callHandler('quark', {'method': 'setPref', 'args': [key, value]}, callback);
+  }
+  
 }
 
 setupWebViewJavascriptBridge(function(bridge) {

From a6b5cb5f5d40ab5e29d30d239ccfe9ae7999edd4 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Mon, 12 Dec 2016 11:35:36 +0800
Subject: [PATCH 32/43] pass url when setup preferences

---
 quark-shell/QSHPreferencesViewController.h | 1 +
 quark-shell/QSHPreferencesViewController.m | 7 +++++--
 quark-shell/QSHWebViewDelegate.m           | 1 +
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHPreferencesViewController.h b/quark-shell/QSHPreferencesViewController.h
index 01c712e..7601a4e 100644
--- a/quark-shell/QSHPreferencesViewController.h
+++ b/quark-shell/QSHPreferencesViewController.h
@@ -17,6 +17,7 @@
 @property (nonatomic, strong) QSHWebView *webView;
 
 - (instancetype)initWithIdentifier:(NSString *)identifier
+                               url:(NSString *)url
                       toolbarImage:(NSImage *)image
                       toolbarLabel:(NSString *)label
                             height:(NSInteger)height
diff --git a/quark-shell/QSHPreferencesViewController.m b/quark-shell/QSHPreferencesViewController.m
index a5b718e..bb0405b 100644
--- a/quark-shell/QSHPreferencesViewController.m
+++ b/quark-shell/QSHPreferencesViewController.m
@@ -11,6 +11,7 @@
 @interface QSHPreferencesViewController ()
 
 @property (nonatomic) NSString *identifier;
+@property (nonatomic) NSString *url;
 @property (nonatomic) NSImage *toolbarItemImage;
 @property (nonatomic) NSString *toolbarItemLabel;
 @property (nonatomic) NSInteger height;
@@ -24,6 +25,7 @@ @implementation QSHPreferencesViewController
 @synthesize identifier = _identifier;
 
 - (instancetype)initWithIdentifier:(NSString *)identifier
+                               url:(NSString *)url
                       toolbarImage:(NSImage *)image
                       toolbarLabel:(NSString *)label
                             height:(NSInteger)height
@@ -32,6 +34,7 @@ - (instancetype)initWithIdentifier:(NSString *)identifier
     self = [super initWithNibName:@"QSHPreferencesViewController" bundle:nil];
     if (self) {
         _identifier = identifier;
+        _url = url;
         _toolbarItemImage = image;
         _toolbarItemLabel = label;
         _height = height;
@@ -59,8 +62,8 @@ - (void)loadView
     
     [self _createViews];
 
-    NSString *url = [[NSURL URLWithString:kPreferencesDirectory relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
-    url = [url stringByAppendingString:[NSString stringWithFormat:@"%@.html", self.identifier]];
+    NSString *url = [[NSURL URLWithString:kRootPath relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
+    url = [url stringByAppendingString:_url];
     
     [QSHWebViewDelegate initWebviewWithBridge:_webView url:[NSURL URLWithString:url] webDelegate:_delegate isMain:NO];
 }
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 77c9d92..b9f9a4c 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -407,6 +407,7 @@ - (void)setupPreferences:(NSArray *)args
         NSInteger height = preferences[@"height"] ? [preferences[@"height"] integerValue]: kPreferencesDefaultHeight;
         QSHPreferencesViewController *vc = [[QSHPreferencesViewController alloc]
                                             initWithIdentifier:preferences[@"identifier"]
+                                            url:preferences[@"url"]
                                             toolbarImage:[NSImage imageNamed:preferences[@"icon"]]
                                             toolbarLabel:preferences[@"label"]
                                             height:height

From c3b02bbe97a5c5c04f9d91c2f05cd7755c02da59 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Mon, 12 Dec 2016 19:00:54 +0800
Subject: [PATCH 33/43] emit msg to preferences controller

---
 quark-shell/QSHPreferencesViewController.m | 5 ++---
 quark-shell/QSHWebViewDelegate.m           | 7 +++++++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/quark-shell/QSHPreferencesViewController.m b/quark-shell/QSHPreferencesViewController.m
index bb0405b..8e16b5b 100644
--- a/quark-shell/QSHPreferencesViewController.m
+++ b/quark-shell/QSHPreferencesViewController.m
@@ -62,10 +62,9 @@ - (void)loadView
     
     [self _createViews];
 
-    NSString *url = [[NSURL URLWithString:kRootPath relativeToURL:[[NSBundle mainBundle] resourceURL]] absoluteString];
-    url = [url stringByAppendingString:_url];
+    NSURL *url = [NSURL URLWithString:_url relativeToURL:[QSHWebViewDelegate getRootURL]];
     
-    [QSHWebViewDelegate initWebviewWithBridge:_webView url:[NSURL URLWithString:url] webDelegate:_delegate isMain:NO];
+    [QSHWebViewDelegate initWebviewWithBridge:_webView url:url webDelegate:_delegate isMain:NO];
 }
 
 - (void)addNativeComponent:(NSDictionary *)component
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index b9f9a4c..0096156 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -28,6 +28,7 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
 
 @property (nonatomic) MASPreferencesWindowController *preferencesWindowController;
 @property (nonatomic) NSMutableArray *windows;
+@property (nonatomic) NSMutableArray *prefWindows;
 
 @end
 
@@ -82,6 +83,7 @@ - (instancetype)init
     self = [super init];
     if (self) {
         self.windows = [[NSMutableArray alloc] init];
+        self.prefWindows = [[NSMutableArray alloc] init];
         NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
         appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
         appBundleVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
@@ -403,6 +405,7 @@ - (void)setupPreferences:(NSArray *)args
 {
     NSArray *preferencesArray = args[0];
     NSMutableArray *viewControllers = [NSMutableArray array];
+    
 	for (NSDictionary *preferences in preferencesArray) {
         NSInteger height = preferences[@"height"] ? [preferences[@"height"] integerValue]: kPreferencesDefaultHeight;
         QSHPreferencesViewController *vc = [[QSHPreferencesViewController alloc]
@@ -419,6 +422,7 @@ - (void)setupPreferences:(NSArray *)args
 
         [viewControllers addObject:vc];
 	}
+    self.prefWindows = viewControllers;
 
     NSString *title = NSLocalizedString(@"Preferences", @"Common title for Preferences window");
     self.preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:viewControllers title:title];
@@ -578,6 +582,9 @@ - (void)emitMessage:(NSArray *)arg
     for (QSHWebViewWindowController *window in self.windows) {
         [bridges addObject:window.webView.bridge];
     }
+    for (QSHPreferencesViewController *pvc in self.prefWindows) {
+        [bridges addObject:pvc.webView.bridge];
+    }
     [bridges addObject:self.mainBridge];
     
     for (WKWebViewJavascriptBridge *b in bridges) {

From 4148dfc43aa069464cfc89855f5a86a50b99d588 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Thu, 22 Dec 2016 23:43:53 +0800
Subject: [PATCH 34/43] add playsound

---
 quark-shell/QSHWebViewDelegate.m | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 0096156..c2fda12 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -15,6 +15,7 @@
 #import <StartAtLoginController.h>
 #import "WKWebViewJavascriptBridge.h"
 #import <GCDWebServer/GCDWebServer.h>
+#import <AVFoundation/AVFoundation.h>
 
 static const NSInteger kPreferencesDefaultHeight = 192;
 
@@ -22,6 +23,7 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
     NSString *appVersion;
     NSString *appBundleVersion;
     NSString *platform;
+    AVAudioPlayer *_audioPlayer;
 
     BOOL debug;
 }
@@ -145,6 +147,8 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(resizePopup:) ||
         selector == @selector(quit) ||
         selector == @selector(openURL:) ||
+        selector == @selector(playSound:) ||
+        selector == @selector(stopSound) ||
         selector == @selector(changeIcon:) ||
         selector == @selector(changeHighlightedIcon:) ||
         selector == @selector(changeClickAction:) ||
@@ -555,6 +559,25 @@ - (void)closeWindow:(NSWindowController *)window
     [window close];
 }
 
+- (void)playSound:(NSArray *)args
+{
+    NSDictionary *options = args[0];
+    NSString *urlString = options[@"path"];
+    NSInteger loop = [options[@"loop"] integerValue];
+    
+    NSURL *soundUrl = [NSURL URLWithString:urlString relativeToURL:[QSHWebViewDelegate getRootURL]];
+
+    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
+    [_audioPlayer setNumberOfLoops:loop];
+    [_audioPlayer prepareToPlay];
+    [_audioPlayer play];
+}
+
+- (void)stopSound
+{
+    [_audioPlayer stop];
+}
+
 - (void)setPin:(NSArray *)args
 {
     bool pinned = [args[0] boolValue];
@@ -583,7 +606,9 @@ - (void)emitMessage:(NSArray *)arg
         [bridges addObject:window.webView.bridge];
     }
     for (QSHPreferencesViewController *pvc in self.prefWindows) {
-        [bridges addObject:pvc.webView.bridge];
+        if (pvc.webView.bridge != nil) {
+            [bridges addObject:pvc.webView.bridge];
+        }
     }
     [bridges addObject:self.mainBridge];
     

From 1ac3d6dcdfcbfe70ca65ed8893e7217218770a71 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 23 Dec 2016 00:42:47 +0800
Subject: [PATCH 35/43] update getters

---
 quark-shell/QSHWebViewDelegate.m | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index c2fda12..6dd5bcd 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -295,6 +295,14 @@ - (void)setShowDockIcon:(NSArray *)args
     [self.appDelegate showDockIcon:showDockIcon];
 }
 
+- (void)getShowDockIcon:(NSArray *)args
+{
+    WVJBResponseCallback responseCallback = args[1];
+    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
+    NSString *value = [userPreferences stringForKey:@"showDockIcon"];
+    responseCallback(value);
+}
+
 - (void)getPref:(NSArray *)args
 {
     NSString *key = args[0];
@@ -331,6 +339,14 @@ - (void)setLaunchAtLogin:(NSArray *)args
     loginController.startAtLogin = launchAtLogin;
 }
 
+- (void)getLaunchAtLogin:(NSArray *)args
+{
+    WVJBResponseCallback responseCallback = args[0];
+    StartAtLoginController *loginController = [[StartAtLoginController alloc] initWithIdentifier:@"com.hackplan.quark-shell-helper"];
+    NSString *value = @([loginController startAtLogin]).stringValue;
+    responseCallback(value);
+}
+
 - (void)notify:(NSArray *)args
 {
     NSDictionary *message = args[0];
@@ -578,13 +594,21 @@ - (void)stopSound
     [_audioPlayer stop];
 }
 
-- (void)setPin:(NSArray *)args
+- (void)setPinPopup:(NSArray *)args
 {
     bool pinned = [args[0] boolValue];
     [[NSUserDefaults standardUserDefaults] setBool:pinned forKey:@"pinned"];
     self.appDelegate.pinned = pinned;
 }
 
+- (void)getPinPopup:(NSArray *)args
+{
+    WVJBResponseCallback responseCallback = args[0];
+    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
+    NSString *value = [userPreferences stringForKey:@"pinned"];
+    responseCallback(value);
+}
+
 - (void)checkUpdate:(NSString *)url
 {
     SUUpdater *updater = [[SUUpdater alloc] init];

From e6ad4eac8ebbc0fc84d605c2c56e97f53b090a12 Mon Sep 17 00:00:00 2001
From: unstop <unstop01@gmail.com>
Date: Fri, 23 Dec 2016 01:01:36 +0800
Subject: [PATCH 36/43] add setMainMenu

---
 quark-shell/QSHWebViewDelegate.m | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 6dd5bcd..ce930e1 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -641,25 +641,43 @@ - (void)emitMessage:(NSArray *)arg
     }
 }
 
+- (void)setMainMenu:(NSArray *)args
+{
+    NSDictionary *options = args[0];
+    NSMenu *menu = [[NSApplication sharedApplication] mainMenu];
+    menu.autoenablesItems = NO;
+    for (NSDictionary *item in options[@"items"]) {
+        if ([item[@"type"] isEqualToString:@"separator"]) {
+            [menu addItem:[NSMenuItem separatorItem]];
+        }
+        else {
+            NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:item[@"label"] action:@selector(menuItemClicked:) keyEquivalent:@""];
+            menuItem.target = self;
+            menuItem.representedObject = item[@"message"];
+            [menuItem setEnabled:YES];
+            [menu addItem:menuItem];
+        }
+    }
+}
+
 - (void)showMenu:(NSArray *)args
 {
     NSDictionary *options = args[0];
     NSMenu *menu = [[NSMenu alloc] init];
     menu.autoenablesItems = NO;
-	for (NSDictionary *item in options[@"items"]) {
+    for (NSDictionary *item in options[@"items"]) {
         if ([item[@"type"] isEqualToString:@"separator"]) {
             [menu addItem:[NSMenuItem separatorItem]];
         }
         else {
             NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:item[@"label"] action:@selector(menuItemClicked:) keyEquivalent:@""];
             menuItem.target = self;
-            menuItem.representedObject = ^{
-            };
+            menuItem.representedObject = item[@"message"];
             [menuItem setEnabled:YES];
             [menu addItem:menuItem];
         }
-	}
-
+    }
+    
     CGFloat x = [options[@"x"] doubleValue];
     CGFloat yFlipped = self.webView.frame.size.height - [options[@"y"] doubleValue];
     [menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(x, yFlipped) inView:self.webView];
@@ -667,8 +685,8 @@ - (void)showMenu:(NSArray *)args
 
 - (void)menuItemClicked:(NSMenuItem *)sender
 {
-    void(^clickHandler)(void) = sender.representedObject;
-    clickHandler();
+    NSArray *args = [NSArray arrayWithObject:sender.representedObject];
+    [self emitMessage:args];
 }
 
 #pragma mark - Delegate methods

From fc23fe1a492277dd668ad6034f6ba885903c0af5 Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Thu, 12 Jan 2017 11:12:18 +0800
Subject: [PATCH 37/43] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20quark.setMainMenu=20?=
 =?UTF-8?q?=E8=B0=83=E7=94=A8=E4=B8=8D=E4=BA=86/=E8=B0=83=E7=94=A8?=
 =?UTF-8?q?=E6=97=A0=E6=95=88=E7=9A=84=20BUG?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell/QSHWebViewDelegate.m | 1 +
 quark-shell/Quark.js             | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index ce930e1..cbcd46b 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -174,6 +174,7 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(checkUpdate:) ||
         selector == @selector(checkUpdateInBackground:) ||
         selector == @selector(emitMessage:) ||
+        selector == @selector(setMainMenu:) ||
         selector == @selector(showMenu:)) {
         return NO;
     }
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 0848608..2d45fb6 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -37,11 +37,11 @@ function setupQuarkWithBridge(bridge) {
   ], false);
 
   setMethods([
-    'setupPreferences', 'notify', 'setPin', 'setLaunchAtLogin',
+    'setupPreferences', 'notify', 'setPinPopup', 'setLaunchAtLogin',
     'newWindow', 'changeIcon', 'changeHighlightedIcon', 'showMenu',
     'openURL', 'changeLabel', 'addKeyboardShortcut', 'closeWindow', 'closeWindowById',
     'checkUpdate', 'checkUpdateInBackground', 'setShowDockIcon',
-    'resizePopup'
+    'resizePopup', 'setMainMenu'
   ], true);
 
   quark.closeWindow = function (options) {

From 20c83aad716fee71a37804e642b901c61732d5bf Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Thu, 12 Jan 2017 16:16:24 +0800
Subject: [PATCH 38/43] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=20quark.setIn?=
 =?UTF-8?q?terval,=20quark.clearInterval,=20quark.setTimeout,=20quark.clea?=
 =?UTF-8?q?rTimeout?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell/QSHWebViewDelegate.m | 34 ++++++++++++++
 quark-shell/QSH_GCDTimer.h       | 22 +++++++++
 quark-shell/QSH_GCDTimer.m       | 78 ++++++++++++++++++++++++++++++++
 quark-shell/Quark.js             | 38 ++++++++++++----
 4 files changed, 164 insertions(+), 8 deletions(-)
 create mode 100644 quark-shell/QSH_GCDTimer.h
 create mode 100644 quark-shell/QSH_GCDTimer.m

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index cbcd46b..118de4a 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -16,6 +16,7 @@
 #import "WKWebViewJavascriptBridge.h"
 #import <GCDWebServer/GCDWebServer.h>
 #import <AVFoundation/AVFoundation.h>
+#import "QSH_GCDTimer.h"
 
 static const NSInteger kPreferencesDefaultHeight = 192;
 
@@ -24,6 +25,8 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
     NSString *appBundleVersion;
     NSString *platform;
     AVAudioPlayer *_audioPlayer;
+    NSMutableDictionary *_intervalTimers;
+    long _intervalTimersUniqueId;
 
     BOOL debug;
 }
@@ -175,6 +178,8 @@ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
         selector == @selector(checkUpdateInBackground:) ||
         selector == @selector(emitMessage:) ||
         selector == @selector(setMainMenu:) ||
+        selector == @selector(setInterval:) ||
+        selector == @selector(clearInterval:) ||
         selector == @selector(showMenu:)) {
         return NO;
     }
@@ -690,6 +695,35 @@ - (void)menuItemClicked:(NSMenuItem *)sender
     [self emitMessage:args];
 }
 
+- (void)setInterval:(NSArray *)args
+{
+    NSNumber *callbackId = args[0];
+    NSNumber *interval = args[1];
+    bool isRepeat = args.count > 2 ? [args[2] boolValue] : true;
+    
+    [self clearInterval:@[callbackId]];
+    _intervalTimers[callbackId] = [QSH_GCDTimer
+                                   timerWithTimeInterval:interval
+                                   inQueue:dispatch_get_main_queue()
+                                   repeats:isRepeat
+                                   block:^(QSH_GCDTimer *timer) {
+                                       [self.webView.bridge
+                                        callHandler:@"intervalCallback"
+                                        data:@{@"callbackId": callbackId}
+                                        ];
+                                   }];
+}
+
+- (void)clearInterval:(NSArray *)args
+{
+    NSNumber *timerId = args[0];
+    QSH_GCDTimer *timer = _intervalTimers[timerId];
+    if (timer != nil) {
+        [_intervalTimers removeObjectForKey:timerId];
+        [timer invalidate];
+    }
+}
+
 #pragma mark - Delegate methods
 
 - (void)webView:(WKWebView *)webView addMessageToConsole:(NSDictionary *)message
diff --git a/quark-shell/QSH_GCDTimer.h b/quark-shell/QSH_GCDTimer.h
new file mode 100644
index 0000000..b623793
--- /dev/null
+++ b/quark-shell/QSH_GCDTimer.h
@@ -0,0 +1,22 @@
+//
+//  QSH_GCDTimer.h
+//  Pomotodo
+//
+//  Created by c4605 on 2017/1/12.
+//  Copyright © 2017年 HackPlan. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface QSH_GCDTimer : NSObject
+
++ (QSH_GCDTimer *)timerWithTimeInterval:(NSNumber *)interval
+                                inQueue:(dispatch_queue_t)queue
+                                repeats:(BOOL)repeats
+                                  block:(void (^)(QSH_GCDTimer *timer))block;
+
+- (void)invalidate;
+
+@end
+
+typedef void (^QSH_GCDTimerBlock)(QSH_GCDTimer *timer);
diff --git a/quark-shell/QSH_GCDTimer.m b/quark-shell/QSH_GCDTimer.m
new file mode 100644
index 0000000..aa28e89
--- /dev/null
+++ b/quark-shell/QSH_GCDTimer.m
@@ -0,0 +1,78 @@
+//
+//  QSH_GCDTimer.m
+//  Pomotodo
+//
+//  Created by c4605 on 2017/1/12.
+//  Copyright © 2017年 HackPlan. All rights reserved.
+//
+
+#import "QSH_GCDTimer.h"
+
+@interface QSH_GCDTimer () {
+    dispatch_source_t _timer;
+    bool _invalidated;
+}
+
+@property (nonatomic) NSNumber *interval;
+@property (nonatomic) dispatch_queue_t queue;
+@property (nonatomic) bool repeats;
+@property (nonatomic) QSH_GCDTimerBlock block;
+
+@end
+
+@implementation QSH_GCDTimer
+
+#pragma mark - public
+
++ (QSH_GCDTimer *)timerWithTimeInterval:(NSNumber *)interval
+                                inQueue:(dispatch_queue_t)queue
+                                repeats:(BOOL)repeats
+                                  block:(QSH_GCDTimerBlock)block
+{
+    QSH_GCDTimer *timer = [[QSH_GCDTimer alloc] init];
+    timer.interval = interval;
+    timer.queue = queue;
+    timer.repeats = repeats;
+    timer.block = block;
+    [timer start];
+    return timer;
+}
+
+- (void)invalidate
+{
+    _invalidated = YES;
+    if (self.repeats) {
+        dispatch_cancel(_timer);
+        _timer = nil;
+    }
+}
+
+#pragma mark - private
+
+- (void)start
+{
+    uint64_t interval = [self.interval unsignedLongLongValue] * NSEC_PER_MSEC;
+    dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, interval);
+    
+    if (self.repeats) {
+        _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue);
+        dispatch_source_set_timer(_timer, startTime, interval, 0);
+        dispatch_source_set_event_handler(_timer, ^{
+            [self onDispatchTimeout];
+        });
+        dispatch_resume(_timer);
+    } else {
+        dispatch_after(startTime, self.queue, ^{
+            [self onDispatchTimeout];
+        });
+    }
+}
+
+- (void)onDispatchTimeout
+{
+    if (!_invalidated) {
+        self.block(self);
+    }
+}
+
+@end
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index 2d45fb6..ac30f90 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -59,7 +59,29 @@ function setupQuarkWithBridge(bridge) {
   quark.setPref = function (key, value, callback) {
     bridge.callHandler('quark', {'method': 'setPref', 'args': [key, value]}, callback);
   }
-  
+
+  ;(function() {
+    var intervalCallbacks = {}
+    var intervalTimerUniqueId = 1
+    bridge.registerHandler('intervalCallback', function(data) {
+      var fn = intervalCallbacks[data.callbackId]
+      typeof fn === 'function' ? fn() : quark.clearInterval(data.callbackId)
+    })
+    quark.setInterval = function(fn, interval, _oneTime) {
+      var currId = intervalTimerUniqueId
+      intervalTimerUniqueId += 1
+      bridge.callHandler('quark', {'method': 'setInterval', 'args': [currId, interval, _oneTime ? false : true]})
+      intervalCallbacks[currId] = fn
+      return currId
+    }
+    quark.setTimeout = function(fn, interval) {
+      return quark.setInterval(fn, interval, true)
+    }
+    quark.clearTimeout = quark.clearInterval = function(timerId) {
+      bridge.callHandler('quark', {'method': 'clearInterval', 'args': [timerId]})
+      delete intervalCallbacks[timerId]
+    }
+  })();
 }
 
 setupWebViewJavascriptBridge(function(bridge) {
@@ -77,18 +99,18 @@ setupWebViewJavascriptBridge(function(bridge) {
       fn(data);
     })
   });
-                             
+
   // windowClose
   quark.closeSubscribers = [];
   quark.onWindowClose = function(fn) {
-  quark.closeSubscribers.push(fn)
+    quark.closeSubscribers.push(fn)
   };
   bridge.registerHandler('onQuarkWindowClose', function(data) {
-                        quark.closeSubscribers.forEach(function(fn){
-                                                     fn(data);
-                                                     })
-                        });
-  
+    quark.closeSubscribers.forEach(function(fn) {
+      fn(data);
+    })
+  });
+
   // Shortcut
   quark.shortcutSubscribers = [];
   quark.onShortcut = function(id, fn) {

From 5f48f63d5621fd9dc31a9b5fb0b1e416b11b5b19 Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Thu, 12 Jan 2017 17:09:41 +0800
Subject: [PATCH 39/43] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?=
 =?UTF-8?q?=E4=BA=86=20alwaysOnTop=20=E7=9A=84=E5=AD=90=E7=AA=97=E5=8F=A3?=
 =?UTF-8?q?=E9=87=8C=20JS=20=E7=9A=84=20ondragover=20=E4=BA=8B=E4=BB=B6?=
 =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E8=A7=A6=E5=8F=91=E7=9A=84=20BUG?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell/QSHWebViewDelegate.m | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 118de4a..657e323 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -543,7 +543,7 @@ - (void)newWindow:(NSArray *)args
     }
 
     if ([options[@"alwaysOnTop"] boolValue]) {
-        webViewWindowController.window.level = NSScreenSaverWindowLevel;
+        webViewWindowController.window.level = NSModalPanelWindowLevel;
     }
 
     if (options[@"alpha"]) {

From 7d337414ddbdf852ff3d08d4c943d880528ae16d Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Fri, 13 Jan 2017 12:52:36 +0800
Subject: [PATCH 40/43] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=A8=E9=80=89/?=
 =?UTF-8?q?=E5=A4=8D=E5=88=B6/=E7=B2=98=E8=B4=B4=E5=BF=AB=E6=8D=B7?=
 =?UTF-8?q?=E9=94=AE=E4=B8=8D=E5=8F=AF=E7=94=A8=E7=9A=84=20BUG?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell-helper/Base.lproj/MainMenu.xib |  20 +--
 quark-shell/Base.lproj/MainMenu.xib        | 198 +--------------------
 2 files changed, 14 insertions(+), 204 deletions(-)

diff --git a/quark-shell-helper/Base.lproj/MainMenu.xib b/quark-shell-helper/Base.lproj/MainMenu.xib
index c6ad683..eea5cbc 100644
--- a/quark-shell-helper/Base.lproj/MainMenu.xib
+++ b/quark-shell-helper/Base.lproj/MainMenu.xib
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
-        <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
+        <development version="7000" identifier="xcode"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -16,11 +16,11 @@
         <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
         <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
             <items>
-                <menuItem title="quark-shell-helper" id="1Xt-HY-uBw">
+                <menuItem title="Pomotodo-helper" id="1Xt-HY-uBw">
                     <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="quark-shell-helper" systemMenu="apple" id="uQy-DD-JDr">
+                    <menu key="submenu" title="Pomotodo-helper" systemMenu="apple" id="uQy-DD-JDr">
                         <items>
-                            <menuItem title="About quark-shell-helper" id="5kV-Vb-QxS">
+                            <menuItem title="About Pomotodo-helper" id="5kV-Vb-QxS">
                                 <modifierMask key="keyEquivalentModifierMask"/>
                                 <connections>
                                     <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
@@ -34,7 +34,7 @@
                                 <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
-                            <menuItem title="Hide quark-shell-helper" keyEquivalent="h" id="Olw-nP-bQN">
+                            <menuItem title="Hide Pomotodo-helper" keyEquivalent="h" id="Olw-nP-bQN">
                                 <connections>
                                     <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
                                 </connections>
@@ -52,7 +52,7 @@
                                 </connections>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
-                            <menuItem title="Quit quark-shell-helper" keyEquivalent="q" id="4sb-4s-VLi">
+                            <menuItem title="Quit Pomotodo-helper" keyEquivalent="q" id="4sb-4s-VLi">
                                 <connections>
                                     <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
                                 </connections>
@@ -653,7 +653,7 @@
                     <modifierMask key="keyEquivalentModifierMask"/>
                     <menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
                         <items>
-                            <menuItem title="quark-shell-helper Help" keyEquivalent="?" id="FKE-Sm-Kum">
+                            <menuItem title="Pomotodo-helper Help" keyEquivalent="?" id="FKE-Sm-Kum">
                                 <connections>
                                     <action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
                                 </connections>
diff --git a/quark-shell/Base.lproj/MainMenu.xib b/quark-shell/Base.lproj/MainMenu.xib
index 596cb02..d4762ce 100644
--- a/quark-shell/Base.lproj/MainMenu.xib
+++ b/quark-shell/Base.lproj/MainMenu.xib
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -29,14 +29,10 @@
         </window>
         <menu title="Main Menu" systemMenu="main" id="tdM-1d-aZL">
             <items>
-                <menuItem title="Quark Container" id="BQ6-OV-amQ">
+                <menuItem title="Pomotodo" id="BQ6-OV-amQ">
                     <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Quark Container" systemMenu="apple" id="nhy-Sa-7z1">
+                    <menu key="submenu" title="Pomotodo" systemMenu="apple" id="nhy-Sa-7z1">
                         <items>
-                            <menuItem title="Configure" id="U4e-aq-VaD">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="20d-gj-dDZ"/>
                             <menuItem title="Preferences…" keyEquivalent="," id="Sqr-wY-JQP"/>
                             <menuItem isSeparatorItem="YES" id="0IX-tH-nqQ"/>
                             <menuItem title="Services" id="Fuq-9I-Pnf">
@@ -44,7 +40,7 @@
                                 <menu key="submenu" title="Services" systemMenu="services" id="NLl-pI-e6c"/>
                             </menuItem>
                             <menuItem isSeparatorItem="YES" id="5sr-ed-yEb"/>
-                            <menuItem title="Hide Quark Contatiner" keyEquivalent="h" id="HGc-Jt-lN6">
+                            <menuItem title="Hide Pomotodo" keyEquivalent="h" id="HGc-Jt-lN6">
                                 <connections>
                                     <action selector="hide:" target="-1" id="VmP-I0-sBV"/>
                                 </connections>
@@ -68,34 +64,11 @@
                     <modifierMask key="keyEquivalentModifierMask"/>
                     <menu key="submenu" title="File" id="YLR-xR-XN2">
                         <items>
-                            <menuItem title="New" keyEquivalent="n" id="pA9-Ff-sGj"/>
-                            <menuItem title="Open…" keyEquivalent="o" id="x1e-nD-cSW"/>
-                            <menuItem title="Open Recent" id="6am-Mb-2P2">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="VOt-3c-t5h">
-                                    <items>
-                                        <menuItem title="Clear Menu" id="UB6-hD-LOk">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="ZUA-U1-HQy"/>
                             <menuItem title="Close" keyEquivalent="w" id="YbC-mK-gmk">
                                 <connections>
                                     <action selector="performClose:" target="-1" id="p9J-Et-AeX"/>
                                 </connections>
                             </menuItem>
-                            <menuItem title="Save…" keyEquivalent="s" id="i7L-Ck-XHA"/>
-                            <menuItem title="Save As…" keyEquivalent="S" id="QUK-Ob-vBW"/>
-                            <menuItem title="Revert to Saved" id="cKY-Fj-TIN">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="2Q5-cg-wyk"/>
-                            <menuItem title="Page Setup…" keyEquivalent="P" id="Gnm-OF-pfc">
-                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
-                            </menuItem>
-                            <menuItem title="Print…" keyEquivalent="p" id="Mrt-5S-Hr2"/>
                         </items>
                     </menu>
                 </menuItem>
@@ -242,169 +215,6 @@
                         </items>
                     </menu>
                 </menuItem>
-                <menuItem title="Format" id="UrF-XM-hmR">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Format" id="xEO-ec-Cna">
-                        <items>
-                            <menuItem title="Font" id="268-fS-mwY">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Font" systemMenu="font" id="JpG-LN-qtQ">
-                                    <items>
-                                        <menuItem title="Show Fonts" keyEquivalent="t" id="NG4-19-5w2"/>
-                                        <menuItem title="Bold" tag="2" keyEquivalent="b" id="7Vg-Pb-LKV"/>
-                                        <menuItem title="Italic" tag="1" keyEquivalent="i" id="CBs-tW-Sck"/>
-                                        <menuItem title="Underline" keyEquivalent="u" id="S19-cD-7P7"/>
-                                        <menuItem isSeparatorItem="YES" id="I37-rg-mdY"/>
-                                        <menuItem title="Bigger" tag="3" keyEquivalent="+" id="RsT-8R-UA2"/>
-                                        <menuItem title="Smaller" tag="4" keyEquivalent="-" id="HNs-xR-bst"/>
-                                        <menuItem isSeparatorItem="YES" id="wJx-Nh-A1O"/>
-                                        <menuItem title="Kern" id="h7F-R6-071">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Kern" id="rjY-kI-AYs">
-                                                <items>
-                                                    <menuItem title="Use Default" id="S6C-jH-yla">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Use None" id="w6w-7A-Ncf">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Tighten" id="cDb-cq-mZj">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Loosen" id="u5Y-d1-dEd">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem title="Ligatures" id="kfW-KK-eLn">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Ligatures" id="sm9-gB-fjx">
-                                                <items>
-                                                    <menuItem title="Use Default" id="tcy-mL-jRW">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Use None" id="ipK-TZ-PQa">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Use All" id="ATN-TH-HI3">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem title="Baseline" id="8dm-eP-rOz">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Baseline" id="cTz-67-kop">
-                                                <items>
-                                                    <menuItem title="Use Default" id="goF-BA-9hm">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Superscript" id="C5f-9z-T3e">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Subscript" id="k9W-mp-zCZ">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Raise" id="kvk-qq-Qkr">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem title="Lower" id="d1b-G3-Uys">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="kwV-o5-Rxn"/>
-                                        <menuItem title="Show Colors" keyEquivalent="C" id="dyj-sv-2MP"/>
-                                        <menuItem isSeparatorItem="YES" id="jEA-2s-zd6"/>
-                                        <menuItem title="Copy Style" keyEquivalent="c" id="QMV-vz-ZuN">
-                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                        </menuItem>
-                                        <menuItem title="Paste Style" keyEquivalent="v" id="ddP-0L-vci">
-                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Text" id="cCB-3p-aYe">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Text" id="B1R-fr-eKl">
-                                    <items>
-                                        <menuItem title="Align Left" keyEquivalent="{" id="fSq-i8-cZg"/>
-                                        <menuItem title="Center" keyEquivalent="|" id="2db-vs-SAg"/>
-                                        <menuItem title="Justify" id="eQc-S5-64I">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                        </menuItem>
-                                        <menuItem title="Align Right" keyEquivalent="}" id="gId-6w-e0C"/>
-                                        <menuItem isSeparatorItem="YES" id="RaJ-4l-Abz"/>
-                                        <menuItem title="Writing Direction" id="FRR-sV-QWF">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Writing Direction" id="6B3-pg-TFP">
-                                                <items>
-                                                    <menuItem title="Paragraph" enabled="NO" id="tIW-Zr-yF0">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="sbB-Se-3Vu">
-                                                        <string key="title">	Default</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="qFy-M4-xaQ">
-                                                        <string key="title">	Left to Right</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="kRl-0k-ca2">
-                                                        <string key="title">	Right to Left</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem isSeparatorItem="YES" id="nWk-Pb-j4J"/>
-                                                    <menuItem title="Selection" enabled="NO" id="PcS-EK-vUi">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="0wo-Wy-hOI">
-                                                        <string key="title">	Default</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="J8V-OH-L6d">
-                                                        <string key="title">	Left to Right</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="Gca-tp-vKh">
-                                                        <string key="title">	Right to Left</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="LLG-ox-fKA"/>
-                                        <menuItem title="Show Ruler" id="1QY-jp-G9L">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                        </menuItem>
-                                        <menuItem title="Copy Ruler" keyEquivalent="c" id="knf-En-GKe">
-                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
-                                        </menuItem>
-                                        <menuItem title="Paste Ruler" keyEquivalent="v" id="g8M-gP-HlN">
-                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="View" id="CHu-VI-fhd">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="View" id="2jU-jg-oPe">
-                        <items>
-                            <menuItem title="Show Toolbar" keyEquivalent="t" id="9bV-j8-SXp">
-                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                            </menuItem>
-                            <menuItem title="Customize Toolbar…" id="V3P-uH-gZL">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
                 <menuItem title="Window" id="nmy-nt-XnN">
                     <modifierMask key="keyEquivalentModifierMask"/>
                     <menu key="submenu" title="Window" systemMenu="window" id="KgO-9o-O1c">

From 9c2e6c0b64edd29c182830c1be4caf06bba54d91 Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Mon, 16 Jan 2017 16:44:05 +0800
Subject: [PATCH 41/43] =?UTF-8?q?=E9=87=8D=E6=9E=84=20+(void)initWebviewWi?=
 =?UTF-8?q?thBridge:url:webDelegate:isMain=20=EF=BC=8C=E8=AE=A9=E6=89=80?=
 =?UTF-8?q?=E6=9C=89=20JS=20=E5=8F=AF=E8=B0=83=E7=94=A8=E5=87=BD=E6=95=B0?=
 =?UTF-8?q?=E9=83=BD=E6=8E=A5=E5=8F=97=E5=8F=82=E6=95=B0=E4=BB=A5=E7=AE=80?=
 =?UTF-8?q?=E5=8C=96=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell/NSArray+isIncludeString.h |  15 ++
 quark-shell/NSArray+isIncludeString.m |  27 ++++
 quark-shell/QSHWebViewDelegate.h      |   1 -
 quark-shell/QSHWebViewDelegate.m      | 209 ++++++++++++++------------
 quark-shell/Quark.js                  |   2 +-
 5 files changed, 159 insertions(+), 95 deletions(-)
 create mode 100644 quark-shell/NSArray+isIncludeString.h
 create mode 100644 quark-shell/NSArray+isIncludeString.m

diff --git a/quark-shell/NSArray+isIncludeString.h b/quark-shell/NSArray+isIncludeString.h
new file mode 100644
index 0000000..f6fc0ee
--- /dev/null
+++ b/quark-shell/NSArray+isIncludeString.h
@@ -0,0 +1,15 @@
+//
+//  NSArray+isIncludeString.h
+//  Pomotodo
+//
+//  Created by c4605 on 2017/1/16.
+//  Copyright © 2017年 HackPlan. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface NSArray (isIncludeString)
+
+- (BOOL)isIncludeString:(NSString *)str;
+
+@end
diff --git a/quark-shell/NSArray+isIncludeString.m b/quark-shell/NSArray+isIncludeString.m
new file mode 100644
index 0000000..0619436
--- /dev/null
+++ b/quark-shell/NSArray+isIncludeString.m
@@ -0,0 +1,27 @@
+//
+//  NSArray+isIncludeString.m
+//  Pomotodo
+//
+//  Created by c4605 on 2017/1/16.
+//  Copyright © 2017年 HackPlan. All rights reserved.
+//
+
+#import "NSArray+isIncludeString.h"
+
+@implementation NSArray (isIncludeString)
+
+- (BOOL)isIncludeString:(NSString *)str
+{
+    for (NSString *elem in self) {
+        if (
+            [elem isKindOfClass:[NSString class]] &&
+            [elem isEqualToString:str]
+        ) {
+            return YES;
+        }
+    }
+    
+    return NO;
+}
+
+@end
diff --git a/quark-shell/QSHWebViewDelegate.h b/quark-shell/QSHWebViewDelegate.h
index 42e11e0..ee7253c 100644
--- a/quark-shell/QSHWebViewDelegate.h
+++ b/quark-shell/QSHWebViewDelegate.h
@@ -24,7 +24,6 @@
 @property (nonatomic, weak) QSHWebView *webView;
 @property (nonatomic, weak) WKWebViewJavascriptBridge *mainBridge;
 
-+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
 + (NSURL *)getRootURL;
 + (NSURL *)getIndexURL;
 + (NSURL *)getFolderURL;
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 657e323..8223d8a 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -17,6 +17,7 @@
 #import <GCDWebServer/GCDWebServer.h>
 #import <AVFoundation/AVFoundation.h>
 #import "QSH_GCDTimer.h"
+#import "NSArray+isIncludeString.h"
 
 static const NSInteger kPreferencesDefaultHeight = 192;
 
@@ -110,24 +111,19 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
     [_WKBridge registerHandler:@"quark" handler:^(id data, WVJBResponseCallback responseCallback) {
         if ([data isKindOfClass:[NSDictionary class]]) {
             NSLog(@"Trigger method: %@ from JS", data[@"method"]);
+            NSString *method = data[@"method"];
+            if (![QSHWebViewDelegate isMethodExcludedFromWebScript:method]) return;
+            
             NSArray *args = data[@"args"];
-            SEL method = NSSelectorFromString(data[@"method"]);
-            if ([args count] > 0) {
-                method = NSSelectorFromString([data[@"method"] stringByAppendingString:@":"]);
-            }
-            if (![QSHWebViewDelegate isSelectorExcludedFromWebScript: method]) {
-                if (method == NSSelectorFromString(@"closeWindow:") ){
-                    [webDelegate performSelector:method withObject: webview.parentWindow];
-                } else if (method == NSSelectorFromString(@"getPref:") ){
-                    NSArray *argsWithCallback = [args arrayByAddingObject:responseCallback];
-                    [webDelegate performSelector:method withObject: argsWithCallback];
-                } else if (method == NSSelectorFromString(@"setPref:") ){
-                    NSArray *argsWithCallback = [args arrayByAddingObject:responseCallback];
-                    [webDelegate performSelector:method withObject: argsWithCallback];
-                } else {
-                    [webDelegate performSelector:method withObject: args];
-                }
+            if (args == nil) args = @[];
+            if ([QSHWebViewDelegate isMethodReceiveParentWindow:method]){
+                args = [args arrayByAddingObject:webview.parentWindow];
+            } else if ([QSHWebViewDelegate isMethodResponseToJS:method]) {
+                args = [args arrayByAddingObject:responseCallback];
             }
+            
+            SEL methodSEL = NSSelectorFromString([data[@"method"] stringByAppendingString:@":"]);
+            [webDelegate performSelector:methodSEL withObject:args];
         }
     }];
     
@@ -142,49 +138,69 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
 
 #pragma mark WebScripting Protocol
 
-+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
-{
-    if (selector == @selector(openPopup) ||
-        selector == @selector(closePopup) ||
-        selector == @selector(togglePopup) ||
-        selector == @selector(resizePopup:) ||
-        selector == @selector(quit) ||
-        selector == @selector(openURL:) ||
-        selector == @selector(playSound:) ||
-        selector == @selector(stopSound) ||
-        selector == @selector(changeIcon:) ||
-        selector == @selector(changeHighlightedIcon:) ||
-        selector == @selector(changeClickAction:) ||
-        selector == @selector(changeSecondaryClickAction:) ||
-        selector == @selector(changeLabel:) ||
-        selector == @selector(resetMenubarIcon) ||
-        selector == @selector(setLaunchAtLogin:) ||
-        selector == @selector(setShowDockIcon:) ||
-        selector == @selector(notify:) ||
-        selector == @selector(removeAllScheduledNotifications) ||
-        selector == @selector(removeAllDeliveredNotifications) ||
-        selector == @selector(addKeyboardShortcut:) ||
-        selector == @selector(clearKeyboardShortcut) ||
-        selector == @selector(setupPreferences:) ||
-        selector == @selector(openPreferences) ||
-        selector == @selector(closePreferences) ||
-        selector == @selector(newWindow:) ||
-        selector == @selector(closeWindow:) ||
-        selector == @selector(closeWindowById:) ||
-        selector == @selector(setPin:) ||
-        selector == @selector(getPref:) ||
-        selector == @selector(setPref:) ||
-        selector == @selector(checkUpdate:) ||
-        selector == @selector(checkUpdateInBackground:) ||
-        selector == @selector(emitMessage:) ||
-        selector == @selector(setMainMenu:) ||
-        selector == @selector(setInterval:) ||
-        selector == @selector(clearInterval:) ||
-        selector == @selector(showMenu:)) {
-        return NO;
-    }
-
-    return YES;
++ (BOOL)isMethodReceiveParentWindow:(NSString *)method
+{
+    return [@[
+              @"closeWindow"
+    ] isIncludeString:method];
+}
+
++ (BOOL)isMethodResponseToJS:(NSString *)method
+{
+    return [@[
+              @"getPref",
+              @"getPinPopup",
+              @"getShowDockIcon",
+              @"getLaunchAtLogin",
+              @"setPref"
+    ] isIncludeString:method];
+}
+
++ (BOOL)isMethodExcludedFromWebScript:(NSString *)method
+{
+    return [@[
+              @"openPopup",
+              @"closePopup",
+              @"togglePopup",
+              @"resizePopup",
+              @"quit",
+              @"openURL",
+              @"playSound",
+              @"stopSound",
+              @"changeIcon",
+              @"changeHighlightedIcon",
+              @"changeClickAction",
+              @"changeSecondaryClickAction",
+              @"changeLabel",
+              @"resetMenubarIcon",
+              @"setLaunchAtLogin",
+              @"getLaunchAtLogin",
+              @"setShowDockIcon",
+              @"getShowDockIcon",
+              @"notify",
+              @"removeAllScheduledNotifications",
+              @"removeAllDeliveredNotifications",
+              @"addKeyboardShortcut",
+              @"clearKeyboardShortcut",
+              @"setupPreferences",
+              @"openPreferences",
+              @"closePreferences",
+              @"newWindow",
+              @"closeWindow",
+              @"closeWindowById",
+              @"getPinPopup",
+              @"setPinPopup",
+              @"getPref",
+              @"setPref",
+              @"checkUpdate",
+              @"checkUpdateInBackground",
+              @"emitMessage",
+              @"setMainMenu",
+              @"setInterval",
+              @"clearInterval",
+              @"setMainMenu",
+              @"showMenu",
+    ] isIncludeString:method];
 }
 
 + (BOOL)isKeyExcludedFromWebScript:(const char *)name
@@ -200,17 +216,17 @@ + (BOOL)isKeyExcludedFromWebScript:(const char *)name
 
 #pragma mark - Methods for JavaScript
 
-- (void)openPopup
+- (void)openPopup:(NSArray *)args
 {
     [self.appDelegate showWindow];
 }
 
-- (void)closePopup
+- (void)closePopup:(NSArray *)args
 {
     [self.appDelegate hideWindow];
 }
 
-- (void)togglePopup
+- (void)togglePopup:(NSArray *)args
 {
     [self.appDelegate toggleWindow];
 }
@@ -226,7 +242,7 @@ - (void)resizePopup:(NSArray *)args
     }
 }
 
-- (void)quit
+- (void)quit:(NSArray *)args
 {
     [NSApp terminate:nil];
 }
@@ -268,7 +284,7 @@ - (void)changeSecondaryClickAction:(NSArray *)args
     };
 }
 
-- (void)resetMenubarIcon
+- (void)resetMenubarIcon:(NSArray *)args
 {
     if (IS_PRIOR_TO_10_9) {
         self.statusItemView.icon = [NSImage imageNamed:@"StatusIcon"];
@@ -303,7 +319,7 @@ - (void)setShowDockIcon:(NSArray *)args
 
 - (void)getShowDockIcon:(NSArray *)args
 {
-    WVJBResponseCallback responseCallback = args[1];
+    WVJBResponseCallback responseCallback = args[0];
     NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
     NSString *value = [userPreferences stringForKey:@"showDockIcon"];
     responseCallback(value);
@@ -377,31 +393,18 @@ - (void)notify:(NSArray *)args
     [notificationCenter scheduleNotification:notification];
 }
 
-- (void)removeAllScheduledNotifications
+- (void)removeAllScheduledNotifications:(NSArray *)args
 {
     NSUserNotificationCenter *notificationCenter = [NSUserNotificationCenter defaultUserNotificationCenter];
     notificationCenter.scheduledNotifications = @[];
 }
 
-- (void)removeAllDeliveredNotifications
+- (void)removeAllDeliveredNotifications:(NSArray *)args
 {
     NSUserNotificationCenter *notificationCenter = [NSUserNotificationCenter defaultUserNotificationCenter];
     [notificationCenter removeAllDeliveredNotifications];
 }
 
-- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification
-{
-    return YES;
-}
-
-- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification
-{
-    if (notification.userInfo[@"popupOnClick"]) {
-        [self.appDelegate showWindow];
-    }
-    [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification];
-}
-
 - (void)addKeyboardShortcut:(NSArray *)args
 {
     NSDictionary* shortcutObj = args[0];
@@ -422,7 +425,7 @@ - (void)addKeyboardShortcut:(NSArray *)args
     [userPreferences synchronize];
 }
 
-- (void)clearKeyboardShortcut
+- (void)clearKeyboardShortcut:(NSArray *)args
 {
     [[MASShortcutMonitor sharedMonitor] unregisterAllShortcuts];
 }
@@ -455,12 +458,12 @@ - (void)setupPreferences:(NSArray *)args
     [self.preferencesWindowController selectControllerAtIndex:0];
 }
 
-- (void)openPreferences
+- (void)openPreferences:(NSArray *)args
 {
     [self.preferencesWindowController showWindow:nil];
 }
 
-- (void)closePreferences
+- (void)closePreferences:(NSArray *)args
 {
     [self.preferencesWindowController close];
 }
@@ -576,8 +579,9 @@ - (void)closeWindowById:(NSArray *)args
     }
 }
 
-- (void)closeWindow:(NSWindowController *)window
+- (void)closeWindow:(NSArray *)args
 {
+    NSWindowController *window = args[0];
     [window close];
 }
 
@@ -595,7 +599,7 @@ - (void)playSound:(NSArray *)args
     [_audioPlayer play];
 }
 
-- (void)stopSound
+- (void)stopSound:(NSArray *)args
 {
     [_audioPlayer stop];
 }
@@ -615,15 +619,17 @@ - (void)getPinPopup:(NSArray *)args
     responseCallback(value);
 }
 
-- (void)checkUpdate:(NSString *)url
+- (void)checkUpdate:(NSArray *)args
 {
+    NSString *url = args[0];
     SUUpdater *updater = [[SUUpdater alloc] init];
     updater.feedURL = [NSURL URLWithString:url];
     [updater checkForUpdates:nil];
 }
 
-- (void)checkUpdateInBackground:(NSString *)url
+- (void)checkUpdateInBackground:(NSArray *)args
 {
+    NSString *url = args[0];
     SUUpdater *updater = [[SUUpdater alloc] init];
     updater.feedURL = [NSURL URLWithString:url];
     [updater checkForUpdatesInBackground];
@@ -689,12 +695,6 @@ - (void)showMenu:(NSArray *)args
     [menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(x, yFlipped) inView:self.webView];
 }
 
-- (void)menuItemClicked:(NSMenuItem *)sender
-{
-    NSArray *args = [NSArray arrayWithObject:sender.representedObject];
-    [self emitMessage:args];
-}
-
 - (void)setInterval:(NSArray *)args
 {
     NSNumber *callbackId = args[0];
@@ -724,6 +724,14 @@ - (void)clearInterval:(NSArray *)args
     }
 }
 
+#pragma mark - Private methods
+
+- (void)menuItemClicked:(NSMenuItem *)sender
+{
+    NSArray *args = [NSArray arrayWithObject:sender.representedObject];
+    [self emitMessage:args];
+}
+
 #pragma mark - Delegate methods
 
 - (void)webView:(WKWebView *)webView addMessageToConsole:(NSDictionary *)message
@@ -842,4 +850,19 @@ - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary
     return nil;
 }
 
+#pragma mark - NSUserNotificationCenterDelegate
+
+- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification
+{
+    return YES;
+}
+
+- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification
+{
+    if (notification.userInfo[@"popupOnClick"]) {
+        [self.appDelegate showWindow];
+    }
+    [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification];
+}
+
 @end
diff --git a/quark-shell/Quark.js b/quark-shell/Quark.js
index ac30f90..2833c04 100644
--- a/quark-shell/Quark.js
+++ b/quark-shell/Quark.js
@@ -45,7 +45,7 @@ function setupQuarkWithBridge(bridge) {
   ], true);
 
   quark.closeWindow = function (options) {
-    bridge.callHandler('quark', {'method': 'closeWindow', 'args': [0]})
+    bridge.callHandler('quark', {'method': 'closeWindow', 'args': []})
   }
 
   quark.emit = function (options) {

From 8328b498a93efbc2cd336d2dd520c0c2a5c8e447 Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Mon, 16 Jan 2017 16:56:20 +0800
Subject: [PATCH 42/43] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BA=86=20+isMethodRe?=
 =?UTF-8?q?ceiveParentWindow:=20=E5=92=8C=20+isMethodResponseToJS:=20?=
 =?UTF-8?q?=E7=9A=84=E5=87=BD=E6=95=B0=20WVJBResponseCallback=20=E5=92=8C?=
 =?UTF-8?q?=20parentWindow=20=E5=8F=98=E6=88=90=E6=9C=80=E9=A1=B6=E7=AB=AF?=
 =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

因为 JavaScript 传过来的参数数量是不确定的，如果放在最后的话如果
JavaScript 少传了参数会导致 Objective-C 取不到相应的参数
---
 quark-shell/QSHWebViewDelegate.m | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 8223d8a..3ebf14a 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -114,8 +114,7 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
             NSString *method = data[@"method"];
             if (![QSHWebViewDelegate isMethodExcludedFromWebScript:method]) return;
             
-            NSArray *args = data[@"args"];
-            if (args == nil) args = @[];
+            NSArray *args = @[];
             if ([QSHWebViewDelegate isMethodReceiveParentWindow:method]){
                 args = [args arrayByAddingObject:webview.parentWindow];
             } else if ([QSHWebViewDelegate isMethodResponseToJS:method]) {
@@ -123,7 +122,7 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
             }
             
             SEL methodSEL = NSSelectorFromString([data[@"method"] stringByAppendingString:@":"]);
-            [webDelegate performSelector:methodSEL withObject:args];
+            [webDelegate performSelector:methodSEL withObject:[args arrayByAddingObjectsFromArray:data[@"args"]]];
         }
     }];
     
@@ -327,8 +326,8 @@ - (void)getShowDockIcon:(NSArray *)args
 
 - (void)getPref:(NSArray *)args
 {
-    NSString *key = args[0];
-    WVJBResponseCallback responseCallback = args[1];
+    WVJBResponseCallback responseCallback = args[0];
+    NSString *key = args[1];
     NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
     NSString *value = [userPreferences stringForKey:key];
     responseCallback(value);
@@ -336,12 +335,13 @@ - (void)getPref:(NSArray *)args
 
 - (void)setPref:(NSArray *)args
 {
-    NSString *key = args[0];
-    NSString *value = args[1];
+    WVJBResponseCallback responseCallback = args[0];
+    NSString *key = args[1];
+    NSString *value = args[2];
     if (!([value length] > 0)) {
         value = @"";
     }
-    WVJBResponseCallback responseCallback = args[2];
+    
     NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
     [userPreferences setObject:value forKey:key];
     [userPreferences synchronize];

From 3c59f96e6a8b9c39751ad7de720e69267420327a Mon Sep 17 00:00:00 2001
From: c4605 <bolasblack@gmail.com>
Date: Mon, 16 Jan 2017 18:19:14 +0800
Subject: [PATCH 43/43] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20quark.setInterval=20?=
 =?UTF-8?q?=E6=9C=89=E5=8F=AF=E8=83=BD=E5=AD=98=E5=9C=A8=E5=86=85=E5=AD=98?=
 =?UTF-8?q?=E6=B3=84=E6=BC=8F=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 quark-shell/QSHWebView.h         |  4 ++-
 quark-shell/QSHWebView.m         | 59 +++++++++++++++++++++++++++++---
 quark-shell/QSHWebViewDelegate.m | 52 +++++++++++++---------------
 3 files changed, 80 insertions(+), 35 deletions(-)

diff --git a/quark-shell/QSHWebView.h b/quark-shell/QSHWebView.h
index 9e5c99b..3e3940c 100644
--- a/quark-shell/QSHWebView.h
+++ b/quark-shell/QSHWebView.h
@@ -20,6 +20,8 @@
 @property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
 @property (nonatomic) QSHWebViewWindowController *parentWindow;
 
-+ (WKWebViewConfiguration *)webViewConfiguration;
+- (void)setInterval:(NSNumber *)callbackId interval:(NSNumber *)interval isRepeat:(BOOL)isRepeat;
+- (void)clearInterval:(NSNumber *)callbackId;
+- (void)clearAllIntervalTimer;
 
 @end
diff --git a/quark-shell/QSHWebView.m b/quark-shell/QSHWebView.m
index aa03498..8bdd933 100644
--- a/quark-shell/QSHWebView.m
+++ b/quark-shell/QSHWebView.m
@@ -7,9 +7,63 @@
 //
 
 #import "QSHWebView.h"
+#import "QSH_GCDTimer.h"
+
+@interface QSHWebView () {
+    NSMutableDictionary *_intervalTimers;
+}
+
+@end
 
 @implementation QSHWebView
 
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        _intervalTimers = [[NSMutableDictionary alloc] init];
+    }
+    return self;
+}
+
+- (instancetype)initWithFrame:(NSRect)frameRect
+{
+    return [super initWithFrame:frameRect configuration: [QSHWebView webViewConfiguration]];
+}
+
+- (void)setInterval:(NSNumber *)callbackId interval:(NSNumber *)interval isRepeat:(BOOL)isRepeat
+{
+    [self clearInterval:callbackId];
+    _intervalTimers[callbackId] = [QSH_GCDTimer
+                                   timerWithTimeInterval:interval
+                                   inQueue:dispatch_get_main_queue()
+                                   repeats:isRepeat
+                                   block:^(QSH_GCDTimer *timer) {
+                                       [self.bridge
+                                        callHandler:@"intervalCallback"
+                                        data:@{@"callbackId": callbackId}
+                                        ];
+                                   }];
+}
+
+- (void)clearInterval:(NSNumber *)timerId
+{
+    QSH_GCDTimer *timer = _intervalTimers[timerId];
+    if (timer != nil) {
+        [_intervalTimers removeObjectForKey:timerId];
+        [timer invalidate];
+    }
+}
+
+- (void)clearAllIntervalTimer
+{
+    for (NSNumber *timerId in [_intervalTimers allKeys]) {
+        [self clearInterval:timerId];
+    }
+}
+
+# pragma mark - private methods
+
 + (NSString *)quarkSourceScript
 {
     return [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Quark" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
@@ -37,9 +91,4 @@ + (WKWebViewConfiguration *)webViewConfiguration
     return configuration;
 }
 
-- (instancetype)initWithFrame:(NSRect)frameRect
-{
-    return [super initWithFrame:frameRect configuration: [QSHWebView webViewConfiguration]];
-}
-
 @end
diff --git a/quark-shell/QSHWebViewDelegate.m b/quark-shell/QSHWebViewDelegate.m
index 3ebf14a..cceddec 100644
--- a/quark-shell/QSHWebViewDelegate.m
+++ b/quark-shell/QSHWebViewDelegate.m
@@ -16,7 +16,6 @@
 #import "WKWebViewJavascriptBridge.h"
 #import <GCDWebServer/GCDWebServer.h>
 #import <AVFoundation/AVFoundation.h>
-#import "QSH_GCDTimer.h"
 #import "NSArray+isIncludeString.h"
 
 static const NSInteger kPreferencesDefaultHeight = 192;
@@ -26,8 +25,6 @@ @interface QSHWebViewDelegate () <NSUserNotificationCenterDelegate, WebPolicyDel
     NSString *appBundleVersion;
     NSString *platform;
     AVAudioPlayer *_audioPlayer;
-    NSMutableDictionary *_intervalTimers;
-    long _intervalTimersUniqueId;
 
     BOOL debug;
 }
@@ -115,8 +112,8 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
             if (![QSHWebViewDelegate isMethodExcludedFromWebScript:method]) return;
             
             NSArray *args = @[];
-            if ([QSHWebViewDelegate isMethodReceiveParentWindow:method]){
-                args = [args arrayByAddingObject:webview.parentWindow];
+            if ([QSHWebViewDelegate isMethodReceiveWebView:method]){
+                args = [args arrayByAddingObject:webview];
             } else if ([QSHWebViewDelegate isMethodResponseToJS:method]) {
                 args = [args arrayByAddingObject:responseCallback];
             }
@@ -137,10 +134,12 @@ + (void)initWebviewWithBridge:(QSHWebView*)webview url:(NSURL*)url webDelegate:(
 
 #pragma mark WebScripting Protocol
 
-+ (BOOL)isMethodReceiveParentWindow:(NSString *)method
++ (BOOL)isMethodReceiveWebView:(NSString *)method
 {
     return [@[
-              @"closeWindow"
+              @"closeWindow",
+              @"setInterval",
+              @"clearInterval"
     ] isIncludeString:method];
 }
 
@@ -581,8 +580,8 @@ - (void)closeWindowById:(NSArray *)args
 
 - (void)closeWindow:(NSArray *)args
 {
-    NSWindowController *window = args[0];
-    [window close];
+    QSHWebView *webview = args[0];
+    [webview.parentWindow close];
 }
 
 - (void)playSound:(NSArray *)args
@@ -697,31 +696,18 @@ - (void)showMenu:(NSArray *)args
 
 - (void)setInterval:(NSArray *)args
 {
-    NSNumber *callbackId = args[0];
-    NSNumber *interval = args[1];
+    QSHWebView *webview = args[0];
+    NSNumber *timerId = args[1];
+    NSNumber *interval = args[2];
     bool isRepeat = args.count > 2 ? [args[2] boolValue] : true;
-    
-    [self clearInterval:@[callbackId]];
-    _intervalTimers[callbackId] = [QSH_GCDTimer
-                                   timerWithTimeInterval:interval
-                                   inQueue:dispatch_get_main_queue()
-                                   repeats:isRepeat
-                                   block:^(QSH_GCDTimer *timer) {
-                                       [self.webView.bridge
-                                        callHandler:@"intervalCallback"
-                                        data:@{@"callbackId": callbackId}
-                                        ];
-                                   }];
+    [webview setInterval:timerId interval:interval isRepeat:isRepeat];
 }
 
 - (void)clearInterval:(NSArray *)args
 {
-    NSNumber *timerId = args[0];
-    QSH_GCDTimer *timer = _intervalTimers[timerId];
-    if (timer != nil) {
-        [_intervalTimers removeObjectForKey:timerId];
-        [timer invalidate];
-    }
+    QSHWebView *webview = args[0];
+    NSNumber *timerId = args[1];
+    [webview clearInterval:timerId];
 }
 
 #pragma mark - Private methods
@@ -865,4 +851,12 @@ - (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNot
     [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification];
 }
 
+#pragma mark - WKNavigationDelegate
+
+- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation
+{
+    QSHWebView *qshWebView = (QSHWebView *)webView;
+    [qshWebView clearAllIntervalTimer];
+}
+
 @end
