diff --git a/make.sh b/make.sh index b778cbc..b891196 100755 --- a/make.sh +++ b/make.sh @@ -4,7 +4,7 @@ EXTENSION_NAME="PiPer" -SOURCE_FILES=("main.js" "fix.js") +SOURCE_FILES=("main.js" "fix.js" "localization_bridge.js") # Certifcate paths LEAF_CERT_PATH="../certs/cert.pem" @@ -20,12 +20,14 @@ Usage: make.sh [options] Options: -h -? --help Show this screen - -t --target (all|safari-legacy) Make extension for target browser [default: all] + -t --target (all|safari|safari-legacy) Make extension for target browser [default: all] -p --profile (release|debug|distribute) Set settings according to profile [default: debug] -c --compress-css Compress CSS -j --compress-js Compress JavaScript -s --compress-svg Compress SVG -l --logging-level Set logging level (0=all 10=trace 20=info 30=warning 40=error) + -i --development-team Set development team ID + -a --archive-to-xcode Archive Safari extension to Xcode for Mac App Store distribution -e --package-extension Package extension for distribution (safari-legacy requires private key) -d --no-debug-js Remove JavaScript source maps to prevent debugging -v --no-version-increment Disable automatic version incrementing @@ -42,7 +44,7 @@ while :; do -h|-\?|--help) show_help ;; -p|--profile) [[ "$2" ]] && profile=$2 ;; --profile=?*) profile=${1#*=} ;; - -l|-t|--logging-level|--target) shift ;; + -l|-t|-i|--logging-level|--target|--development-team) shift ;; -?*) ;; *) break esac @@ -78,6 +80,8 @@ case $profile in ;; esac update_version=1 +archive_xcode=0 +development_team="" targets="all" set -- "${arguments[@]}" @@ -95,6 +99,9 @@ while :; do --target=?*) targets=${1#*=} ;; -l|--logging-level) [[ "$2" ]] && logging_level=$2 && shift ;; --logging-level=?*) logging_level=${1#*=} ;; + -i|--development-team) [[ "$2" ]] && development_team=$2 && shift ;; + --development-team=?*) development_team=${1#*=} ;; + -a|--archive-to-xcode) archive_xcode=1 ;; -p|--profile) shift ;; -?*) ;; *) break ;; @@ -107,10 +114,12 @@ echo "Setting '${profile}' profile" # Validate targets case $targets in + safari) targets=("safari") ;; safari-legacy) targets=("safari-legacy") ;; - *) targets=("safari-legacy") + *) targets=("safari" "safari-legacy") esac + # Helper checks for build tool dependency and falls back to 'npx' if possible function get_node_command() { if type "$1" &>/dev/null; then @@ -130,7 +139,28 @@ function get_node_command() { # Target specific build checks for i in "${!targets[@]}"; do - if [[ "${targets[$i]}" = "safari-legacy" ]]; then + if [[ "${targets[$i]}" = "safari" ]]; then + + # Only build 'safari' extension target when running under macOS + if [[ "$(uname)" != "Darwin" ]]; then + echo "Warning: Building 'safari' extension skipped as requires macOS" >&2 + unset "targets[$i]" + continue + fi + + # Ensure with have Xcode command line tools installed + if [[ -z $(xcode-select --print-path) ]]; then + echo "Installing Xcode Command Line Tools (expect a GUI popup)" + xcode-select --install &>/dev/null + echo "Press any key after installation has completed" + read -rsn1 + if [[ -z $(xcode-select --print-path) ]]; then + echo "Unable to find Xcode Command Line Tools" + exit 1 + fi + fi + + elif [[ "${targets[$i]}" = "safari-legacy" ]]; then # Get 'safari-legacy' specific build tool path and exit if not found [[ "${package_ext}" -eq 1 ]] && { XARJS_PATH=$(get_node_command "xarjs" "xar-js") || exit 1; } @@ -277,6 +307,11 @@ for target in "${targets[@]}"; do # Set target specific flags case $target in + safari) + browser=1 + target_extension="" + common_file_path="/Extension/Resources" + ;; safari-legacy) browser=1 target_extension=".safariextension" @@ -457,9 +492,81 @@ for target in "${targets[@]}"; do done fi - # Safari specific build steps - if [[ "${target}" == "safari-legacy" ]]; then + if [[ "${target}" == "safari" ]]; then + + # Update version info from git + if [[ "${update_version}" -eq 1 ]]; then + multiline_sed_regex "out/${EXTENSION_NAME}-${target}/Extension/Info.plist" "s|(> *CFBundleShortVersionString *[^>]+>)[^<]+|\1${git_release_version}|g" + multiline_sed_regex "out/${EXTENSION_NAME}-${target}/Extension/Info.plist" "s|(> *CFBundleVersion *[^>]+>)[^<]+|\1${number_of_commits}|g" + multiline_sed_regex "out/${EXTENSION_NAME}-${target}/App/Info.plist" "s|(> *CFBundleShortVersionString *[^>]+>)[^<]+|\1${git_release_version}|g" + multiline_sed_regex "out/${EXTENSION_NAME}-${target}/App/Info.plist" "s|(> *CFBundleVersion *[^>]+>)[^<]+|\1${number_of_commits}|g" + fi + + # Get development team id automatically if needed + if [[ -z "${development_team}" ]]; then + + # Helper maintains unique list of ids + team_ids=() + function add_unique_team_ids() { + for i in "${!team_ids[@]}"; do + [[ ${team_ids[$i]} = "$1" ]] && return + done + team_ids+=("$1") + } + + # Search mobileprovision files for team identifiers + regex="TeamIdentifier<\/key>[^\/]+>([A-Z0-9]{10})<\/" + for path in "${HOME}/Library/MobileDevice/Provisioning Profiles"/*.mobileprovision; do + source=$(cat "${path}" | iconv -f "ISO-8859-1" -t "UTF-8") + if [[ "${source}" =~ $regex ]]; then + add_unique_team_ids "${BASH_REMATCH[1]}" + fi + done + + # If multiple or no identifiers found then prompt the user + development_team_hint="(avoid this message in future by specifying --development-team)" + if (( ${#team_ids[@]} == 0 )); then + echo "Unable to find development team automatically, please enter below: ${development_team_hint}" + read development_team /dev/null + + # Copy archive to Xcode if needed + if [[ "${archive_xcode}" -eq 1 ]]; then + archive_time=$(date '+%d-%m-%Y, %H.%M') + mv "./out/${EXTENSION_NAME}-${target}.xcarchive" "${HOME}/Library/Developer/Xcode/Archives/${EXTENSION_NAME} ${archive_time}.xcarchive" + fi + + # Package extension + if [[ "${package_ext}" -eq 1 ]]; then + productbuild --quiet --component "./out/PiPer.app" "/Applications" "./out/${EXTENSION_NAME}-${target}.pkg" + rm -rf "./out/PiPer.app" + else + mv "out/PiPer.app" "out/${EXTENSION_NAME}-${target}.app" + fi + + # Remove everything else + rm -rf "out/${EXTENSION_NAME}-${target}.xcarchive" + rm -rf "out/${EXTENSION_NAME}-${target}" + + elif [[ "${target}" == "safari-legacy" ]]; then # Remove irrelevant target file rm -f "out/${EXTENSION_NAME}-${target}${target_extension}/update.plist" diff --git a/out/PiPer-safari-legacy.safariextz b/out/PiPer-safari-legacy.safariextz index 58af50d..a210606 100644 Binary files a/out/PiPer-safari-legacy.safariextz and b/out/PiPer-safari-legacy.safariextz differ diff --git a/out/PiPer-safari.pkg b/out/PiPer-safari.pkg new file mode 100644 index 0000000..7b05480 Binary files /dev/null and b/out/PiPer-safari.pkg differ diff --git a/src/common/scripts/localization.js b/src/common/scripts/localization.js index 6aa6295..93c73b0 100644 --- a/src/common/scripts/localization.js +++ b/src/common/scripts/localization.js @@ -9,6 +9,24 @@ localizations['button-title'] = { 'fr': 'Démarrer Image dans l’image', }; +localizations['donate'] = { + 'en': 'Donate', + 'de': 'Spenden', +}; + +localizations['report-bug'] = { + 'en': 'Report a bug', + 'de': 'Einen Fehler melden', +}; + +localizations['enable'] = { + 'en': 'Enable', +}; + +localizations['safari-disabled-warning'] = { + 'en': 'Extension is currently disabled, enable in Safari preferences', +}; + // Set English as the default fallback language const defaultLanguage = 'en'; diff --git a/src/safari-legacy/update.plist b/src/safari-legacy/update.plist index 9adbcd7..a64852f 100644 --- a/src/safari-legacy/update.plist +++ b/src/safari-legacy/update.plist @@ -10,7 +10,7 @@ CFBundleShortVersionString CFBundleVersion - 173 + 174 Developer Identifier BQ6Q24MF9X URL diff --git a/src/safari/App/AppDelegate.swift b/src/safari/App/AppDelegate.swift new file mode 100644 index 0000000..45d8736 --- /dev/null +++ b/src/safari/App/AppDelegate.swift @@ -0,0 +1,25 @@ +// +// AppDelegate.swift +// PiPer App +// +// Created by Adam Marcus on 19/07/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + func applicationDidFinishLaunching(_ aNotification: Notification) { + } + + func applicationWillTerminate(_ aNotification: Notification) { + } + + func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true; + } + +} + diff --git a/src/safari/App/Icon.icns b/src/safari/App/Icon.icns new file mode 100644 index 0000000..8d87f47 Binary files /dev/null and b/src/safari/App/Icon.icns differ diff --git a/src/safari/App/Info.plist b/src/safari/App/Info.plist new file mode 100644 index 0000000..0708a8c --- /dev/null +++ b/src/safari/App/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + Icon.icns + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.0.0 + CFBundleVersion + 0 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2018 Adam Marcus. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/src/safari/App/LocalizationManager.swift b/src/safari/App/LocalizationManager.swift new file mode 100644 index 0000000..f19d706 --- /dev/null +++ b/src/safari/App/LocalizationManager.swift @@ -0,0 +1,49 @@ +// +// LocalizationManager.swift +// PiPer +// +// Created by Adam Marcus on 12/10/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Foundation +import JavaScriptCore + +class LocalizationManager { + + let context: JSContext = JSContext() + let languageCode: String + + static let `default` = LocalizationManager() + + init(withLanguageCode languageCode: String? = Locale.current.languageCode) { + + self.languageCode = languageCode ?? "" + + #if DEBUG + context.exceptionHandler = { _, value in + print("Localization JavaScriptCore error: \(value!)") + } + #endif + + context.evaluateScript("const window = {};") + + if let extensionBundleURL = ResourceHelper.extensionBundleURL { + let localizationFile = extensionBundleURL.appendingPathComponent("scripts/localization_bridge.js").path + + let localizationFileContents = try? String(contentsOfFile: localizationFile, + encoding: String.Encoding.utf8) + + if let localizationScript = localizationFileContents { + context.evaluateScript(localizationScript) + } + } + } + + func localizedString(forKey key: String) -> String { + let string = context.evaluateScript("window.localizedString('\(key)', '\(languageCode)');").toString() + return string ?? "" + } + +} + diff --git a/src/safari/App/LocalizedButton.swift b/src/safari/App/LocalizedButton.swift new file mode 100644 index 0000000..9e80f6e --- /dev/null +++ b/src/safari/App/LocalizedButton.swift @@ -0,0 +1,33 @@ +// +// LocalizedButton.swift +// PiPer +// +// Created by Adam Marcus on 13/10/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Cocoa + +@IBDesignable +class LocalizedButton: NSButton { + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + localizeTitle() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + localizeTitle() + } + + override func prepareForInterfaceBuilder() { + super.prepareForInterfaceBuilder() + localizeTitle() + } + + func localizeTitle() { + self.title = LocalizationManager.default.localizedString(forKey:self.title) + } + +} diff --git a/src/safari/App/LocalizedTextField.swift b/src/safari/App/LocalizedTextField.swift new file mode 100644 index 0000000..030394e --- /dev/null +++ b/src/safari/App/LocalizedTextField.swift @@ -0,0 +1,33 @@ +// +// LocalizedTextField.swift +// PiPer +// +// Created by Adam Marcus on 13/10/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Cocoa + +@IBDesignable +class LocalizedTextField: NSTextField { + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + localizeValue() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + localizeValue() + } + + override func prepareForInterfaceBuilder() { + super.prepareForInterfaceBuilder() + localizeValue() + } + + func localizeValue() { + self.stringValue = LocalizationManager.default.localizedString(forKey:self.stringValue) + } + +} diff --git a/src/safari/App/Main.storyboard b/src/safari/App/Main.storyboard new file mode 100644 index 0000000..0ec8916 --- /dev/null +++ b/src/safari/App/Main.storyboard @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/safari/App/PiPer_App.entitlements b/src/safari/App/PiPer_App.entitlements new file mode 100644 index 0000000..f549d79 --- /dev/null +++ b/src/safari/App/PiPer_App.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(APP_GROUP_ID) + + com.apple.security.network.client + + + diff --git a/src/safari/App/ResourceHelper.swift b/src/safari/App/ResourceHelper.swift new file mode 100644 index 0000000..b3b4a64 --- /dev/null +++ b/src/safari/App/ResourceHelper.swift @@ -0,0 +1,23 @@ +// +// ResourceHelper.swift +// PiPer +// +// Created by Adam Marcus on 13/10/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Foundation + +class ResourceHelper { + + static let extensionBundleURL: URL? = { + guard let pluginURL = Bundle.main.builtInPlugInsURL else { + return nil + } + guard let extensionBundle = Bundle(url: pluginURL.appendingPathComponent("PiPerExt.appex")) else { + return nil + } + return extensionBundle.resourceURL + }() + +} diff --git a/src/safari/App/ViewController.swift b/src/safari/App/ViewController.swift new file mode 100644 index 0000000..ddbce7c --- /dev/null +++ b/src/safari/App/ViewController.swift @@ -0,0 +1,69 @@ +// +// ViewController.swift +// PiPer App +// +// Created by Adam Marcus on 19/07/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import Cocoa +import SafariServices + +class ViewController: NSViewController { + + let extensionId = String(cString:EXTENSION_BUNDLE_ID) + + @IBOutlet var viewContainer: NSVisualEffectView! + @IBOutlet var mainView: NSView! + @IBOutlet var extensionDisabledView: NSView! + + + override func viewDidLoad() { + super.viewDidLoad() + + // Display the main view by default + viewContainer.addSubview(mainView) + + // Poll every second for Safari extension state changes + Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.checkExtensionState), userInfo: nil, repeats: true).fire() + } + + // Display the requested view + func showView(_ newView: NSView) { + let oldView = viewContainer.subviews.first + if oldView == newView { + return + } + // Avoid animating the transition due to NSButton vibrancy rendering glitch in dark mode + // viewContainer.animator().replaceSubview(oldView!, with:newView) + viewContainer.replaceSubview(oldView!, with:newView) + } + + // Check extension state and show extension disabled view if necessary + @objc func checkExtensionState() { + SFSafariExtensionManager.getStateOfSafariExtension(withIdentifier: extensionId) { state, error in + DispatchQueue.main.async { + if let status = state?.isEnabled { + self.showView(status ? self.mainView : self.extensionDisabledView) + } + } + } + } + + @IBAction func clickedEnableExtension(sender: NSButton) { + SFSafariApplication.showPreferencesForExtension(withIdentifier: extensionId) + } + + @IBAction func clickedReportBug(sender: NSButton) { + if let url = URL(string: "https://github.com/amarcu5/PiPer/issues") { + NSWorkspace.shared.open(url) + } + } + + @IBAction func clickedDonate(sender: NSButton) { + if let url = URL(string: "https://paypal.me/adampmarcus") { + NSWorkspace.shared.open(url) + } + } + +} diff --git a/src/safari/Common/Defines.c b/src/safari/Common/Defines.c new file mode 100644 index 0000000..60e3742 --- /dev/null +++ b/src/safari/Common/Defines.c @@ -0,0 +1,15 @@ +// +// Defines.c +// PiPer +// +// Created by Adam Marcus on 10/08/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +#define QUOTE(str) #str +#define EXPAND_AND_QUOTE(str) QUOTE(str) + +const char * APP_GROUP_ID = EXPAND_AND_QUOTE(APP_GROUP_ID_CONST); + +const char * APP_BUNDLE_ID = EXPAND_AND_QUOTE(APP_BUNDLE_ID_CONST); +const char * EXTENSION_BUNDLE_ID = EXPAND_AND_QUOTE(EXTENSION_BUNDLE_ID_CONST); diff --git a/src/safari/Common/Defines.h b/src/safari/Common/Defines.h new file mode 100644 index 0000000..54a22c3 --- /dev/null +++ b/src/safari/Common/Defines.h @@ -0,0 +1,12 @@ +// +// Defines.h +// PiPer +// +// Created by Adam Marcus on 10/08/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +extern const char * APP_GROUP_ID; + +extern const char * APP_BUNDLE_ID; +extern const char * EXTENSION_BUNDLE_ID; diff --git a/src/safari/Extension/Info.plist b/src/safari/Extension/Info.plist new file mode 100644 index 0000000..c0d1d93 --- /dev/null +++ b/src/safari/Extension/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + PiPer + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 0.0.0 + CFBundleVersion + 0 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSExtension + + NSExtensionPointIdentifier + com.apple.Safari.extension + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).SafariExtensionHandler + SFSafariContentScript + + + Script + scripts/main.js + + + SFSafariExtensionBundleIdentifiersToUninstall + + com.amarcus.safari.piper + + SFSafariWebsiteAccess + + Level + All + + + NSHumanReadableCopyright + Copyright © 2018 Adam Marcus. All rights reserved. + NSHumanReadableDescription + Adds Picture in Picture functionality to Youtube, Netflix, Amazon Video, Twitch, and more! + + diff --git a/src/safari/Extension/PiPer_Extension.entitlements b/src/safari/Extension/PiPer_Extension.entitlements new file mode 100644 index 0000000..35fae2f --- /dev/null +++ b/src/safari/Extension/PiPer_Extension.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(APP_GROUP_ID) + + + diff --git a/src/safari/Extension/Resources/scripts/localization_bridge.js b/src/safari/Extension/Resources/scripts/localization_bridge.js new file mode 100644 index 0000000..fda5769 --- /dev/null +++ b/src/safari/Extension/Resources/scripts/localization_bridge.js @@ -0,0 +1,4 @@ +import { localizedString } from './localization.js' + +// Export localization functions +window['localizedString'] = localizedString; \ No newline at end of file diff --git a/src/safari/Extension/SafariExtensionHandler.swift b/src/safari/Extension/SafariExtensionHandler.swift new file mode 100644 index 0000000..3ae61bd --- /dev/null +++ b/src/safari/Extension/SafariExtensionHandler.swift @@ -0,0 +1,13 @@ +// +// SafariExtensionHandler.swift +// PiPer +// +// Created by Adam Marcus on 19/07/2018. +// Copyright © 2018 Adam Marcus. All rights reserved. +// + +import SafariServices + +class SafariExtensionHandler: SFSafariExtensionHandler { + +} diff --git a/src/safari/PiPer.xcodeproj/project.pbxproj b/src/safari/PiPer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ea185d9 --- /dev/null +++ b/src/safari/PiPer.xcodeproj/project.pbxproj @@ -0,0 +1,563 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 85254C902100C6CA000CDDE0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85254C8F2100C6CA000CDDE0 /* AppDelegate.swift */; }; + 85254C922100C6CA000CDDE0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85254C912100C6CA000CDDE0 /* ViewController.swift */; }; + 85254CA92100C703000CDDE0 /* SafariExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85254CA82100C703000CDDE0 /* SafariExtensionHandler.swift */; }; + 85254CB72100C703000CDDE0 /* PiPerExt.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 85254CA32100C703000CDDE0 /* PiPerExt.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 854061A62171599100F60C11 /* LocalizationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854061A52171599100F60C11 /* LocalizationManager.swift */; }; + 854061A8217167EA00F60C11 /* LocalizedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854061A7217167EA00F60C11 /* LocalizedButton.swift */; }; + 854061AA2172234300F60C11 /* LocalizedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854061A92172234300F60C11 /* LocalizedTextField.swift */; }; + 857DA7332116237700B38873 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 857DA7322116237700B38873 /* Icon.icns */; }; + 85A0EA8021726E30000DB27C /* scripts in Resources */ = {isa = PBXBuildFile; fileRef = 85A0EA7A21726E2A000DB27C /* scripts */; }; + 85A0EA8121726E30000DB27C /* images in Resources */ = {isa = PBXBuildFile; fileRef = 85A0EA7B21726E2B000DB27C /* images */; }; + 85A0EA8621726F05000DB27C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 85A0EA8521726F05000DB27C /* Main.storyboard */; }; + 85A0EA8C2172850D000DB27C /* ResourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85A0EA8B2172850D000DB27C /* ResourceHelper.swift */; }; + 85E505AB211E330F003B446B /* Defines.c in Sources */ = {isa = PBXBuildFile; fileRef = 85E505AA211E330F003B446B /* Defines.c */; }; + 85E505AC211E3339003B446B /* Defines.c in Sources */ = {isa = PBXBuildFile; fileRef = 85E505AA211E330F003B446B /* Defines.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 85254CB52100C703000CDDE0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 85254C842100C6C9000CDDE0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 85254CA22100C703000CDDE0; + remoteInfo = PiPer; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 85254CBB2100C703000CDDE0 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 85254CB72100C703000CDDE0 /* PiPerExt.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 851C3AE62113D4F90052505E /* PiPer_App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PiPer_App.entitlements; sourceTree = ""; }; + 851C3AE72113D4FE0052505E /* PiPer_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PiPer_Extension.entitlements; sourceTree = ""; }; + 85254C8C2100C6CA000CDDE0 /* PiPer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PiPer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 85254C8F2100C6CA000CDDE0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 85254C912100C6CA000CDDE0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 85254C982100C6CA000CDDE0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 85254CA32100C703000CDDE0 /* PiPerExt.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = PiPerExt.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 85254CA82100C703000CDDE0 /* SafariExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariExtensionHandler.swift; sourceTree = ""; }; + 85254CAF2100C703000CDDE0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 854061A52171599100F60C11 /* LocalizationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationManager.swift; sourceTree = ""; }; + 854061A7217167EA00F60C11 /* LocalizedButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedButton.swift; sourceTree = ""; }; + 854061A92172234300F60C11 /* LocalizedTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedTextField.swift; sourceTree = ""; }; + 857DA7322116237700B38873 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; }; + 85A0EA7A21726E2A000DB27C /* scripts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = scripts; sourceTree = ""; }; + 85A0EA7B21726E2B000DB27C /* images */ = {isa = PBXFileReference; lastKnownFileType = folder; path = images; sourceTree = ""; }; + 85A0EA8521726F05000DB27C /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 85A0EA8B2172850D000DB27C /* ResourceHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceHelper.swift; sourceTree = ""; }; + 85E505A7211E22A4003B446B /* Defines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Defines.h; sourceTree = ""; }; + 85E505AA211E330F003B446B /* Defines.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = Defines.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 85254C892100C6CA000CDDE0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 85254CA02100C703000CDDE0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 85254C832100C6C9000CDDE0 = { + isa = PBXGroup; + children = ( + 85E505A9211E2D83003B446B /* Common */, + 85254C8E2100C6CA000CDDE0 /* App */, + 85254CA72100C703000CDDE0 /* Extension */, + 85254C8D2100C6CA000CDDE0 /* Products */, + 8589A341211E42FD006F9C65 /* Frameworks */, + ); + sourceTree = ""; + }; + 85254C8D2100C6CA000CDDE0 /* Products */ = { + isa = PBXGroup; + children = ( + 85254C8C2100C6CA000CDDE0 /* PiPer.app */, + 85254CA32100C703000CDDE0 /* PiPerExt.appex */, + ); + name = Products; + sourceTree = ""; + }; + 85254C8E2100C6CA000CDDE0 /* App */ = { + isa = PBXGroup; + children = ( + 85254C8F2100C6CA000CDDE0 /* AppDelegate.swift */, + 85A0EA8B2172850D000DB27C /* ResourceHelper.swift */, + 85254C912100C6CA000CDDE0 /* ViewController.swift */, + 854061A7217167EA00F60C11 /* LocalizedButton.swift */, + 854061A92172234300F60C11 /* LocalizedTextField.swift */, + 854061A52171599100F60C11 /* LocalizationManager.swift */, + 85A0EA8521726F05000DB27C /* Main.storyboard */, + 857DA7322116237700B38873 /* Icon.icns */, + 851C3AE62113D4F90052505E /* PiPer_App.entitlements */, + 85254C982100C6CA000CDDE0 /* Info.plist */, + ); + path = App; + sourceTree = ""; + }; + 85254CA72100C703000CDDE0 /* Extension */ = { + isa = PBXGroup; + children = ( + 85A0EA7321726E12000DB27C /* Resources */, + 85254CA82100C703000CDDE0 /* SafariExtensionHandler.swift */, + 851C3AE72113D4FE0052505E /* PiPer_Extension.entitlements */, + 85254CAF2100C703000CDDE0 /* Info.plist */, + ); + path = Extension; + sourceTree = ""; + }; + 8589A341211E42FD006F9C65 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 85A0EA7321726E12000DB27C /* Resources */ = { + isa = PBXGroup; + children = ( + 85A0EA7A21726E2A000DB27C /* scripts */, + 85A0EA7B21726E2B000DB27C /* images */, + ); + path = Resources; + sourceTree = ""; + }; + 85E505A9211E2D83003B446B /* Common */ = { + isa = PBXGroup; + children = ( + 85E505A7211E22A4003B446B /* Defines.h */, + 85E505AA211E330F003B446B /* Defines.c */, + ); + path = Common; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 85254C8B2100C6CA000CDDE0 /* PiPer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 85254C9C2100C6CA000CDDE0 /* Build configuration list for PBXNativeTarget "PiPer" */; + buildPhases = ( + 85254C882100C6CA000CDDE0 /* Sources */, + 85254C892100C6CA000CDDE0 /* Frameworks */, + 85254C8A2100C6CA000CDDE0 /* Resources */, + 85254CBB2100C703000CDDE0 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 85254CB62100C703000CDDE0 /* PBXTargetDependency */, + ); + name = PiPer; + productName = PiPer; + productReference = 85254C8C2100C6CA000CDDE0 /* PiPer.app */; + productType = "com.apple.product-type.application"; + }; + 85254CA22100C703000CDDE0 /* PiPerExt */ = { + isa = PBXNativeTarget; + buildConfigurationList = 85254CB82100C703000CDDE0 /* Build configuration list for PBXNativeTarget "PiPerExt" */; + buildPhases = ( + 85254C9F2100C703000CDDE0 /* Sources */, + 85254CA02100C703000CDDE0 /* Frameworks */, + 85254CA12100C703000CDDE0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PiPerExt; + productName = PiPer; + productReference = 85254CA32100C703000CDDE0 /* PiPerExt.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 85254C842100C6C9000CDDE0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1000; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Adam Marcus"; + TargetAttributes = { + 85254C8B2100C6CA000CDDE0 = { + CreatedOnToolsVersion = 10.0; + LastSwiftMigration = 1000; + SystemCapabilities = { + com.apple.ApplicationGroups.Mac = { + enabled = 1; + }; + com.apple.NetworkExtensions = { + enabled = 0; + }; + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 85254CA22100C703000CDDE0 = { + CreatedOnToolsVersion = 10.0; + SystemCapabilities = { + com.apple.ApplicationGroups.Mac = { + enabled = 1; + }; + com.apple.NetworkExtensions = { + enabled = 0; + }; + }; + }; + }; + }; + buildConfigurationList = 85254C872100C6C9000CDDE0 /* Build configuration list for PBXProject "PiPer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 85254C832100C6C9000CDDE0; + productRefGroup = 85254C8D2100C6CA000CDDE0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 85254C8B2100C6CA000CDDE0 /* PiPer */, + 85254CA22100C703000CDDE0 /* PiPerExt */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 85254C8A2100C6CA000CDDE0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 857DA7332116237700B38873 /* Icon.icns in Resources */, + 85A0EA8621726F05000DB27C /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 85254CA12100C703000CDDE0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 85A0EA8021726E30000DB27C /* scripts in Resources */, + 85A0EA8121726E30000DB27C /* images in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 85254C882100C6CA000CDDE0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 854061A8217167EA00F60C11 /* LocalizedButton.swift in Sources */, + 85E505AB211E330F003B446B /* Defines.c in Sources */, + 85254C922100C6CA000CDDE0 /* ViewController.swift in Sources */, + 85254C902100C6CA000CDDE0 /* AppDelegate.swift in Sources */, + 85A0EA8C2172850D000DB27C /* ResourceHelper.swift in Sources */, + 854061A62171599100F60C11 /* LocalizationManager.swift in Sources */, + 854061AA2172234300F60C11 /* LocalizedTextField.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 85254C9F2100C703000CDDE0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 85254CA92100C703000CDDE0 /* SafariExtensionHandler.swift in Sources */, + 85E505AC211E3339003B446B /* Defines.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 85254CB62100C703000CDDE0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 85254CA22100C703000CDDE0 /* PiPerExt */; + targetProxy = 85254CB52100C703000CDDE0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 85254C9A2100C6CA000CDDE0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APP_BUNDLE_ID = com.amarcus.PiPer; + APP_GROUP_ID = "$(TeamIdentifierPrefix)group.amarcus.piper"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + EXTENSION_BUNDLE_ID = com.amarcus.PiPer.PiPerExt; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "APP_GROUP_ID_CONST=\"$(APP_GROUP_ID)\"", + "APP_BUNDLE_ID_CONST=\"$(APP_BUNDLE_ID)\"", + "EXTENSION_BUNDLE_ID_CONST=\"$(EXTENSION_BUNDLE_ID)\"", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OBJC_BRIDGING_HEADER = Common/Defines.h; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 85254C9B2100C6CA000CDDE0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APP_BUNDLE_ID = com.amarcus.PiPer; + APP_GROUP_ID = "$(TeamIdentifierPrefix)group.amarcus.piper"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXTENSION_BUNDLE_ID = com.amarcus.PiPer.PiPerExt; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "APP_GROUP_ID_CONST=\"$(APP_GROUP_ID)\"", + "APP_BUNDLE_ID_CONST=\"$(APP_BUNDLE_ID)\"", + "EXTENSION_BUNDLE_ID_CONST=\"$(EXTENSION_BUNDLE_ID)\"", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = Common/Defines.h; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 85254C9D2100C6CA000CDDE0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = App/PiPer_App.entitlements; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = App/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_ID)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 85254C9E2100C6CA000CDDE0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = App/PiPer_App.entitlements; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = App/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_ID)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; + 85254CB92100C703000CDDE0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = Extension/PiPer_Extension.entitlements; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Extension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "$(EXTENSION_BUNDLE_ID)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 85254CBA2100C703000CDDE0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = Extension/PiPer_Extension.entitlements; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Extension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "$(EXTENSION_BUNDLE_ID)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 85254C872100C6C9000CDDE0 /* Build configuration list for PBXProject "PiPer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 85254C9A2100C6CA000CDDE0 /* Debug */, + 85254C9B2100C6CA000CDDE0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 85254C9C2100C6CA000CDDE0 /* Build configuration list for PBXNativeTarget "PiPer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 85254C9D2100C6CA000CDDE0 /* Debug */, + 85254C9E2100C6CA000CDDE0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 85254CB82100C703000CDDE0 /* Build configuration list for PBXNativeTarget "PiPerExt" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 85254CB92100C703000CDDE0 /* Debug */, + 85254CBA2100C703000CDDE0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 85254C842100C6C9000CDDE0 /* Project object */; +} diff --git a/src/safari/PiPer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/src/safari/PiPer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c3094ec --- /dev/null +++ b/src/safari/PiPer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/UserInterfaceState.xcuserstate b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..50ef388 Binary files /dev/null and b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/WorkspaceSettings.xcsettings b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f25782d --- /dev/null +++ b/src/safari/PiPer.xcodeproj/project.xcworkspace/xcuserdata/amarcus.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,18 @@ + + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + EnabledFullIndexStoreVisibility + + IssueFilterStyle + ShowActiveSchemeOnly + LiveSourceIssuesEnabled + + + diff --git a/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPer.xcscheme b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPer.xcscheme new file mode 100644 index 0000000..5922de7 --- /dev/null +++ b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPer.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPerExt.xcscheme b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPerExt.xcscheme new file mode 100644 index 0000000..4d18eab --- /dev/null +++ b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/PiPerExt.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/xcschememanagement.plist b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0c7c38d --- /dev/null +++ b/src/safari/PiPer.xcodeproj/xcuserdata/amarcus.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + PiPer.xcscheme + + orderHint + 0 + + PiPerExt.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + 85254C8B2100C6CA000CDDE0 + + primary + + + 85254CA22100C703000CDDE0 + + primary + + + + + diff --git a/src/safari/exportOptions.plist b/src/safari/exportOptions.plist new file mode 100644 index 0000000..c1e8fb6 --- /dev/null +++ b/src/safari/exportOptions.plist @@ -0,0 +1,8 @@ + + + + + method + mac-application + +