Compare commits
27 commits
ck/live-on
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85640ffce1 | ||
|
|
25a0f7c421 | ||
|
|
e4b0f1660b | ||
|
|
3fbb520a10 | ||
|
|
fa1ef6fcda | ||
|
|
62a5739d86 | ||
|
|
aa634d03e2 | ||
|
|
951b4ddae2 | ||
|
|
3dedca4de3 | ||
|
|
3c70bc2a5c | ||
|
|
bca07c33b8 | ||
|
|
abf1101484 | ||
|
|
df549d48e6 | ||
|
|
ec8cc533ab | ||
|
|
a97063f9b7 | ||
|
|
cb1bc1c8aa | ||
|
|
4334f8c9c9 | ||
|
|
0fe630878d | ||
|
|
51fd638b72 | ||
|
|
c755f752a0 | ||
|
|
c4c342dc8b | ||
|
|
29d2bfae3f | ||
|
|
2088ae6ede | ||
|
|
cca5999214 | ||
|
|
ab73183b2b | ||
|
|
44ecf042a3 | ||
|
|
7cc1f3119e |
8
.github/actions/archive/action.yml
vendored
|
|
@ -26,18 +26,18 @@ runs:
|
||||||
run: |
|
run: |
|
||||||
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
||||||
|
|
||||||
xcodebuild archive \
|
xcodebuild clean archive \
|
||||||
-allowProvisioningUpdates \
|
-allowProvisioningUpdates \
|
||||||
-allowProvisioningDeviceRegistration \
|
-allowProvisioningDeviceRegistration \
|
||||||
|
-skipPackagePluginValidation \
|
||||||
|
-skipMacroValidation \
|
||||||
|
-onlyUsePackageVersionsFromResolvedFile \
|
||||||
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
||||||
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
||||||
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
||||||
-onlyUsePackageVersionsFromResolvedFile \
|
|
||||||
-scheme '${{ inputs.scheme }}' \
|
-scheme '${{ inputs.scheme }}' \
|
||||||
-destination '${{ inputs.destination }}' \
|
-destination '${{ inputs.destination }}' \
|
||||||
-archivePath '${{ inputs.archive-path }}' \
|
-archivePath '${{ inputs.archive-path }}' \
|
||||||
-resultBundlePath BuildResults.xcresult
|
-resultBundlePath BuildResults.xcresult
|
||||||
|
|
||||||
./Tools/xcresulttool-github BuildResults.xcresult
|
|
||||||
|
|
||||||
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8
|
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8
|
||||||
|
|
|
||||||
14
.github/actions/build-for-testing/action.yml
vendored
|
|
@ -18,32 +18,36 @@ inputs:
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: Cache Swift Packages
|
- name: Xcode Cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
Apple/PackageCache
|
Apple/PackageCache
|
||||||
Apple/SourcePackages
|
Apple/SourcePackages
|
||||||
|
Apple/DerivedData
|
||||||
key: ${{ runner.os }}-${{ inputs.scheme }}-${{ hashFiles('**/Package.resolved') }}
|
key: ${{ runner.os }}-${{ inputs.scheme }}-${{ hashFiles('**/Package.resolved') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
${{ runner.os }}-${{ inputs.scheme }}-${{ hashFiles('**/Package.resolved') }}
|
||||||
${{ runner.os }}-${{ inputs.scheme }}-
|
${{ runner.os }}-${{ inputs.scheme }}-
|
||||||
|
${{ runner.os }}-
|
||||||
- name: Build
|
- name: Build
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: Apple
|
working-directory: Apple
|
||||||
run: |
|
run: |
|
||||||
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
||||||
|
|
||||||
xcodebuild clean build-for-testing \
|
xcodebuild build-for-testing \
|
||||||
-allowProvisioningUpdates \
|
-allowProvisioningUpdates \
|
||||||
-allowProvisioningDeviceRegistration \
|
-allowProvisioningDeviceRegistration \
|
||||||
|
-skipPackagePluginValidation \
|
||||||
|
-skipMacroValidation \
|
||||||
|
-onlyUsePackageVersionsFromResolvedFile \
|
||||||
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
||||||
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
||||||
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
||||||
-onlyUsePackageVersionsFromResolvedFile \
|
|
||||||
-clonedSourcePackagesDirPath SourcePackages \
|
-clonedSourcePackagesDirPath SourcePackages \
|
||||||
-packageCachePath $PWD/PackageCache \
|
-packageCachePath $PWD/PackageCache \
|
||||||
-skipPackagePluginValidation \
|
-derivedDataPath $PWD/DerivedData \
|
||||||
-skipMacroValidation \
|
|
||||||
-scheme '${{ inputs.scheme }}' \
|
-scheme '${{ inputs.scheme }}' \
|
||||||
-destination '${{ inputs.destination }}' \
|
-destination '${{ inputs.destination }}' \
|
||||||
-resultBundlePath BuildResults.xcresult
|
-resultBundlePath BuildResults.xcresult
|
||||||
|
|
|
||||||
30
.github/actions/download-profiles/action.yml
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
name: Download Provisioning Profiles
|
||||||
|
inputs:
|
||||||
|
app-store-key:
|
||||||
|
description: App Store key in PEM PKCS#8 format
|
||||||
|
required: true
|
||||||
|
app-store-key-id:
|
||||||
|
description: App Store key ID
|
||||||
|
required: true
|
||||||
|
app-store-key-issuer-id:
|
||||||
|
description: App Store key issuer ID
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- shell: bash
|
||||||
|
env:
|
||||||
|
FASTLANE_OPT_OUT_USAGE: 'YES'
|
||||||
|
run: |
|
||||||
|
APP_STORE_KEY=$(echo "${{ inputs.app-store-key }}" | jq -sR .)
|
||||||
|
cat << EOF > api-key.json
|
||||||
|
{
|
||||||
|
"key_id": "${{ inputs.app-store-key-id }}",
|
||||||
|
"issuer_id": "${{ inputs.app-store-key-issuer-id }}",
|
||||||
|
"key": $APP_STORE_KEY
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fastlane sigh download_all --api_key_path api-key.json
|
||||||
|
|
||||||
|
rm -rf api-key.json
|
||||||
18
.github/actions/export/action.yml
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
name: Notarize
|
name: Export
|
||||||
inputs:
|
inputs:
|
||||||
app-store-key:
|
app-store-key:
|
||||||
description: App Store key in PEM PKCS#8 format
|
description: App Store key in PEM PKCS#8 format
|
||||||
|
|
@ -12,11 +12,8 @@ inputs:
|
||||||
archive-path:
|
archive-path:
|
||||||
description: Xcode archive path
|
description: Xcode archive path
|
||||||
required: true
|
required: true
|
||||||
destination:
|
export-options:
|
||||||
description: The Xcode export destination. This can either be "export" or "upload"
|
description: The export options in JSON format
|
||||||
required: true
|
|
||||||
method:
|
|
||||||
description: The Xcode export method. This can be one of app-store, validation, ad-hoc, package, enterprise, development, developer-id, or mac-application.
|
|
||||||
required: true
|
required: true
|
||||||
export-path:
|
export-path:
|
||||||
description: The path to export the archive to
|
description: The path to export the archive to
|
||||||
|
|
@ -24,19 +21,20 @@ inputs:
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- id: notarize
|
- shell: bash
|
||||||
shell: bash
|
|
||||||
working-directory: Apple
|
working-directory: Apple
|
||||||
run: |
|
run: |
|
||||||
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
||||||
|
|
||||||
echo '{"destination":"${{ inputs.destination }}","method":"${{ inputs.method }}"}' \
|
echo '${{ inputs.export-options }}' | plutil -convert xml1 -o ExportOptions.plist -
|
||||||
| plutil -convert xml1 -o ExportOptions.plist -
|
|
||||||
|
|
||||||
xcodebuild \
|
xcodebuild \
|
||||||
-exportArchive \
|
-exportArchive \
|
||||||
-allowProvisioningUpdates \
|
-allowProvisioningUpdates \
|
||||||
-allowProvisioningDeviceRegistration \
|
-allowProvisioningDeviceRegistration \
|
||||||
|
-skipPackagePluginValidation \
|
||||||
|
-skipMacroValidation \
|
||||||
|
-onlyUsePackageVersionsFromResolvedFile \
|
||||||
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
-authenticationKeyID ${{ inputs.app-store-key-id }} \
|
||||||
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
|
||||||
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
|
||||||
|
|
|
||||||
25
.github/actions/notarize/action.yml
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
name: Notarize
|
||||||
|
inputs:
|
||||||
|
app-store-key:
|
||||||
|
description: App Store key in PEM PKCS#8 format
|
||||||
|
required: true
|
||||||
|
app-store-key-id:
|
||||||
|
description: App Store key ID
|
||||||
|
required: true
|
||||||
|
app-store-key-issuer-id:
|
||||||
|
description: App Store key issuer ID
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- id: notarize
|
||||||
|
shell: bash
|
||||||
|
working-directory: Apple
|
||||||
|
run: |
|
||||||
|
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
|
||||||
|
|
||||||
|
ditto -c -k --keepParent Release/Burrow.app Upload.zip
|
||||||
|
xcrun notarytool submit --wait --issuer ${{ inputs.app-store-key-issuer-id }} --key-id ${{ inputs.app-store-key-id }} --key "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" Upload.zip
|
||||||
|
xcrun stapler staple Release/Burrow.app
|
||||||
|
|
||||||
|
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8 Release
|
||||||
|
|
@ -18,9 +18,6 @@ inputs:
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- shell: bash
|
|
||||||
id: vars
|
|
||||||
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
|
||||||
- shell: bash
|
- shell: bash
|
||||||
working-directory: Apple
|
working-directory: Apple
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -28,10 +25,10 @@ runs:
|
||||||
-scheme '${{ inputs.scheme }}' \
|
-scheme '${{ inputs.scheme }}' \
|
||||||
-destination '${{ inputs.destination }}' \
|
-destination '${{ inputs.destination }}' \
|
||||||
${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \
|
${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \
|
||||||
-resultBundlePath "${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult"
|
-resultBundlePath "${{ inputs.artifact-prefix }}.xcresult"
|
||||||
- uses: kishikawakatsumi/xcresulttool@v1
|
- uses: kishikawakatsumi/xcresulttool@v1
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
path: Apple/${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult
|
path: Apple/${{ inputs.artifact-prefix }}.xcresult
|
||||||
title: ${{ inputs.check-name }}
|
title: ${{ inputs.check-name }}
|
||||||
show-passed-tests: false
|
show-passed-tests: false
|
||||||
|
|
|
||||||
29
.github/workflows/build-appimage.yml
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
name: Build AppImage
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "*"
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
jobs:
|
||||||
|
appimage:
|
||||||
|
name: Build AppImage
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: docker
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Build AppImage
|
||||||
|
run: |
|
||||||
|
docker build -t appimage-builder . -f burrow-gtk/build-aux/Dockerfile
|
||||||
|
docker create --name temp appimage-builder
|
||||||
|
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
|
||||||
|
docker rm temp
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
name: Upload to GitHub
|
||||||
|
with:
|
||||||
|
name: AppImage
|
||||||
|
path: Burrow-x86_64.AppImage
|
||||||
17
.github/workflows/build-apple.yml
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
name: Apple Build
|
name: Build Apple Apps
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
|
|
@ -12,7 +12,7 @@ concurrency:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build App (${{ matrix.platform }})
|
name: Build App (${{ matrix.platform }})
|
||||||
runs-on: macos-13
|
runs-on: macos-14
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
|
@ -24,7 +24,7 @@ jobs:
|
||||||
rust-targets:
|
rust-targets:
|
||||||
- aarch64-apple-ios
|
- aarch64-apple-ios
|
||||||
- scheme: App
|
- scheme: App
|
||||||
destination: platform=iOS Simulator,OS=17.2,name=iPhone 15 Pro
|
destination: platform=iOS Simulator,OS=18.0,name=iPhone 15 Pro
|
||||||
platform: iOS Simulator
|
platform: iOS Simulator
|
||||||
sdk-name: iphonesimulator
|
sdk-name: iphonesimulator
|
||||||
rust-targets:
|
rust-targets:
|
||||||
|
|
@ -38,7 +38,8 @@ jobs:
|
||||||
- x86_64-apple-darwin
|
- x86_64-apple-darwin
|
||||||
- aarch64-apple-darwin
|
- aarch64-apple-darwin
|
||||||
env:
|
env:
|
||||||
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer
|
DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer
|
||||||
|
PROTOC_PATH: /opt/homebrew/bin/protoc
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
@ -53,8 +54,10 @@ jobs:
|
||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
toolchain: stable
|
|
||||||
targets: ${{ join(matrix.rust-targets, ', ') }}
|
targets: ${{ join(matrix.rust-targets, ', ') }}
|
||||||
|
- name: Install Protobuf
|
||||||
|
shell: bash
|
||||||
|
run: brew install protobuf
|
||||||
- name: Build
|
- name: Build
|
||||||
id: build
|
id: build
|
||||||
uses: ./.github/actions/build-for-testing
|
uses: ./.github/actions/build-for-testing
|
||||||
|
|
@ -64,7 +67,7 @@ jobs:
|
||||||
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
- name: Xcode Unit Test
|
- name: Run Unit Tests
|
||||||
if: ${{ matrix.xcode-unit-test != '' }}
|
if: ${{ matrix.xcode-unit-test != '' }}
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: ./.github/actions/test-without-building
|
uses: ./.github/actions/test-without-building
|
||||||
|
|
@ -74,7 +77,7 @@ jobs:
|
||||||
test-plan: ${{ matrix.xcode-unit-test }}
|
test-plan: ${{ matrix.xcode-unit-test }}
|
||||||
artifact-prefix: unit-tests-${{ matrix.sdk-name }}
|
artifact-prefix: unit-tests-${{ matrix.sdk-name }}
|
||||||
check-name: Xcode Unit Tests (${{ matrix.platform }})
|
check-name: Xcode Unit Tests (${{ matrix.platform }})
|
||||||
- name: Xcode UI Test
|
- name: Run UI Tests
|
||||||
if: ${{ matrix.xcode-ui-test != '' }}
|
if: ${{ matrix.xcode-ui-test != '' }}
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: ./.github/actions/test-without-building
|
uses: ./.github/actions/test-without-building
|
||||||
|
|
|
||||||
4
.github/workflows/build-docker.yml
vendored
|
|
@ -6,6 +6,9 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- "*"
|
- "*"
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build Docker Image
|
name: Build Docker Image
|
||||||
|
|
@ -33,6 +36,7 @@ jobs:
|
||||||
images: ghcr.io/${{ github.repository }}
|
images: ghcr.io/${{ github.repository }}
|
||||||
tags: |
|
tags: |
|
||||||
type=sha
|
type=sha
|
||||||
|
type=match,pattern=builds/(.*),group=1
|
||||||
type=raw,value=latest,enable={{is_default_branch}}
|
type=raw,value=latest,enable={{is_default_branch}}
|
||||||
- name: Build and Push
|
- name: Build and Push
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v4
|
||||||
|
|
|
||||||
5
.github/workflows/build-flatpak.yml
vendored
|
|
@ -1,7 +1,4 @@
|
||||||
on:
|
on: workflow_dispatch
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
pull_request:
|
|
||||||
name: Build Flatpak
|
name: Build Flatpak
|
||||||
jobs:
|
jobs:
|
||||||
flatpak:
|
flatpak:
|
||||||
|
|
|
||||||
10
.github/workflows/build-rpm.yml
vendored
|
|
@ -1,16 +1,11 @@
|
||||||
|
on: workflow_dispatch
|
||||||
name: Build RPM
|
name: Build RPM
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "main" ]
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- "*"
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build RPM
|
name: Build RPM
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@v2
|
||||||
- name: Install RPM
|
- name: Install RPM
|
||||||
run: cargo install cargo-generate-rpm
|
run: cargo install cargo-generate-rpm
|
||||||
|
|
@ -20,4 +15,3 @@ jobs:
|
||||||
strip -s target/release/burrow
|
strip -s target/release/burrow
|
||||||
- name: Build RPM
|
- name: Build RPM
|
||||||
run: cargo generate-rpm -p burrow
|
run: cargo generate-rpm -p burrow
|
||||||
|
|
||||||
|
|
|
||||||
23
.github/workflows/build-rust.yml
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
name: Rust Build
|
name: Build Rust Crate
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
|
|
@ -21,15 +21,21 @@ jobs:
|
||||||
- x86_64-unknown-linux-gnu
|
- x86_64-unknown-linux-gnu
|
||||||
targets:
|
targets:
|
||||||
- aarch64-unknown-linux-gnu
|
- aarch64-unknown-linux-gnu
|
||||||
- os: macos-12
|
- os: macos-13
|
||||||
platform: macOS
|
platform: macOS (Intel)
|
||||||
|
xcode: /Applications/Xcode_15.2.app
|
||||||
test-targets:
|
test-targets:
|
||||||
- x86_64-apple-darwin
|
- x86_64-apple-darwin
|
||||||
targets:
|
targets:
|
||||||
|
- x86_64-apple-ios
|
||||||
|
- os: macos-14
|
||||||
|
platform: macOS
|
||||||
|
xcode: /Applications/Xcode_16.0.app
|
||||||
|
test-targets:
|
||||||
- aarch64-apple-darwin
|
- aarch64-apple-darwin
|
||||||
|
targets:
|
||||||
- aarch64-apple-ios
|
- aarch64-apple-ios
|
||||||
- aarch64-apple-ios-sim
|
- aarch64-apple-ios-sim
|
||||||
- x86_64-apple-ios
|
|
||||||
- os: windows-2022
|
- os: windows-2022
|
||||||
platform: Windows
|
platform: Windows
|
||||||
test-targets:
|
test-targets:
|
||||||
|
|
@ -38,10 +44,11 @@ jobs:
|
||||||
- aarch64-pc-windows-msvc
|
- aarch64-pc-windows-msvc
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer
|
DEVELOPER_DIR: ${{ matrix.xcode }}/Contents/Developer
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
||||||
RUST_BACKTRACE: short
|
RUST_BACKTRACE: short
|
||||||
|
PROTOC_VERSION: 3.25.1
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
@ -54,10 +61,14 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y ${{ join(matrix.packages, ' ') }}
|
sudo apt-get install -y ${{ join(matrix.packages, ' ') }}
|
||||||
- name: Install Windows Deps
|
- name: Configure LLVM
|
||||||
if: matrix.os == 'windows-2022'
|
if: matrix.os == 'windows-2022'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: echo "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\Llvm\x64\bin" >> $GITHUB_PATH
|
run: echo "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\Llvm\x64\bin" >> $GITHUB_PATH
|
||||||
|
- name: Install protoc
|
||||||
|
uses: taiki-e/install-action@v2
|
||||||
|
with:
|
||||||
|
tool: protoc@${{ env.PROTOC_VERSION }}
|
||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
7
.github/workflows/lint-git.yml
vendored
|
|
@ -8,13 +8,14 @@ jobs:
|
||||||
name: Git Lint
|
name: Git Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Install Gitlint
|
- name: Install
|
||||||
shell: bash
|
shell: bash
|
||||||
run: python -m pip install gitlint
|
run: python -m pip install gitlint
|
||||||
- name: Run Gitlint
|
- name: Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD"
|
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD"
|
||||||
|
|
|
||||||
9
.github/workflows/lint-swift.yml
vendored
|
|
@ -1,8 +1,5 @@
|
||||||
name: Swift Lint
|
name: Swift Lint
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- "*"
|
- "*"
|
||||||
|
|
@ -14,8 +11,6 @@ jobs:
|
||||||
image: ghcr.io/realm/swiftlint:latest
|
image: ghcr.io/realm/swiftlint:latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
ssh-key: ${{ secrets.DEPLOY_KEY }}
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: swiftlint lint --reporter github-actions-logging
|
run: swiftlint lint --strict --reporter github-actions-logging
|
||||||
|
|
|
||||||
112
.github/workflows/release-apple.yml
vendored
|
|
@ -1,65 +1,119 @@
|
||||||
name: Build Apple Release
|
name: Release (Apple)
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types:
|
types:
|
||||||
- created
|
- created
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build ${{ matrix.configuration['platform'] }} Release
|
name: Build ${{ matrix.platform }} Release
|
||||||
runs-on: macos-13
|
runs-on: macos-14
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
configuration:
|
include:
|
||||||
- scheme: App (iOS)
|
- platform: iOS
|
||||||
destination: generic/platform=iOS
|
rust-targets:
|
||||||
platform: iOS
|
- aarch64-apple-ios
|
||||||
method: ad-hoc
|
- platform: macOS
|
||||||
artifact-file: Apple/Release/Burrow.ipa
|
rust-targets:
|
||||||
- scheme: App (macOS)
|
- x86_64-apple-darwin
|
||||||
destination: generic/platform=macOS
|
- aarch64-apple-darwin
|
||||||
platform: macOS
|
|
||||||
method: mac-application
|
|
||||||
artifact-file: Burrow.app.txz
|
|
||||||
env:
|
env:
|
||||||
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer
|
DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer
|
||||||
|
PROTOC_PATH: /opt/homebrew/bin/protoc
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ssh-key: ${{ secrets.DEPLOY_KEY }}
|
fetch-depth: 0
|
||||||
submodules: recursive
|
|
||||||
- name: Import Certificate
|
- name: Import Certificate
|
||||||
uses: ./.github/actions/import-cert
|
uses: ./.github/actions/import-cert
|
||||||
with:
|
with:
|
||||||
certificate: ${{ secrets.DEVELOPER_CERT }}
|
certificate: ${{ secrets.DEVELOPER_CERT }}
|
||||||
password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
|
password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
|
||||||
|
- name: Download Provisioning Profiles
|
||||||
|
uses: ./.github/actions/download-profiles
|
||||||
|
with:
|
||||||
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
|
- name: Install Provisioning Profiles
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles/
|
||||||
|
cp -f Apple/Profiles/* ~/Library/MobileDevice/Provisioning\ Profiles/
|
||||||
|
- name: Install Rust
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: ${{ join(matrix.rust-targets, ', ') }}
|
||||||
|
- name: Install Protobuf
|
||||||
|
shell: bash
|
||||||
|
run: brew install protobuf
|
||||||
|
- name: Configure Version
|
||||||
|
id: version
|
||||||
|
shell: bash
|
||||||
|
run: echo "BUILD_NUMBER=$(Tools/version.sh)" >> $GITHUB_OUTPUT
|
||||||
- name: Archive
|
- name: Archive
|
||||||
uses: ./.github/actions/archive
|
uses: ./.github/actions/archive
|
||||||
with:
|
with:
|
||||||
scheme: ${{ matrix.configuration['scheme'] }}
|
scheme: App
|
||||||
destination: ${{ matrix.configuration['destination'] }}
|
destination: generic/platform=${{ matrix.platform }}
|
||||||
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
archive-path: Burrow.xcarchive
|
archive-path: Burrow.xcarchive
|
||||||
- name: Export Locally
|
- name: Export
|
||||||
uses: ./.github/actions/export
|
uses: ./.github/actions/export
|
||||||
with:
|
with:
|
||||||
method: ${{ matrix.configuration['method'] }}
|
method: ${{ matrix.platform == 'macOS' && 'developer-id' || 'ad-hoc' }}
|
||||||
destination: export
|
destination: export
|
||||||
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
archive-path: Burrow.xcarchive
|
archive-path: Burrow.xcarchive
|
||||||
|
export-options: |
|
||||||
|
{"teamID":"P6PV2R9443","destination":"export","method":"developer-id","provisioningProfiles":{"com.hackclub.burrow":"Burrow Developer ID","com.hackclub.burrow.network":"Burrow Network Developer ID"},"signingCertificate":"Developer ID Application","signingStyle":"manual"}
|
||||||
export-path: Release
|
export-path: Release
|
||||||
- name: Compress
|
- name: Notarize
|
||||||
if: ${{ matrix.configuration['platform'] == 'macOS' }}
|
if: ${{ matrix.platform == 'macOS' }}
|
||||||
|
uses: ./.github/actions/notarize
|
||||||
|
with:
|
||||||
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
|
- name: Compress (iOS)
|
||||||
|
if: ${{ matrix.platform == 'iOS' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: tar --options xz:compression-level=9 -C Apple/Release -cJf Burrow.app.txz ./
|
run: |
|
||||||
- name: Attach Artifact
|
cp Apple/Release/Burrow.ipa Burrow.ipa
|
||||||
uses: SierraSoftworks/gh-releases@v1.0.6
|
aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
|
||||||
|
rm -rf Apple/Release
|
||||||
|
- name: Compress (macOS)
|
||||||
|
if: ${{ matrix.platform == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
aa archive -a lzma -b 8m -d Apple/Release -subdir Burrow.app -o Burrow.app.aar
|
||||||
|
aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
|
||||||
|
rm -rf Apple/Release
|
||||||
|
- name: Upload to GitHub
|
||||||
|
uses: SierraSoftworks/gh-releases@v1.0.7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
overwrite: 'false'
|
release_tag: ${{ github.ref_name }}
|
||||||
files: ${{ matrix.configuration['artifact-file'] }}
|
overwrite: 'true'
|
||||||
|
files: |
|
||||||
|
${{ matrix.platform == 'macOS' && 'Burrow.aap.aar' || 'Burrow.ipa' }}
|
||||||
|
Burrow-${{ matrix.platform }}.xcarchive.aar
|
||||||
|
- name: Upload to App Store Connect
|
||||||
|
if: ${{ matrix.platform == 'iOS' }}
|
||||||
|
uses: ./.github/actions/export
|
||||||
|
with:
|
||||||
|
app-store-key: ${{ secrets.APPSTORE_KEY }}
|
||||||
|
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
|
||||||
|
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
|
||||||
|
archive-path: Burrow.xcarchive
|
||||||
|
export-options: |
|
||||||
|
{"method": "app-store", "destination": "upload"}
|
||||||
|
export-path: Release
|
||||||
|
|
|
||||||
23
.github/workflows/release-if-needed.yaml
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
name: Create Release If Needed
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 10 * * *'
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}
|
||||||
|
jobs:
|
||||||
|
create:
|
||||||
|
name: Create Release If Needed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ $(Tools/version.sh status) == "dirty" ]]; then
|
||||||
|
gh workflow run release-now.yml
|
||||||
|
fi
|
||||||
29
.github/workflows/release-linux.yml
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
name: Release (Linux)
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
jobs:
|
||||||
|
appimage:
|
||||||
|
name: Build AppImage
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: docker
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build AppImage
|
||||||
|
run: |
|
||||||
|
docker build -t appimage-builder . -f burrow-gtk/build-aux/Dockerfile
|
||||||
|
docker create --name temp appimage-builder
|
||||||
|
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
|
||||||
|
docker rm temp
|
||||||
|
- name: Attach Artifacts
|
||||||
|
uses: SierraSoftworks/gh-releases@v1.0.7
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
release_tag: ${{ github.ref_name }}
|
||||||
|
overwrite: "true"
|
||||||
|
files: |
|
||||||
|
Burrow-x86_64.AppImage
|
||||||
17
.github/workflows/release-now.yml
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
name: Create Release
|
||||||
|
on: workflow_dispatch
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}
|
||||||
|
jobs:
|
||||||
|
create:
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
|
||||||
|
name: Create Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- shell: bash
|
||||||
|
run: Tools/version.sh increment
|
||||||
9
.gitignore
vendored
|
|
@ -1,8 +1,17 @@
|
||||||
# Xcode
|
# Xcode
|
||||||
xcuserdata
|
xcuserdata
|
||||||
|
|
||||||
|
# Swift
|
||||||
|
Apple/Package/.swiftpm/
|
||||||
|
|
||||||
# Rust
|
# Rust
|
||||||
target/
|
target/
|
||||||
|
.env
|
||||||
|
|
||||||
.DS_STORE
|
.DS_STORE
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
tmp/
|
||||||
|
|
||||||
|
*.db
|
||||||
|
*.sock
|
||||||
|
|
@ -30,7 +30,6 @@ opt_in_rules:
|
||||||
- function_default_parameter_at_end
|
- function_default_parameter_at_end
|
||||||
- ibinspectable_in_extension
|
- ibinspectable_in_extension
|
||||||
- identical_operands
|
- identical_operands
|
||||||
- implicitly_unwrapped_optional
|
|
||||||
- indentation_width
|
- indentation_width
|
||||||
- joined_default_parameter
|
- joined_default_parameter
|
||||||
- last_where
|
- last_where
|
||||||
|
|
@ -46,7 +45,6 @@ opt_in_rules:
|
||||||
- multiline_parameters
|
- multiline_parameters
|
||||||
- multiline_parameters_brackets
|
- multiline_parameters_brackets
|
||||||
- no_extension_access_modifier
|
- no_extension_access_modifier
|
||||||
- no_grouping_extension
|
|
||||||
- nslocalizedstring_key
|
- nslocalizedstring_key
|
||||||
- nslocalizedstring_require_bundle
|
- nslocalizedstring_require_bundle
|
||||||
- number_separator
|
- number_separator
|
||||||
|
|
@ -76,9 +74,7 @@ opt_in_rules:
|
||||||
- sorted_first_last
|
- sorted_first_last
|
||||||
- sorted_imports
|
- sorted_imports
|
||||||
- static_operator
|
- static_operator
|
||||||
- strict_fileprivate
|
|
||||||
- strong_iboutlet
|
- strong_iboutlet
|
||||||
- switch_case_on_newline
|
|
||||||
- test_case_accessibility
|
- test_case_accessibility
|
||||||
- toggle_bool
|
- toggle_bool
|
||||||
- trailing_closure
|
- trailing_closure
|
||||||
|
|
@ -97,3 +93,5 @@ disabled_rules:
|
||||||
- force_try
|
- force_try
|
||||||
- nesting
|
- nesting
|
||||||
- todo
|
- todo
|
||||||
|
- trailing_comma
|
||||||
|
- switch_case_on_newline
|
||||||
|
|
|
||||||
17
.vscode/settings.json
vendored
|
|
@ -8,10 +8,19 @@
|
||||||
"editor.acceptSuggestionOnEnter": "on",
|
"editor.acceptSuggestionOnEnter": "on",
|
||||||
"rust-analyzer.restartServerOnConfigChange": true,
|
"rust-analyzer.restartServerOnConfigChange": true,
|
||||||
"rust-analyzer.cargo.features": "all",
|
"rust-analyzer.cargo.features": "all",
|
||||||
"rust-analyzer.rustfmt.extraArgs": [
|
"rust-analyzer.rustfmt.extraArgs": ["+nightly"],
|
||||||
"+nightly"
|
|
||||||
],
|
|
||||||
"[rust]": {
|
"[rust]": {
|
||||||
"editor.defaultFormatter": "rust-lang.rust-analyzer",
|
"editor.defaultFormatter": "rust-lang.rust-analyzer"
|
||||||
|
},
|
||||||
|
"rust-analyzer.inlayHints.typeHints.enable": false,
|
||||||
|
"rust-analyzer.linkedProjects": [
|
||||||
|
"./burrow/Cargo.toml"
|
||||||
|
],
|
||||||
|
"[yaml]": {
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.autoIndent": "advanced",
|
||||||
|
"diffEditor.ignoreTrimWhitespace": false,
|
||||||
|
"editor.formatOnSave": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,11 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array>
|
||||||
|
<string>applinks:burrow.rs?mode=developer</string>
|
||||||
|
<string>webcredentials:burrow.rs?mode=developer</string>
|
||||||
|
</array>
|
||||||
<key>com.apple.developer.networking.networkextension</key>
|
<key>com.apple.developer.networking.networkextension</key>
|
||||||
<array>
|
<array>
|
||||||
<string>packet-tunnel-provider</string>
|
<string>packet-tunnel-provider</string>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,11 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array>
|
||||||
|
<string>applinks:burrow.rs?mode=developer</string>
|
||||||
|
<string>webcredentials:burrow.rs?mode=developer</string>
|
||||||
|
</array>
|
||||||
<key>com.apple.developer.networking.networkextension</key>
|
<key>com.apple.developer.networking.networkextension</key>
|
||||||
<array>
|
<array>
|
||||||
<string>packet-tunnel-provider</string>
|
<string>packet-tunnel-provider</string>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,12 @@ INFOPLIST_KEY_UIStatusBarStyle[sdk=iphone*] = UIStatusBarStyleDefault
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
|
||||||
TARGETED_DEVICE_FAMILY[sdk=iphone*] = 1,2
|
TARGETED_DEVICE_FAMILY[sdk=iphone*] = 1,2
|
||||||
|
EXCLUDED_SOURCE_FILE_NAMES = MainMenu.xib
|
||||||
|
|
||||||
|
EXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*] =
|
||||||
|
INFOPLIST_KEY_LSUIElement[sdk=macosx*] = YES
|
||||||
|
INFOPLIST_KEY_NSMainNibFile[sdk=macosx*] = MainMenu
|
||||||
|
INFOPLIST_KEY_NSPrincipalClass[sdk=macosx*] = NSApplication
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType[sdk=macosx*] = public.app-category.utilities
|
INFOPLIST_KEY_LSApplicationCategoryType[sdk=macosx*] = public.app-category.utilities
|
||||||
|
|
||||||
CODE_SIGN_ENTITLEMENTS = App/App-iOS.entitlements
|
CODE_SIGN_ENTITLEMENTS = App/App-iOS.entitlements
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
import AppKit
|
import AppKit
|
||||||
|
import BurrowUI
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
@main
|
||||||
@MainActor
|
@MainActor
|
||||||
class AppDelegate: NSObject, NSApplicationDelegate {
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
private let quitItem: NSMenuItem = {
|
private let quitItem: NSMenuItem = {
|
||||||
|
|
@ -16,7 +18,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private let toggleItem: NSMenuItem = {
|
private let toggleItem: NSMenuItem = {
|
||||||
let toggleView = NSHostingView(rootView: MenuItemToggleView(tunnel: BurrowApp.tunnel))
|
let toggleView = NSHostingView(rootView: MenuItemToggleView())
|
||||||
toggleView.frame.size = CGSize(width: 300, height: 32)
|
toggleView.frame.size = CGSize(width: 300, height: 32)
|
||||||
toggleView.autoresizingMask = [.width]
|
toggleView.autoresizingMask = [.width]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"platform" : "ios",
|
|
||||||
"size" : "1024x1024"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "16x16"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "16x16"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "32x32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "32x32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "128x128"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "128x128"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "256x256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "256x256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "512x512"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "512x512"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +1,14 @@
|
||||||
|
#if !os(macOS)
|
||||||
|
import BurrowUI
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
@main
|
|
||||||
@MainActor
|
@MainActor
|
||||||
|
@main
|
||||||
struct BurrowApp: App {
|
struct BurrowApp: App {
|
||||||
static let tunnel = Tunnel { manager, proto in
|
|
||||||
proto.serverAddress = "hackclub.com"
|
|
||||||
manager.localizedDescription = "Burrow"
|
|
||||||
}
|
|
||||||
|
|
||||||
#if os(macOS)
|
|
||||||
@NSApplicationDelegateAdaptor(AppDelegate.self)
|
|
||||||
var delegate
|
|
||||||
#endif
|
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
TunnelView(tunnel: Self.tunnel)
|
BurrowView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
||||||
679
Apple/App/MainMenu.xib
Normal file
|
|
@ -0,0 +1,679 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23091" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23091"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="BurrowApp" customModuleProvider="target"/>
|
||||||
|
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||||
|
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Burrow" id="1Xt-HY-uBw">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Burrow" systemMenu="apple" id="uQy-DD-JDr">
|
||||||
|
<items>
|
||||||
|
<menuItem title="About Burrow" id="5kV-Vb-QxS">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
||||||
|
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
|
||||||
|
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
||||||
|
<menuItem title="Services" id="NMo-om-nkz">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
|
||||||
|
<menuItem title="Hide Burrow" keyEquivalent="h" id="Olw-nP-bQN">
|
||||||
|
<connections>
|
||||||
|
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Show All" id="Kd2-mp-pUS">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
|
||||||
|
<menuItem title="Quit Burrow" keyEquivalent="q" id="4sb-4s-VLi">
|
||||||
|
<connections>
|
||||||
|
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="File" id="dMs-cI-mzQ">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="File" id="bib-Uj-vzu">
|
||||||
|
<items>
|
||||||
|
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
|
||||||
|
<connections>
|
||||||
|
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
|
||||||
|
<connections>
|
||||||
|
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Open Recent" id="tXI-mr-wws">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Clear Menu" id="vNY-rz-j42">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
|
||||||
|
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
|
||||||
|
<connections>
|
||||||
|
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
|
||||||
|
<connections>
|
||||||
|
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
|
||||||
|
<connections>
|
||||||
|
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
|
||||||
|
<connections>
|
||||||
|
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
|
||||||
|
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
|
||||||
|
<connections>
|
||||||
|
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Edit" id="5QF-Oa-p0T">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
|
||||||
|
<connections>
|
||||||
|
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
|
||||||
|
<connections>
|
||||||
|
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
|
||||||
|
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
|
||||||
|
<connections>
|
||||||
|
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
|
||||||
|
<connections>
|
||||||
|
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
|
||||||
|
<connections>
|
||||||
|
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Delete" id="pa3-QI-u2k">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
|
||||||
|
<connections>
|
||||||
|
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
|
||||||
|
<menuItem title="Find" id="4EN-yA-p0u">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Find" id="1b7-l0-nxx">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
|
||||||
|
<connections>
|
||||||
|
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
|
||||||
|
<connections>
|
||||||
|
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
|
||||||
|
<connections>
|
||||||
|
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
|
||||||
|
<connections>
|
||||||
|
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
|
||||||
|
<connections>
|
||||||
|
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
|
||||||
|
<connections>
|
||||||
|
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
|
||||||
|
<connections>
|
||||||
|
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
|
||||||
|
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Substitutions" id="9ic-FL-obx">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
|
||||||
|
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Smart Links" id="cwL-P1-jid">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Data Detectors" id="tRr-pd-1PS">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Transformations" id="2oI-Rn-ZJC">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Speech" id="xrE-MZ-jX0">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Format" id="jxT-CU-nIS">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Font" id="Gi5-1S-RQB">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
|
||||||
|
<connections>
|
||||||
|
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
|
||||||
|
<connections>
|
||||||
|
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
|
||||||
|
<connections>
|
||||||
|
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
|
||||||
|
<connections>
|
||||||
|
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
|
||||||
|
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
|
||||||
|
<connections>
|
||||||
|
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
|
||||||
|
<connections>
|
||||||
|
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
|
||||||
|
<menuItem title="Kern" id="jBQ-r6-VK2">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Use Default" id="GUa-eO-cwY">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Use None" id="cDB-IK-hbR">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Tighten" id="46P-cB-AYj">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Loosen" id="ogc-rX-tC1">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Ligatures" id="o6e-r0-MWq">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Use Default" id="agt-UL-0e3">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Use None" id="J7y-lM-qPV">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Use All" id="xQD-1f-W4t">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Baseline" id="OaQ-X3-Vso">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Use Default" id="3Om-Ey-2VK">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Superscript" id="Rqc-34-cIF">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Subscript" id="I0S-gh-46l">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Raise" id="2h7-ER-AoG">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Lower" id="1tx-W0-xDw">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
|
||||||
|
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
|
||||||
|
<connections>
|
||||||
|
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
|
||||||
|
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Text" id="Fal-I4-PZk">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Text" id="d9c-me-L2H">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
|
||||||
|
<connections>
|
||||||
|
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
|
||||||
|
<connections>
|
||||||
|
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Justify" id="J5U-5w-g23">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
|
||||||
|
<connections>
|
||||||
|
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
|
||||||
|
<menuItem title="Writing Direction" id="H1b-Si-o9J">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="YGs-j5-SAR">
|
||||||
|
<string key="title"> Default</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="Lbh-J2-qVU">
|
||||||
|
<string key="title"> Left to Right</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="jFq-tB-4Kx">
|
||||||
|
<string key="title"> Right to Left</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
|
||||||
|
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="Nop-cj-93Q">
|
||||||
|
<string key="title"> Default</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="BgM-ve-c93">
|
||||||
|
<string key="title"> Left to Right</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem id="RB4-Sm-HuC">
|
||||||
|
<string key="title"> Right to Left</string>
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
|
||||||
|
<menuItem title="Show Ruler" id="vLm-3I-IUL">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="View" id="H8h-7b-M4v">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="View" id="HyV-fh-RgO">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
|
||||||
|
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleSidebar:" target="-1" id="iwa-gc-5KM"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Window" id="aUF-d1-5bR">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
|
||||||
|
<connections>
|
||||||
|
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Zoom" id="R4o-n2-Eq4">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
||||||
|
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Help" id="wpr-3q-Mcd">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Burrow Help" keyEquivalent="?" id="FKE-Sm-Kum">
|
||||||
|
<connections>
|
||||||
|
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
<point key="canvasLocation" x="200" y="121"/>
|
||||||
|
</menu>
|
||||||
|
</objects>
|
||||||
|
</document>
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
//
|
|
||||||
// MenuView.swift
|
|
||||||
// App
|
|
||||||
//
|
|
||||||
// Created by Thomas Stubblefield on 5/13/23.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct MenuItemToggleView: View {
|
|
||||||
var tunnel: Tunnel
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
HStack {
|
|
||||||
Text("Burrow")
|
|
||||||
.font(.headline)
|
|
||||||
Spacer()
|
|
||||||
Toggle("Burrow", isOn: tunnel.isOn)
|
|
||||||
.labelsHidden()
|
|
||||||
.disabled(tunnel.isDisabled)
|
|
||||||
.toggleStyle(.switch)
|
|
||||||
}
|
|
||||||
.padding(.horizontal, 4)
|
|
||||||
.padding(10)
|
|
||||||
.frame(minWidth: 300, minHeight: 32, maxHeight: 32)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Tunnel {
|
|
||||||
var isDisabled: Bool {
|
|
||||||
switch self.status {
|
|
||||||
case .disconnected, .permissionRequired, .connected:
|
|
||||||
return false
|
|
||||||
case .unknown, .disabled, .connecting, .reasserting, .disconnecting, .invalid, .configurationReadWriteFailed:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var isOn: Binding<Bool> {
|
|
||||||
Binding {
|
|
||||||
switch self.status {
|
|
||||||
case .unknown, .disabled, .disconnecting, .disconnected, .invalid, .permissionRequired, .configurationReadWriteFailed:
|
|
||||||
return false
|
|
||||||
case .connecting, .reasserting, .connected:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
} set: { newValue in
|
|
||||||
switch (self.status, newValue) {
|
|
||||||
case (.permissionRequired, true):
|
|
||||||
Task { try await self.configure() }
|
|
||||||
case (.disconnected, true):
|
|
||||||
try? self.start()
|
|
||||||
case (.connected, false):
|
|
||||||
self.stop()
|
|
||||||
default:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
import Foundation
|
|
||||||
import NetworkExtension
|
|
||||||
|
|
||||||
extension Tunnel {
|
|
||||||
enum Status: CustomStringConvertible, Equatable, Hashable {
|
|
||||||
case unknown
|
|
||||||
case permissionRequired
|
|
||||||
case disabled
|
|
||||||
case connecting
|
|
||||||
case connected(Date)
|
|
||||||
case disconnecting
|
|
||||||
case disconnected
|
|
||||||
case reasserting
|
|
||||||
case invalid
|
|
||||||
case configurationReadWriteFailed
|
|
||||||
|
|
||||||
var description: String {
|
|
||||||
switch self {
|
|
||||||
case .unknown:
|
|
||||||
return "Unknown"
|
|
||||||
case .permissionRequired:
|
|
||||||
return "Permission Required"
|
|
||||||
case .disconnected:
|
|
||||||
return "Disconnected"
|
|
||||||
case .disabled:
|
|
||||||
return "Disabled"
|
|
||||||
case .connecting:
|
|
||||||
return "Connecting"
|
|
||||||
case .connected:
|
|
||||||
return "Connected"
|
|
||||||
case .disconnecting:
|
|
||||||
return "Disconnecting"
|
|
||||||
case .reasserting:
|
|
||||||
return "Reasserting"
|
|
||||||
case .invalid:
|
|
||||||
return "Invalid"
|
|
||||||
case .configurationReadWriteFailed:
|
|
||||||
return "System Error"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
import Combine
|
|
||||||
import NetworkExtension
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
@Observable class Tunnel {
|
|
||||||
private(set) var status: Status = .unknown
|
|
||||||
private var error: NEVPNError?
|
|
||||||
|
|
||||||
private let bundleIdentifier: String
|
|
||||||
private let configure: (NETunnelProviderManager, NETunnelProviderProtocol) -> Void
|
|
||||||
private var tasks: [Task<Void, Error>] = []
|
|
||||||
|
|
||||||
// Each manager corresponds to one entry in the Settings app.
|
|
||||||
// Our goal is to maintain a single manager, so we create one if none exist and delete extra if there are any.
|
|
||||||
private var managers: [NEVPNManager]? {
|
|
||||||
didSet { status = currentStatus }
|
|
||||||
}
|
|
||||||
|
|
||||||
private var currentStatus: Status {
|
|
||||||
guard let managers = managers else {
|
|
||||||
guard let error = error else {
|
|
||||||
return .unknown
|
|
||||||
}
|
|
||||||
|
|
||||||
switch error.code {
|
|
||||||
case .configurationReadWriteFailed:
|
|
||||||
return .configurationReadWriteFailed
|
|
||||||
default:
|
|
||||||
return .unknown
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let manager = managers.first else {
|
|
||||||
return .permissionRequired
|
|
||||||
}
|
|
||||||
|
|
||||||
guard manager.isEnabled else {
|
|
||||||
return .disabled
|
|
||||||
}
|
|
||||||
|
|
||||||
return manager.connection.tunnelStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
convenience init(configure: @escaping (NETunnelProviderManager, NETunnelProviderProtocol) -> Void) {
|
|
||||||
self.init("com.hackclub.burrow.network", configure: configure)
|
|
||||||
}
|
|
||||||
|
|
||||||
init(_ bundleIdentifier: String, configure: @escaping (NETunnelProviderManager, NETunnelProviderProtocol) -> Void) {
|
|
||||||
self.bundleIdentifier = bundleIdentifier
|
|
||||||
self.configure = configure
|
|
||||||
|
|
||||||
listenForUpdates()
|
|
||||||
Task { await update() }
|
|
||||||
}
|
|
||||||
|
|
||||||
private func listenForUpdates() {
|
|
||||||
let center = NotificationCenter.default
|
|
||||||
let statusTask = Task {
|
|
||||||
for try await _ in center.notifications(named: .NEVPNStatusDidChange).map({ _ in () }) {
|
|
||||||
status = currentStatus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let configurationTask = Task {
|
|
||||||
for try await _ in center.notifications(named: .NEVPNConfigurationChange).map({ _ in () }) {
|
|
||||||
await update()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tasks = [statusTask, configurationTask]
|
|
||||||
}
|
|
||||||
|
|
||||||
private func update() async {
|
|
||||||
do {
|
|
||||||
let updated = try await NETunnelProviderManager.managers
|
|
||||||
await MainActor.run { managers = updated }
|
|
||||||
} catch let vpnError as NEVPNError {
|
|
||||||
error = vpnError
|
|
||||||
} catch {
|
|
||||||
print(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func configure() async throws {
|
|
||||||
if managers == nil {
|
|
||||||
await update()
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let managers = managers else { return }
|
|
||||||
|
|
||||||
if managers.count > 1 {
|
|
||||||
try await withThrowingTaskGroup(of: Void.self, returning: Void.self) { group in
|
|
||||||
for manager in managers.suffix(from: 1) {
|
|
||||||
group.addTask { try await manager.remove() }
|
|
||||||
}
|
|
||||||
try await group.waitForAll()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if managers.isEmpty {
|
|
||||||
let manager = NETunnelProviderManager()
|
|
||||||
let proto = NETunnelProviderProtocol()
|
|
||||||
proto.providerBundleIdentifier = bundleIdentifier
|
|
||||||
configure(manager, proto)
|
|
||||||
|
|
||||||
manager.protocolConfiguration = proto
|
|
||||||
try await manager.save()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func start() throws {
|
|
||||||
guard let manager = managers?.first else { return }
|
|
||||||
try manager.connection.startVPNTunnel()
|
|
||||||
}
|
|
||||||
|
|
||||||
func stop() {
|
|
||||||
guard let manager = managers?.first else { return }
|
|
||||||
manager.connection.stopVPNTunnel()
|
|
||||||
}
|
|
||||||
|
|
||||||
deinit {
|
|
||||||
for task in tasks {
|
|
||||||
task.cancel()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension NEVPNConnection {
|
|
||||||
var tunnelStatus: Tunnel.Status {
|
|
||||||
switch status {
|
|
||||||
case .connected:
|
|
||||||
return .connected(connectedDate!)
|
|
||||||
case .connecting:
|
|
||||||
return .connecting
|
|
||||||
case .disconnecting:
|
|
||||||
return .disconnecting
|
|
||||||
case .disconnected:
|
|
||||||
return .disconnected
|
|
||||||
case .reasserting:
|
|
||||||
return .reasserting
|
|
||||||
case .invalid:
|
|
||||||
return .invalid
|
|
||||||
@unknown default:
|
|
||||||
return .unknown
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct TunnelView: View {
|
|
||||||
var tunnel: Tunnel
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
VStack {
|
|
||||||
Text(verbatim: tunnel.status.description)
|
|
||||||
switch tunnel.status {
|
|
||||||
case .connected:
|
|
||||||
Button("Disconnect", action: stop)
|
|
||||||
case .permissionRequired:
|
|
||||||
Button("Allow", action: configure)
|
|
||||||
case .disconnected:
|
|
||||||
Button("Start", action: start)
|
|
||||||
default:
|
|
||||||
EmptyView()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func start() {
|
|
||||||
try? tunnel.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func stop() {
|
|
||||||
tunnel.stop()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func configure() {
|
|
||||||
Task { try await tunnel.configure() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,20 +7,47 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
0B28F1562ABF463A000D44B0 /* DataTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B28F1552ABF463A000D44B0 /* DataTypes.swift */; };
|
|
||||||
0B46E8E02AC918CA00BA2A3C /* BurrowIpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B46E8DF2AC918CA00BA2A3C /* BurrowIpc.swift */; };
|
|
||||||
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
|
|
||||||
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; };
|
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; };
|
||||||
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
|
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
|
||||||
D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
|
D03383AD2C8E67E300F7C44E /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = D078F7E22C8DA375008A8CEC /* SwiftProtobuf */; };
|
||||||
|
D03383AE2C8E67E300F7C44E /* NIO in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE902C8DAB2000778185 /* NIO */; };
|
||||||
|
D03383AF2C8E67E300F7C44E /* NIOConcurrencyHelpers in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */; };
|
||||||
|
D03383B02C8E67E300F7C44E /* NIOTransportServices in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE952C8DAB2800778185 /* NIOTransportServices */; };
|
||||||
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
|
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
|
||||||
D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */; };
|
D09150422B9D2AF700BE3CB0 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D09150412B9D2AF700BE3CB0 /* MainMenu.xib */; platformFilters = (macos, ); };
|
||||||
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; };
|
D0B1D1102C436152004B7823 /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = D0B1D10F2C436152004B7823 /* AsyncAlgorithms */; };
|
||||||
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; };
|
|
||||||
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FE2A086E1C00AD070D /* Status.swift */; };
|
|
||||||
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B98FC629FDC5B5004E7149 /* Tunnel.swift */; };
|
|
||||||
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCC6032A09535900AD070D /* libburrow.a */; };
|
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCC6032A09535900AD070D /* libburrow.a */; };
|
||||||
D0BCC60A2A09A0B800AD070D /* build-rust.sh in Resources */ = {isa = PBXBuildFile; fileRef = D0B98FBF29FD8072004E7149 /* build-rust.sh */; };
|
D0BF09522C8E66F6000D8DEC /* BurrowConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; };
|
||||||
|
D0BF09552C8E66FD000D8DEC /* BurrowConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; };
|
||||||
|
D0D4E53A2C8D996F007F820A /* BurrowCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
D0D4E56B2C8D9C2F007F820A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49A2C8D921A007F820A /* Logging.swift */; };
|
||||||
|
D0D4E5702C8D9C62007F820A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
|
||||||
|
D0D4E5712C8D9C6F007F820A /* HackClub.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49D2C8D921A007F820A /* HackClub.swift */; };
|
||||||
|
D0D4E5722C8D9C6F007F820A /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49E2C8D921A007F820A /* Network.swift */; };
|
||||||
|
D0D4E5732C8D9C6F007F820A /* WireGuard.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49F2C8D921A007F820A /* WireGuard.swift */; };
|
||||||
|
D0D4E5742C8D9C6F007F820A /* BurrowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A22C8D921A007F820A /* BurrowView.swift */; };
|
||||||
|
D0D4E5752C8D9C6F007F820A /* FloatingButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */; };
|
||||||
|
D0D4E5762C8D9C6F007F820A /* MenuItemToggleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */; };
|
||||||
|
D0D4E5772C8D9C6F007F820A /* NetworkCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */; };
|
||||||
|
D0D4E5782C8D9C6F007F820A /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */; };
|
||||||
|
D0D4E5792C8D9C6F007F820A /* NetworkExtensionTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */; };
|
||||||
|
D0D4E57A2C8D9C6F007F820A /* NetworkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A82C8D921A007F820A /* NetworkView.swift */; };
|
||||||
|
D0D4E57B2C8D9C6F007F820A /* OAuth2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A92C8D921A007F820A /* OAuth2.swift */; };
|
||||||
|
D0D4E57C2C8D9C6F007F820A /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AA2C8D921A007F820A /* Tunnel.swift */; };
|
||||||
|
D0D4E57D2C8D9C6F007F820A /* TunnelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */; };
|
||||||
|
D0D4E57E2C8D9C6F007F820A /* TunnelStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */; };
|
||||||
|
D0D4E5892C8D9C94007F820A /* BurrowUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */; };
|
||||||
|
D0D4E58A2C8D9C9E007F820A /* BurrowUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
D0D4E58B2C8D9CA4007F820A /* BurrowConfiguration.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
D0D4E5922C8D9D15007F820A /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E58F2C8D9D0A007F820A /* Constants.swift */; };
|
||||||
|
D0D4E5A62C8D9E65007F820A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
|
||||||
|
D0F4FAD32C8DC79C0068730A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
|
||||||
|
D0F7594E2C8DAB6B00126CF3 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = D078F7E02C8DA375008A8CEC /* GRPC */; };
|
||||||
|
D0F759612C8DB24B00126CF3 /* grpc-swift-config.json in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4962C8D921A007F820A /* grpc-swift-config.json */; };
|
||||||
|
D0F759622C8DB24B00126CF3 /* swift-protobuf-config.json in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */; };
|
||||||
|
D0F7597E2C8DB30500126CF3 /* CGRPCZlib in Frameworks */ = {isa = PBXBuildFile; productRef = D0F7597D2C8DB30500126CF3 /* CGRPCZlib */; };
|
||||||
|
D0F7598D2C8DB3DA00126CF3 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4992C8D921A007F820A /* Client.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
|
@ -31,6 +58,48 @@
|
||||||
remoteGlobalIDString = D020F65229E4A697002790F6;
|
remoteGlobalIDString = D020F65229E4A697002790F6;
|
||||||
remoteInfo = BurrowNetworkExtension;
|
remoteInfo = BurrowNetworkExtension;
|
||||||
};
|
};
|
||||||
|
D0BF09502C8E66F1000D8DEC /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E55A2C8D9BF4007F820A;
|
||||||
|
remoteInfo = Configuration;
|
||||||
|
};
|
||||||
|
D0BF09532C8E66FA000D8DEC /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E55A2C8D9BF4007F820A;
|
||||||
|
remoteInfo = Configuration;
|
||||||
|
};
|
||||||
|
D0D4E56E2C8D9C5D007F820A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
|
||||||
|
remoteInfo = Core;
|
||||||
|
};
|
||||||
|
D0D4E57F2C8D9C78007F820A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
|
||||||
|
remoteInfo = Core;
|
||||||
|
};
|
||||||
|
D0D4E5872C8D9C88007F820A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E5502C8D9BF2007F820A;
|
||||||
|
remoteInfo = UI;
|
||||||
|
};
|
||||||
|
D0F4FAD12C8DC7960068730A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
|
||||||
|
remoteInfo = Core;
|
||||||
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
|
@ -45,12 +114,23 @@
|
||||||
name = "Embed Foundation Extensions";
|
name = "Embed Foundation Extensions";
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
D0D4E53F2C8D996F007F820A /* Embed Frameworks */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 10;
|
||||||
|
files = (
|
||||||
|
D0D4E58B2C8D9CA4007F820A /* BurrowConfiguration.framework in Embed Frameworks */,
|
||||||
|
D0D4E58A2C8D9C9E007F820A /* BurrowUI.framework in Embed Frameworks */,
|
||||||
|
D0D4E53A2C8D996F007F820A /* BurrowCore.framework in Embed Frameworks */,
|
||||||
|
);
|
||||||
|
name = "Embed Frameworks";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
0B28F1552ABF463A000D44B0 /* DataTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTypes.swift; sourceTree = "<group>"; };
|
D00117422B30348D00D87C25 /* Configuration.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Configuration.xcconfig; sourceTree = "<group>"; };
|
||||||
0B46E8DF2AC918CA00BA2A3C /* BurrowIpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowIpc.swift; sourceTree = "<group>"; };
|
|
||||||
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
|
|
||||||
D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
|
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
|
||||||
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
|
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
|
||||||
|
|
@ -66,17 +146,43 @@
|
||||||
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "NetworkExtension-iOS.entitlements"; sourceTree = "<group>"; };
|
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "NetworkExtension-iOS.entitlements"; sourceTree = "<group>"; };
|
||||||
D020F66829E4AA74002790F6 /* App-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-iOS.entitlements"; sourceTree = "<group>"; };
|
D020F66829E4AA74002790F6 /* App-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-iOS.entitlements"; sourceTree = "<group>"; };
|
||||||
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
|
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
|
||||||
|
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
|
||||||
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
|
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
|
||||||
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelView.swift; sourceTree = "<group>"; };
|
D09150412B9D2AF700BE3CB0 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; };
|
||||||
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
|
D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
|
||||||
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
|
|
||||||
D0B98FD829FDDB6F004E7149 /* libburrow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libburrow.h; sourceTree = "<group>"; };
|
D0B98FD829FDDB6F004E7149 /* libburrow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libburrow.h; sourceTree = "<group>"; };
|
||||||
D0B98FDC29FDDDCF004E7149 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
|
D0B98FDC29FDDDCF004E7149 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
|
||||||
D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NetworkExtension+Async.swift"; sourceTree = "<group>"; };
|
|
||||||
D0BCC5FE2A086E1C00AD070D /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = "<group>"; };
|
|
||||||
D0BCC6032A09535900AD070D /* libburrow.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libburrow.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
D0BCC6032A09535900AD070D /* libburrow.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libburrow.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D0BF09582C8E6789000D8DEC /* UI.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UI.xcconfig; sourceTree = "<group>"; };
|
||||||
|
D0D4E4952C8D921A007F820A /* burrow.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = burrow.proto; sourceTree = "<group>"; };
|
||||||
|
D0D4E4962C8D921A007F820A /* grpc-swift-config.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "grpc-swift-config.json"; sourceTree = "<group>"; };
|
||||||
|
D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "swift-protobuf-config.json"; sourceTree = "<group>"; };
|
||||||
|
D0D4E4992C8D921A007F820A /* Client.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E49A2C8D921A007F820A /* Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E49D2C8D921A007F820A /* HackClub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HackClub.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E49E2C8D921A007F820A /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E49F2C8D921A007F820A /* WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuard.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A12C8D921A007F820A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A22C8D921A007F820A /* BurrowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowView.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingButtonStyle.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItemToggleView.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkCarouselView.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NetworkExtension+Async.swift"; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkExtensionTunnel.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A82C8D921A007F820A /* NetworkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkView.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4A92C8D921A007F820A /* OAuth2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OAuth2.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4AA2C8D921A007F820A /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelButton.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelStatusView.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E4F62C8D932D007F820A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
|
D0D4E4F72C8D941D007F820A /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = "<group>"; };
|
||||||
|
D0D4E5312C8D996F007F820A /* BurrowCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowConfiguration.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D0D4E58E2C8D9D0A007F820A /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = "<group>"; };
|
||||||
|
D0D4E58F2C8D9D0A007F820A /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
|
||||||
|
D0D4E5902C8D9D0A007F820A /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
|
@ -84,7 +190,10 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
D0BF09522C8E66F6000D8DEC /* BurrowConfiguration.framework in Frameworks */,
|
||||||
|
D0D4E5A62C8D9E65007F820A /* BurrowCore.framework in Frameworks */,
|
||||||
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */,
|
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */,
|
||||||
|
D0B1D1102C436152004B7823 /* AsyncAlgorithms in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -92,18 +201,41 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
D0BF09552C8E66FD000D8DEC /* BurrowConfiguration.framework in Frameworks */,
|
||||||
|
D0F4FAD32C8DC79C0068730A /* BurrowCore.framework in Frameworks */,
|
||||||
|
D0D4E5892C8D9C94007F820A /* BurrowUI.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D078F7CF2C8DA213008A8CEC /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
D03383B02C8E67E300F7C44E /* NIOTransportServices in Frameworks */,
|
||||||
|
D03383AF2C8E67E300F7C44E /* NIOConcurrencyHelpers in Frameworks */,
|
||||||
|
D03383AE2C8E67E300F7C44E /* NIO in Frameworks */,
|
||||||
|
D03383AD2C8E67E300F7C44E /* SwiftProtobuf in Frameworks */,
|
||||||
|
D0F7594E2C8DAB6B00126CF3 /* GRPC in Frameworks */,
|
||||||
|
D0F7597E2C8DB30500126CF3 /* CGRPCZlib in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D0D4E5532C8D9BF2007F820A /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
D0D4E5702C8D9C62007F820A /* BurrowCore.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
43AA26D62A0FFFD000F14CE6 /* Menu */ = {
|
D00117432B30372900D87C25 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
43AA26D72A10004900F14CE6 /* MenuView.swift */,
|
|
||||||
);
|
);
|
||||||
path = Menu;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
D020F63C29E4A1FF002790F6 /* Configuration */ = {
|
D020F63C29E4A1FF002790F6 /* Configuration */ = {
|
||||||
|
|
@ -112,8 +244,13 @@
|
||||||
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */,
|
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */,
|
||||||
D020F64A29E4A452002790F6 /* App.xcconfig */,
|
D020F64A29E4A452002790F6 /* App.xcconfig */,
|
||||||
D020F66329E4A703002790F6 /* Extension.xcconfig */,
|
D020F66329E4A703002790F6 /* Extension.xcconfig */,
|
||||||
|
D0D4E4F72C8D941D007F820A /* Framework.xcconfig */,
|
||||||
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */,
|
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */,
|
||||||
|
D0D4E4F62C8D932D007F820A /* Debug.xcconfig */,
|
||||||
|
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */,
|
||||||
D020F64229E4A1FF002790F6 /* Info.plist */,
|
D020F64229E4A1FF002790F6 /* Info.plist */,
|
||||||
|
D0D4E5912C8D9D0A007F820A /* Constants */,
|
||||||
|
D00117422B30348D00D87C25 /* Configuration.xcconfig */,
|
||||||
);
|
);
|
||||||
path = Configuration;
|
path = Configuration;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -126,8 +263,6 @@
|
||||||
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */,
|
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */,
|
||||||
D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */,
|
D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */,
|
||||||
D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */,
|
D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */,
|
||||||
0B28F1552ABF463A000D44B0 /* DataTypes.swift */,
|
|
||||||
0B46E8DF2AC918CA00BA2A3C /* BurrowIpc.swift */,
|
|
||||||
D0B98FD729FDDB57004E7149 /* libburrow */,
|
D0B98FD729FDDB57004E7149 /* libburrow */,
|
||||||
);
|
);
|
||||||
path = NetworkExtension;
|
path = NetworkExtension;
|
||||||
|
|
@ -138,8 +273,11 @@
|
||||||
children = (
|
children = (
|
||||||
D05B9F7429E39EEC008CB1F9 /* App */,
|
D05B9F7429E39EEC008CB1F9 /* App */,
|
||||||
D020F65629E4A697002790F6 /* NetworkExtension */,
|
D020F65629E4A697002790F6 /* NetworkExtension */,
|
||||||
|
D0D4E49C2C8D921A007F820A /* Core */,
|
||||||
|
D0D4E4AD2C8D921A007F820A /* UI */,
|
||||||
D020F63C29E4A1FF002790F6 /* Configuration */,
|
D020F63C29E4A1FF002790F6 /* Configuration */,
|
||||||
D05B9F7329E39EEC008CB1F9 /* Products */,
|
D05B9F7329E39EEC008CB1F9 /* Products */,
|
||||||
|
D00117432B30372900D87C25 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
|
@ -148,6 +286,10 @@
|
||||||
children = (
|
children = (
|
||||||
D05B9F7229E39EEC008CB1F9 /* Burrow.app */,
|
D05B9F7229E39EEC008CB1F9 /* Burrow.app */,
|
||||||
D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */,
|
D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */,
|
||||||
|
D0BCC6032A09535900AD070D /* libburrow.a */,
|
||||||
|
D0D4E5312C8D996F007F820A /* BurrowCore.framework */,
|
||||||
|
D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */,
|
||||||
|
D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -155,14 +297,9 @@
|
||||||
D05B9F7429E39EEC008CB1F9 /* App */ = {
|
D05B9F7429E39EEC008CB1F9 /* App */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
43AA26D62A0FFFD000F14CE6 /* Menu */,
|
|
||||||
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
|
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
|
||||||
D00AA8962A4669BC005C8102 /* AppDelegate.swift */,
|
D00AA8962A4669BC005C8102 /* AppDelegate.swift */,
|
||||||
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */,
|
D09150412B9D2AF700BE3CB0 /* MainMenu.xib */,
|
||||||
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */,
|
|
||||||
D0BCC5FE2A086E1C00AD070D /* Status.swift */,
|
|
||||||
D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */,
|
|
||||||
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */,
|
|
||||||
D020F66829E4AA74002790F6 /* App-iOS.entitlements */,
|
D020F66829E4AA74002790F6 /* App-iOS.entitlements */,
|
||||||
D020F66929E4AA74002790F6 /* App-macOS.entitlements */,
|
D020F66929E4AA74002790F6 /* App-macOS.entitlements */,
|
||||||
D020F64929E4A34B002790F6 /* App.xcconfig */,
|
D020F64929E4A34B002790F6 /* App.xcconfig */,
|
||||||
|
|
@ -176,11 +313,71 @@
|
||||||
D0B98FBF29FD8072004E7149 /* build-rust.sh */,
|
D0B98FBF29FD8072004E7149 /* build-rust.sh */,
|
||||||
D0B98FDC29FDDDCF004E7149 /* module.modulemap */,
|
D0B98FDC29FDDDCF004E7149 /* module.modulemap */,
|
||||||
D0B98FD829FDDB6F004E7149 /* libburrow.h */,
|
D0B98FD829FDDB6F004E7149 /* libburrow.h */,
|
||||||
D0BCC6032A09535900AD070D /* libburrow.a */,
|
|
||||||
);
|
);
|
||||||
path = libburrow;
|
path = libburrow;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
D0D4E4982C8D921A007F820A /* Client */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0D4E4952C8D921A007F820A /* burrow.proto */,
|
||||||
|
D0D4E4962C8D921A007F820A /* grpc-swift-config.json */,
|
||||||
|
D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */,
|
||||||
|
);
|
||||||
|
path = Client;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D0D4E49C2C8D921A007F820A /* Core */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0D4E49A2C8D921A007F820A /* Logging.swift */,
|
||||||
|
D0D4E4992C8D921A007F820A /* Client.swift */,
|
||||||
|
D0D4E4982C8D921A007F820A /* Client */,
|
||||||
|
);
|
||||||
|
path = Core;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D0D4E4A02C8D921A007F820A /* Networks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0D4E49D2C8D921A007F820A /* HackClub.swift */,
|
||||||
|
D0D4E49E2C8D921A007F820A /* Network.swift */,
|
||||||
|
D0D4E49F2C8D921A007F820A /* WireGuard.swift */,
|
||||||
|
);
|
||||||
|
path = Networks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D0D4E4AD2C8D921A007F820A /* UI */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0D4E4A22C8D921A007F820A /* BurrowView.swift */,
|
||||||
|
D0D4E4A02C8D921A007F820A /* Networks */,
|
||||||
|
D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */,
|
||||||
|
D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */,
|
||||||
|
D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */,
|
||||||
|
D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */,
|
||||||
|
D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */,
|
||||||
|
D0D4E4A82C8D921A007F820A /* NetworkView.swift */,
|
||||||
|
D0D4E4A92C8D921A007F820A /* OAuth2.swift */,
|
||||||
|
D0D4E4AA2C8D921A007F820A /* Tunnel.swift */,
|
||||||
|
D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */,
|
||||||
|
D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */,
|
||||||
|
D0D4E4A12C8D921A007F820A /* Assets.xcassets */,
|
||||||
|
D0BF09582C8E6789000D8DEC /* UI.xcconfig */,
|
||||||
|
);
|
||||||
|
path = UI;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D0D4E5912C8D9D0A007F820A /* Constants */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0D4E58E2C8D9D0A007F820A /* Constants.h */,
|
||||||
|
D0D4E58F2C8D9D0A007F820A /* Constants.swift */,
|
||||||
|
D0D4E5902C8D9D0A007F820A /* module.modulemap */,
|
||||||
|
);
|
||||||
|
path = Constants;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
|
@ -191,12 +388,12 @@
|
||||||
D0BCC60B2A09A0C100AD070D /* Compile Rust */,
|
D0BCC60B2A09A0C100AD070D /* Compile Rust */,
|
||||||
D020F64F29E4A697002790F6 /* Sources */,
|
D020F64F29E4A697002790F6 /* Sources */,
|
||||||
D020F65029E4A697002790F6 /* Frameworks */,
|
D020F65029E4A697002790F6 /* Frameworks */,
|
||||||
D020F65129E4A697002790F6 /* Resources */,
|
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
D08252712B5C3E2E005DA378 /* PBXTargetDependency */,
|
D0BF09512C8E66F1000D8DEC /* PBXTargetDependency */,
|
||||||
|
D0D4E5802C8D9C78007F820A /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = NetworkExtension;
|
name = NetworkExtension;
|
||||||
productName = BurrowNetworkExtension;
|
productName = BurrowNetworkExtension;
|
||||||
|
|
@ -210,12 +407,15 @@
|
||||||
D05B9F6E29E39EEC008CB1F9 /* Sources */,
|
D05B9F6E29E39EEC008CB1F9 /* Sources */,
|
||||||
D05B9F6F29E39EEC008CB1F9 /* Frameworks */,
|
D05B9F6F29E39EEC008CB1F9 /* Frameworks */,
|
||||||
D05B9F7029E39EEC008CB1F9 /* Resources */,
|
D05B9F7029E39EEC008CB1F9 /* Resources */,
|
||||||
|
D0D4E53F2C8D996F007F820A /* Embed Frameworks */,
|
||||||
D020F66129E4A697002790F6 /* Embed Foundation Extensions */,
|
D020F66129E4A697002790F6 /* Embed Foundation Extensions */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
D08252732B5C3E33005DA378 /* PBXTargetDependency */,
|
D0BF09542C8E66FA000D8DEC /* PBXTargetDependency */,
|
||||||
|
D0F4FAD22C8DC7960068730A /* PBXTargetDependency */,
|
||||||
|
D0D4E5882C8D9C88007F820A /* PBXTargetDependency */,
|
||||||
D020F65C29E4A697002790F6 /* PBXTargetDependency */,
|
D020F65C29E4A697002790F6 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = App;
|
name = App;
|
||||||
|
|
@ -223,6 +423,71 @@
|
||||||
productReference = D05B9F7229E39EEC008CB1F9 /* Burrow.app */;
|
productReference = D05B9F7229E39EEC008CB1F9 /* Burrow.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
|
D0D4E5302C8D996F007F820A /* Core */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = D0D4E53C2C8D996F007F820A /* Build configuration list for PBXNativeTarget "Core" */;
|
||||||
|
buildPhases = (
|
||||||
|
D0D4E52D2C8D996F007F820A /* Sources */,
|
||||||
|
D078F7CF2C8DA213008A8CEC /* Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
D0F7598A2C8DB34200126CF3 /* PBXTargetDependency */,
|
||||||
|
D0F7595E2C8DB24400126CF3 /* PBXTargetDependency */,
|
||||||
|
D0F759602C8DB24400126CF3 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = Core;
|
||||||
|
packageProductDependencies = (
|
||||||
|
D078F7E02C8DA375008A8CEC /* GRPC */,
|
||||||
|
D078F7E22C8DA375008A8CEC /* SwiftProtobuf */,
|
||||||
|
D044EE902C8DAB2000778185 /* NIO */,
|
||||||
|
D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */,
|
||||||
|
D044EE952C8DAB2800778185 /* NIOTransportServices */,
|
||||||
|
D0F7597D2C8DB30500126CF3 /* CGRPCZlib */,
|
||||||
|
);
|
||||||
|
productName = Core;
|
||||||
|
productReference = D0D4E5312C8D996F007F820A /* BurrowCore.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
D0D4E5502C8D9BF2007F820A /* UI */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = D0D4E5552C8D9BF2007F820A /* Build configuration list for PBXNativeTarget "UI" */;
|
||||||
|
buildPhases = (
|
||||||
|
D0D4E5522C8D9BF2007F820A /* Sources */,
|
||||||
|
D0D4E5532C8D9BF2007F820A /* Frameworks */,
|
||||||
|
D0D4E5542C8D9BF2007F820A /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
D0D4E56F2C8D9C5D007F820A /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = UI;
|
||||||
|
packageProductDependencies = (
|
||||||
|
);
|
||||||
|
productName = Core;
|
||||||
|
productReference = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
D0D4E55A2C8D9BF4007F820A /* Configuration */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = D0D4E55F2C8D9BF4007F820A /* Build configuration list for PBXNativeTarget "Configuration" */;
|
||||||
|
buildPhases = (
|
||||||
|
D0F759912C8DB49E00126CF3 /* Configure Version */,
|
||||||
|
D0D4E55C2C8D9BF4007F820A /* Sources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = Configuration;
|
||||||
|
packageProductDependencies = (
|
||||||
|
);
|
||||||
|
productName = Core;
|
||||||
|
productReference = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
|
|
@ -230,8 +495,8 @@
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = 1;
|
BuildIndependentTargetsInParallel = 1;
|
||||||
LastSwiftUpdateCheck = 1430;
|
LastSwiftUpdateCheck = 1600;
|
||||||
LastUpgradeCheck = 1510;
|
LastUpgradeCheck = 1520;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
D020F65229E4A697002790F6 = {
|
D020F65229E4A697002790F6 = {
|
||||||
CreatedOnToolsVersion = 14.3;
|
CreatedOnToolsVersion = 14.3;
|
||||||
|
|
@ -239,6 +504,9 @@
|
||||||
D05B9F7129E39EEC008CB1F9 = {
|
D05B9F7129E39EEC008CB1F9 = {
|
||||||
CreatedOnToolsVersion = 14.3;
|
CreatedOnToolsVersion = 14.3;
|
||||||
};
|
};
|
||||||
|
D0D4E5302C8D996F007F820A = {
|
||||||
|
CreatedOnToolsVersion = 16.0;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = D05B9F6D29E39EEC008CB1F9 /* Build configuration list for PBXProject "Burrow" */;
|
buildConfigurationList = D05B9F6D29E39EEC008CB1F9 /* Build configuration list for PBXProject "Burrow" */;
|
||||||
|
|
@ -251,7 +519,11 @@
|
||||||
);
|
);
|
||||||
mainGroup = D05B9F6929E39EEC008CB1F9;
|
mainGroup = D05B9F6929E39EEC008CB1F9;
|
||||||
packageReferences = (
|
packageReferences = (
|
||||||
D082526F2B5C3E23005DA378 /* XCRemoteSwiftPackageReference "SwiftLint" */,
|
D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */,
|
||||||
|
D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */,
|
||||||
|
D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */,
|
||||||
|
D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */,
|
||||||
|
D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */,
|
||||||
);
|
);
|
||||||
productRefGroup = D05B9F7329E39EEC008CB1F9 /* Products */;
|
productRefGroup = D05B9F7329E39EEC008CB1F9 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
|
|
@ -259,24 +531,26 @@
|
||||||
targets = (
|
targets = (
|
||||||
D05B9F7129E39EEC008CB1F9 /* App */,
|
D05B9F7129E39EEC008CB1F9 /* App */,
|
||||||
D020F65229E4A697002790F6 /* NetworkExtension */,
|
D020F65229E4A697002790F6 /* NetworkExtension */,
|
||||||
|
D0D4E5502C8D9BF2007F820A /* UI */,
|
||||||
|
D0D4E5302C8D996F007F820A /* Core */,
|
||||||
|
D0D4E55A2C8D9BF4007F820A /* Configuration */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
D020F65129E4A697002790F6 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
D0BCC60A2A09A0B800AD070D /* build-rust.sh in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
D05B9F7029E39EEC008CB1F9 /* Resources */ = {
|
D05B9F7029E39EEC008CB1F9 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */,
|
D09150422B9D2AF700BE3CB0 /* MainMenu.xib in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D0D4E5542C8D9BF2007F820A /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -303,6 +577,28 @@
|
||||||
shellScript = "\"${PROJECT_DIR}/NetworkExtension/libburrow/build-rust.sh\"\n";
|
shellScript = "\"${PROJECT_DIR}/NetworkExtension/libburrow/build-rust.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
|
D0F759912C8DB49E00126CF3 /* Configure Version */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"$(PROJECT_DIR)/../Tools/version.sh",
|
||||||
|
"$(PROJECT_DIR)/../.git",
|
||||||
|
);
|
||||||
|
name = "Configure Version";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(PROJECT_DIR)/Configuration/Version.xcconfig",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"$PROJECT_DIR/../Tools/version.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
|
@ -310,8 +606,6 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
0B28F1562ABF463A000D44B0 /* DataTypes.swift in Sources */,
|
|
||||||
0B46E8E02AC918CA00BA2A3C /* BurrowIpc.swift in Sources */,
|
|
||||||
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */,
|
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
|
@ -320,13 +614,48 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */,
|
|
||||||
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */,
|
|
||||||
D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */,
|
|
||||||
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */,
|
|
||||||
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */,
|
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */,
|
||||||
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
|
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
|
||||||
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */,
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D0D4E52D2C8D996F007F820A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
D0F759612C8DB24B00126CF3 /* grpc-swift-config.json in Sources */,
|
||||||
|
D0F759622C8DB24B00126CF3 /* swift-protobuf-config.json in Sources */,
|
||||||
|
D0F7598D2C8DB3DA00126CF3 /* Client.swift in Sources */,
|
||||||
|
D0D4E56B2C8D9C2F007F820A /* Logging.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D0D4E5522C8D9BF2007F820A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
D0D4E5712C8D9C6F007F820A /* HackClub.swift in Sources */,
|
||||||
|
D0D4E5722C8D9C6F007F820A /* Network.swift in Sources */,
|
||||||
|
D0D4E5732C8D9C6F007F820A /* WireGuard.swift in Sources */,
|
||||||
|
D0D4E5742C8D9C6F007F820A /* BurrowView.swift in Sources */,
|
||||||
|
D0D4E5752C8D9C6F007F820A /* FloatingButtonStyle.swift in Sources */,
|
||||||
|
D0D4E5762C8D9C6F007F820A /* MenuItemToggleView.swift in Sources */,
|
||||||
|
D0D4E5772C8D9C6F007F820A /* NetworkCarouselView.swift in Sources */,
|
||||||
|
D0D4E5782C8D9C6F007F820A /* NetworkExtension+Async.swift in Sources */,
|
||||||
|
D0D4E5792C8D9C6F007F820A /* NetworkExtensionTunnel.swift in Sources */,
|
||||||
|
D0D4E57A2C8D9C6F007F820A /* NetworkView.swift in Sources */,
|
||||||
|
D0D4E57B2C8D9C6F007F820A /* OAuth2.swift in Sources */,
|
||||||
|
D0D4E57C2C8D9C6F007F820A /* Tunnel.swift in Sources */,
|
||||||
|
D0D4E57D2C8D9C6F007F820A /* TunnelButton.swift in Sources */,
|
||||||
|
D0D4E57E2C8D9C6F007F820A /* TunnelStatusView.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
D0D4E55C2C8D9BF4007F820A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
D0D4E5922C8D9D15007F820A /* Constants.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -338,13 +667,47 @@
|
||||||
target = D020F65229E4A697002790F6 /* NetworkExtension */;
|
target = D020F65229E4A697002790F6 /* NetworkExtension */;
|
||||||
targetProxy = D020F65B29E4A697002790F6 /* PBXContainerItemProxy */;
|
targetProxy = D020F65B29E4A697002790F6 /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
D08252712B5C3E2E005DA378 /* PBXTargetDependency */ = {
|
D0BF09512C8E66F1000D8DEC /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
productRef = D08252702B5C3E2E005DA378 /* SwiftLintPlugin */;
|
target = D0D4E55A2C8D9BF4007F820A /* Configuration */;
|
||||||
|
targetProxy = D0BF09502C8E66F1000D8DEC /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
D08252732B5C3E33005DA378 /* PBXTargetDependency */ = {
|
D0BF09542C8E66FA000D8DEC /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
productRef = D08252722B5C3E33005DA378 /* SwiftLintPlugin */;
|
target = D0D4E55A2C8D9BF4007F820A /* Configuration */;
|
||||||
|
targetProxy = D0BF09532C8E66FA000D8DEC /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
D0D4E56F2C8D9C5D007F820A /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = D0D4E5302C8D996F007F820A /* Core */;
|
||||||
|
targetProxy = D0D4E56E2C8D9C5D007F820A /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
D0D4E5802C8D9C78007F820A /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = D0D4E5302C8D996F007F820A /* Core */;
|
||||||
|
targetProxy = D0D4E57F2C8D9C78007F820A /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
D0D4E5882C8D9C88007F820A /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = D0D4E5502C8D9BF2007F820A /* UI */;
|
||||||
|
targetProxy = D0D4E5872C8D9C88007F820A /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
D0F4FAD22C8DC7960068730A /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = D0D4E5302C8D996F007F820A /* Core */;
|
||||||
|
targetProxy = D0F4FAD12C8DC7960068730A /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
D0F7595E2C8DB24400126CF3 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
productRef = D0F7595D2C8DB24400126CF3 /* GRPCSwiftPlugin */;
|
||||||
|
};
|
||||||
|
D0F759602C8DB24400126CF3 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
productRef = D0F7595F2C8DB24400126CF3 /* SwiftProtobufPlugin */;
|
||||||
|
};
|
||||||
|
D0F7598A2C8DB34200126CF3 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
productRef = D0F759892C8DB34200126CF3 /* GRPC */;
|
||||||
};
|
};
|
||||||
/* End PBXTargetDependency section */
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
|
@ -391,6 +754,48 @@
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
D0D4E53D2C8D996F007F820A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D0D4E4F72C8D941D007F820A /* Framework.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
D0D4E53E2C8D996F007F820A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D0D4E4F72C8D941D007F820A /* Framework.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
D0D4E5562C8D9BF2007F820A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D0BF09582C8E6789000D8DEC /* UI.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
D0D4E5572C8D9BF2007F820A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D0BF09582C8E6789000D8DEC /* UI.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
D0D4E5602C8D9BF4007F820A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D00117422B30348D00D87C25 /* Configuration.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
D0D4E5612C8D9BF4007F820A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D00117422B30348D00D87C25 /* Configuration.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
|
@ -421,29 +826,128 @@
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
D0D4E53C2C8D996F007F820A /* Build configuration list for PBXNativeTarget "Core" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
D0D4E53D2C8D996F007F820A /* Debug */,
|
||||||
|
D0D4E53E2C8D996F007F820A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
D0D4E5552C8D9BF2007F820A /* Build configuration list for PBXNativeTarget "UI" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
D0D4E5562C8D9BF2007F820A /* Debug */,
|
||||||
|
D0D4E5572C8D9BF2007F820A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
D0D4E55F2C8D9BF4007F820A /* Build configuration list for PBXNativeTarget "Configuration" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
D0D4E5602C8D9BF4007F820A /* Debug */,
|
||||||
|
D0D4E5612C8D9BF4007F820A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
/* Begin XCRemoteSwiftPackageReference section */
|
/* Begin XCRemoteSwiftPackageReference section */
|
||||||
D082526F2B5C3E23005DA378 /* XCRemoteSwiftPackageReference "SwiftLint" */ = {
|
D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */ = {
|
||||||
isa = XCRemoteSwiftPackageReference;
|
isa = XCRemoteSwiftPackageReference;
|
||||||
repositoryURL = "https://github.com/realm/SwiftLint.git";
|
repositoryURL = "https://github.com/apple/swift-nio.git";
|
||||||
requirement = {
|
requirement = {
|
||||||
kind = upToNextMajorVersion;
|
kind = upToNextMajorVersion;
|
||||||
minimumVersion = 0.54.0;
|
minimumVersion = 2.72.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/apple/swift-nio-transport-services.git";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 1.21.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/apple/swift-async-algorithms.git";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 1.0.1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/grpc/grpc-swift.git";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 1.23.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/apple/swift-protobuf.git";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 1.28.1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
D08252702B5C3E2E005DA378 /* SwiftLintPlugin */ = {
|
D044EE902C8DAB2000778185 /* NIO */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = D082526F2B5C3E23005DA378 /* XCRemoteSwiftPackageReference "SwiftLint" */;
|
package = D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */;
|
||||||
productName = "plugin:SwiftLintPlugin";
|
productName = NIO;
|
||||||
};
|
};
|
||||||
D08252722B5C3E33005DA378 /* SwiftLintPlugin */ = {
|
D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = D082526F2B5C3E23005DA378 /* XCRemoteSwiftPackageReference "SwiftLint" */;
|
package = D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */;
|
||||||
productName = "plugin:SwiftLintPlugin";
|
productName = NIOConcurrencyHelpers;
|
||||||
|
};
|
||||||
|
D044EE952C8DAB2800778185 /* NIOTransportServices */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */;
|
||||||
|
productName = NIOTransportServices;
|
||||||
|
};
|
||||||
|
D078F7E02C8DA375008A8CEC /* GRPC */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
|
||||||
|
productName = GRPC;
|
||||||
|
};
|
||||||
|
D078F7E22C8DA375008A8CEC /* SwiftProtobuf */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */;
|
||||||
|
productName = SwiftProtobuf;
|
||||||
|
};
|
||||||
|
D0B1D10F2C436152004B7823 /* AsyncAlgorithms */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */;
|
||||||
|
productName = AsyncAlgorithms;
|
||||||
|
};
|
||||||
|
D0F7595D2C8DB24400126CF3 /* GRPCSwiftPlugin */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
|
||||||
|
productName = "plugin:GRPCSwiftPlugin";
|
||||||
|
};
|
||||||
|
D0F7595F2C8DB24400126CF3 /* SwiftProtobufPlugin */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */;
|
||||||
|
productName = "plugin:SwiftProtobufPlugin";
|
||||||
|
};
|
||||||
|
D0F7597D2C8DB30500126CF3 /* CGRPCZlib */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
|
||||||
|
productName = CGRPCZlib;
|
||||||
|
};
|
||||||
|
D0F759892C8DB34200126CF3 /* GRPC */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
|
||||||
|
productName = GRPC;
|
||||||
};
|
};
|
||||||
/* End XCSwiftPackageProductDependency section */
|
/* End XCSwiftPackageProductDependency section */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,86 +1,123 @@
|
||||||
{
|
{
|
||||||
|
"originHash" : "fa512b990383b7e309c5854a5279817052294a8191a6d3c55c49cfb38e88c0c3",
|
||||||
"pins" : [
|
"pins" : [
|
||||||
{
|
{
|
||||||
"identity" : "collectionconcurrencykit",
|
"identity" : "grpc-swift",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/JohnSundell/CollectionConcurrencyKit.git",
|
"location" : "https://github.com/grpc/grpc-swift.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "b4f23e24b5a1bff301efc5e70871083ca029ff95",
|
"revision" : "6a90b7e77e29f9bda6c2b3a4165a40d6c02cfda1",
|
||||||
"version" : "0.2.0"
|
"version" : "1.23.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "cryptoswift",
|
"identity" : "swift-async-algorithms",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
|
"location" : "https://github.com/apple/swift-async-algorithms.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "7892a123f7e8d0fe62f9f03728b17bbd4f94df5c",
|
"revision" : "6ae9a051f76b81cc668305ceed5b0e0a7fd93d20",
|
||||||
"version" : "1.8.1"
|
"version" : "1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "sourcekitten",
|
"identity" : "swift-atomics",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/jpsim/SourceKitten.git",
|
"location" : "https://github.com/apple/swift-atomics.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "b6dc09ee51dfb0c66e042d2328c017483a1a5d56",
|
"revision" : "cd142fd2f64be2100422d658e7411e39489da985",
|
||||||
"version" : "0.34.1"
|
"version" : "1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swift-argument-parser",
|
"identity" : "swift-collections",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/apple/swift-argument-parser.git",
|
"location" : "https://github.com/apple/swift-collections.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "fee6933f37fde9a5e12a1e4aeaa93fe60116ff2a",
|
"revision" : "9bf03ff58ce34478e66aaee630e491823326fd06",
|
||||||
"version" : "1.2.2"
|
"version" : "1.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swift-syntax",
|
"identity" : "swift-http-types",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/apple/swift-syntax.git",
|
"location" : "https://github.com/apple/swift-http-types",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "6ad4ea24b01559dde0773e3d091f1b9e36175036",
|
"revision" : "ae67c8178eb46944fd85e4dc6dd970e1f3ed6ccd",
|
||||||
"version" : "509.0.2"
|
"version" : "1.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swiftlint",
|
"identity" : "swift-log",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/realm/SwiftLint.git",
|
"location" : "https://github.com/apple/swift-log.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "f17a4f9dfb6a6afb0408426354e4180daaf49cee",
|
"revision" : "9cb486020ebf03bfa5b5df985387a14a98744537",
|
||||||
"version" : "0.54.0"
|
"version" : "1.6.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swiftytexttable",
|
"identity" : "swift-nio",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/scottrhoyt/SwiftyTextTable.git",
|
"location" : "https://github.com/apple/swift-nio.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3",
|
"revision" : "9746cf80e29edfef2a39924a66731249223f42a3",
|
||||||
"version" : "0.9.0"
|
"version" : "2.72.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swxmlhash",
|
"identity" : "swift-nio-extras",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/drmohundro/SWXMLHash.git",
|
"location" : "https://github.com/apple/swift-nio-extras.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "4d0f62f561458cbe1f732171e625f03195151b60",
|
"revision" : "d1ead62745cc3269e482f1c51f27608057174379",
|
||||||
"version" : "7.0.1"
|
"version" : "1.24.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identity" : "yams",
|
"identity" : "swift-nio-http2",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/jpsim/Yams.git",
|
"location" : "https://github.com/apple/swift-nio-http2.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3",
|
"revision" : "b5f7062b60e4add1e8c343ba4eb8da2e324b3a94",
|
||||||
"version" : "5.0.6"
|
"version" : "1.34.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-nio-ssl",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/apple/swift-nio-ssl.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "7b84abbdcef69cc3be6573ac12440220789dcd69",
|
||||||
|
"version" : "2.27.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-nio-transport-services",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/apple/swift-nio-transport-services.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "38ac8221dd20674682148d6451367f89c2652980",
|
||||||
|
"version" : "1.21.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-protobuf",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/apple/swift-protobuf.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "edb6ed4919f7756157fe02f2552b7e3850a538e5",
|
||||||
|
"version" : "1.28.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-system",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/apple/swift-system.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "d2ba781702a1d8285419c15ee62fd734a9437ff5",
|
||||||
|
"version" : "1.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version" : 2
|
"version" : 3
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1510"
|
LastUpgradeVersion = "1600"
|
||||||
version = "1.7">
|
version = "1.7">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES"
|
||||||
|
buildArchitectures = "Automatic">
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1510"
|
LastUpgradeVersion = "1600"
|
||||||
|
wasCreatedForAppExtension = "YES"
|
||||||
version = "2.0">
|
version = "2.0">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES"
|
||||||
|
buildArchitectures = "Automatic">
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
|
LD_EXPORT_SYMBOLS = NO
|
||||||
SKIP_INSTALL = NO
|
SKIP_INSTALL = NO
|
||||||
|
|
||||||
LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks
|
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks
|
||||||
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks
|
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks
|
||||||
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor
|
||||||
|
|
||||||
ENABLE_PREVIEWS = YES
|
|
||||||
|
|
|
||||||
|
|
@ -1,61 +1,44 @@
|
||||||
#include "Identity.xcconfig"
|
#include "Identity.xcconfig"
|
||||||
|
#include "Debug.xcconfig"
|
||||||
|
#include "Version.xcconfig"
|
||||||
|
|
||||||
SDKROOT = auto
|
SDKROOT = auto
|
||||||
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES
|
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES
|
||||||
|
|
||||||
SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx
|
SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx
|
||||||
|
SWIFT_VERSION = 6.0
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 17.0
|
IPHONEOS_DEPLOYMENT_TARGET = 17.0
|
||||||
MACOSX_DEPLOYMENT_TARGET = 14.0
|
MACOSX_DEPLOYMENT_TARGET = 14.0
|
||||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO
|
||||||
SUPPORTS_MACCATALYST = NO
|
SUPPORTS_MACCATALYST = NO
|
||||||
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO
|
|
||||||
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)
|
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME)
|
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME)
|
||||||
CURRENT_PROJECT_VERSION = 1
|
|
||||||
MARKETING_VERSION = 0.1
|
MARKETING_VERSION = 0.1
|
||||||
|
|
||||||
SKIP_INSTALL = YES
|
SKIP_INSTALL = YES
|
||||||
|
|
||||||
CODE_SIGN_IDENTITY = Apple Development
|
CODE_SIGN_IDENTITY = Apple Development
|
||||||
|
|
||||||
INFOPLIST_FILE = Configuration/Info.plist
|
|
||||||
GENERATE_INFOPLIST_FILE = YES
|
GENERATE_INFOPLIST_FILE = YES
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright = Copyright © 2023 Hack Club
|
INFOPLIST_FILE = Configuration/Info.plist
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = Copyright © 2023-2024 Hack Club
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = Burrow
|
INFOPLIST_KEY_CFBundleDisplayName = Burrow
|
||||||
|
|
||||||
ENABLE_BITCODE = NO
|
|
||||||
|
|
||||||
ENABLE_APP_SANDBOX[sdk=macosx*] = YES
|
ENABLE_APP_SANDBOX[sdk=macosx*] = YES
|
||||||
ENABLE_HARDENED_RUNTIME[sdk=macosx*] = YES
|
|
||||||
COMBINE_HIDPI_IMAGES = YES
|
|
||||||
COPY_PHASE_STRIP = NO
|
|
||||||
|
|
||||||
|
ENABLE_BITCODE = NO
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO
|
||||||
|
COMBINE_HIDPI_IMAGES = YES
|
||||||
|
EAGER_LINKING = YES
|
||||||
FUSE_BUILD_SCRIPT_PHASES = YES
|
FUSE_BUILD_SCRIPT_PHASES = YES
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES
|
||||||
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES
|
||||||
|
ENABLE_DEBUG_DYLIB = NO
|
||||||
|
|
||||||
APP_GROUP_IDENTIFIER = group.$(APP_BUNDLE_IDENTIFIER)
|
APP_GROUP_IDENTIFIER = group.$(APP_BUNDLE_IDENTIFIER)
|
||||||
APP_GROUP_IDENTIFIER[sdk=macosx*] = $(DEVELOPMENT_TEAM).$(APP_BUNDLE_IDENTIFIER)
|
APP_GROUP_IDENTIFIER[sdk=macosx*] = $(DEVELOPMENT_TEAM).$(APP_BUNDLE_IDENTIFIER)
|
||||||
NETWORK_EXTENSION_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).network
|
NETWORK_EXTENSION_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).network
|
||||||
|
|
||||||
// Swift
|
// https://github.com/grpc/grpc-swift/issues/683#issuecomment-1130118953
|
||||||
SWIFT_VERSION = 5.0
|
OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CNIOAtomics.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CNIODarwin.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CGRPCZlib.modulemap
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES
|
|
||||||
|
|
||||||
// Release
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = -Osize
|
|
||||||
LLVM_LTO = YES
|
|
||||||
DEAD_CODE_STRIPPING = YES
|
|
||||||
VALIDATE_PRODUCT = YES
|
|
||||||
|
|
||||||
// Debug
|
|
||||||
ONLY_ACTIVE_ARCH[config=Debug] = YES
|
|
||||||
DEBUG_INFORMATION_FORMAT[config=Debug] = dwarf
|
|
||||||
ENABLE_TESTABILITY[config=Debug] = YES
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL[config=Debug] = -Onone
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug] = DEBUG
|
|
||||||
SWIFT_COMPILATION_MODE[config=Debug] = singlefile
|
|
||||||
LLVM_LTO[config=Debug] = NO
|
|
||||||
DEAD_CODE_STRIPPING[config=Debug] = NO
|
|
||||||
VALIDATE_PRODUCT[config=Debug] = NO
|
|
||||||
|
|
|
||||||
4
Apple/Configuration/Configuration.xcconfig
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
#include "Framework.xcconfig"
|
||||||
|
|
||||||
|
SWIFT_INCLUDE_PATHS = $(PROJECT_DIR)/Configuration/Constants
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = APP_BUNDLE_IDENTIFIER=$(APP_BUNDLE_IDENTIFIER) APP_GROUP_IDENTIFIER=$(APP_GROUP_IDENTIFIER) NETWORK_EXTENSION_BUNDLE_IDENTIFIER=$(NETWORK_EXTENSION_BUNDLE_IDENTIFIER)
|
||||||
12
Apple/Configuration/Constants/Constants.h
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#define MACRO_STRING_(m) #m
|
||||||
|
#define MACRO_STRING(m) @MACRO_STRING_(m)
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
static NSString * const AppBundleIdentifier = MACRO_STRING(APP_BUNDLE_IDENTIFIER);
|
||||||
|
static NSString * const AppGroupIdentifier = MACRO_STRING(APP_GROUP_IDENTIFIER);
|
||||||
|
static NSString * const NetworkExtensionBundleIdentifier = MACRO_STRING(NETWORK_EXTENSION_BUNDLE_IDENTIFIER);
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
38
Apple/Configuration/Constants/Constants.swift
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
@_implementationOnly import CConstants
|
||||||
|
import OSLog
|
||||||
|
|
||||||
|
public enum Constants {
|
||||||
|
enum Error: Swift.Error {
|
||||||
|
case invalidAppGroupIdentifier
|
||||||
|
}
|
||||||
|
|
||||||
|
public static let bundleIdentifier = AppBundleIdentifier
|
||||||
|
public static let appGroupIdentifier = AppGroupIdentifier
|
||||||
|
public static let networkExtensionBundleIdentifier = NetworkExtensionBundleIdentifier
|
||||||
|
|
||||||
|
public static var socketURL: URL {
|
||||||
|
get throws {
|
||||||
|
try groupContainerURL.appending(component: "burrow.sock", directoryHint: .notDirectory)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static var databaseURL: URL {
|
||||||
|
get throws {
|
||||||
|
try groupContainerURL.appending(component: "burrow.db", directoryHint: .notDirectory)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static var groupContainerURL: URL {
|
||||||
|
get throws { try _groupContainerURL.get() }
|
||||||
|
}
|
||||||
|
private static let _groupContainerURL: Result<URL, Error> = {
|
||||||
|
switch FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) {
|
||||||
|
case .some(let url): .success(url)
|
||||||
|
case .none: .failure(.invalidAppGroupIdentifier)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Logger {
|
||||||
|
@_dynamicReplacement(for: subsystem)
|
||||||
|
public static var subsystem: String { Constants.bundleIdentifier }
|
||||||
|
}
|
||||||
4
Apple/Configuration/Constants/module.modulemap
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
module CConstants {
|
||||||
|
header "Constants.h"
|
||||||
|
export *
|
||||||
|
}
|
||||||
26
Apple/Configuration/Debug.xcconfig
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Release
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = -Osize
|
||||||
|
LLVM_LTO = YES
|
||||||
|
DEAD_CODE_STRIPPING = YES
|
||||||
|
STRIP_INSTALLED_PRODUCT = YES
|
||||||
|
STRIP_SWIFT_SYMBOLS = YES
|
||||||
|
COPY_PHASE_STRIP = NO
|
||||||
|
VALIDATE_PRODUCT = YES
|
||||||
|
ENABLE_MODULE_VERIFIER = YES
|
||||||
|
|
||||||
|
// Debug
|
||||||
|
ONLY_ACTIVE_ARCH[config=Debug] = YES
|
||||||
|
DEBUG_INFORMATION_FORMAT[config=Debug] = dwarf
|
||||||
|
ENABLE_TESTABILITY[config=Debug] = YES
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG=1 $(inherited)
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL[config=Debug] = -Onone
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug] = DEBUG
|
||||||
|
SWIFT_COMPILATION_MODE[config=Debug] = singlefile
|
||||||
|
LLVM_LTO[config=Debug] = NO
|
||||||
|
DEAD_CODE_STRIPPING[config=Debug] = NO
|
||||||
|
VALIDATE_PRODUCT[config=Debug] = NO
|
||||||
|
STRIP_INSTALLED_PRODUCT[config=Debug] = NO
|
||||||
|
STRIP_SWIFT_SYMBOLS[config=Debug] = NO
|
||||||
|
ENABLE_MODULE_VERIFIER[config=Debug] = NO
|
||||||
|
|
@ -1,2 +1,6 @@
|
||||||
|
LD_EXPORT_SYMBOLS = NO
|
||||||
|
|
||||||
|
OTHER_SWIFT_FLAGS = $(inherited) -Xfrontend -disable-autolink-framework -Xfrontend UIKit -Xfrontend -disable-autolink-framework -Xfrontend AppKit -Xfrontend -disable-autolink-framework -Xfrontend SwiftUI
|
||||||
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks
|
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks
|
||||||
LD_RUNPATH_SEARCH_PATHS[sdk=macos*] = $(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks
|
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks
|
||||||
|
|
|
||||||
14
Apple/Configuration/Framework.xcconfig
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
PRODUCT_NAME = Burrow$(TARGET_NAME:c99extidentifier)
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(TARGET_NAME:c99extidentifier)
|
||||||
|
APPLICATION_EXTENSION_API_ONLY = YES
|
||||||
|
SWIFT_INSTALL_OBJC_HEADER = NO
|
||||||
|
SWIFT_SKIP_AUTOLINKING_FRAMEWORKS = YES
|
||||||
|
SWIFT_SKIP_AUTOLINKING_LIBRARIES = YES
|
||||||
|
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks
|
||||||
|
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/Frameworks
|
||||||
|
|
||||||
|
DYLIB_INSTALL_NAME_BASE = @rpath
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1
|
||||||
|
DYLIB_CURRENT_VERSION = 1
|
||||||
|
VERSIONING_SYSTEM =
|
||||||
0
Apple/Configuration/Version.xcconfig
Normal file
32
Apple/Core/Client.swift
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
import GRPC
|
||||||
|
import NIOTransportServices
|
||||||
|
|
||||||
|
public typealias TunnelClient = Burrow_TunnelAsyncClient
|
||||||
|
public typealias NetworksClient = Burrow_NetworksAsyncClient
|
||||||
|
|
||||||
|
public protocol Client {
|
||||||
|
init(channel: GRPCChannel)
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Client {
|
||||||
|
public static func unix(socketURL: URL) -> Self {
|
||||||
|
let group = NIOTSEventLoopGroup()
|
||||||
|
let configuration = ClientConnection.Configuration.default(
|
||||||
|
target: .unixDomainSocket(socketURL.path),
|
||||||
|
eventLoopGroup: group
|
||||||
|
)
|
||||||
|
return Self(channel: ClientConnection(configuration: configuration))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension TunnelClient: Client {
|
||||||
|
public init(channel: any GRPCChannel) {
|
||||||
|
self.init(channel: channel, defaultCallOptions: .init(), interceptors: .none)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension NetworksClient: Client {
|
||||||
|
public init(channel: any GRPCChannel) {
|
||||||
|
self.init(channel: channel, defaultCallOptions: .init(), interceptors: .none)
|
||||||
|
}
|
||||||
|
}
|
||||||
1
Apple/Core/Client/burrow.proto
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../../../proto/burrow.proto
|
||||||
11
Apple/Core/Client/grpc-swift-config.json
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"invocations": [
|
||||||
|
{
|
||||||
|
"protoFiles": [
|
||||||
|
"burrow.proto",
|
||||||
|
],
|
||||||
|
"server": false,
|
||||||
|
"visibility": "public"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
10
Apple/Core/Client/swift-protobuf-config.json
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"invocations": [
|
||||||
|
{
|
||||||
|
"protoFiles": [
|
||||||
|
"burrow.proto",
|
||||||
|
],
|
||||||
|
"visibility": "public"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
19
Apple/Core/Logging.swift
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
import os
|
||||||
|
@_exported import OSLog
|
||||||
|
|
||||||
|
extension Logger {
|
||||||
|
private static let loggers: OSAllocatedUnfairLock<[String: Logger]> = OSAllocatedUnfairLock(initialState: [:])
|
||||||
|
|
||||||
|
public dynamic static var subsystem: String { "com.hackclub.burrow" }
|
||||||
|
|
||||||
|
public static func logger(for type: Any.Type) -> Logger {
|
||||||
|
let category = String(describing: type)
|
||||||
|
let logger = loggers.withLock { loggers in
|
||||||
|
if let logger = loggers[category] { return logger }
|
||||||
|
let logger = Logger(subsystem: subsystem, category: category)
|
||||||
|
loggers[category] = logger
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,133 +0,0 @@
|
||||||
import Foundation
|
|
||||||
import Network
|
|
||||||
import os
|
|
||||||
|
|
||||||
final class LineProtocol: NWProtocolFramerImplementation {
|
|
||||||
static let definition = NWProtocolFramer.Definition(implementation: LineProtocol.self)
|
|
||||||
static let label = "Lines"
|
|
||||||
init(framer: NWProtocolFramer.Instance) { }
|
|
||||||
func start(framer: NWProtocolFramer.Instance) -> NWProtocolFramer.StartResult { .ready }
|
|
||||||
func stop(framer: NWProtocolFramer.Instance) -> Bool { true }
|
|
||||||
func wakeup(framer: NWProtocolFramer.Instance) { }
|
|
||||||
func cleanup(framer: NWProtocolFramer.Instance) { }
|
|
||||||
func lines(from buffer: UnsafeMutableRawBufferPointer?) -> (lines: [Data], size: Int)? {
|
|
||||||
guard let buffer = buffer else { return nil }
|
|
||||||
let lines = buffer
|
|
||||||
.split(separator: 10)
|
|
||||||
guard !lines.isEmpty else { return nil }
|
|
||||||
let size = lines
|
|
||||||
.lazy
|
|
||||||
.map(\.count)
|
|
||||||
.reduce(0, +) + lines.count
|
|
||||||
let strings = lines
|
|
||||||
.lazy
|
|
||||||
.map { Data($0) }
|
|
||||||
return (lines: Array(strings), size: size)
|
|
||||||
}
|
|
||||||
func handleInput(framer: NWProtocolFramer.Instance) -> Int {
|
|
||||||
var result: [Data] = []
|
|
||||||
_ = framer.parseInput(minimumIncompleteLength: 1, maximumLength: 16_000) { buffer, _ in
|
|
||||||
guard let (lines, size) = lines(from: buffer) else {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
result = lines
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
for line in result {
|
|
||||||
framer.deliverInput(data: line, message: .init(instance: framer), isComplete: true)
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func handleOutput(
|
|
||||||
framer: NWProtocolFramer.Instance,
|
|
||||||
message: NWProtocolFramer.Message,
|
|
||||||
messageLength: Int,
|
|
||||||
isComplete: Bool
|
|
||||||
) {
|
|
||||||
do {
|
|
||||||
try framer.writeOutputNoCopy(length: messageLength)
|
|
||||||
} catch {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension NWConnection {
|
|
||||||
func receiveMessage() async throws -> (Data?, NWConnection.ContentContext?, Bool) {
|
|
||||||
try await withUnsafeThrowingContinuation { continuation in
|
|
||||||
receiveMessage { completeContent, contentContext, isComplete, error in
|
|
||||||
if let error = error {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
continuation.resume(returning: (completeContent, contentContext, isComplete))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func send_raw(_ request: Data) async throws -> Data {
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
let comp: NWConnection.SendCompletion = .contentProcessed {error in
|
|
||||||
if let error = error {
|
|
||||||
continuation.resume(with: .failure(error))
|
|
||||||
} else {
|
|
||||||
continuation.resume(with: .success(request))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.send(content: request, completion: comp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final class BurrowIpc {
|
|
||||||
let connection: NWConnection
|
|
||||||
private var generator = SystemRandomNumberGenerator()
|
|
||||||
private var logger: Logger
|
|
||||||
init(logger: Logger) {
|
|
||||||
let params = NWParameters.tcp
|
|
||||||
params.defaultProtocolStack
|
|
||||||
.applicationProtocols
|
|
||||||
.insert(NWProtocolFramer.Options(definition: LineProtocol.definition), at: 0)
|
|
||||||
let connection = NWConnection(to: .unix(path: "burrow.sock"), using: params)
|
|
||||||
connection.start(queue: .global())
|
|
||||||
self.connection = connection
|
|
||||||
self.logger = logger
|
|
||||||
}
|
|
||||||
func send<T: Request, U: Decodable>(_ request: T) async throws -> U {
|
|
||||||
do {
|
|
||||||
let id: UInt = generator.next(upperBound: UInt.max)
|
|
||||||
var copy = request
|
|
||||||
copy.id = id
|
|
||||||
var data = try JSONEncoder().encode(request)
|
|
||||||
data.append(contentsOf: [10])
|
|
||||||
_ = try await self.connection.send_raw(data)
|
|
||||||
return try JSONDecoder().decode(Response<U>.self, from: data).result
|
|
||||||
} catch {
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func receive_raw() async throws -> Data {
|
|
||||||
let (completeContent, _, _) = try await connection.receiveMessage()
|
|
||||||
self.logger.info("Received raw message response")
|
|
||||||
guard let data = completeContent else {
|
|
||||||
throw BurrowError.resultIsNone
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
func request<U: Decodable>(_ request: any Request, type: U.Type) async throws -> U {
|
|
||||||
do {
|
|
||||||
var data: Data = try JSONEncoder().encode(request)
|
|
||||||
data.append(contentsOf: [10])
|
|
||||||
_ = try await self.connection.send_raw(data)
|
|
||||||
self.logger.debug("message sent")
|
|
||||||
let receivedData = try await receive_raw()
|
|
||||||
self.logger.info("Received result: \(String(decoding: receivedData, as: UTF8.self))")
|
|
||||||
return try self.parse_response(receivedData)
|
|
||||||
} catch {
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func parse_response<U: Decodable>(_ response: Data) throws -> U {
|
|
||||||
try JSONDecoder().decode(U.self, from: response)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
import Foundation
|
|
||||||
|
|
||||||
// swiftlint:disable identifier_name
|
|
||||||
enum BurrowError: Error {
|
|
||||||
case addrDoesntExist
|
|
||||||
case resultIsError
|
|
||||||
case cantParseResult
|
|
||||||
case resultIsNone
|
|
||||||
}
|
|
||||||
|
|
||||||
protocol Request: Codable where CommandT: Codable {
|
|
||||||
associatedtype CommandT
|
|
||||||
var id: UInt { get set }
|
|
||||||
var command: CommandT { get set }
|
|
||||||
}
|
|
||||||
|
|
||||||
struct BurrowSingleCommand: Request {
|
|
||||||
var id: UInt
|
|
||||||
var command: String
|
|
||||||
}
|
|
||||||
|
|
||||||
struct BurrowRequest<T>: Request where T: Codable {
|
|
||||||
var id: UInt
|
|
||||||
var command: T
|
|
||||||
}
|
|
||||||
|
|
||||||
struct BurrowStartRequest: Codable {
|
|
||||||
struct TunOptions: Codable {
|
|
||||||
let name: String?
|
|
||||||
let no_pi: Bool
|
|
||||||
let tun_excl: Bool
|
|
||||||
let tun_retrieve: Bool
|
|
||||||
let address: String?
|
|
||||||
}
|
|
||||||
struct StartOptions: Codable {
|
|
||||||
let tun: TunOptions
|
|
||||||
}
|
|
||||||
let Start: StartOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
func start_req_fd(id: UInt) -> BurrowRequest<BurrowStartRequest> {
|
|
||||||
let command = BurrowStartRequest(Start: BurrowStartRequest.StartOptions(
|
|
||||||
tun: BurrowStartRequest.TunOptions(name: nil, no_pi: false, tun_excl: false, tun_retrieve: true, address: nil)
|
|
||||||
))
|
|
||||||
return BurrowRequest(id: id, command: command)
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Response<T>: Decodable where T: Decodable {
|
|
||||||
var id: UInt
|
|
||||||
var result: T
|
|
||||||
}
|
|
||||||
|
|
||||||
struct BurrowResult<T>: Codable where T: Codable {
|
|
||||||
var Ok: T?
|
|
||||||
var Err: String?
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ServerConfigData: Codable {
|
|
||||||
struct InternalConfig: Codable {
|
|
||||||
let address: String?
|
|
||||||
let name: String?
|
|
||||||
let mtu: Int32?
|
|
||||||
}
|
|
||||||
let ServerConfig: InternalConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
// swiftlint:enable identifier_name
|
|
||||||
|
|
@ -2,17 +2,19 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.network.client</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.network.server</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.developer.networking.networkextension</key>
|
<key>com.apple.developer.networking.networkextension</key>
|
||||||
<array>
|
<array>
|
||||||
<string>packet-tunnel-provider</string>
|
<string>packet-tunnel-provider</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>com.apple.security.app-sandbox</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(APP_GROUP_IDENTIFIER)</string>
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>com.apple.security.network.client</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.network.server</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,6 @@ PRODUCT_BUNDLE_IDENTIFIER = $(NETWORK_EXTENSION_BUNDLE_IDENTIFIER)
|
||||||
INFOPLIST_FILE = NetworkExtension/Info.plist
|
INFOPLIST_FILE = NetworkExtension/Info.plist
|
||||||
|
|
||||||
CODE_SIGN_ENTITLEMENTS = NetworkExtension/NetworkExtension-iOS.entitlements
|
CODE_SIGN_ENTITLEMENTS = NetworkExtension/NetworkExtension-iOS.entitlements
|
||||||
CODE_SIGN_ENTITLEMENTS[sdk=macos*] = NetworkExtension/NetworkExtension-macOS.entitlements
|
CODE_SIGN_ENTITLEMENTS[sdk=macosx*] = NetworkExtension/NetworkExtension-macOS.entitlements
|
||||||
|
|
||||||
SWIFT_INCLUDE_PATHS = $(inherited) $(PROJECT_DIR)/NetworkExtension
|
SWIFT_INCLUDE_PATHS = $(inherited) $(PROJECT_DIR)/NetworkExtension
|
||||||
|
|
|
||||||
|
|
@ -1,69 +1,74 @@
|
||||||
|
import AsyncAlgorithms
|
||||||
|
import BurrowConfiguration
|
||||||
|
import BurrowCore
|
||||||
import libburrow
|
import libburrow
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||||
let logger = Logger(subsystem: "com.hackclub.burrow", category: "frontend")
|
enum Error: Swift.Error {
|
||||||
var client: BurrowIpc?
|
case missingTunnelConfiguration
|
||||||
var osInitialized = false
|
|
||||||
override func startTunnel(options: [String: NSObject]? = nil) async throws {
|
|
||||||
logger.log("Starting tunnel")
|
|
||||||
if !osInitialized {
|
|
||||||
libburrow.initialize_oslog()
|
|
||||||
osInitialized = true
|
|
||||||
}
|
}
|
||||||
libburrow.start_srv()
|
|
||||||
client = BurrowIpc(logger: logger)
|
|
||||||
logger.info("Started server")
|
|
||||||
do {
|
|
||||||
let command = BurrowSingleCommand(id: 0, command: "ServerConfig")
|
|
||||||
guard let data = try await client?.request(command, type: Response<BurrowResult<ServerConfigData>>.self)
|
|
||||||
else {
|
|
||||||
throw BurrowError.cantParseResult
|
|
||||||
}
|
|
||||||
let encoded = try JSONEncoder().encode(data.result)
|
|
||||||
self.logger.log("Received final data: \(String(decoding: encoded, as: UTF8.self))")
|
|
||||||
guard let serverconfig = data.result.Ok else {
|
|
||||||
throw BurrowError.resultIsError
|
|
||||||
}
|
|
||||||
guard let tunNs = self.generateTunSettings(from: serverconfig) else {
|
|
||||||
throw BurrowError.addrDoesntExist
|
|
||||||
}
|
|
||||||
try await self.setTunnelNetworkSettings(tunNs)
|
|
||||||
self.logger.info("Set remote tunnel address to \(tunNs.tunnelRemoteAddress)")
|
|
||||||
|
|
||||||
// let tunFd = self.packetFlow.value(forKeyPath: "socket.fileDescriptor") as! Int;
|
private let logger = Logger.logger(for: PacketTunnelProvider.self)
|
||||||
// self.logger.info("Found File Descriptor: \(tunFd)")
|
|
||||||
let startCommand = start_req_fd(id: 1)
|
private var client: TunnelClient {
|
||||||
guard let data = try await client?.request(startCommand, type: Response<BurrowResult<String>>.self)
|
get throws { try _client.get() }
|
||||||
else {
|
|
||||||
throw BurrowError.cantParseResult
|
|
||||||
}
|
}
|
||||||
let encodedStartRes = try JSONEncoder().encode(data.result)
|
private let _client: Result<TunnelClient, Swift.Error> = Result {
|
||||||
self.logger.log("Received start server response: \(String(decoding: encodedStartRes, as: UTF8.self))")
|
try TunnelClient.unix(socketURL: Constants.socketURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
do {
|
||||||
|
libburrow.spawnInProcess(
|
||||||
|
socketPath: try Constants.socketURL.path(percentEncoded: false),
|
||||||
|
databasePath: try Constants.databaseURL.path(percentEncoded: false)
|
||||||
|
)
|
||||||
} catch {
|
} catch {
|
||||||
self.logger.error("An error occurred: \(error)")
|
logger.error("Failed to spawn networking thread: \(error)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func startTunnel(options: [String: NSObject]? = nil) async throws {
|
||||||
|
do {
|
||||||
|
let configuration = try await Array(client.tunnelConfiguration(.init()).prefix(1)).first
|
||||||
|
guard let settings = configuration?.settings else {
|
||||||
|
throw Error.missingTunnelConfiguration
|
||||||
|
}
|
||||||
|
try await setTunnelNetworkSettings(settings)
|
||||||
|
_ = try await client.tunnelStart(.init())
|
||||||
|
logger.log("Started tunnel with network settings: \(settings)")
|
||||||
|
} catch {
|
||||||
|
logger.error("Failed to start tunnel: \(error)")
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private func generateTunSettings(from: ServerConfigData) -> NETunnelNetworkSettings? {
|
|
||||||
let cfig = from.ServerConfig
|
|
||||||
guard let addr = cfig.address else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// Using a makeshift remote tunnel address
|
|
||||||
let nst = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "1.1.1.1")
|
|
||||||
nst.ipv4Settings = NEIPv4Settings(addresses: [addr], subnetMasks: ["255.255.255.0"])
|
|
||||||
logger.log("Initialized ipv4 settings: \(nst.ipv4Settings)")
|
|
||||||
return nst
|
|
||||||
}
|
|
||||||
override func stopTunnel(with reason: NEProviderStopReason) async {
|
override func stopTunnel(with reason: NEProviderStopReason) async {
|
||||||
}
|
do {
|
||||||
override func handleAppMessage(_ messageData: Data) async -> Data? {
|
_ = try await client.tunnelStop(.init())
|
||||||
messageData
|
logger.log("Stopped client")
|
||||||
}
|
} catch {
|
||||||
override func sleep() async {
|
logger.error("Failed to stop tunnel: \(error)")
|
||||||
}
|
}
|
||||||
override func wake() {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Burrow_TunnelConfigurationResponse {
|
||||||
|
fileprivate var settings: NEPacketTunnelNetworkSettings {
|
||||||
|
let ipv6Addresses = addresses.filter { IPv6Address($0) != nil }
|
||||||
|
|
||||||
|
let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "1.1.1.1")
|
||||||
|
settings.mtu = NSNumber(value: mtu)
|
||||||
|
settings.ipv4Settings = NEIPv4Settings(
|
||||||
|
addresses: addresses.filter { IPv4Address($0) != nil },
|
||||||
|
subnetMasks: ["255.255.255.0"]
|
||||||
|
)
|
||||||
|
settings.ipv6Settings = NEIPv6Settings(
|
||||||
|
addresses: ipv6Addresses,
|
||||||
|
networkPrefixLengths: ipv6Addresses.map { _ in 64 }
|
||||||
|
)
|
||||||
|
return settings
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,10 @@ CARGO_ARGS+=("--lib")
|
||||||
|
|
||||||
# Pass the configuration (Debug or Release) through to cargo
|
# Pass the configuration (Debug or Release) through to cargo
|
||||||
if [[ $SWIFT_ACTIVE_COMPILATION_CONDITIONS == *DEBUG* ]]; then
|
if [[ $SWIFT_ACTIVE_COMPILATION_CONDITIONS == *DEBUG* ]]; then
|
||||||
CARGO_DIR="debug"
|
CARGO_TARGET_SUBDIR="debug"
|
||||||
else
|
else
|
||||||
CARGO_ARGS+=("--release")
|
CARGO_ARGS+=("--release")
|
||||||
CARGO_DIR="release"
|
CARGO_TARGET_SUBDIR="release"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -x "$(command -v rustup)" ]]; then
|
if [[ -x "$(command -v rustup)" ]]; then
|
||||||
|
|
@ -68,13 +68,16 @@ else
|
||||||
CARGO_PATH="$(dirname $(readlink -f $(which cargo))):/usr/bin"
|
CARGO_PATH="$(dirname $(readlink -f $(which cargo))):/usr/bin"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PROTOC=$(readlink -f $(which protoc))
|
||||||
|
CARGO_PATH="$(dirname $PROTOC):$CARGO_PATH"
|
||||||
|
|
||||||
# Run cargo without the various environment variables set by Xcode.
|
# Run cargo without the various environment variables set by Xcode.
|
||||||
# Those variables can confuse cargo and the build scripts it runs.
|
# Those variables can confuse cargo and the build scripts it runs.
|
||||||
env -i PATH="$CARGO_PATH" cargo build "${CARGO_ARGS[@]}"
|
env -i PATH="$CARGO_PATH" PROTOC="$PROTOC" CARGO_TARGET_DIR="${CONFIGURATION_TEMP_DIR}/target" IPHONEOS_DEPLOYMENT_TARGET="$IPHONEOS_DEPLOYMENT_TARGET" MACOSX_DEPLOYMENT_TARGET="$MACOSX_DEPLOYMENT_TARGET" cargo build "${CARGO_ARGS[@]}"
|
||||||
|
|
||||||
mkdir -p "${BUILT_PRODUCTS_DIR}"
|
mkdir -p "${BUILT_PRODUCTS_DIR}"
|
||||||
|
|
||||||
# Use `lipo` to merge the architectures together into BUILT_PRODUCTS_DIR
|
# Use `lipo` to merge the architectures together into BUILT_PRODUCTS_DIR
|
||||||
/usr/bin/xcrun --sdk $PLATFORM_NAME lipo \
|
/usr/bin/xcrun --sdk $PLATFORM_NAME lipo \
|
||||||
-create $(printf "${PROJECT_DIR}/../target/%q/${CARGO_DIR}/libburrow.a " "${RUST_TARGETS[@]}") \
|
-create $(printf "${CONFIGURATION_TEMP_DIR}/target/%q/${CARGO_TARGET_SUBDIR}/libburrow.a " "${RUST_TARGETS[@]}") \
|
||||||
-output "${BUILT_PRODUCTS_DIR}/libburrow.a"
|
-output "${BUILT_PRODUCTS_DIR}/libburrow.a"
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
void start_srv();
|
__attribute__((__swift_name__("spawnInProcess(socketPath:databasePath:)")))
|
||||||
void initialize_oslog();
|
extern void spawn_in_process(const char * __nullable socket_path, const char * __nullable db_path);
|
||||||
|
|
|
||||||
BIN
Apple/Profiles/Burrow_Developer_ID.provisionprofile
Normal file
BIN
Apple/Profiles/Burrow_Network_Developer_ID.provisionprofile
Normal file
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/100.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/1024.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/114.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/120.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/128.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/144.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/152.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/16.png
Normal file
|
After Width: | Height: | Size: 684 B |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/167.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/172.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/180.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/196.png
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/20.png
Normal file
|
After Width: | Height: | Size: 927 B |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/216.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/256.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/29.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/32.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/40.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/48.png
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/50.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/512.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/55.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/57.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/58.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/60.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/64.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/72.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/76.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/80.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/87.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
Apple/UI/Assets.xcassets/AppIcon.appiconset/88.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
344
Apple/UI/Assets.xcassets/AppIcon.appiconset/Contents.json
Normal file
|
|
@ -0,0 +1,344 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "40.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "60.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "29.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "58.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "87.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "80.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "120.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "57.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "57x57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "114.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "57x57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "120.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "180.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "20.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "40.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "29.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "58.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "40.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "80.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "50.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "50x50"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "100.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "50x50"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "72.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "72x72"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "144.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "72x72"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "76.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "152.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "167.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "83.5x83.5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "1024.png",
|
||||||
|
"idiom" : "ios-marketing",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "16.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "16x16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "32.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "16x16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "32.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "32x32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "64.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "32x32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "128.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "256.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "256.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "512.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "512.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "1024.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "48.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "notificationCenter",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "24x24",
|
||||||
|
"subtype" : "38mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "55.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "notificationCenter",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "27.5x27.5",
|
||||||
|
"subtype" : "42mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "58.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "companionSettings",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "87.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "companionSettings",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "notificationCenter",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "33x33",
|
||||||
|
"subtype" : "45mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "80.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40",
|
||||||
|
"subtype" : "38mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "88.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "44x44",
|
||||||
|
"subtype" : "40mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "46x46",
|
||||||
|
"subtype" : "41mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "100.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "50x50",
|
||||||
|
"subtype" : "44mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "51x51",
|
||||||
|
"subtype" : "45mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "appLauncher",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "54x54",
|
||||||
|
"subtype" : "49mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "172.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "quickLook",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "86x86",
|
||||||
|
"subtype" : "38mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "196.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "quickLook",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "98x98",
|
||||||
|
"subtype" : "42mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "216.png",
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "quickLook",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "108x108",
|
||||||
|
"subtype" : "44mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "quickLook",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "117x117",
|
||||||
|
"subtype" : "45mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "watch",
|
||||||
|
"role" : "quickLook",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "129x129",
|
||||||
|
"subtype" : "49mm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "1024.png",
|
||||||
|
"idiom" : "watch-marketing",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Apple/UI/Assets.xcassets/HackClub.colorset/Contents.json
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x50",
|
||||||
|
"green" : "0x37",
|
||||||
|
"red" : "0xEC"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
12
Apple/UI/Assets.xcassets/HackClub.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "flag-standalone-wtransparent.pdf",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Apple/UI/Assets.xcassets/HackClub.imageset/flag-standalone-wtransparent.pdf
vendored
Normal file
20
Apple/UI/Assets.xcassets/WireGuard.colorset/Contents.json
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x1A",
|
||||||
|
"green" : "0x17",
|
||||||
|
"red" : "0x88"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Apple/UI/Assets.xcassets/WireGuard.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "WireGuard.svg",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true
|
||||||
|
}
|
||||||
|
}
|
||||||
6
Apple/UI/Assets.xcassets/WireGuard.imageset/WireGuard.svg
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg viewBox="0 0 46 79" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g stroke-width=".265" transform="matrix(1, 0, 0, 1, 144.316635, -78.301682)">
|
||||||
|
<path d="M -131.805 103.359 C -123.863 98.5 -113.717 101.469 -109.915 108.776 C -109.195 110.161 -109.103 112.293 -109.559 113.746 C -111.135 118.761 -114.855 121.574 -119.961 122.769 C -118.455 121.48 -117.257 120.019 -116.876 117.999 C -116.474 116.064 -116.911 114.05 -118.078 112.455 C -119.937 109.901 -123.263 108.888 -126.23 109.971 C -129.373 111.164 -131.095 114.033 -130.785 117.56 C -130.497 120.836 -128.011 122.959 -123.36 123.765 C -124.056 124.133 -124.591 124.404 -125.115 124.696 C -127.245 125.863 -129.099 127.475 -130.55 129.423 C -131.022 130.06 -131.347 130.112 -132.066 129.672 C -141.415 123.955 -142.016 109.605 -131.806 103.359 L -131.805 103.359 Z M -138.803 138.688 C -140.305 139.07 -141.761 139.634 -143.296 140.138 C -142.545 135.071 -136.612 130.404 -131.594 130.936 C -133.048 132.939 -133.896 135.317 -134.039 137.787 C -135.707 138.094 -137.278 138.301 -138.803 138.688 Z M -106.844 89.217 C -105.36 89.271 -103.873 89.248 -102.388 89.284 C -102.017 89.308 -101.649 89.359 -101.285 89.437 C -101.617 89.947 -101.992 90.428 -102.406 90.875 C -102.937 91.37 -103.537 91.853 -104.302 91.101 C -104.486 90.92 -104.921 90.962 -105.241 90.958 C -106.718 90.938 -108.197 90.891 -109.672 90.947 C -110.951 90.988 -112.227 91.118 -113.488 91.336 C -113.725 91.379 -114.078 92.165 -113.969 92.455 C -113.713 93.139 -113.339 93.893 -112.785 94.331 C -110.737 95.947 -108.559 97.399 -106.501 99.004 C -104.502 100.564 -102.641 102.274 -101.507 104.628 C -100.03 107.694 -99.987 110.91 -100.624 114.139 C -101.688 119.531 -104.416 123.998 -108.835 127.242 C -110.615 128.55 -112.819 129.292 -114.858 130.231 C -116.652 131.057 -118.498 131.769 -120.295 132.586 C -123.536 134.06 -125.357 137.577 -124.822 141.235 C -124.33 144.591 -121.386 147.392 -118.013 147.97 C -113.967 148.664 -109.792 146.034 -108.802 141.922 C -107.689 137.297 -110.202 133.168 -114.905 131.917 C -115.112 131.862 -115.32 131.81 -115.752 131.698 C -114.494 131.136 -113.407 130.735 -112.404 130.183 C -110.654 129.22 -108.936 128.201 -107.249 127.124 C -106.754 126.807 -106.486 126.807 -106.063 127.173 C -102.828 129.969 -100.899 133.448 -100.358 137.713 C -99.462 144.773 -102.804 151.259 -109.108 154.584 C -118.86 159.727 -130.794 153.873 -132.948 143.061 C -134.794 133.799 -128.257 125.399 -120.391 123.777 C -117.008 123.079 -113.914 121.671 -111.509 119.065 C -109.957 117.384 -109.205 115.942 -108.948 115.291 C -108.471 114.071 -108.227 112.772 -108.228 111.462 C -108.28 110.329 -108.546 109.216 -109.013 108.182 C -109.834 106.31 -112.98 103.332 -113.759 102.704 L -121.168 96.904 C -121.429 96.689 -121.723 96.705 -122.36 96.748 C -123.117 96.799 -125.053 96.906 -125.888 96.688 C -125.212 96.176 -123.371 95.432 -122.58 94.834 C -124.98 93.212 -127.721 93.798 -130.237 93.313 C -129.655 92.23 -126.776 90.564 -125.139 90.379 C -125.236 89.464 -125.385 88.556 -125.585 87.659 C -125.685 87.291 -126.096 86.934 -126.455 86.723 C -127.324 86.214 -128.246 85.793 -129.246 85.286 C -128.35 84.707 -127.313 84.386 -126.247 84.358 C -125.238 84.32 -124.228 84.418 -123.245 84.651 C -121.461 85.058 -120.037 84.792 -118.618 83.58 C -119.735 83.13 -120.852 82.719 -121.935 82.233 C -123.003 81.746 -124.043 81.202 -125.052 80.604 C -122.241 80.994 -119.523 82.048 -116.649 81.663 C -116.625 81.532 -116.6 81.402 -116.576 81.271 C -118.724 80.771 -120.873 80.271 -123.251 79.717 C -119.272 79.353 -115.567 79.293 -112.059 81.002 C -111.072 81.482 -110.039 81.88 -109.093 82.43 C -108.631 82.697 -108.321 83.225 -107.942 83.636 C -107.641 83.962 -107.4 84.399 -107.03 84.595 C -105.628 85.341 -104.084 85.37 -102.512 85.333 C -102.5 85.154 -102.489 84.986 -102.477 84.806 C -100.894 85.3 -99.113 87.125 -99.116 88.458 C -101.68 88.458 -104.242 88.449 -106.804 88.473 C -107.077 88.475 -107.349 88.675 -107.622 88.784 C -107.363 88.935 -107.108 89.207 -106.844 89.217 Z" style="fill: rgb(255, 255, 255);"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4 KiB |