From 5fe2d0a78bc75a3e160548c2072b631bbf7574c7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 23 Aug 2024 00:12:33 -0400 Subject: [PATCH 001/313] forgejo-ci: deploy to $branch-testing when PR is a WIP --- .forgejo/bin/deploy.sh | 8 ++++++++ .forgejo/workflows/build-aarch64.yaml | 7 ++++++- .forgejo/workflows/build-x86_64.yaml | 8 +++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/deploy.sh b/.forgejo/bin/deploy.sh index 3138b69..3a4fb0a 100755 --- a/.forgejo/bin/deploy.sh +++ b/.forgejo/bin/deploy.sh @@ -14,6 +14,14 @@ for apk in $apkgs; do arch=$(echo $apk | awk -F '/' '{print $3}') name=$(echo $apk | awk -F '/' '{print $4}') + if [ "$(curl -s $GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/pulls/$GITHUB_EVENT_NUMBER | jq .draft)" == "true" ]; then + # if draft, send to -testing branch + branch="$branch-testing" + else + # if not draft, assume that this was sent to $branch-testing and nuke it + curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN -X DELETE $TARGET_REPO/$BASEBRANCH/$branch-testing/$arch/$name + fi + echo "Sending $name of arch $arch to $TARGET_REPO/$BASEBRANCH/$branch" return=$(curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN --upload-file $apk $TARGET_REPO/$BASEBRANCH/$branch 2>&1) echo $return diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index d6738b2..429ed0b 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -2,6 +2,10 @@ on: pull_request: types: [ assigned, opened, synchronize, reopened ] +concurrency: + group: ${{ github.head_ref || github.ref_name }} + cancel-in-progress: true + jobs: build-aarch64: runs-on: aarch64 @@ -41,9 +45,10 @@ jobs: CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} + GITHUB_EVENT_NUMBER: ${{ github.event.number }} steps: - name: Setting up environment - run: apk add nodejs curl findutils git gawk + run: apk add nodejs curl findutils git gawk jq - name: Repo pull uses: actions/checkout@v4 - name: Package download diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 8731799..90c62cc 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -2,6 +2,10 @@ on: pull_request: types: [ assigned, opened, synchronize, reopened ] +concurrency: + group: ${{ github.head_ref || github.ref_name }} + cancel-in-progress: true + jobs: build-x86_64: runs-on: x86_64 @@ -41,12 +45,14 @@ jobs: CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} + GITHUB_EVENT_NUMBER: ${{ github.event.number }} steps: - name: Setting up environment - run: apk add nodejs curl findutils git gawk + run: apk add nodejs curl findutils git gawk jq - name: Repo pull uses: actions/checkout@v4 - name: Package download uses: forgejo/download-artifact@v3 - name: Package deployment run: ${{ github.workspace }}/.forgejo/bin/deploy.sh + From 013f4597b1d576143dc349395e84c47a2cab01e2 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 23 Aug 2024 00:12:53 -0400 Subject: [PATCH 002/313] user/codeberg-pages-server: new aport --- .forgejo/workflows/build-x86_64.yaml | 1 - user/codeberg-pages-server/APKBUILD | 45 +++++++++++++++++++ .../codeberg-pages-server.openrc | 30 +++++++++++++ .../codeberg-pages-server.post-install | 39 ++++++++++++++++ .../codeberg-pages-server.post-upgrade | 1 + .../codeberg-pages-server.pre-install | 26 +++++++++++ .../upgrade-go-sqlite3-to-1.14.19.patch | 26 +++++++++++ 7 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 user/codeberg-pages-server/APKBUILD create mode 100644 user/codeberg-pages-server/codeberg-pages-server.openrc create mode 100755 user/codeberg-pages-server/codeberg-pages-server.post-install create mode 120000 user/codeberg-pages-server/codeberg-pages-server.post-upgrade create mode 100644 user/codeberg-pages-server/codeberg-pages-server.pre-install create mode 100644 user/codeberg-pages-server/upgrade-go-sqlite3-to-1.14.19.patch diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 90c62cc..9b9e451 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -55,4 +55,3 @@ jobs: uses: forgejo/download-artifact@v3 - name: Package deployment run: ${{ github.workspace }}/.forgejo/bin/deploy.sh - diff --git a/user/codeberg-pages-server/APKBUILD b/user/codeberg-pages-server/APKBUILD new file mode 100644 index 0000000..5eab680 --- /dev/null +++ b/user/codeberg-pages-server/APKBUILD @@ -0,0 +1,45 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=codeberg-pages-server +pkgver=5.1 +pkgrel=0 +pkgdesc="The Codeberg Pages Server – with custom domain support, per-repo pages using the "pages" branch, caching and more." +url="https://codeberg.org/Codeberg/pages-server" +arch="all" +license="EUPL-1.2" +depends="nginx" +makedepends="go just" +# tests disabled for now +options="!check" +install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install" +source=" + $pkgname-$pkgver.tar.gz::https://codeberg.org/Codeberg/pages-server/archive/v$pkgver.tar.gz + codeberg-pages-server.openrc + upgrade-go-sqlite3-to-1.14.19.patch + " +builddir="$srcdir/"pages-server +subpackages="$pkgname-openrc" +pkgusers="git" +pkggroups="www-data" + +export GOPATH=$srcdir/go +export GOCACHE=$srcdir/go-build +export GOTMPDIR=$srcdir + +build() { + just build +} + +package() { + msg "Packaging $pkgname" + install -Dm755 "$builddir"/build/codeberg-pages-server "$pkgdir"/usr/bin/codeberg-pages-server + + install -Dm755 "$srcdir"/$pkgname.openrc \ + "$pkgdir"/etc/init.d/$pkgname +} + +sha512sums=" +55a1dd5ed0f1cb2aaad1066eca8bfbd1d537169ed3712c748163ebff64edc45d05ac1f6f062433e232e2638a790232438282f96dd7410eb4cbaff7208f5f2427 codeberg-pages-server-5.1.tar.gz +4defb4fe3a4230f4aa517fbecd5e5b8bcef2a64e1b40615660ae9eec33597310a09df5e126f4d39ce7764bd1716c0a7040637699135c103cbc1879593c6c06f1 codeberg-pages-server.openrc +895f1c8d22fcf1d5491a6fe0ce5d93201f83b6dd5fc81b24016b609988fb6c66fdde75bb3830f385a5c83d96366ca3a5f4f9524f52058b6c5dfd8b80d14bac5b upgrade-go-sqlite3-to-1.14.19.patch +" diff --git a/user/codeberg-pages-server/codeberg-pages-server.openrc b/user/codeberg-pages-server/codeberg-pages-server.openrc new file mode 100644 index 0000000..a036393 --- /dev/null +++ b/user/codeberg-pages-server/codeberg-pages-server.openrc @@ -0,0 +1,30 @@ +#!/sbin/openrc-run + +name="$RC_SVCNAME" +cfgfile="/etc/conf.d/$RC_SVCNAME.conf" +pidfile="/run/$RC_SVCNAME.pid" +working_directory="/usr/share/webapps/authentik" +command="/usr/share/webapps/authentik/server" +command_user="authentik" +command_group="authentik" +start_stop_daemon_args="" +command_background="yes" +output_log="/var/log/authentik/$RC_SVCNAME.log" +error_log="/var/log/authentik/$RC_SVCNAME.err" + +depend() { + need redis + need postgresql +} + +start_pre() { + cd "$working_directory" + checkpath --directory --owner $command_user:$command_group --mode 0775 \ + /var/log/authentik \ + /var/lib/authentik/certs +} + +stop_pre() { + ebegin "Killing child processes" + kill $(ps -o pid= --ppid $(cat $pidfile)) || true +} diff --git a/user/codeberg-pages-server/codeberg-pages-server.post-install b/user/codeberg-pages-server/codeberg-pages-server.post-install new file mode 100755 index 0000000..a715d20 --- /dev/null +++ b/user/codeberg-pages-server/codeberg-pages-server.post-install @@ -0,0 +1,39 @@ +#!/bin/sh +set -eu + +group=authentik +config_file='/etc/authentik/config.yml' + +setcap 'cap_net_bind_service=+ep' /usr/share/webapps/authentik/server + +if [ $(grep '@@SECRET_KEY@@' "$config_file") ]; then + echo "* Generating random secret in $config_file" >&2 + + secret_key="$(pwgen -s 50 1)" + sed -i "s|@@SECRET_KEY@@|$secret_key|" "$config_file" + chown root:$group "$config_file" +fi + +if [ "${0##*.}" = 'post-upgrade' ]; then + cat >&2 <<-EOF + * + * To finish Authentik upgrade run: + * + * authentik-manage migrate + * + EOF +else + cat >&2 <<-EOF + * + * 1. Adjust settings in /etc/authentik/config.yml. + * + * 2. Create database for Authentik: + * + * psql -c "CREATE ROLE authentik PASSWORD 'top-secret' INHERIT LOGIN;" + * psql -c "CREATE DATABASE authentik OWNER authentik ENCODING 'UTF-8';" + * + * 3. Run "authentik-manage migrate" + * 4. Setup admin user at https:///if/flow/initial-setup/ + * + EOF +fi diff --git a/user/codeberg-pages-server/codeberg-pages-server.post-upgrade b/user/codeberg-pages-server/codeberg-pages-server.post-upgrade new file mode 120000 index 0000000..d7ffea2 --- /dev/null +++ b/user/codeberg-pages-server/codeberg-pages-server.post-upgrade @@ -0,0 +1 @@ +codeberg-pages-server.post-install \ No newline at end of file diff --git a/user/codeberg-pages-server/codeberg-pages-server.pre-install b/user/codeberg-pages-server/codeberg-pages-server.pre-install new file mode 100644 index 0000000..792f304 --- /dev/null +++ b/user/codeberg-pages-server/codeberg-pages-server.pre-install @@ -0,0 +1,26 @@ +#!/bin/sh +# It's very important to set user/group correctly. + +authentik_dir='/var/lib/authentik' + +if ! getent group authentik 1>/dev/null; then + echo '* Creating group authentik' 1>&2 + + addgroup -S authentik +fi + +if ! id authentik 2>/dev/null 1>&2; then + echo '* Creating user authentik' 1>&2 + + adduser -DHS -G authentik -h "$authentik_dir" -s /bin/sh \ + -g "added by apk for authentik" authentik + passwd -u authentik 1>/dev/null # unlock +fi + +if ! id -Gn authentik | grep -Fq redis; then + echo '* Adding user authentik to group redis' 1>&2 + + addgroup authentik redis +fi + +exit 0 diff --git a/user/codeberg-pages-server/upgrade-go-sqlite3-to-1.14.19.patch b/user/codeberg-pages-server/upgrade-go-sqlite3-to-1.14.19.patch new file mode 100644 index 0000000..fabb214 --- /dev/null +++ b/user/codeberg-pages-server/upgrade-go-sqlite3-to-1.14.19.patch @@ -0,0 +1,26 @@ +diff --git a/go.mod.orig b/go.mod +index eba292e..00310e5 100644 +--- a/go.mod.orig ++++ b/go.mod +@@ -11,7 +11,7 @@ require ( + github.com/go-sql-driver/mysql v1.6.0 + github.com/joho/godotenv v1.4.0 + github.com/lib/pq v1.10.7 +- github.com/mattn/go-sqlite3 v1.14.16 ++ github.com/mattn/go-sqlite3 v1.14.19 + github.com/microcosm-cc/bluemonday v1.0.26 + github.com/reugn/equalizer v0.0.0-20210216135016-a959c509d7ad + github.com/rs/zerolog v1.27.0 +diff --git a/go.sum.orig b/go.sum +index 7ea8b78..19145ea 100644 +--- a/go.sum.orig ++++ b/go.sum +@@ -479,6 +479,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m + github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= + github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= + github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= ++github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= ++github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= + github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= + github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= + github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= From ac72de14fccf3c9d7e86ada9cda6ae8f7439ee0f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 24 Aug 2024 21:29:31 -0400 Subject: [PATCH 003/313] forgejo-ci: build.sh is now local rather than patched --- .forgejo/bin/build.sh | 260 ++++++++++++++++++++++++++ .forgejo/patches/build.patch | 66 ------- .forgejo/workflows/build-aarch64.yaml | 4 +- .forgejo/workflows/build-x86_64.yaml | 4 +- 4 files changed, 262 insertions(+), 72 deletions(-) create mode 100755 .forgejo/bin/build.sh delete mode 100644 .forgejo/patches/build.patch diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh new file mode 100755 index 0000000..d9e327f --- /dev/null +++ b/.forgejo/bin/build.sh @@ -0,0 +1,260 @@ +#!/bin/sh +# shellcheck disable=SC3043 + +. /usr/local/lib/functions.sh + +# shellcheck disable=SC3040 +set -eu -o pipefail + +readonly APORTSDIR=$CI_PROJECT_DIR +readonly REPOS="backports user" +readonly ALPINE_REPOS="main community testing" +readonly ARCH=$(apk --print-arch) +# gitlab variables +readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME + +: "${REPODEST:=$HOME/packages}" +: "${MIRROR:=https://ayakael.net/api/packages/forge/alpine}" +: "${ALPINE_MIRROR:=http://dl-cdn.alpinelinux.org/alpine}" +: "${MAX_ARTIFACT_SIZE:=300000000}" #300M +: "${CI_DEBUG_BUILD:=}" + +: "${CI_ALPINE_BUILD_OFFSET:=0}" +: "${CI_ALPINE_BUILD_LIMIT:=9999}" + +msg() { + local color=${2:-green} + case "$color" in + red) color="31";; + green) color="32";; + yellow) color="33";; + blue) color="34";; + *) color="32";; + esac + printf "\033[1;%sm>>>\033[1;0m %s\n" "$color" "$1" | xargs >&2 +} + +verbose() { + echo "> " "$@" + # shellcheck disable=SC2068 + $@ +} + +debugging() { + [ -n "$CI_DEBUG_BUILD" ] +} + +debug() { + if debugging; then + verbose "$@" + fi +} + +die() { + msg "$1" red + exit 1 +} + +capture_stderr() { + "$@" 2>&1 +} + +report() { + report=$1 + + reportsdir=$APORTSDIR/logs/ + mkdir -p "$reportsdir" + + tee -a "$reportsdir/$report.log" +} + +get_release() { + case $BASEBRANCH in + v*) echo "$BASEBRANCH";; + edge) echo edge;; + *) die "Branch \"$BASEBRANCH\" not supported!" + esac +} + +build_aport() { + local repo="$1" aport="$2" + cd "$APORTSDIR/$repo/$aport" + if abuild -r 2>&1 | report "build-$aport"; then + checkapk 2>&1 | report "checkapk-$aport" || true + aport_ok="$aport_ok $repo/$aport" + else + aport_ng="$aport_ng $repo/$aport" + fi +} + +check_aport() { + local repo="$1" aport="$2" + cd "$APORTSDIR/$repo/$aport" + if ! abuild check_arch 2>/dev/null; then + aport_na="$aport_na $repo/$aport" + return 1 + fi +} + +set_repositories_for() { + local target_repo="$1" repos='' repo='' + local release + + release=$(get_release) + for repo in $REPOS; do + [ "$repo" = "non-free" ] && continue + [ "$release" == "edge" ] && [ "$repo" == "backports" ] && continue + repos="$repos $MIRROR/$release/$repo $REPODEST/$repo" + [ "$repo" = "$target_repo" ] && break + done + doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" + doas apk update || true +} + +apply_offset_limit() { + start=$1 + limit=$2 + end=$((start+limit)) + + sed -n "$((start+1)),${end}p" +} + +setup_system() { + local repos='' repo='' + local release + + release=$(get_release) + for repo in $ALPINE_REPOS; do + [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue + repos="$repos $ALPINE_MIRROR/$release/$repo" + done + doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" + doas apk -U upgrade -a || apk fix || die "Failed to up/downgrade system" + abuild-keygen -ain + doas sed -i -E 's/export JOBS=[0-9]+$/export JOBS=$(nproc)/' /etc/abuild.conf + ( . /etc/abuild.conf && echo "Building with $JOBS jobs" ) + mkdir -p "$REPODEST" + git config --global init.defaultBranch master +} + +sysinfo() { + printf ">>> Host system information (arch: %s, release: %s) <<<\n" "$ARCH" "$(get_release)" + printf "- Number of Cores: %s\n" "$(nproc)" + printf "- Memory: %s Gb\n" "$(awk '/^MemTotal/ {print ($2/1024/1024)}' /proc/meminfo)" + printf "- Free space: %s\n" "$(df -hP / | awk '/\/$/ {print $4}')" +} + +copy_artifacts() { + cd "$APORTSDIR" + + packages_size="$(du -sk "$REPODEST" | awk '{print $1 * 1024}')" + if [ -z "$packages_size" ]; then + return + fi + + echo "Artifact size: $packages_size bytes" + + mkdir -p keys/ packages/ + + if [ "$packages_size" -lt $MAX_ARTIFACT_SIZE ]; then + msg "Copying packages for artifact upload" + cp -ar "$REPODEST"/* packages/ 2>/dev/null + cp ~/.abuild/*.rsa.pub keys/ + else + msg "Artifact size $packages_size larger than max ($MAX_ARTIFACT_SIZE), skipping uploading them" yellow + fi +} + +section_start setup "Setting up the system" collapse + +if debugging; then + set -x +fi + +aport_ok= +aport_na= +aport_ng= +failed= + +sysinfo || true +setup_system || die "Failed to setup system" + +# git no longer allows to execute in repositories owned by different users +doas chown -R buildozer: . + +fetch_flags="-qn" +debugging && fetch_flags="-v" + +git fetch $fetch_flags "$CI_MERGE_REQUEST_PROJECT_URL" \ + "+refs/heads/$BASEBRANCH:refs/heads/$BASEBRANCH" + +if debugging; then + merge_base=$(git merge-base "$BASEBRANCH" HEAD) || echo "Could not determine merge-base" + echo "Merge base: $merge_base" + git --version + git config -l + [ -n "$merge_base" ] && git tag -f merge-base "$merge_base" + git --no-pager log -200 --oneline --graph --decorate --all +fi + +section_end setup + +build_start=$CI_ALPINE_BUILD_OFFSET +build_limit=$CI_ALPINE_BUILD_LIMIT + +for repo in $(changed_repos); do + set_repositories_for "$repo" + built_aports=0 + changed_aports_in_repo=$(changed_aports "$repo") + changed_aports_in_repo_count=$(echo "$changed_aports_in_repo" | wc -l) + changed_aports_to_build=$(echo "$changed_aports_in_repo" | apply_offset_limit "$build_start" "$build_limit") + + msg "Changed aports in $repo:" + # shellcheck disable=SC2086 # Splitting is expected here + printf " - %s\n" $changed_aports_to_build + for pkgname in $changed_aports_to_build; do + section_start "build_$pkgname" "Building package $pkgname" + built_aports=$((built_aports+1)) + if check_aport "$repo" "$pkgname"; then + build_aport "$repo" "$pkgname" + fi + section_end "build_$pkgname" + done + + build_start=$((build_start-(changed_aports_in_repo_count-built_aports))) + build_limit=$((build_limit-built_aports)) + + if [ $build_limit -le 0 ]; then + msg "Limit reached, breaking" + break + fi +done + +section_start artifacts "Handeling artifacts" collapse +copy_artifacts || true +section_end artifacts + +section_start summary "Build summary" + +echo "### Build summary ###" + +for ok in $aport_ok; do + msg "$ok: build succesfully" +done + +for na in $aport_na; do + msg "$na: disabled for $ARCH" yellow +done + +for ng in $aport_ng; do + msg "$ng: build failed" red + failed=true +done +section_end summary + +if [ "$failed" = true ]; then + exit 1 +elif [ -z "$aport_ok" ]; then + msg "No packages found to be built." yellow +fi + diff --git a/.forgejo/patches/build.patch b/.forgejo/patches/build.patch deleted file mode 100644 index 842dd75..0000000 --- a/.forgejo/patches/build.patch +++ /dev/null @@ -1,66 +0,0 @@ -diff --git a/usr/local/bin/build.sh.orig b/usr/local/bin/build.sh -old mode 100644 -new mode 100755 -index c3b8f7a..f609018 ---- a/usr/local/bin/build.sh.orig -+++ b/usr/local/bin/build.sh -@@ -7,13 +7,15 @@ - set -eu -o pipefail - - readonly APORTSDIR=$CI_PROJECT_DIR --readonly REPOS="main community testing non-free" -+readonly REPOS="backports user" -+readonly ALPINE_REPOS="main community testing" - readonly ARCH=$(apk --print-arch) - # gitlab variables - readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - : "${REPODEST:=$HOME/packages}" --: "${MIRROR:=https://dl-cdn.alpinelinux.org/alpine}" -+: "${MIRROR:=https://ayakael.net/api/packages/forge/alpine}" -+: "${ALPINE_MIRROR:=http://dl-cdn.alpinelinux.org/alpine}" - : "${MAX_ARTIFACT_SIZE:=300000000}" #300M - : "${CI_DEBUG_BUILD:=}" - -@@ -68,8 +70,8 @@ report() { - - get_release() { - case $BASEBRANCH in -- *-stable) echo v"${BASEBRANCH%-*}";; -- master) echo edge;; -+ v*) echo "$BASEBRANCH";; -+ edge) echo edge;; - *) die "Branch \"$BASEBRANCH\" not supported!" - esac - } -@@ -101,11 +103,11 @@ set_repositories_for() { - release=$(get_release) - for repo in $REPOS; do - [ "$repo" = "non-free" ] && continue -- [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue -+ [ "$release" == "edge" ] && [ "$repo" == "backports" ] && continue - repos="$repos $MIRROR/$release/$repo $REPODEST/$repo" - [ "$repo" = "$target_repo" ] && break - done -- doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" -+ doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" - doas apk update - } - -@@ -118,7 +120,15 @@ apply_offset_limit() { - } - - setup_system() { -- doas sh -c "echo $MIRROR/$(get_release)/main > /etc/apk/repositories" -+ local repos='' repo='' -+ local release -+ -+ release=$(get_release) -+ for repo in $ALPINE_REPOS; do -+ [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue -+ repos="$repos $ALPINE_MIRROR/$release/$repo" -+ done -+ doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" - doas apk -U upgrade -a || apk fix || die "Failed to up/downgrade system" - abuild-keygen -ain - doas sed -i -E 's/export JOBS=[0-9]+$/export JOBS=$(nproc)/' /etc/abuild.conf diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index 429ed0b..885560f 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -27,9 +27,7 @@ jobs: with: fetch-depth: 500 - name: Package build - run: | - doas patch -d / -p1 -i ${{ github.workspace }}/.forgejo/patches/build.patch - build.sh + run: ${{ github.workspace }}/.forgejo/bin/build.sh - name: Package upload uses: forgejo/upload-artifact@v3 with: diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 9b9e451..6451bf7 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -27,9 +27,7 @@ jobs: with: fetch-depth: 500 - name: Package build - run: | - doas patch -d / -p1 -i ${{ github.workspace }}/.forgejo/patches/build.patch - build.sh + run: ${{ github.workspace }}/.forgejo/bin/build.sh - name: Package upload uses: forgejo/upload-artifact@v3 with: From d6e00b639541a23337bfaaa746c4fc50d6da74d3 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 Aug 2024 10:57:30 -0400 Subject: [PATCH 004/313] forgejo-ci: build.sh is now local rather than patched --- .forgejo/bin/build.sh | 260 ++++++++++++++++++++++++++ .forgejo/patches/build.patch | 66 ------- .forgejo/workflows/build-aarch64.yaml | 4 +- .forgejo/workflows/build-x86_64.yaml | 4 +- 4 files changed, 262 insertions(+), 72 deletions(-) create mode 100755 .forgejo/bin/build.sh delete mode 100644 .forgejo/patches/build.patch diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh new file mode 100755 index 0000000..8c732ec --- /dev/null +++ b/.forgejo/bin/build.sh @@ -0,0 +1,260 @@ +#!/bin/sh +# shellcheck disable=SC3043 + +. /usr/local/lib/functions.sh + +# shellcheck disable=SC3040 +set -eu -o pipefail + +readonly APORTSDIR=$CI_PROJECT_DIR +readonly REPOS="backports user" +readonly ALPINE_REPOS="main community testing" +readonly ARCH=$(apk --print-arch) +# gitlab variables +readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME + +: "${REPODEST:=$HOME/packages}" +: "${MIRROR:=https://ayakael.net/api/packages/forge/alpine}" +: "${ALPINE_MIRROR:=http://dl-cdn.alpinelinux.org/alpine}" +: "${MAX_ARTIFACT_SIZE:=300000000}" #300M +: "${CI_DEBUG_BUILD:=}" + +: "${CI_ALPINE_BUILD_OFFSET:=0}" +: "${CI_ALPINE_BUILD_LIMIT:=9999}" + +msg() { + local color=${2:-green} + case "$color" in + red) color="31";; + green) color="32";; + yellow) color="33";; + blue) color="34";; + *) color="32";; + esac + printf "\033[1;%sm>>>\033[1;0m %s\n" "$color" "$1" | xargs >&2 +} + +verbose() { + echo "> " "$@" + # shellcheck disable=SC2068 + $@ +} + +debugging() { + [ -n "$CI_DEBUG_BUILD" ] +} + +debug() { + if debugging; then + verbose "$@" + fi +} + +die() { + msg "$1" red + exit 1 +} + +capture_stderr() { + "$@" 2>&1 +} + +report() { + report=$1 + + reportsdir=$APORTSDIR/logs/ + mkdir -p "$reportsdir" + + tee -a "$reportsdir/$report.log" +} + +get_release() { + case $BASEBRANCH in + v*) echo "$BASEBRANCH";; + edge) echo edge;; + *) die "Branch \"$BASEBRANCH\" not supported!" + esac +} + +build_aport() { + local repo="$1" aport="$2" + cd "$APORTSDIR/$repo/$aport" + if abuild -r 2>&1 | report "build-$aport"; then + checkapk 2>&1 | report "checkapk-$aport" || true + aport_ok="$aport_ok $repo/$aport" + else + aport_ng="$aport_ng $repo/$aport" + fi +} + +check_aport() { + local repo="$1" aport="$2" + cd "$APORTSDIR/$repo/$aport" + if ! abuild check_arch 2>/dev/null; then + aport_na="$aport_na $repo/$aport" + return 1 + fi +} + +set_repositories_for() { + local target_repo="$1" repos='' repo='' + local release + + release=$(get_release) + for repo in $REPOS; do + [ "$repo" = "non-free" ] && continue + [ "$release" == "edge" ] && [ "$repo" == "backports" ] && continue + repos="$repos $MIRROR/$release/$repo $REPODEST/$repo" + [ "$repo" = "$target_repo" ] && break + done + doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" + doas apk update +} + +apply_offset_limit() { + start=$1 + limit=$2 + end=$((start+limit)) + + sed -n "$((start+1)),${end}p" +} + +setup_system() { + local repos='' repo='' + local release + + release=$(get_release) + for repo in $ALPINE_REPOS; do + [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue + repos="$repos $ALPINE_MIRROR/$release/$repo" + done + doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" + doas apk -U upgrade -a || apk fix || die "Failed to up/downgrade system" + abuild-keygen -ain + doas sed -i -E 's/export JOBS=[0-9]+$/export JOBS=$(nproc)/' /etc/abuild.conf + ( . /etc/abuild.conf && echo "Building with $JOBS jobs" ) + mkdir -p "$REPODEST" + git config --global init.defaultBranch master +} + +sysinfo() { + printf ">>> Host system information (arch: %s, release: %s) <<<\n" "$ARCH" "$(get_release)" + printf "- Number of Cores: %s\n" "$(nproc)" + printf "- Memory: %s Gb\n" "$(awk '/^MemTotal/ {print ($2/1024/1024)}' /proc/meminfo)" + printf "- Free space: %s\n" "$(df -hP / | awk '/\/$/ {print $4}')" +} + +copy_artifacts() { + cd "$APORTSDIR" + + packages_size="$(du -sk "$REPODEST" | awk '{print $1 * 1024}')" + if [ -z "$packages_size" ]; then + return + fi + + echo "Artifact size: $packages_size bytes" + + mkdir -p keys/ packages/ + + if [ "$packages_size" -lt $MAX_ARTIFACT_SIZE ]; then + msg "Copying packages for artifact upload" + cp -ar "$REPODEST"/* packages/ 2>/dev/null + cp ~/.abuild/*.rsa.pub keys/ + else + msg "Artifact size $packages_size larger than max ($MAX_ARTIFACT_SIZE), skipping uploading them" yellow + fi +} + +section_start setup "Setting up the system" collapse + +if debugging; then + set -x +fi + +aport_ok= +aport_na= +aport_ng= +failed= + +sysinfo || true +setup_system || die "Failed to setup system" + +# git no longer allows to execute in repositories owned by different users +doas chown -R buildozer: . + +fetch_flags="-qn" +debugging && fetch_flags="-v" + +git fetch $fetch_flags "$CI_MERGE_REQUEST_PROJECT_URL" \ + "+refs/heads/$BASEBRANCH:refs/heads/$BASEBRANCH" + +if debugging; then + merge_base=$(git merge-base "$BASEBRANCH" HEAD) || echo "Could not determine merge-base" + echo "Merge base: $merge_base" + git --version + git config -l + [ -n "$merge_base" ] && git tag -f merge-base "$merge_base" + git --no-pager log -200 --oneline --graph --decorate --all +fi + +section_end setup + +build_start=$CI_ALPINE_BUILD_OFFSET +build_limit=$CI_ALPINE_BUILD_LIMIT + +for repo in $(changed_repos); do + set_repositories_for "$repo" + built_aports=0 + changed_aports_in_repo=$(changed_aports "$repo") + changed_aports_in_repo_count=$(echo "$changed_aports_in_repo" | wc -l) + changed_aports_to_build=$(echo "$changed_aports_in_repo" | apply_offset_limit "$build_start" "$build_limit") + + msg "Changed aports in $repo:" + # shellcheck disable=SC2086 # Splitting is expected here + printf " - %s\n" $changed_aports_to_build + for pkgname in $changed_aports_to_build; do + section_start "build_$pkgname" "Building package $pkgname" + built_aports=$((built_aports+1)) + if check_aport "$repo" "$pkgname"; then + build_aport "$repo" "$pkgname" + fi + section_end "build_$pkgname" + done + + build_start=$((build_start-(changed_aports_in_repo_count-built_aports))) + build_limit=$((build_limit-built_aports)) + + if [ $build_limit -le 0 ]; then + msg "Limit reached, breaking" + break + fi +done + +section_start artifacts "Handeling artifacts" collapse +copy_artifacts || true +section_end artifacts + +section_start summary "Build summary" + +echo "### Build summary ###" + +for ok in $aport_ok; do + msg "$ok: build succesfully" +done + +for na in $aport_na; do + msg "$na: disabled for $ARCH" yellow +done + +for ng in $aport_ng; do + msg "$ng: build failed" red + failed=true +done +section_end summary + +if [ "$failed" = true ]; then + exit 1 +elif [ -z "$aport_ok" ]; then + msg "No packages found to be built." yellow +fi + diff --git a/.forgejo/patches/build.patch b/.forgejo/patches/build.patch deleted file mode 100644 index 842dd75..0000000 --- a/.forgejo/patches/build.patch +++ /dev/null @@ -1,66 +0,0 @@ -diff --git a/usr/local/bin/build.sh.orig b/usr/local/bin/build.sh -old mode 100644 -new mode 100755 -index c3b8f7a..f609018 ---- a/usr/local/bin/build.sh.orig -+++ b/usr/local/bin/build.sh -@@ -7,13 +7,15 @@ - set -eu -o pipefail - - readonly APORTSDIR=$CI_PROJECT_DIR --readonly REPOS="main community testing non-free" -+readonly REPOS="backports user" -+readonly ALPINE_REPOS="main community testing" - readonly ARCH=$(apk --print-arch) - # gitlab variables - readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - : "${REPODEST:=$HOME/packages}" --: "${MIRROR:=https://dl-cdn.alpinelinux.org/alpine}" -+: "${MIRROR:=https://ayakael.net/api/packages/forge/alpine}" -+: "${ALPINE_MIRROR:=http://dl-cdn.alpinelinux.org/alpine}" - : "${MAX_ARTIFACT_SIZE:=300000000}" #300M - : "${CI_DEBUG_BUILD:=}" - -@@ -68,8 +70,8 @@ report() { - - get_release() { - case $BASEBRANCH in -- *-stable) echo v"${BASEBRANCH%-*}";; -- master) echo edge;; -+ v*) echo "$BASEBRANCH";; -+ edge) echo edge;; - *) die "Branch \"$BASEBRANCH\" not supported!" - esac - } -@@ -101,11 +103,11 @@ set_repositories_for() { - release=$(get_release) - for repo in $REPOS; do - [ "$repo" = "non-free" ] && continue -- [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue -+ [ "$release" == "edge" ] && [ "$repo" == "backports" ] && continue - repos="$repos $MIRROR/$release/$repo $REPODEST/$repo" - [ "$repo" = "$target_repo" ] && break - done -- doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" -+ doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" - doas apk update - } - -@@ -118,7 +120,15 @@ apply_offset_limit() { - } - - setup_system() { -- doas sh -c "echo $MIRROR/$(get_release)/main > /etc/apk/repositories" -+ local repos='' repo='' -+ local release -+ -+ release=$(get_release) -+ for repo in $ALPINE_REPOS; do -+ [ "$release" != "edge" ] && [ "$repo" == "testing" ] && continue -+ repos="$repos $ALPINE_MIRROR/$release/$repo" -+ done -+ doas sh -c "printf '%s\n' $repos > /etc/apk/repositories" - doas apk -U upgrade -a || apk fix || die "Failed to up/downgrade system" - abuild-keygen -ain - doas sed -i -E 's/export JOBS=[0-9]+$/export JOBS=$(nproc)/' /etc/abuild.conf diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index d6738b2..aed3fe8 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -23,9 +23,7 @@ jobs: with: fetch-depth: 500 - name: Package build - run: | - doas patch -d / -p1 -i ${{ github.workspace }}/.forgejo/patches/build.patch - build.sh + run: ${{ github.workspace }}/.forgejo/bin/build.sh - name: Package upload uses: forgejo/upload-artifact@v3 with: diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 8731799..a174e45 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -23,9 +23,7 @@ jobs: with: fetch-depth: 500 - name: Package build - run: | - doas patch -d / -p1 -i ${{ github.workspace }}/.forgejo/patches/build.patch - build.sh + run: ${{ github.workspace }}/.forgejo/bin/build.sh - name: Package upload uses: forgejo/upload-artifact@v3 with: From 888654be5cd996e3163aa2a7fc8c7bffe3a8c932 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 Aug 2024 10:05:30 -0400 Subject: [PATCH 005/313] user/rmfakecloud: upgrade to 0.0.19 --- user/rmfakecloud/APKBUILD | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/user/rmfakecloud/APKBUILD b/user/rmfakecloud/APKBUILD index 1bdaac4..4bc816e 100644 --- a/user/rmfakecloud/APKBUILD +++ b/user/rmfakecloud/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) pkgname=rmfakecloud -pkgver=0.0.17 +pkgver=0.0.19 _gittag=v$pkgver pkgrel=0 pkgdesc="A selfhosted cloud for the Remarkable Tablet" @@ -10,7 +10,7 @@ url="https://github.com/ddvk/rmfakecloud" arch="all" license="AGPL-3.0-only" makedepends="go yarn" -options="chmod-clean" +options="chmod-clean net" source=" $pkgname-$pkgver.tar.gz::https://github.com/ddvk/rmfakecloud/archive/v$pkgver.tar.gz rmfakecloud.conf @@ -18,20 +18,6 @@ source=" " subpackages="$pkgname-openrc" -case "$CTARGET_ARCH" in - aarch64)export GOARCH="arm64" ;; - armel) export GOARCH="arm" GOARM=5 ;; - armhf) export GOARCH="arm" GOARM=6 ;; - armv7) export GOARCH="arm" GOARM=7 ;; - s390x) export GOARCH="s390x" ;; - x86) export GOARCH="386" ;; - x86_64) export GOARCH="amd64" ;; - ppc64) export GOARCH="ppc64" ;; - ppc64le) export GOARCH="ppc64le" ;; - riscv64) export GOARCH="riscv64" ;; - *) export GOARCH="unsupported";; -esac - build() { export GOPATH="$srcdir/go" export LDFLAGS="$LDFLAGS -X main.version=$pkgver" @@ -51,7 +37,7 @@ package() { install -Dm755 "$srcdir"/rmfakecloud.openrc "$pkgdir"/etc/init.d/rmfakecloud } sha512sums=" -2836364ba7a0c70b33f5914e357a87fb681275268a1cd5e1b6eba91037017c57f6a24b1bcecf9daa423c2588128ce591c2066d8af1d89eedccca231d24671748 rmfakecloud-0.0.17.tar.gz +55948ede5f8a4cc9e74c9c68f83d14dec4950f23da5ef053f3ae708edf2643f64e5736abfe63cbf6700e5277adff7167ce0f228a8241169261f4ce59e2815a35 rmfakecloud-0.0.19.tar.gz d5677cef282085cd6642a034dd258ffa294862aeb0ce81d6485a524a15564849bc4eb90a9d1fa4dbcf4eab69dcd893302aa06493fc8fad74d69200c2bdf246c0 rmfakecloud.conf 891d0945886796132f951293e081046334857563b4ebae28a3aa5b6bc37768767c49ce102de645ed8340af2518de606be8bf6ecafeb6d189dd937970aa3e6498 rmfakecloud.openrc " From 68130cdf8aaf21e688b99b0f40af85dc375fcfc1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 Aug 2024 21:14:06 -0400 Subject: [PATCH 006/313] user/zotero: upgrade to 7.0.3 --- user/zotero/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/zotero/APKBUILD b/user/zotero/APKBUILD index 09790c7..f6c9803 100644 --- a/user/zotero/APKBUILD +++ b/user/zotero/APKBUILD @@ -1,7 +1,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=zotero -pkgver=7.0.0 +pkgver=7.0.3 pkgrel=0 _fxver=115.9.1 _gittag=$pkgver @@ -96,7 +96,7 @@ source="https://ftp.mozilla.org/pub/firefox/releases/${_fxver}esr/source/firefox vendor-prefs.js zotero.desktop - https://lab.ilot.io/mirrors/zotero-client/-/releases/$_gittag/downloads/tarball/zotero-client-$_gittag.tar.gz + https://ayakael.net/api/packages/mirrors/generic/zotero/$pkgver/zotero-$pkgver.tar.gz zotero_build-modifications.patch zotero_test-drop-build.patch zotero_test-fix-chars.patch @@ -105,7 +105,7 @@ source="https://ftp.mozilla.org/pub/firefox/releases/${_fxver}esr/source/firefox " builddir="$srcdir"/firefox-$_fxver -_zoterodir="$srcdir"/zotero-client-$_gittag +_zoterodir="$srcdir"/zotero-$_gittag _mozappdir=/usr/lib/zotero # help our shared-object scanner to find the libs @@ -391,7 +391,7 @@ f8c3555ef6207933cbffbf4fc101a9b4c0d2990c0063162f0f0bde70ef0b46f86bfac42e71106951 382510375b1a2fa79be0ab79e3391a021ae2c022429ffbaa7e7a69166f99bb56d01e59a1b10688592a29238f21c9d6977672bd77f9fae439b66bdfe0c55ddb15 mozilla-location.keys fc45bc3ffb9404e5338ea26a9f04807b40f6f516324972cddd48bedb91b8bd7c6b8d4e03a0209020f5e67b703bc4ff89389985791b9bd544a0fc3951e2dc338e vendor-prefs.js e1a0a4ff5cc1b53f13776ca11927d671426b0691e78e74a4adf2166d57bb2ae8ac409cc11a37ce5e2f680fdf05d5bc3849c33a9717aca1bb62d03ae5231a67fb zotero.desktop -4d6146d127153bfe7069e32cc3e4ec4c491d8cc4371034d569427bdf486d1cd39ade8e668cfe7dd0453844f935a4eba60832dd5492a247236fac75ce6928e36a zotero-client-7.0.0.tar.gz +48c7106f0d20b5f1fba2a4b846282c627a5654ac8579f8a7cdb202b187416311f5eb32827ac6e972d1815348bd2ad00bd10bcff1a4ca8efc9b4b07b4e3e825dc zotero-7.0.3.tar.gz 746dbabbb3ea9199d17891e2079b9256d04843f548132178862117d2334694d98e2cc981945d72f31d0e5b2c42904d371633f6905996bb580aa0b5ae95c64ddc zotero_build-modifications.patch 337070ee4c44ccb35c6b6290c18327740bb9fccfd1a6ad1045782e83daa290b6ced7d53955d3a889f661d588738a64f2e7f383639f4c46be9fdf891168abc9ff zotero_test-drop-build.patch f0e4f09496531222e8400959f9ef12852bca269eb3bf4c3b87ccaf92f28a12b9374461a1c79ad294a4393dbe30800aa1c85497033d0bc304fa8c198dfab3efd2 zotero_test-fix-chars.patch From a6e60edfd946c0b92a6c42a2eced1d4da0f355e5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 3 Sep 2024 07:52:53 -0400 Subject: [PATCH 007/313] user/rstudio-desktop: enable build --- user/rstudio-desktop/APKBUILD | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user/rstudio-desktop/APKBUILD b/user/rstudio-desktop/APKBUILD index 958ac4b..27b21ce 100644 --- a/user/rstudio-desktop/APKBUILD +++ b/user/rstudio-desktop/APKBUILD @@ -7,14 +7,14 @@ _gittag=v2023.03.0+386 _panmirrortag=aea3027882718af657d60221818c3ff35f413219 pkgrel=0 pkgdesc="A powerful and productive integrated development environment (IDE) for R programming language" -#arch="x86_64" +arch="x86_64" url="https://www.rstudio.com/products/rstudio/" license='AGPL3' options="!check" # No testsuite # missing quarto-cli depends=" R>=3.0.1 - clang14 + clang15 hunspell-en libldap lxqt-config @@ -23,6 +23,7 @@ depends=" sqlite " makedepends=" + bash apache-ant boost-dev cmake>=3.1.0 From d00a14e6952a280c04669be0c3830b41f1851005 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 3 Sep 2024 12:14:10 -0400 Subject: [PATCH 008/313] forgejo: always create artifacts for build stage --- .forgejo/workflows/build-aarch64.yaml | 4 +++- .forgejo/workflows/build-x86_64.yaml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index aed3fe8..59f90c9 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -23,7 +23,9 @@ jobs: with: fetch-depth: 500 - name: Package build - run: ${{ github.workspace }}/.forgejo/bin/build.sh + run: | + ${{ github.workspace }}/.forgejo/bin/build.sh + touch packages/dummy - name: Package upload uses: forgejo/upload-artifact@v3 with: diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index a174e45..298a213 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -23,7 +23,9 @@ jobs: with: fetch-depth: 500 - name: Package build - run: ${{ github.workspace }}/.forgejo/bin/build.sh + run: | + ${{ github.workspace }}/.forgejo/bin/build.sh + touch packages/dummy - name: Package upload uses: forgejo/upload-artifact@v3 with: From 021b81131e87066224e038c416668961ed460445 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 3 Sep 2024 12:22:25 -0400 Subject: [PATCH 009/313] user/mathjax2: bump pkgrel --- user/mathjax2/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/mathjax2/APKBUILD b/user/mathjax2/APKBUILD index bc78cb6..ceb2b15 100644 --- a/user/mathjax2/APKBUILD +++ b/user/mathjax2/APKBUILD @@ -3,7 +3,7 @@ pkgname=mathjax2 pkgver=2.7.9 -pkgrel=0 +pkgrel=1 pkgdesc="An open source JavaScript display engine for mathematics that works in all modern browsers" url="https://www.mathjax.org/" arch=noarch From 743ceb8dbe6cae3c4e95d2a57072f7b6f19e2141 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 5 Sep 2024 16:05:34 -0400 Subject: [PATCH 010/313] backports/signal-desktop: upgrade to 7.22.2 --- backports/signal-desktop/APKBUILD | 74 +++++++++---------- .../signal-desktop/libsignal-auditable.patch | 16 ++-- .../signal-fix-dns-fallback.patch | 12 --- .../signal-show-window-please.patch | 14 ++-- ...l-c7019036-do-not-define-crypto_addc.patch | 25 +++++++ ...my-wife.patch => webrtc-shared-libs.patch} | 12 +++ 6 files changed, 87 insertions(+), 66 deletions(-) delete mode 100644 backports/signal-desktop/signal-fix-dns-fallback.patch create mode 100644 backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch rename backports/signal-desktop/{webrtc-shared-like-my-wife.patch => webrtc-shared-libs.patch} (68%) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index b804d51..ce68f67 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.11.0 +pkgver=7.22.2 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -42,6 +42,7 @@ makedepends=" libsecret-dev libvpx-dev libwebp-dev + libxml2-dev lld llvm-dev mesa-dev @@ -63,14 +64,14 @@ makedepends=" options="net !check" # follow signal-desktop package.json -> @signalapp/libsignal-client -_libsignalver=0.46.2 +_libsignalver=0.55.1 # follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.42.0 +_ringrtcver=2.46.1 # follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) -_webrtcver=6261i +_webrtcver=6478j # follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION # last bsqlite version: 8.7.1 @@ -80,7 +81,7 @@ source=" https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz https://github.com/signalapp/libsignal/archive/refs/tags/v$_libsignalver/libsignal-$_libsignalver.tar.gz https://github.com/signalapp/ringrtc/archive/refs/tags/v$_ringrtcver/ringrtc-$_ringrtcver.tar.gz - https://ab-sn.lnl.gay/webrtc-$_webrtcver.tar.zst + https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst https://github.com/signalapp/Signal-FTS5-Extension/archive/refs/tags/v$_stokenizerver/stokenizer-$_stokenizerver.tar.gz bettersqlite-use-system-sqlcipher.patch @@ -88,11 +89,11 @@ source=" signal-disable-updates.patch signal-update-links.patch signal-show-window-please.patch - signal-fix-dns-fallback.patch ringrtc-webrtc-renamed.patch - webrtc-shared-like-my-wife.patch + webrtc-shared-libs.patch webrtc-compiler.patch webrtc-gcc13.patch + webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch signal-desktop " @@ -195,8 +196,7 @@ prepare() { done msg "Installing signal-desktop JS dependencies" - echo 'ignore-engines true' > .yarnrc - yarn --ignore-scripts --frozen-lockfile + npm ci --ignore-scripts ( cd "$srcdir"/webrtc-$_webrtcver @@ -283,7 +283,7 @@ prepare() { cd "$srcdir"/ringrtc-$_ringrtcver/src/node msg "Installing ringrtc js dependencies" - yarn --frozen-lockfile --ignore-scripts + npm ci --ignore-scripts ) ( @@ -293,7 +293,7 @@ prepare() { sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' binding.gyp msg "Installing libsignal js dependencies" - yarn --ignore-scripts --frozen-lockfile + npm install --ignore-scripts ) # remove shipped fonts for system-provided (part 1) @@ -359,10 +359,11 @@ build() { ( cd "$srcdir"/ringrtc-$_ringrtcver/src/node msg "Building ringrtc JS glue code" - yarn build + npm ci --ignore-scripts + npm run build msg "Cleaning dev dependencies for ringrtc" - yarn --ignore-scripts --frozen-lockfile --production + npm prune --ignore-scripts --omit=dev ) # module on npm intentionally unbuildable: https://github.com/signalapp/libsignal/issues/464#issuecomment-1160665052 @@ -370,17 +371,18 @@ build() { cd "$srcdir"/libsignal-$_libsignalver/node msg "Building libsignal" - yarn node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source - yarn node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source + node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source + node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source mkdir -p prebuilds/linux-$chromium_arch mv build/Release/libsignal_client_linux_$chromium_arch.node prebuilds/linux-$chromium_arch/node.napi.node msg "Building libsignal glue code" - yarn tsc + npm ci --ignore-scripts + npm run tsc msg "Cleaning dev dependencies for libsignal" - yarn --ignore-scripts --frozen-lockfile --production + npm prune -ignore-scripts --omit=dev ) ( @@ -392,31 +394,21 @@ build() { ) # from package.json postinstall - yarn build:acknowledgments - yarn patch-package + npm run build:acknowledgments + npm exec patch-package rm -rf node_modules/dtrace-provider # get esbuild installed (needed for next step) - npm rebuild esbuild + npm install esbuild # build front NODE_ENV=production \ SIGNAL_ENV=production \ NODE_OPTIONS=--openssl-legacy-provider \ - yarn build:dev + npm run build:dev # purge non-production deps - yarn install --ignore-scripts --frozen-lockfile --production - - # XXX: the previous step undoes the patches. and removes the patch applier. - # please force me to just implement packaging without dev modules in tasje. -lnl - for x in patches/*.patch; do - # some of these patches are made for devDependencies - if [ -d "$(grep -Eo 'node_modules/(@[a-z\d_-]+/)?[a-z\d_-]+/' "$x" | head -n1)" ]; then - msg "$x" - patch -Np1 -i ./"$x" - fi - done + npm prune --ignore-scripts --omit=dev # use our libsignal rm -rf node_modules/@signalapp/libsignal-client/ @@ -451,7 +443,7 @@ build() { check() { # tests run against downloaded build of electron for glibc, probably can be patched - yarn test + npm run test } package() { @@ -472,20 +464,20 @@ package() { } sha512sums=" -cebb1c8412089fe6f5faa9d4bfcb8bb4e8c9d2f3e4a13eef15e8f36d97b4bc65eae3c0865af0a7c82a0af2fd0597482b3d7c1f25e7d51465ea2589c817183b19 Signal-Desktop-7.11.0.tar.gz -6be40fcfbcb9bd20c51dd9ef1c65e7f586fbbee04af66af89a5b8c0ce3fa2ce5efd586e10de1d6d5c579126ed4bb2f31e50a8448ed5390d12e226cd075537007 libsignal-0.46.2.tar.gz -5cb7e88e8c04244a8f4727237dd0662357eb84dfb384de57c6579f01f0c53944d019a2af29efe37c4d30993fdba4be6f9bd9f7975ac24e43207fe814e0b95f95 ringrtc-2.42.0.tar.gz -89796d611bd7cda7c0e98318826753b1acc373396d77f2a0a826bf95e9e28d2c0f33181705b50b1afc52fdf12dbf3d35e30ad86b0ce3052ed9131ea20c842d04 webrtc-6261i.tar.zst +20d09f64ddb8e42f314aa1538df55e4fa18b1b1b647a1434bd38122fe26cbf18c699f81d415e751dbec1888d0eb5020fb366129bf293cd28e26eaacf456bcbfb Signal-Desktop-7.22.2.tar.gz +2179eb6862ceb9e3a1df04a4e9b9bb3d64ce84f017d3048f0aaafdd4960843230216443139ff1a8127b6901e9859a2f2ed59e12f2ba9ffc906f79107d7fc161f libsignal-0.55.1.tar.gz +c941e7016e96acbba615a9ba12d91882f83b64656b40b6de26e1dc21abf4aea29ed49459c5bd60e43df65a93103cb6878d3d7bb17c597fd88a807c3f6e71c41e ringrtc-2.46.1.tar.gz +0de4999800eea98bd38d785fcf6683a6f431f98483ca91dcf8ca721d5eecd197043db564bacd2dc583442fe3b43affda61c02230b044b4d4c05fbb6e11741ea5 webrtc-6478j.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch -92de6fc7cc5f2b6d65bedbd74cc733dd86dafc9cbfb9b727c3267aef63a71a07247cde9b163c68fddfeb9096dcd7f554d36d0b2de078d8905e3825645ddbd6eb libsignal-auditable.patch +2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch 152435231cdcf52a17a9e24aadf95d77511258e818172941ba074a73a90a541f0136feb58868674f2bcb19191a6d12933fe6cd5baf3ee99e508915c72523163b signal-disable-updates.patch d50eb5724502df9ea4d795db8cfc27af767c25168d7db2af512e615be7cc2ca290210a9ae78e1abb153c0198677e858ad3d74926c958099d0319295e7d9e7f1d signal-update-links.patch -646d303fe58cae3f0896ae0275a66695b902fae6ddde7c568cc9798157dee9f45ceff907bc951fadc4c511d512a73d114b4e4f7c8914e2311c63929d29e1621a signal-show-window-please.patch -3df878d259cdc12fe116651e9978deb6c15b5bce477d692b2301f17bc660327b29ac4412cfd6966bd0cef15c90675c56ce7c3abd8e2119899cc5d281ab1d9474 signal-fix-dns-fallback.patch +bfc8acdd13aa48d29c7657311733cc9d33c4899782efbd1ef6d25ad1698be4de7cc67e829324bc0309715d69ae37ea9f782cf54887317e817213e110d73d68e7 signal-show-window-please.patch b11fdd930943ca327650e4738ed85cd6b5eea779455a5895bccebba98e449bafc6b0f09bcf4545f2b2e16644355664e9768dd6d4d62f87619207c430367f72c5 ringrtc-webrtc-renamed.patch -9d92389637cdda83a0a7039fa6c52516d7bc491d0b1e42d5374b9d1f4fa7b9c930642f2dca896da17a2dc3344fa1bb97434c8dddd0539a4fedfd0dec809fc875 webrtc-shared-like-my-wife.patch +f4e80ed7e67b98d6988c69ab5025286be17db29dc90f90bf837133cd8ae737f46293e6a2432b02f98c300ed461653b5a66801ff957a418c6a7c33877e3fe0443 webrtc-shared-libs.patch e07ae8544988d402aaf0fbd95ea36a64c94c59566c561132578aa6dcf8ff11a34058530e64dc204e5cadc2482f1401e74b32384a144e5e08017c663d0cf7c2fc webrtc-compiler.patch 88515d8b8cc82355c9f9b0f44fac83b7ff149b13e9fb102fd46036ec5234cfb2385fa5ad58a0520ee604b93dc4ddd6ae18a7005978ef207841645724ef7a9749 webrtc-gcc13.patch +2721dce75ed1b6cd8bff129cd90d05ea07ce61cafd9145913748cb1f4e58d4c042c3c43efc578ad84e15624937b7ed67b8d5fec3d764e7feb26ff28f86cacd77 webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch 87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop " diff --git a/backports/signal-desktop/libsignal-auditable.patch b/backports/signal-desktop/libsignal-auditable.patch index bdf59ab..c5c8f8a 100644 --- a/backports/signal-desktop/libsignal-auditable.patch +++ b/backports/signal-desktop/libsignal-auditable.patch @@ -1,11 +1,13 @@ ---- ./node/build_node_bridge.py.orig -+++ ./node/build_node_bridge.py -@@ -63,7 +63,7 @@ +diff --git a/node/build_node_bridge.py.orig b/node/build_node_bridge.py +index e75c2d0..3bdb328 100755 +--- a/node/build_node_bridge.py.orig ++++ b/node/build_node_bridge.py +@@ -97,7 +97,7 @@ def main(args: Optional[List[str]] = None) -> int: + if 'npm_config_libsignal_debug_level_logs' not in os.environ: + features.append('log/release_max_level_info') - out_dir = options.out_dir.strip('"') or os.path.join('build', configuration_name) - -- cmdline = ['cargo', 'build', '--target', cargo_target, '-p', 'libsignal-node', '--features', 'testing-fns'] -+ cmdline = ['cargo', 'auditable', 'build', '--target', cargo_target, '-p', 'libsignal-node', '--features', 'testing-fns'] +- cmdline = ['cargo', 'build', '--target', cargo_target, '-p', 'libsignal-node', '--features', ','.join(features)] ++ cmdline = ['cargo', 'auditable', 'build', '--target', cargo_target, '-p', 'libsignal-node', '--features', ','.join(features)] if configuration_name == 'Release': cmdline.append('--release') print("Running '%s'" % (' '.join(cmdline))) diff --git a/backports/signal-desktop/signal-fix-dns-fallback.patch b/backports/signal-desktop/signal-fix-dns-fallback.patch deleted file mode 100644 index b4f54be..0000000 --- a/backports/signal-desktop/signal-fix-dns-fallback.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/ts/scripts/generate-dns-fallback.ts.orig b/ts/scripts/generate-dns-fallback.ts -index dec7023..39f442f 100644 ---- a/ts/scripts/generate-dns-fallback.ts.orig -+++ b/ts/scripts/generate-dns-fallback.ts -@@ -20,7 +20,6 @@ const FALLBACK_DOMAINS = [ - 'cdn3.signal.org', - 'updates2.signal.org', - 'sfu.voip.signal.org', -- 'create.signal.art', - ]; - - async function main() { diff --git a/backports/signal-desktop/signal-show-window-please.patch b/backports/signal-desktop/signal-show-window-please.patch index 39c8381..73c94af 100644 --- a/backports/signal-desktop/signal-show-window-please.patch +++ b/backports/signal-desktop/signal-show-window-please.patch @@ -1,11 +1,13 @@ ---- ./app/main.ts.orig -+++ ./app/main.ts -@@ -721,7 +721,7 @@ - const titleBarOverlay = await getTitleBarOverlay(); +diff --git a/app/main.ts.orig b/app/main.ts +index aa1bec8..bd7c1d5 100644 +--- a/app/main.ts.orig ++++ b/app/main.ts +@@ -690,7 +690,7 @@ async function createWindow() { + : DEFAULT_HEIGHT; const windowOptions: Electron.BrowserWindowConstructorOptions = { - show: false, + show: true, - width: DEFAULT_WIDTH, - height: DEFAULT_HEIGHT, + width, + height, minWidth: MIN_WIDTH, diff --git a/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch b/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch new file mode 100644 index 0000000..5eb6919 --- /dev/null +++ b/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch @@ -0,0 +1,25 @@ +diff --git a/third_party/boringssl/src/crypto/internal.h b/third_party/boringssl/src/crypto/internal.h +index a77102d76..a45f97bcc 100644 +--- a/third_party/boringssl/src/crypto/internal.h ++++ b/third_party/boringssl/src/crypto/internal.h +@@ -1174,6 +1174,11 @@ static inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) { + + // Arithmetic functions. + ++// The most efficient versions of these functions on GCC and Clang depend on C11 ++// |_Generic|. If we ever need to call these from C++, we'll need to add a ++// variant that uses C++ overloads instead. ++#if !defined(__cplusplus) ++ + // CRYPTO_addc_* returns |x + y + carry|, and sets |*out_carry| to the carry + // bit. |carry| must be zero or one. + #if OPENSSL_HAS_BUILTIN(__builtin_addc) +@@ -1275,6 +1280,8 @@ static inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow, + #define CRYPTO_subc_w CRYPTO_subc_u32 + #endif + ++#endif // !__cplusplus ++ + + // FIPS functions. + diff --git a/backports/signal-desktop/webrtc-shared-like-my-wife.patch b/backports/signal-desktop/webrtc-shared-libs.patch similarity index 68% rename from backports/signal-desktop/webrtc-shared-like-my-wife.patch rename to backports/signal-desktop/webrtc-shared-libs.patch index bd7115a..7bfbd7f 100644 --- a/backports/signal-desktop/webrtc-shared-like-my-wife.patch +++ b/backports/signal-desktop/webrtc-shared-libs.patch @@ -26,3 +26,15 @@ suppressed_configs += [ "//build/config/compiler:thin_archive" ] defines = [] +diff --git a/third_party/googletest/BUILD.gn.orig b/third_party/googletest/BUILD.gn +index 14089f0..b7dc621 100644 +--- a/third_party/googletest/BUILD.gn.orig ++++ b/third_party/googletest/BUILD.gn +@@ -48,7 +48,6 @@ config("gtest_config") { + + configs = [ + "//third_party/abseil-cpp:absl_include_config", +- "//third_party/re2:re2_config", + ] + } + From 7ffb4b3105657408c99c64bf360be6df9bc814c9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 9 Sep 2024 13:27:21 -0400 Subject: [PATCH 011/313] backports/signal-desktop: upgrade to 7.23.0 --- backports/signal-desktop/APKBUILD | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index ce68f67..47e3475 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.22.2 +pkgver=7.23.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -67,14 +67,14 @@ options="net !check" _libsignalver=0.55.1 # follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.46.1 +_ringrtcver=2.46.2 # follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) -_webrtcver=6478j +_webrtcver=6478k # follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION -# last bsqlite version: 8.7.1 +# last bsqlite version: 8.8.0 _stokenizerver=0.2.1 source=" @@ -464,10 +464,10 @@ package() { } sha512sums=" -20d09f64ddb8e42f314aa1538df55e4fa18b1b1b647a1434bd38122fe26cbf18c699f81d415e751dbec1888d0eb5020fb366129bf293cd28e26eaacf456bcbfb Signal-Desktop-7.22.2.tar.gz +b0dafc7e689ddd60aee36c0d5c0ce6335c1ba36050cdc5036225caf3fc9645d2103f403b7765eed3c82ede3247790905e53bbcc0e7365b053f3000eefe02de1d Signal-Desktop-7.23.0.tar.gz 2179eb6862ceb9e3a1df04a4e9b9bb3d64ce84f017d3048f0aaafdd4960843230216443139ff1a8127b6901e9859a2f2ed59e12f2ba9ffc906f79107d7fc161f libsignal-0.55.1.tar.gz -c941e7016e96acbba615a9ba12d91882f83b64656b40b6de26e1dc21abf4aea29ed49459c5bd60e43df65a93103cb6878d3d7bb17c597fd88a807c3f6e71c41e ringrtc-2.46.1.tar.gz -0de4999800eea98bd38d785fcf6683a6f431f98483ca91dcf8ca721d5eecd197043db564bacd2dc583442fe3b43affda61c02230b044b4d4c05fbb6e11741ea5 webrtc-6478j.tar.zst +ff85a50d39cf0a431e813d091e94cb0c7e4298a2eb7d85c23d034ebf83a33f0032d81717a65265a1a8dfa66453923ba0051135f8cbca1f98c1b43d506270130e ringrtc-2.46.2.tar.gz +33877b01787834ebf77b98028e04c8201a53daea4671f445c2ce6a3be6a6befbdc6dcc9c03da0582d10b547cb63c0bfeed9ffa5ca04e1d586abd6c09355ec853 webrtc-6478k.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch From 8ffac41cb87d23846eb52cdd7ea743e0f409648a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 12 Sep 2024 13:11:30 -0400 Subject: [PATCH 012/313] backports/signal-desktop: upgrade to 7.24.0 --- backports/signal-desktop/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 47e3475..aca8b8c 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.23.0 +pkgver=7.24.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -81,7 +81,7 @@ source=" https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz https://github.com/signalapp/libsignal/archive/refs/tags/v$_libsignalver/libsignal-$_libsignalver.tar.gz https://github.com/signalapp/ringrtc/archive/refs/tags/v$_ringrtcver/ringrtc-$_ringrtcver.tar.gz - https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst + https://ayakael.net/api/packages/mirrors/generic/signal-desktop/v$pkgver/webrtc-$_webrtcver.tar.zst https://github.com/signalapp/Signal-FTS5-Extension/archive/refs/tags/v$_stokenizerver/stokenizer-$_stokenizerver.tar.gz bettersqlite-use-system-sqlcipher.patch @@ -464,10 +464,10 @@ package() { } sha512sums=" -b0dafc7e689ddd60aee36c0d5c0ce6335c1ba36050cdc5036225caf3fc9645d2103f403b7765eed3c82ede3247790905e53bbcc0e7365b053f3000eefe02de1d Signal-Desktop-7.23.0.tar.gz +df9f49462b5dcc6379c36e2179e2aa8f896a4ca8de1d7270e71be30e3f80321b8b0eec8d93e99624628a8af01a287a2a0e52457e8b302d5f1bbda8d30eaa77a8 Signal-Desktop-7.24.0.tar.gz 2179eb6862ceb9e3a1df04a4e9b9bb3d64ce84f017d3048f0aaafdd4960843230216443139ff1a8127b6901e9859a2f2ed59e12f2ba9ffc906f79107d7fc161f libsignal-0.55.1.tar.gz ff85a50d39cf0a431e813d091e94cb0c7e4298a2eb7d85c23d034ebf83a33f0032d81717a65265a1a8dfa66453923ba0051135f8cbca1f98c1b43d506270130e ringrtc-2.46.2.tar.gz -33877b01787834ebf77b98028e04c8201a53daea4671f445c2ce6a3be6a6befbdc6dcc9c03da0582d10b547cb63c0bfeed9ffa5ca04e1d586abd6c09355ec853 webrtc-6478k.tar.zst +98b239a10dfdd972d2dbb62950f461935d831f3f305a4b236667dd31d35da504a8bf45c28eb74c045dce84a225ef4d1bbf97a70eda03183cf56bcc65995cd28b webrtc-6478k.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch From b9b609bedfe8a169b7824f69d108a91da3532585 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 12 Sep 2024 20:26:08 -0400 Subject: [PATCH 013/313] backports/signal-desktop: upgrade to 7.24.1 --- backports/signal-desktop/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index aca8b8c..198cef7 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.24.0 +pkgver=7.24.1 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -81,7 +81,7 @@ source=" https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz https://github.com/signalapp/libsignal/archive/refs/tags/v$_libsignalver/libsignal-$_libsignalver.tar.gz https://github.com/signalapp/ringrtc/archive/refs/tags/v$_ringrtcver/ringrtc-$_ringrtcver.tar.gz - https://ayakael.net/api/packages/mirrors/generic/signal-desktop/v$pkgver/webrtc-$_webrtcver.tar.zst + https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst https://github.com/signalapp/Signal-FTS5-Extension/archive/refs/tags/v$_stokenizerver/stokenizer-$_stokenizerver.tar.gz bettersqlite-use-system-sqlcipher.patch @@ -464,10 +464,10 @@ package() { } sha512sums=" -df9f49462b5dcc6379c36e2179e2aa8f896a4ca8de1d7270e71be30e3f80321b8b0eec8d93e99624628a8af01a287a2a0e52457e8b302d5f1bbda8d30eaa77a8 Signal-Desktop-7.24.0.tar.gz +abea63881d3c32f1e607ad498c6376826858e410d7a140e0dc5d3b8a4f294c9f290e24c1905f3ae37d0e8c16bdd31d87f0eb4a797bf3876d7977ea401c128e80 Signal-Desktop-7.24.1.tar.gz 2179eb6862ceb9e3a1df04a4e9b9bb3d64ce84f017d3048f0aaafdd4960843230216443139ff1a8127b6901e9859a2f2ed59e12f2ba9ffc906f79107d7fc161f libsignal-0.55.1.tar.gz ff85a50d39cf0a431e813d091e94cb0c7e4298a2eb7d85c23d034ebf83a33f0032d81717a65265a1a8dfa66453923ba0051135f8cbca1f98c1b43d506270130e ringrtc-2.46.2.tar.gz -98b239a10dfdd972d2dbb62950f461935d831f3f305a4b236667dd31d35da504a8bf45c28eb74c045dce84a225ef4d1bbf97a70eda03183cf56bcc65995cd28b webrtc-6478k.tar.zst +aba08248d983537c0e92bd13578e67b29c974cde8c554af72b29196a4443d1127546b5bc9a5ceec1793cc20becd235584598297d42eeceb504cc373d63ed23df webrtc-6478k.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch From f82ac83d0bfc3d51ab895734f1695d1764405808 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 18 Sep 2024 21:01:16 -0400 Subject: [PATCH 014/313] backports/signal-desktop: upgrade to 7.25.0 --- backports/signal-desktop/APKBUILD | 22 ++++++++-------- ...l-c7019036-do-not-define-crypto_addc.patch | 25 ------------------- .../signal-desktop/webrtc-shared-libs.patch | 24 ++++++++++++++++++ 3 files changed, 34 insertions(+), 37 deletions(-) delete mode 100644 backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 198cef7..5d25c7a 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.24.1 +pkgver=7.25.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -64,14 +64,14 @@ makedepends=" options="net !check" # follow signal-desktop package.json -> @signalapp/libsignal-client -_libsignalver=0.55.1 +_libsignalver=0.56.1 # follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.46.2 +_ringrtcver=2.47.0 # follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) -_webrtcver=6478k +_webrtcver=6613a # follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION # last bsqlite version: 8.8.0 @@ -93,7 +93,6 @@ source=" webrtc-shared-libs.patch webrtc-compiler.patch webrtc-gcc13.patch - webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch signal-desktop " @@ -238,7 +237,7 @@ prepare() { \! -path "*third_party/$_lib/chromium/*" \ \! -path "*third_party/$_lib/google/*" \ \! -path './base/third_party/icu/*' \ - \! -path './third_party/libxml/*' \ + \! -path './third_party/re2/*' \ \! -path './third_party/pdfium/third_party/freetype/include/pstables.h' \ \! -path './third_party/harfbuzz-ng/utils/hb_scoped.h' \ \! -path './third_party/crashpad/crashpad/third_party/zlib/zlib_crashpad.h' \ @@ -464,10 +463,10 @@ package() { } sha512sums=" -abea63881d3c32f1e607ad498c6376826858e410d7a140e0dc5d3b8a4f294c9f290e24c1905f3ae37d0e8c16bdd31d87f0eb4a797bf3876d7977ea401c128e80 Signal-Desktop-7.24.1.tar.gz -2179eb6862ceb9e3a1df04a4e9b9bb3d64ce84f017d3048f0aaafdd4960843230216443139ff1a8127b6901e9859a2f2ed59e12f2ba9ffc906f79107d7fc161f libsignal-0.55.1.tar.gz -ff85a50d39cf0a431e813d091e94cb0c7e4298a2eb7d85c23d034ebf83a33f0032d81717a65265a1a8dfa66453923ba0051135f8cbca1f98c1b43d506270130e ringrtc-2.46.2.tar.gz -aba08248d983537c0e92bd13578e67b29c974cde8c554af72b29196a4443d1127546b5bc9a5ceec1793cc20becd235584598297d42eeceb504cc373d63ed23df webrtc-6478k.tar.zst +ff7c2ad5aee387187e6f95e435f378f478c3b324d199b383677c8b1623af0eb0dec903769b14bce31cb47bbd70be23659ccc2168353bbf31076eb278d61855f4 Signal-Desktop-7.25.0.tar.gz +d3bfab26254b52b0be12712a895b9bff6268cdb9a052eae0072c4fb2116af86de6e136e3678eb85ca0e0d0b9af8b8f6075f0e4a39bf66c84d16fd4c9cee22bda libsignal-0.56.1.tar.gz +7a4bde7723f96b81e87201b917872b0785aa874504d0056ba06ea0b0d693b0ded54774398b72b6027df499e85f54d862b4e11a190beb253810554e21115a4eae ringrtc-2.47.0.tar.gz +4d301d48181ef8b1aec5110e9efd0091626193be9e2f9f84169823687ecd443606188c1b95892e362764783f99951df32c02a245f9bb8570e0dd98eef1e04440 webrtc-6613a.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch @@ -475,9 +474,8 @@ be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67 d50eb5724502df9ea4d795db8cfc27af767c25168d7db2af512e615be7cc2ca290210a9ae78e1abb153c0198677e858ad3d74926c958099d0319295e7d9e7f1d signal-update-links.patch bfc8acdd13aa48d29c7657311733cc9d33c4899782efbd1ef6d25ad1698be4de7cc67e829324bc0309715d69ae37ea9f782cf54887317e817213e110d73d68e7 signal-show-window-please.patch b11fdd930943ca327650e4738ed85cd6b5eea779455a5895bccebba98e449bafc6b0f09bcf4545f2b2e16644355664e9768dd6d4d62f87619207c430367f72c5 ringrtc-webrtc-renamed.patch -f4e80ed7e67b98d6988c69ab5025286be17db29dc90f90bf837133cd8ae737f46293e6a2432b02f98c300ed461653b5a66801ff957a418c6a7c33877e3fe0443 webrtc-shared-libs.patch +0888673ba687747beda61cd50efbc25095f4a3d26f1dd58bf003e3a0bf1d302c3f2ebd1deecf630fbf04aedb7b8cd409e9efda4d1e6fda63234c9a9b9755bff4 webrtc-shared-libs.patch e07ae8544988d402aaf0fbd95ea36a64c94c59566c561132578aa6dcf8ff11a34058530e64dc204e5cadc2482f1401e74b32384a144e5e08017c663d0cf7c2fc webrtc-compiler.patch 88515d8b8cc82355c9f9b0f44fac83b7ff149b13e9fb102fd46036ec5234cfb2385fa5ad58a0520ee604b93dc4ddd6ae18a7005978ef207841645724ef7a9749 webrtc-gcc13.patch -2721dce75ed1b6cd8bff129cd90d05ea07ce61cafd9145913748cb1f4e58d4c042c3c43efc578ad84e15624937b7ed67b8d5fec3d764e7feb26ff28f86cacd77 webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch 87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop " diff --git a/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch b/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch deleted file mode 100644 index 5eb6919..0000000 --- a/backports/signal-desktop/webrtc-boringssl-c7019036-do-not-define-crypto_addc.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/third_party/boringssl/src/crypto/internal.h b/third_party/boringssl/src/crypto/internal.h -index a77102d76..a45f97bcc 100644 ---- a/third_party/boringssl/src/crypto/internal.h -+++ b/third_party/boringssl/src/crypto/internal.h -@@ -1174,6 +1174,11 @@ static inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) { - - // Arithmetic functions. - -+// The most efficient versions of these functions on GCC and Clang depend on C11 -+// |_Generic|. If we ever need to call these from C++, we'll need to add a -+// variant that uses C++ overloads instead. -+#if !defined(__cplusplus) -+ - // CRYPTO_addc_* returns |x + y + carry|, and sets |*out_carry| to the carry - // bit. |carry| must be zero or one. - #if OPENSSL_HAS_BUILTIN(__builtin_addc) -@@ -1275,6 +1280,8 @@ static inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow, - #define CRYPTO_subc_w CRYPTO_subc_u32 - #endif - -+#endif // !__cplusplus -+ - - // FIPS functions. - diff --git a/backports/signal-desktop/webrtc-shared-libs.patch b/backports/signal-desktop/webrtc-shared-libs.patch index 7bfbd7f..3916fe0 100644 --- a/backports/signal-desktop/webrtc-shared-libs.patch +++ b/backports/signal-desktop/webrtc-shared-libs.patch @@ -38,3 +38,27 @@ index 14089f0..b7dc621 100644 ] } +diff --git a/third_party/googletest/BUILD.gn.orig b/third_party/googletest/BUILD.gn +index b7dc621..367f929 100644 +--- a/third_party/googletest/BUILD.gn.orig ++++ b/third_party/googletest/BUILD.gn +@@ -133,7 +133,6 @@ source_set("gtest") { + + # googletest only needs `absl`, but this makes gn check happier. + deps = [ "//third_party/abseil-cpp:absl_full" ] +- public_deps = [ "//third_party/re2" ] + if (is_nacl || !build_with_chromium) { + defines += [ "GTEST_DISABLE_PRINT_STACK_TRACE" ] + sources -= [ +diff --git a/third_party/fuzztest/BUILD.gn.orig b/third_party/fuzztest/BUILD.gn +index 57ee790..ba1d297 100644 +--- a/third_party/fuzztest/BUILD.gn.orig ++++ b/third_party/fuzztest/BUILD.gn +@@ -309,7 +309,6 @@ source_set("fuzztest_internal") { + # For RE2 mutators. It's questionable whether we want to pull this library + # into every fuzztest target, but this is the approach used in other + # fuzztest contexts so we'll do the same +- "//third_party/re2", + + # For protobuf mutators + "$protobuf_target_prefix:protobuf_lite", From 714437157cbac0888c1aa21862bfea17acdce265 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 26 Sep 2024 09:16:53 -0400 Subject: [PATCH 015/313] user/zotero: upgrade to 7.0.6 --- user/zotero/APKBUILD | 10 ++-- user/zotero/rust1.78-qcms-stdsimd.patch | 64 ------------------------- 2 files changed, 4 insertions(+), 70 deletions(-) delete mode 100644 user/zotero/rust1.78-qcms-stdsimd.patch diff --git a/user/zotero/APKBUILD b/user/zotero/APKBUILD index f6c9803..04c4e73 100644 --- a/user/zotero/APKBUILD +++ b/user/zotero/APKBUILD @@ -1,9 +1,9 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=zotero -pkgver=7.0.3 +pkgver=7.0.6 pkgrel=0 -_fxver=115.9.1 +_fxver=115.14.0 _gittag=$pkgver # Date of release, YY-MM-DD for metainfo file (see package()) # https://www.mozilla.org/firefox/organizations/notes/ @@ -85,7 +85,6 @@ source="https://ftp.mozilla.org/pub/firefox/releases/${_fxver}esr/source/firefox python-deps.patch rust-lto-thin.patch rust1.78-packed-to-portable_simd.patch - rust1.78-qcms-stdsimd.patch sandbox-fork.patch sandbox-largefile.patch sandbox-sched_setscheduler.patch @@ -365,7 +364,7 @@ package() { } sha512sums=" -9ccaede2fcda13a07f98a2110bb8f99c7324601d66bff311f3070a669576a1598fe1d7de2d005d725d1f44dbe3934a9c0fd0b7950f60686047d4ce8d9d812310 firefox-115.9.1esr.source.tar.xz +dd40c1fd3cf454dbf33a85d38e47bb0e736ed89b829643653e239f43232441f4e9f3c7876f058ff2e6f19daf2b50a8f2d13274e9a107d8a258a6067d1fc43f54 firefox-115.14.0esr.source.tar.xz 3e0501ae7a650346c667dfdc0ae0ca286084f22e89ab2ac671cc0d7315673dc5b6dcb9f9882f6f39d26e9a31e57f7a0fd53d6b805e520224e22b8976850e2eb8 audio-lfs64.patch 454ea3263cabce099accbdc47aaf83be26a19f8b5a4568c01a7ef0384601cf8315efd86cd917f9c8bf419c2c845db89a905f3ff9a8eb0c8e41042e93aa96a85c disable-moz-stackwalk.patch 2f4f15974d52de4bb273b62a332d13620945d284bbc6fe6bd0a1f58ff7388443bc1d3bf9c82cc31a8527aad92b0cd3a1bc41d0af5e1800e0dcbd7033e58ffd71 fix-fortify-system-wrappers.patch @@ -383,7 +382,6 @@ b586ddb21b50fa8fba798c3a269518049c38cc52fd91ad00e96a3f1144e6b2879d9df1a182a2fb18 4e40b34c5f77a1a21fe971a6fcd8a21b1a63423a3a7932a5a6e1c7a2779f9f06a561c806614a01931679a4b1c6afdfd8ae1f3cc6b673f259ccd368e8e54f6e90 python-deps.patch 1c6918dd6655d3a1251bfd4af2e1c561cbb00d540a883b4c1ebf7f5de530d754d9ac07b4b5f56cdab6c511d25c8910ec94043f5733e97501a67abffe1bafaeb1 rust-lto-thin.patch e4795b88e572bb3b6f009dbacc7872b59db2f8facbe2b07f14dd4f45a77c22049783581869f18c6bb3f04d6edb3da59347278321cce2bfa629a4d35e136cda5c rust1.78-packed-to-portable_simd.patch -eae1afad93cc5fa7699b156619600ca4b41e67943b8b6e05ab972d449aece93bbf1e68a5ea1a7b1c9278633dbf7cf31503255558e3e06ddf168b3937a0e014e8 rust1.78-qcms-stdsimd.patch 2518f2fc75b5db30058e0735f47d60fdf1e7adfaeee4b33fb2afb1bd9a616ce943fd88f4404d0802d4083703f4acf1d5ad42377218d025bc768807fbaf7e1609 sandbox-fork.patch b7d0a6126bdf6c0569f80aabf5b37ed2c7a35712eb8a0404a2d85381552f5555d4f97d213ea26cec6a45dc2785f22439376ed5f8e78b4fd664ef0223307b333e sandbox-largefile.patch f8c3555ef6207933cbffbf4fc101a9b4c0d2990c0063162f0f0bde70ef0b46f86bfac42e7110695183424a87948de593f3927b2d8509ede3e4fc7bd8a1fad1ce sandbox-sched_setscheduler.patch @@ -391,7 +389,7 @@ f8c3555ef6207933cbffbf4fc101a9b4c0d2990c0063162f0f0bde70ef0b46f86bfac42e71106951 382510375b1a2fa79be0ab79e3391a021ae2c022429ffbaa7e7a69166f99bb56d01e59a1b10688592a29238f21c9d6977672bd77f9fae439b66bdfe0c55ddb15 mozilla-location.keys fc45bc3ffb9404e5338ea26a9f04807b40f6f516324972cddd48bedb91b8bd7c6b8d4e03a0209020f5e67b703bc4ff89389985791b9bd544a0fc3951e2dc338e vendor-prefs.js e1a0a4ff5cc1b53f13776ca11927d671426b0691e78e74a4adf2166d57bb2ae8ac409cc11a37ce5e2f680fdf05d5bc3849c33a9717aca1bb62d03ae5231a67fb zotero.desktop -48c7106f0d20b5f1fba2a4b846282c627a5654ac8579f8a7cdb202b187416311f5eb32827ac6e972d1815348bd2ad00bd10bcff1a4ca8efc9b4b07b4e3e825dc zotero-7.0.3.tar.gz +805c19cff5bedc510000be4cbaaf4c3ad3ac93d164fc88f35bf29150df00673534d0dd6da461e2e4a040f9f3c72574fb057487319c4638033d190fe06f05802f zotero-7.0.6.tar.gz 746dbabbb3ea9199d17891e2079b9256d04843f548132178862117d2334694d98e2cc981945d72f31d0e5b2c42904d371633f6905996bb580aa0b5ae95c64ddc zotero_build-modifications.patch 337070ee4c44ccb35c6b6290c18327740bb9fccfd1a6ad1045782e83daa290b6ced7d53955d3a889f661d588738a64f2e7f383639f4c46be9fdf891168abc9ff zotero_test-drop-build.patch f0e4f09496531222e8400959f9ef12852bca269eb3bf4c3b87ccaf92f28a12b9374461a1c79ad294a4393dbe30800aa1c85497033d0bc304fa8c198dfab3efd2 zotero_test-fix-chars.patch diff --git a/user/zotero/rust1.78-qcms-stdsimd.patch b/user/zotero/rust1.78-qcms-stdsimd.patch deleted file mode 100644 index 2c86aa1..0000000 --- a/user/zotero/rust1.78-qcms-stdsimd.patch +++ /dev/null @@ -1,64 +0,0 @@ -Relevant bug report: https://bugzilla.mozilla.org/show_bug.cgi?id=1882291 - - -diff --git a/Cargo.lock b/Cargo.lock ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -4274,10 +4274,11 @@ - [[package]] - name = "qcms" - version = "0.2.0" - dependencies = [ - "libc", -+ "version_check", - ] - - [[package]] - name = "qlog" - version = "0.4.0" -diff --git a/gfx/qcms/Cargo.toml b/gfx/qcms/Cargo.toml ---- a/gfx/qcms/Cargo.toml -+++ b/gfx/qcms/Cargo.toml -@@ -18,5 +18,8 @@ - iccv4-enabled = [] - cmyk = [] - - [dependencies] - libc = {version = "0.2", optional = true } -+ -+[build-dependencies] -+version_check = "0.9" -diff --git a/gfx/qcms/build.rs b/gfx/qcms/build.rs -new file mode 100644 ---- /dev/null -+++ b/gfx/qcms/build.rs -@@ -0,0 +1,7 @@ -+extern crate version_check as rustc; -+ -+fn main() { -+ if rustc::is_min_version("1.78.0").unwrap_or(false) { -+ println!("cargo:rustc-cfg=stdsimd_split"); -+ } -+} -diff --git a/gfx/qcms/src/lib.rs b/gfx/qcms/src/lib.rs ---- a/gfx/qcms/src/lib.rs -+++ b/gfx/qcms/src/lib.rs -@@ -5,13 +5,15 @@ - #![allow(non_camel_case_types)] - #![allow(non_snake_case)] - #![allow(non_upper_case_globals)] - // These are needed for the neon SIMD code and can be removed once the MSRV supports the - // instrinsics we use --#![cfg_attr(feature = "neon", feature(stdsimd))] -+#![cfg_attr(all(stdsimd_split, target_arch = "arm", feature = "neon"), feature(stdarch_arm_neon_intrinsics))] -+#![cfg_attr(all(stdsimd_split, target_arch = "arm", feature = "neon"), feature(stdarch_arm_feature_detection))] -+#![cfg_attr(all(not(stdsimd_split), target_arch = "arm", feature = "neon"), feature(stdsimd))] - #![cfg_attr( -- feature = "neon", -+ all(target_arch = "arm", feature = "neon"), - feature(arm_target_feature, raw_ref_op) - - )] - - /// These values match the Rendering Intent values from the ICC spec - From 7e216008680396deac9201af796afd513480120f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 27 Sep 2024 10:13:09 -0400 Subject: [PATCH 016/313] backports/signal-desktop: upgrade to 7.26.0 --- backports/signal-desktop/APKBUILD | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 5d25c7a..7dbe1db 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=signal-desktop -pkgver=7.25.0 +pkgver=7.26.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -64,14 +64,14 @@ makedepends=" options="net !check" # follow signal-desktop package.json -> @signalapp/libsignal-client -_libsignalver=0.56.1 +_libsignalver=0.58.0 # follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.47.0 +_ringrtcver=2.47.1 # follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) -_webrtcver=6613a +_webrtcver=6613b # follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION # last bsqlite version: 8.8.0 @@ -463,10 +463,10 @@ package() { } sha512sums=" -ff7c2ad5aee387187e6f95e435f378f478c3b324d199b383677c8b1623af0eb0dec903769b14bce31cb47bbd70be23659ccc2168353bbf31076eb278d61855f4 Signal-Desktop-7.25.0.tar.gz -d3bfab26254b52b0be12712a895b9bff6268cdb9a052eae0072c4fb2116af86de6e136e3678eb85ca0e0d0b9af8b8f6075f0e4a39bf66c84d16fd4c9cee22bda libsignal-0.56.1.tar.gz -7a4bde7723f96b81e87201b917872b0785aa874504d0056ba06ea0b0d693b0ded54774398b72b6027df499e85f54d862b4e11a190beb253810554e21115a4eae ringrtc-2.47.0.tar.gz -4d301d48181ef8b1aec5110e9efd0091626193be9e2f9f84169823687ecd443606188c1b95892e362764783f99951df32c02a245f9bb8570e0dd98eef1e04440 webrtc-6613a.tar.zst +0d13b30dcfc96c8eba04767e77f9311bff8ddc63ea3829a0de445f2fc126ec0f2f85c131394523f94912eb4a18ec389230a0145b6e496776acf38773edaabb30 Signal-Desktop-7.26.0.tar.gz +6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz +8e5b2ccdf2e80f8fbdd7454fb5909f6f15d51cba05c61f96aee6601db49ea4a712559b554d0e0cdc29254e7903f91edb4cb5acd254f492ef02de52952bea5456 ringrtc-2.47.1.tar.gz +05979588c2cc358c8efec853037aa276fec56c0d583c255467c262caf68263bb6eb761fd2d231340c9d35d99faef9317984293f446f891e5d6be34fa090c8ae5 webrtc-6613b.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch From 63f6a6099fb9ce1c34a8b8cb83cdf412e9c1de0c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 27 Sep 2024 17:32:59 -0400 Subject: [PATCH 017/313] backports/signal-desktop: import upstream changes --- backports/signal-desktop/APKBUILD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 7dbe1db..6b79d5f 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -1,5 +1,6 @@ # Contributor: lauren n. liberda -# Maintainer: lauren n. liberda +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop pkgver=7.26.0 pkgrel=0 @@ -237,6 +238,7 @@ prepare() { \! -path "*third_party/$_lib/chromium/*" \ \! -path "*third_party/$_lib/google/*" \ \! -path './base/third_party/icu/*' \ + \! -path './third_party/libxml/*' \ \! -path './third_party/re2/*' \ \! -path './third_party/pdfium/third_party/freetype/include/pstables.h' \ \! -path './third_party/harfbuzz-ng/utils/hb_scoped.h' \ @@ -292,7 +294,7 @@ prepare() { sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' binding.gyp msg "Installing libsignal js dependencies" - npm install --ignore-scripts + yarn --ignore-scripts --frozen-lockfile ) # remove shipped fonts for system-provided (part 1) @@ -358,7 +360,6 @@ build() { ( cd "$srcdir"/ringrtc-$_ringrtcver/src/node msg "Building ringrtc JS glue code" - npm ci --ignore-scripts npm run build msg "Cleaning dev dependencies for ringrtc" @@ -377,7 +378,6 @@ build() { mv build/Release/libsignal_client_linux_$chromium_arch.node prebuilds/linux-$chromium_arch/node.napi.node msg "Building libsignal glue code" - npm ci --ignore-scripts npm run tsc msg "Cleaning dev dependencies for libsignal" @@ -398,7 +398,7 @@ build() { rm -rf node_modules/dtrace-provider # get esbuild installed (needed for next step) - npm install esbuild + npm rebuild esbuild # build front NODE_ENV=production \ From b306518289c245c0a3386add841efdc79844a38e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 7 Oct 2024 09:37:14 -0400 Subject: [PATCH 018/313] testing/signal-desktop: upgrade to 7.27.0 --- backports/signal-desktop/APKBUILD | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 6b79d5f..4ff9961 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.26.0 +pkgver=7.27.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -68,11 +68,11 @@ options="net !check" _libsignalver=0.58.0 # follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.47.1 +_ringrtcver=2.48.0 # follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) -_webrtcver=6613b +_webrtcver=6613c # follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION # last bsqlite version: 8.8.0 @@ -463,10 +463,10 @@ package() { } sha512sums=" -0d13b30dcfc96c8eba04767e77f9311bff8ddc63ea3829a0de445f2fc126ec0f2f85c131394523f94912eb4a18ec389230a0145b6e496776acf38773edaabb30 Signal-Desktop-7.26.0.tar.gz +307dafec0926092afb3ec8db90325b720cef227e2c41d2b7e5d4128d3a314b98793df4380a22743887a3eef7243a0dec3ce456b881508591bf9fdd4b002d7642 Signal-Desktop-7.27.0.tar.gz 6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz -8e5b2ccdf2e80f8fbdd7454fb5909f6f15d51cba05c61f96aee6601db49ea4a712559b554d0e0cdc29254e7903f91edb4cb5acd254f492ef02de52952bea5456 ringrtc-2.47.1.tar.gz -05979588c2cc358c8efec853037aa276fec56c0d583c255467c262caf68263bb6eb761fd2d231340c9d35d99faef9317984293f446f891e5d6be34fa090c8ae5 webrtc-6613b.tar.zst +ea85f7a5d0ac994480554f0a64fef2d4e60537fb8e2775824d152167c8ca83021371bdd923fa73a87664df15a661d818a6179ac67a7b47d29f8b5e3d6d1fa6fe ringrtc-2.48.0.tar.gz +fe04fcf13f55b124f03ce9d516b1c53fc4f20c6a016819c62eeaa0500eda92c5a0c0d7dc5d1e360a27691dfd404c254e91bed9fb25d0fc40a27795c1b674a82e webrtc-6613c.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch 2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch From 623d98575eb14f2b04b6feb104006b1c41751a1c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 7 Oct 2024 09:52:25 -0400 Subject: [PATCH 019/313] user/zotero: upgrade to 7.0.7 --- user/zotero/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/zotero/APKBUILD b/user/zotero/APKBUILD index 04c4e73..d93720d 100644 --- a/user/zotero/APKBUILD +++ b/user/zotero/APKBUILD @@ -1,7 +1,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=zotero -pkgver=7.0.6 +pkgver=7.0.7 pkgrel=0 _fxver=115.14.0 _gittag=$pkgver @@ -389,7 +389,7 @@ f8c3555ef6207933cbffbf4fc101a9b4c0d2990c0063162f0f0bde70ef0b46f86bfac42e71106951 382510375b1a2fa79be0ab79e3391a021ae2c022429ffbaa7e7a69166f99bb56d01e59a1b10688592a29238f21c9d6977672bd77f9fae439b66bdfe0c55ddb15 mozilla-location.keys fc45bc3ffb9404e5338ea26a9f04807b40f6f516324972cddd48bedb91b8bd7c6b8d4e03a0209020f5e67b703bc4ff89389985791b9bd544a0fc3951e2dc338e vendor-prefs.js e1a0a4ff5cc1b53f13776ca11927d671426b0691e78e74a4adf2166d57bb2ae8ac409cc11a37ce5e2f680fdf05d5bc3849c33a9717aca1bb62d03ae5231a67fb zotero.desktop -805c19cff5bedc510000be4cbaaf4c3ad3ac93d164fc88f35bf29150df00673534d0dd6da461e2e4a040f9f3c72574fb057487319c4638033d190fe06f05802f zotero-7.0.6.tar.gz +ba04ec60afd2e9f9500046128b60f1c68b0ac7e47f5fbbc4f4fbfde01df982eb1561d65fb0aef9bee4ee098c4babc5e9caa4c9e791ad616bb55d7a0523349f34 zotero-7.0.7.tar.gz 746dbabbb3ea9199d17891e2079b9256d04843f548132178862117d2334694d98e2cc981945d72f31d0e5b2c42904d371633f6905996bb580aa0b5ae95c64ddc zotero_build-modifications.patch 337070ee4c44ccb35c6b6290c18327740bb9fccfd1a6ad1045782e83daa290b6ced7d53955d3a889f661d588738a64f2e7f383639f4c46be9fdf891168abc9ff zotero_test-drop-build.patch f0e4f09496531222e8400959f9ef12852bca269eb3bf4c3b87ccaf92f28a12b9374461a1c79ad294a4393dbe30800aa1c85497033d0bc304fa8c198dfab3efd2 zotero_test-fix-chars.patch From eef1e89d88385017f522327574e4e0844c912941 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 9 Oct 2024 18:23:19 -0400 Subject: [PATCH 020/313] backports/signal-desktop: upgrade to 7.28.0 --- backports/signal-desktop/APKBUILD | 39 ++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 4ff9961..c89d74f 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.27.0 +pkgver=7.28.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -64,18 +64,10 @@ makedepends=" " options="net !check" -# follow signal-desktop package.json -> @signalapp/libsignal-client -_libsignalver=0.58.0 - -# follow signal-desktop package.json -> @signalapp/ringrtc -_ringrtcver=2.48.0 - -# follow ringrtc (on version above) -> config/version.properties -> webrtc.version -# downloading tarball generated with abuild snapshot (with gclient dependencies fetched) +# use _check_depends to validate this + _libsignalver=0.58.0 +_ringrtcver=2.48.1 _webrtcver=6613c - -# follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION -# last bsqlite version: 8.8.0 _stokenizerver=0.2.1 source=" @@ -119,6 +111,25 @@ export CARGO_PROFILE_RELEASE_STRIP="symbols" export YARN_CACHE_FOLDER="$srcdir/.yarn" +_check_depends() { + # _libsignalver: follow signal-desktop package.json -> @signalapp/libsignal-client + # _ringrtcver: follow signal-desktop package.json -> @signalapp/ringrtc + # _webrtcver: follow ringrtc (on version above) -> config/version.properties -> webrtc.version + # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) + # _stokenizerver: follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION + + local _libsignalver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/libsignal-client\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) + local _ringrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/ringrtc\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) + local _bsqlitever=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/better-sqlite3\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) + local _webrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/ringrtc/v$_ringrtcver/config/version.properties | awk -F '=' '{if($1 == "webrtc.version"){print $2}}' | head -n 1) + local _stokenizerver=$(curl --silent https://raw.githubusercontent.com/signalapp/better-sqlite3/v$_bsqlitever/deps/download.js | grep "const TOKENIZER_VERSION" | awk '{print $4}' | tr -d "'" | tr -d ';' | head -n 1) + + echo _libsignalver=$_libsignalver + echo _ringrtcver=$_ringrtcver + echo _webrtcver=$_webrtcver + echo _stokenizerver=$_stokenizerver +} + # webrtc only, the other dependencies are fine with tarballs _distbucket="sakamoto/lnl-aports-snapshots/" snapshot() { @@ -463,9 +474,9 @@ package() { } sha512sums=" -307dafec0926092afb3ec8db90325b720cef227e2c41d2b7e5d4128d3a314b98793df4380a22743887a3eef7243a0dec3ce456b881508591bf9fdd4b002d7642 Signal-Desktop-7.27.0.tar.gz +fa557adb65bce33d7c5823c39603ceda8c4f5743d078153f967f94eb423ff0f30eac3a7252fcfdee56b45b5f27f73a86614732171bd9bb474f9f48615daca6f0 Signal-Desktop-7.28.0.tar.gz 6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz -ea85f7a5d0ac994480554f0a64fef2d4e60537fb8e2775824d152167c8ca83021371bdd923fa73a87664df15a661d818a6179ac67a7b47d29f8b5e3d6d1fa6fe ringrtc-2.48.0.tar.gz +0190f5a08a9107c818a4770fe37c8b56bd11a99b5514da27cf0941e03b5681fb710b31d9474d05bcf2ac4035ef8703b6767c1780e25edff02ed982d73d8a8e42 ringrtc-2.48.1.tar.gz fe04fcf13f55b124f03ce9d516b1c53fc4f20c6a016819c62eeaa0500eda92c5a0c0d7dc5d1e360a27691dfd404c254e91bed9fb25d0fc40a27795c1b674a82e webrtc-6613c.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch From d24323205e463b4b637a13578df372bd403074cd Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 09:13:40 -0400 Subject: [PATCH 021/313] backports/signal-desktop: upgrade to 7.28.0 --- backports/signal-desktop/APKBUILD | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index c89d74f..b96bba4 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -9,6 +9,7 @@ url="https://github.com/signalapp/Signal-Desktop/" # same as electron arch="aarch64 x86_64" license="AGPL-3.0-only" +_llvmver=18 depends=" electron font-barlow @@ -24,7 +25,7 @@ makedepends=" cargo cargo-auditable cbindgen - clang-dev + clang$_llvmver-dev cmake crc32c-dev dav1d-dev @@ -44,8 +45,8 @@ makedepends=" libvpx-dev libwebp-dev libxml2-dev - lld - llvm-dev + lld$_llvmver + llvm$_llvmver-dev mesa-dev nodejs npm From 15d01121bac8801cbef2b37c1988865f0e1a0c59 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:04:33 -0400 Subject: [PATCH 022/313] user/zotero: drop due to in aports --- user/zotero/APKBUILD | 398 -- user/zotero/audio-lfs64.patch | 61 - user/zotero/disable-moz-stackwalk.patch | 18 - user/zotero/fix-fortify-system-wrappers.patch | 13 - user/zotero/fix-rust-target.patch | 31 - user/zotero/fix-webrtc-glibcisms.patch | 20 - user/zotero/icu74.patch | 38 - user/zotero/lfs64.patch | 35 - user/zotero/llvm18-bindgen.patch | 619 --- user/zotero/llvm18.patch | 23 - user/zotero/moz-system-jpeg.patch | 15 - user/zotero/mozilla-location.keys | 1 - user/zotero/no-ccache-stats.patch | 13 - user/zotero/nrappkit-qsort.patch | 34 - user/zotero/ppc-musttail.patch | 30 - user/zotero/ppc-webrtc.patch | 23 - user/zotero/python-deps.patch | 12 - user/zotero/rust-lto-thin.patch | 12 - .../rust1.78-packed-to-portable_simd.patch | 3582 ----------------- user/zotero/sandbox-fork.patch | 15 - user/zotero/sandbox-largefile.patch | 17 - user/zotero/sandbox-sched_setscheduler.patch | 24 - user/zotero/stab.h | 71 - user/zotero/vendor-prefs.js | 12 - user/zotero/zotero.desktop | 9 - user/zotero/zotero_build-modifications.patch | 144 - user/zotero/zotero_drop-jazzer.patch | 12 - user/zotero/zotero_test-drop-build.patch | 23 - user/zotero/zotero_test-fix-chars.patch | 16 - .../zotero_test-push-timeout-to-30sec.patch | 13 - 30 files changed, 5334 deletions(-) delete mode 100644 user/zotero/APKBUILD delete mode 100644 user/zotero/audio-lfs64.patch delete mode 100644 user/zotero/disable-moz-stackwalk.patch delete mode 100644 user/zotero/fix-fortify-system-wrappers.patch delete mode 100644 user/zotero/fix-rust-target.patch delete mode 100644 user/zotero/fix-webrtc-glibcisms.patch delete mode 100644 user/zotero/icu74.patch delete mode 100644 user/zotero/lfs64.patch delete mode 100644 user/zotero/llvm18-bindgen.patch delete mode 100644 user/zotero/llvm18.patch delete mode 100644 user/zotero/moz-system-jpeg.patch delete mode 100644 user/zotero/mozilla-location.keys delete mode 100644 user/zotero/no-ccache-stats.patch delete mode 100644 user/zotero/nrappkit-qsort.patch delete mode 100644 user/zotero/ppc-musttail.patch delete mode 100644 user/zotero/ppc-webrtc.patch delete mode 100644 user/zotero/python-deps.patch delete mode 100644 user/zotero/rust-lto-thin.patch delete mode 100644 user/zotero/rust1.78-packed-to-portable_simd.patch delete mode 100644 user/zotero/sandbox-fork.patch delete mode 100644 user/zotero/sandbox-largefile.patch delete mode 100644 user/zotero/sandbox-sched_setscheduler.patch delete mode 100644 user/zotero/stab.h delete mode 100644 user/zotero/vendor-prefs.js delete mode 100644 user/zotero/zotero.desktop delete mode 100644 user/zotero/zotero_build-modifications.patch delete mode 100644 user/zotero/zotero_drop-jazzer.patch delete mode 100644 user/zotero/zotero_test-drop-build.patch delete mode 100644 user/zotero/zotero_test-fix-chars.patch delete mode 100644 user/zotero/zotero_test-push-timeout-to-30sec.patch diff --git a/user/zotero/APKBUILD b/user/zotero/APKBUILD deleted file mode 100644 index d93720d..0000000 --- a/user/zotero/APKBUILD +++ /dev/null @@ -1,398 +0,0 @@ -# Contributor: Antoine Martin (ayakael) -# Maintainer: Antoine Martin (ayakael) -pkgname=zotero -pkgver=7.0.7 -pkgrel=0 -_fxver=115.14.0 -_gittag=$pkgver -# Date of release, YY-MM-DD for metainfo file (see package()) -# https://www.mozilla.org/firefox/organizations/notes/ -_releasedate=2024-08-09 -pkgdesc="A free, easy-to-use tool to help you collect, organize, cite, and share your research sources." -url="https://www.mozilla.org/en-US/firefox/organizations/" -# s390x and riscv64: blocked by rust and cargo -# armhf: build failure on armhf due to wasm -# ppc64le: test suite stalls -arch="x86_64 armv7 aarch64 x86" -license="GPL-3.0-only AND LGPL-2.1-only AND LGPL-3.0-only AND MPL-2.0" -depends=" - ffmpeg-libavcodec - " -makedepends=" - alsa-lib-dev - automake - bash - bsd-compat-headers - cargo - cbindgen - clang - clang-libclang - curl - dbus-glib-dev - gettext - grep - gtk+3.0-dev - hunspell-dev - icu-dev>=69.1 - libevent-dev - libffi-dev - libjpeg-turbo-dev - libnotify-dev - libogg-dev - libtheora-dev - libtool - libvorbis-dev - libvpx-dev - libwebp-dev - libxcomposite-dev - libxt-dev - lld - llvm-dev - m4 - mesa-dev - nasm - nodejs - npm - nspr-dev - nss-dev - perl - pipewire-dev - pulseaudio-dev - python3 - rsync - sed - unzip - wasi-sdk - wireless-tools-dev - xvfb-run - zip - " -source="https://ftp.mozilla.org/pub/firefox/releases/${_fxver}esr/source/firefox-${_fxver}esr.source.tar.xz - audio-lfs64.patch - disable-moz-stackwalk.patch - fix-fortify-system-wrappers.patch - fix-rust-target.patch - fix-webrtc-glibcisms.patch - icu74.patch - lfs64.patch - llvm18-bindgen.patch - llvm18.patch - moz-system-jpeg.patch - no-ccache-stats.patch - nrappkit-qsort.patch - ppc-musttail.patch - ppc-webrtc.patch - python-deps.patch - rust-lto-thin.patch - rust1.78-packed-to-portable_simd.patch - sandbox-fork.patch - sandbox-largefile.patch - sandbox-sched_setscheduler.patch - - stab.h - - mozilla-location.keys - vendor-prefs.js - - zotero.desktop - https://ayakael.net/api/packages/mirrors/generic/zotero/$pkgver/zotero-$pkgver.tar.gz - zotero_build-modifications.patch - zotero_test-drop-build.patch - zotero_test-fix-chars.patch - zotero_test-push-timeout-to-30sec.patch - zotero_drop-jazzer.patch - " - -builddir="$srcdir"/firefox-$_fxver -_zoterodir="$srcdir"/zotero-$_gittag -_mozappdir=/usr/lib/zotero - -# help our shared-object scanner to find the libs -ldpath="$_mozappdir" - -# we need this because cargo verifies checksums of all files in vendor -# crates when it builds and gives us no way to override or update the -# file sanely... so just clear out the file list -_clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' third_party/rust/$1/.cargo-checksum.json -} - -export SHELL=/bin/sh -export BUILD_OFFICIAL=1 -export MOZILLA_OFFICIAL=1 -export USE_SHORT_LIBNAME=1 -export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system -export MOZ_APP_PROFILE="mozilla/firefox" -export MOZ_APP_REMOTINGNAME=firefox-esr -export MOZBUILD_STATE_PATH="$srcdir"/mozbuild -# disable desktop notifications -export MOZ_NOSPAM=1 -# Find our triplet JSON -export RUST_TARGET="$CTARGET" - -# Build with Clang, takes less RAM -export CC="clang" -export CXX="clang++" - -# set rpath so linker finds the libs -export LDFLAGS="$LDFLAGS -Wl,-rpath,$_mozappdir" - -# let firefox do this itself. -unset CARGO_PROFILE_RELEASE_OPT_LEVEL -unset CARGO_PROFILE_RELEASE_LTO - -export CFLAGS="${CFLAGS/-fstack-clash-protection/} -g0 -O2" -export CXXFLAGS="${CXXFLAGS/-fstack-clash-protection/} -g0 -O2 -Wno-deprecated-builtins -Wno-deprecated-declarations" - -prepare() { - # zotero prepare - mv "$_zoterodir" "$builddir"/zotero - ( - cd "$builddir"/zotero - - # checks that we're using expected fx version - local _exp_fxver=$(grep GECKO_VERSION_LINUX "$builddir"/zotero/app/config.sh | sed 's|.*=||' | tr -d '"' | sed 's|esr||') - if [ "$_fxver" != "$_exp_fxver" ]; then - msg "Expected firefox version $_exp_fxver, got $_fxver" - return 1 - fi - - # zotero build expects to be in a git repo - git init - git config user.name info - git config user.email info@example.org - git commit --allow-empty -m 'Initial' - - npm i --legacy-peer-deps - ) - default_prepare - - rm -rf third_party/rust/packed_simd/ - cp "$srcdir"/stab.h toolkit/crashreporter/google-breakpad/src/ - - _clear_vendor_checksums audio_thread_priority - _clear_vendor_checksums bindgen - - base64 -d "$srcdir"/mozilla-location.keys > "$builddir"/mozilla-api-key - - # webrtc does not build on these - case "$CARCH" in - ppc64le) - local webrtc_config="ac_add_options --disable-webrtc" - ;; - esac - case "$CARCH" in - armv7) - # broken here - local rust_simd="ac_add_options --disable-rust-simd" - ;; - *) - local rust_simd="ac_add_options --enable-rust-simd" - ;; - esac - - case "$CARCH" in - aarch64|arm*|x86*) - # disable-elf-hack: exists only on aarch64, arm*, x86, x86_64 - local arch_config="ac_add_options --disable-elf-hack" - ;; - esac - - # sandbox only supported here - case "$CARCH" in - x86*|armv7|aarch64) - local sandbox="ac_add_options --enable-sandbox" - ;; - *) - local sandbox="ac_add_options --disable-sandbox" - ;; - esac - - cat > base-mozconfig <<-EOF - # disable unwanted things - ac_add_options --disable-bootstrap - ac_add_options --disable-cargo-incremental - ac_add_options --disable-crashreporter - ac_add_options --disable-debug - ac_add_options --disable-debug-symbols - ac_add_options --disable-install-strip - ac_add_options --disable-jemalloc - ac_add_options --disable-strip - ac_add_options --disable-tests - ac_add_options --disable-updater - - # features - ac_add_options --enable-alsa - ac_add_options --enable-dbus - ac_add_options --enable-default-toolkit=cairo-gtk3-wayland - ac_add_options --enable-ffmpeg - ac_add_options --enable-hardening - ac_add_options --enable-linker=lld - ac_add_options --enable-necko-wifi - ac_add_options --enable-official-branding - ac_add_options --enable-optimize="$CFLAGS" - ac_add_options --enable-pulseaudio - ac_add_options --enable-release - ac_add_options --enable-update-channel=release - - # system libs - ac_add_options --enable-system-pixman - ac_add_options --with-system-ffi - ac_add_options --with-system-icu - ac_add_options --with-system-jpeg - ac_add_options --with-system-libevent - ac_add_options --with-system-libvpx - ac_add_options --with-system-nspr - ac_add_options --with-system-nss - ac_add_options --with-system-png - ac_add_options --with-system-webp - ac_add_options --with-system-zlib - - # misc - ac_add_options --allow-addon-sideload - ac_add_options --prefix=/usr - ac_add_options --with-app-name=firefox-esr - ac_add_options --with-distribution-id=org.alpinelinux - ac_add_options --with-libclang-path=/usr/lib - ac_add_options --with-unsigned-addon-scopes=app,system - ac_add_options --with-wasi-sysroot=/usr/share/wasi-sysroot - ac_add_options --host=$CHOST - ac_add_options --target=$CTARGET - - # objdir - mk_add_options MOZ_OBJDIR="$builddir/obj" - - mk_add_options RUSTFLAGS="$RUSTFLAGS" - - # keys - # these are for alpine linux use only - ac_add_options --with-mozilla-api-keyfile="$builddir/mozilla-api-key" - - $arch_config - $rust_simd - $sandbox - $webrtc_config - EOF -} - -build() { - cat > .mozconfig base-mozconfig - - export MOZ_BUILD_DATE=$(date ${SOURCE_DATE_EPOCH:+ -d@${SOURCE_DATE_EPOCH}} "+%Y%m%d%H%M%S") - - # for lto - ulimit -n 4096 - - # can't be set here and fail - unset RUSTFLAGS - - local thinlto_jobs=${JOBS:-1} - - case "$CARCH" in - # on this platforms, lld seems to not utilise >1 threads for thinlto for some reason. - # at the same time, having more than 8 also crashes lld for firefox buildsystems (why?). - aarch64) - if [ $thinlto_jobs -gt 8 ]; then - thinlto_jobs=8 - fi - ;; - esac - - export LDFLAGS="$LDFLAGS -Wl,--thinlto-jobs=$thinlto_jobs" - - case "$CARCH" in - # lto for 64-bit systems only - aarch64|x86_64|ppc64le) - cat > .mozconfig base-mozconfig <<-EOF - ac_add_options --enable-lto=cross - EOF - esac - - ./mach build - - # install to where zotero expects it - DESTDIR="$builddir"/zotero/app/xulrunner/firefox ./mach install - mv "$builddir"/zotero/app/xulrunner/firefox/usr/lib/firefox-esr/* "$builddir"/zotero/app/xulrunner/firefox/. - rm -R "$builddir"/zotero/app/xulrunner/firefox/usr - - # zotero build - ( - cd "$builddir"/zotero - NODE_OPTIONS=--openssl-legacy-provider npm run build - - SKIP_32=1 app/scripts/dir_build -p l - # move to seperate folder as check will rebuild with test files added - mv "$builddir"/zotero/app/staging "$builddir"/zotero/app/package - ) - - rm -R "$builddir"/zotero/app/xulrunner/firefox # clean-up unused firefox install -} - -check() { - # install to where zotero expects it - DESTDIR="$builddir"/zotero/app/xulrunner/firefox ./mach install - mv "$builddir"/zotero/app/xulrunner/firefox/usr/lib/firefox-esr/* "$builddir"/zotero/app/xulrunner/firefox/. - rm -R "$builddir"/zotero/app/xulrunner/firefox/usr - - # zotero test build - ( - cd "$builddir"/zotero - ZOTERO_TEST=1 SKIP_32=1 app/scripts/dir_build -p l - - ) - - # test-suite is not very stable, false failure occur from time to time, thus never fails - CI=true LD_LIBRARY_PATH="$builddir"/zotero/app/staging/Zotero_linux xvfb-run "$builddir"/zotero/test/runtests.sh -x "$builddir"/zotero/app/staging/Zotero_linux/zotero || true - - rm -R "$builddir"/zotero/app/xulrunner/firefox # clean-up unused firefox install -} - -package() { - install -dDm755 "$pkgdir"/usr/bin - install -dDm755 "$pkgdir"/usr/lib/zotero - cp -r "$builddir"/zotero/app/package/Zotero_linux/* "$pkgdir/usr/lib/zotero" - ln -s /usr/lib/zotero/zotero "$pkgdir/usr/bin/zotero" - install -Dm644 "$srcdir/zotero.desktop" "$pkgdir/usr/share/applications/zotero.desktop" - - # Copy zotero icons to a standard location - install -Dm644 "$pkgdir/usr/lib/zotero/icons/icon32.png" "$pkgdir/usr/share/icons/hicolor/32x32/apps/zotero.png" - install -Dm644 "$pkgdir/usr/lib/zotero/icons/icon64.png" "$pkgdir/usr/share/icons/hicolor/64x64/apps/zotero.png" - install -Dm644 "$pkgdir/usr/lib/zotero/icons/icon128.png" "$pkgdir/usr/share/icons/hicolor/128x128/apps/zotero.png" - - # Close shell when launching - sed -i -r 's:^("\$CALLDIR/zotero-bin" -app "\$CALLDIR/application.ini" "\$@"):exec \1:' "$pkgdir/usr/lib/zotero/zotero" -} - -sha512sums=" -dd40c1fd3cf454dbf33a85d38e47bb0e736ed89b829643653e239f43232441f4e9f3c7876f058ff2e6f19daf2b50a8f2d13274e9a107d8a258a6067d1fc43f54 firefox-115.14.0esr.source.tar.xz -3e0501ae7a650346c667dfdc0ae0ca286084f22e89ab2ac671cc0d7315673dc5b6dcb9f9882f6f39d26e9a31e57f7a0fd53d6b805e520224e22b8976850e2eb8 audio-lfs64.patch -454ea3263cabce099accbdc47aaf83be26a19f8b5a4568c01a7ef0384601cf8315efd86cd917f9c8bf419c2c845db89a905f3ff9a8eb0c8e41042e93aa96a85c disable-moz-stackwalk.patch -2f4f15974d52de4bb273b62a332d13620945d284bbc6fe6bd0a1f58ff7388443bc1d3bf9c82cc31a8527aad92b0cd3a1bc41d0af5e1800e0dcbd7033e58ffd71 fix-fortify-system-wrappers.patch -cd68b89e29e5f6379fbd5679db27b9a5ef70ea65e51c0d0a8137e1f1fd210e35a8cfb047798e9549bc7275606d7ec5c8d8af1335d29da4699db7acd8bc7ff556 fix-rust-target.patch -305c874fdea3096e9c4c6aa6520ac64bb1c347c4b59db8360096646593fe684c3b5377874d91cecd33d56d1410b4714fbdea2b514923723ecbeff79d51265d9b fix-webrtc-glibcisms.patch -afabea91b328c5a68eaa20f9099ac7b2d0e7f2423e816b05ed168bdd326a5684fa02de08bf05c6033e9b888f02775d1b0443a00329b7a632ee399122a391c13a icu74.patch -5fa9382c692e4bd6a2634308f24a6526fd12a60a2563d2090056d43a60505df3ec9881bbf54562e69394467529b3b0dc45955afca46ed329af03cea074fff070 lfs64.patch -d7a9443cd81d3ef4a6baa1b5d05f2497bc07c1de815a4d85b613b734989e7c589019dd860ea2eb9e32067973efbfd1c913790c6c238778da23d76fbd904128d1 llvm18-bindgen.patch -8c4de34188f634833d99d17bc389c43ab9576b3f0581387407ae77f636a890779cd02786b632fbdfd8b0305575517d51b04f76b9aa3f1a94c3d822578286fc6f llvm18.patch -e28b1fe2967d46c888b41a0a03ee1b6de763124a0281b68aebac04ec3b76cb6fdb56a376d419a003fd87f79e9d086aafd4aaa24efa3345f9857352d3d489356f moz-system-jpeg.patch -c0437a6753f3f350968fa12d250efdfe1bea77baf0e4c06b072b5cc9e78c774dbf4506bc536337030d349fb3ba4460097b75b0c7c5b8fb2d39d8b0a392948936 no-ccache-stats.patch -b586ddb21b50fa8fba798c3a269518049c38cc52fd91ad00e96a3f1144e6b2879d9df1a182a2fb181898042043ae98381a70d0e4acbf8aa705d2b4f62c17a5a1 nrappkit-qsort.patch -2d8dff86212d6d2a904cbb5a5a1d6c17b89adc929fc6a3f4c6cb669f5e83ecddff5a799225319ba445a187b04d111251af75dd3ce8a039164bc14d2a432a2a04 ppc-musttail.patch -6f60e83599041db1b707c21784197ea9816b2c936b89a274bfc24554a600981e6f28448fe41fab0942bd31acd49b1c00beb2eb0961149f2ffa6a4154be123ea7 ppc-webrtc.patch -4e40b34c5f77a1a21fe971a6fcd8a21b1a63423a3a7932a5a6e1c7a2779f9f06a561c806614a01931679a4b1c6afdfd8ae1f3cc6b673f259ccd368e8e54f6e90 python-deps.patch -1c6918dd6655d3a1251bfd4af2e1c561cbb00d540a883b4c1ebf7f5de530d754d9ac07b4b5f56cdab6c511d25c8910ec94043f5733e97501a67abffe1bafaeb1 rust-lto-thin.patch -e4795b88e572bb3b6f009dbacc7872b59db2f8facbe2b07f14dd4f45a77c22049783581869f18c6bb3f04d6edb3da59347278321cce2bfa629a4d35e136cda5c rust1.78-packed-to-portable_simd.patch -2518f2fc75b5db30058e0735f47d60fdf1e7adfaeee4b33fb2afb1bd9a616ce943fd88f4404d0802d4083703f4acf1d5ad42377218d025bc768807fbaf7e1609 sandbox-fork.patch -b7d0a6126bdf6c0569f80aabf5b37ed2c7a35712eb8a0404a2d85381552f5555d4f97d213ea26cec6a45dc2785f22439376ed5f8e78b4fd664ef0223307b333e sandbox-largefile.patch -f8c3555ef6207933cbffbf4fc101a9b4c0d2990c0063162f0f0bde70ef0b46f86bfac42e7110695183424a87948de593f3927b2d8509ede3e4fc7bd8a1fad1ce sandbox-sched_setscheduler.patch -0b3f1e4b9fdc868e4738b5c81fd6c6128ce8885b260affcb9a65ff9d164d7232626ce1291aaea70132b3e3124f5e13fef4d39326b8e7173e362a823722a85127 stab.h -382510375b1a2fa79be0ab79e3391a021ae2c022429ffbaa7e7a69166f99bb56d01e59a1b10688592a29238f21c9d6977672bd77f9fae439b66bdfe0c55ddb15 mozilla-location.keys -fc45bc3ffb9404e5338ea26a9f04807b40f6f516324972cddd48bedb91b8bd7c6b8d4e03a0209020f5e67b703bc4ff89389985791b9bd544a0fc3951e2dc338e vendor-prefs.js -e1a0a4ff5cc1b53f13776ca11927d671426b0691e78e74a4adf2166d57bb2ae8ac409cc11a37ce5e2f680fdf05d5bc3849c33a9717aca1bb62d03ae5231a67fb zotero.desktop -ba04ec60afd2e9f9500046128b60f1c68b0ac7e47f5fbbc4f4fbfde01df982eb1561d65fb0aef9bee4ee098c4babc5e9caa4c9e791ad616bb55d7a0523349f34 zotero-7.0.7.tar.gz -746dbabbb3ea9199d17891e2079b9256d04843f548132178862117d2334694d98e2cc981945d72f31d0e5b2c42904d371633f6905996bb580aa0b5ae95c64ddc zotero_build-modifications.patch -337070ee4c44ccb35c6b6290c18327740bb9fccfd1a6ad1045782e83daa290b6ced7d53955d3a889f661d588738a64f2e7f383639f4c46be9fdf891168abc9ff zotero_test-drop-build.patch -f0e4f09496531222e8400959f9ef12852bca269eb3bf4c3b87ccaf92f28a12b9374461a1c79ad294a4393dbe30800aa1c85497033d0bc304fa8c198dfab3efd2 zotero_test-fix-chars.patch -9dc390d8bae42e645cae45fe5551751d8f38d5c1b8b2cc0eec1c2191f4bde293ffb2c67cfc4de765f2d48b1da4d5fcd4f1c03711e5da3180cd1b63710ccf5599 zotero_test-push-timeout-to-30sec.patch -7fb791a386d30594a11ae3856295d5081000de7525036eb0b5836505bd4f0b13a4fe706400ad7efe00b75c2112cf3d59ea3542b6179ccd80f7ee1889349f441d zotero_drop-jazzer.patch -" diff --git a/user/zotero/audio-lfs64.patch b/user/zotero/audio-lfs64.patch deleted file mode 100644 index c34671a..0000000 --- a/user/zotero/audio-lfs64.patch +++ /dev/null @@ -1,61 +0,0 @@ ---- a/third_party/rust/audio_thread_priority/src/rt_linux.rs -+++ b/third_party/rust/audio_thread_priority/src/rt_linux.rs -@@ -112,7 +112,7 @@ - - /// Returns the maximum priority, maximum real-time time slice, and the current real-time time - /// slice for this process. --fn get_limits() -> Result<(i64, u64, libc::rlimit64), AudioThreadPriorityError> { -+fn get_limits() -> Result<(i64, u64, libc::rlimit), AudioThreadPriorityError> { - let c = Connection::get_private(BusType::System)?; - - let p = Props::new( -@@ -122,7 +122,7 @@ - "org.freedesktop.RealtimeKit1", - DBUS_SOCKET_TIMEOUT, - ); -- let mut current_limit = libc::rlimit64 { -+ let mut current_limit = libc::rlimit { - rlim_cur: 0, - rlim_max: 0, - }; -@@ -141,9 +141,9 @@ - )); - } - -- if unsafe { libc::getrlimit64(libc::RLIMIT_RTTIME, &mut current_limit) } < 0 { -+ if unsafe { libc::getrlimit(libc::RLIMIT_RTTIME, &mut current_limit) } < 0 { - return Err(AudioThreadPriorityError::new_with_inner( -- "getrlimit64", -+ "getrlimit", - Box::new(OSError::last_os_error()), - )); - } -@@ -154,13 +154,13 @@ - fn set_limits(request: u64, max: u64) -> Result<(), AudioThreadPriorityError> { - // Set a soft limit to the limit requested, to be able to handle going over the limit using - // SIGXCPU. Set the hard limit to the maxium slice to prevent getting SIGKILL. -- let new_limit = libc::rlimit64 { -+ let new_limit = libc::rlimit { - rlim_cur: request, - rlim_max: max, - }; -- if unsafe { libc::setrlimit64(libc::RLIMIT_RTTIME, &new_limit) } < 0 { -+ if unsafe { libc::setrlimit(libc::RLIMIT_RTTIME, &new_limit) } < 0 { - return Err(AudioThreadPriorityError::new_with_inner( -- "setrlimit64", -+ "setrlimit", - Box::new(OSError::last_os_error()), - )); - } -@@ -296,9 +296,9 @@ - match r { - Ok(_) => Ok(handle), - Err(e) => { -- if unsafe { libc::setrlimit64(libc::RLIMIT_RTTIME, &limits) } < 0 { -+ if unsafe { libc::setrlimit(libc::RLIMIT_RTTIME, &limits) } < 0 { - return Err(AudioThreadPriorityError::new_with_inner( -- "setrlimit64", -+ "setrlimit", - Box::new(OSError::last_os_error()), - )); - } diff --git a/user/zotero/disable-moz-stackwalk.patch b/user/zotero/disable-moz-stackwalk.patch deleted file mode 100644 index b6bc756..0000000 --- a/user/zotero/disable-moz-stackwalk.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/mozglue/misc/StackWalk.cpp b/mozglue/misc/StackWalk.cpp -index 7d62921..adcfa44 100644 ---- a/mozglue/misc/StackWalk.cpp -+++ b/mozglue/misc/StackWalk.cpp -@@ -33,13 +33,7 @@ using namespace mozilla; - # define MOZ_STACKWALK_SUPPORTS_MACOSX 0 - #endif - --#if (defined(linux) && \ -- ((defined(__GNUC__) && (defined(__i386) || defined(PPC))) || \ -- defined(HAVE__UNWIND_BACKTRACE))) --# define MOZ_STACKWALK_SUPPORTS_LINUX 1 --#else - # define MOZ_STACKWALK_SUPPORTS_LINUX 0 --#endif - - #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) - # define HAVE___LIBC_STACK_END 1 diff --git a/user/zotero/fix-fortify-system-wrappers.patch b/user/zotero/fix-fortify-system-wrappers.patch deleted file mode 100644 index 17cf7e3..0000000 --- a/user/zotero/fix-fortify-system-wrappers.patch +++ /dev/null @@ -1,13 +0,0 @@ -The wrapper features.h gets pulled in by system headers causing thigns to -break. We work around it by simply not wrap features.h - ---- ./config/system-headers.mozbuild.orig -+++ ./config/system-headers.mozbuild -@@ -229,7 +229,6 @@ - 'execinfo.h', - 'extras.h', - 'fcntl.h', -- 'features.h', - 'fenv.h', - 'ffi.h', - 'fibdef.h', diff --git a/user/zotero/fix-rust-target.patch b/user/zotero/fix-rust-target.patch deleted file mode 100644 index 9342063..0000000 --- a/user/zotero/fix-rust-target.patch +++ /dev/null @@ -1,31 +0,0 @@ -Allow us to just set RUST_TARGEt ourselves instead of hacking around in mozilla's -weird custom build system... - ---- a/build/moz.configure/rust.configure -+++ b/build/moz.configure/rust.configure -@@ -225,7 +225,9 @@ - data.setdefault(key, []).append(namespace(rust_target=t, target=info)) - return data - -- -+@imports('os') -+@imports(_from='mozbuild.util', _import='ensure_unicode') -+@imports(_from='mozbuild.util', _import='system_encoding') - def detect_rustc_target( - host_or_target, compiler_info, arm_target, rust_supported_targets - ): -@@ -340,13 +342,13 @@ - - return None - -- rustc_target = find_candidate(candidates) -+ rustc_target = os.environ['RUST_TARGET'] - - if rustc_target is None: - die("Don't know how to translate {} for rustc".format(host_or_target.alias)) - -- return rustc_target -+ return ensure_unicode(rustc_target, system_encoding) - - - @imports('os') diff --git a/user/zotero/fix-webrtc-glibcisms.patch b/user/zotero/fix-webrtc-glibcisms.patch deleted file mode 100644 index 4f9043b..0000000 --- a/user/zotero/fix-webrtc-glibcisms.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/third_party/libwebrtc/system_wrappers/source/cpu_features_linux.cc -+++ b/third_party/libwebrtc/system_wrappers/source/cpu_features_linux.cc -@@ -18,7 +18,7 @@ - #define WEBRTC_GLIBC_PREREQ(a, b) 0 - #endif - --#if WEBRTC_GLIBC_PREREQ(2, 16) -+#if !__GLIBC__ || WEBRTC_GLIBC_PREREQ(2, 16) - #include - #else - #include -@@ -40,7 +40,7 @@ - int architecture = 0; - uint64_t hwcap = 0; - const char* platform = NULL; --#if WEBRTC_GLIBC_PREREQ(2, 16) -+#if !__GLIBC__ || WEBRTC_GLIBC_PREREQ(2, 16) - hwcap = getauxval(AT_HWCAP); - platform = (const char*)getauxval(AT_PLATFORM); - #else diff --git a/user/zotero/icu74.patch b/user/zotero/icu74.patch deleted file mode 100644 index 46c9445..0000000 --- a/user/zotero/icu74.patch +++ /dev/null @@ -1,38 +0,0 @@ -https://bugzilla.mozilla.org/show_bug.cgi?id=1862601 - -# HG changeset patch -# User André Bargull -# Date 1697435923 -7200 -# Node ID d5f3b0c4f08a426ce00a153c04e177eecb6820e2 -# Parent c63994f8259efdf6e745c960aa9e1409d5477049 -Bug xxx - Part 12: Add new line break classes. r? - -diff --git a/intl/lwbrk/LineBreaker.cpp b/intl/lwbrk/LineBreaker.cpp ---- a/intl/lwbrk/LineBreaker.cpp -+++ b/intl/lwbrk/LineBreaker.cpp -@@ -443,17 +443,23 @@ static int8_t GetClass(uint32_t u, LineB - /* JT = 34, [JT] */ CLASS_CHARACTER, - /* JV = 35, [JV] */ CLASS_CHARACTER, - /* CLOSE_PARENTHESIS = 36, [CP] */ CLASS_CLOSE_LIKE_CHARACTER, - /* CONDITIONAL_JAPANESE_STARTER = 37, [CJ] */ CLASS_CLOSE, - /* HEBREW_LETTER = 38, [HL] */ CLASS_CHARACTER, - /* REGIONAL_INDICATOR = 39, [RI] */ CLASS_CHARACTER, - /* E_BASE = 40, [EB] */ CLASS_BREAKABLE, - /* E_MODIFIER = 41, [EM] */ CLASS_CHARACTER, -- /* ZWJ = 42, [ZWJ]*/ CLASS_CHARACTER}; -+ /* ZWJ = 42, [ZWJ]*/ CLASS_CHARACTER, -+ /* AKSARA = 43, [AK] */ CLASS_CHARACTER, -+ /* AKSARA_PREBASE = 44, [AP] */ CLASS_CHARACTER, -+ /* AKSARA_START = 45, [AS] */ CLASS_CHARACTER, -+ /* VIRAMA_FINAL = 46, [VF] */ CLASS_CHARACTER, -+ /* VIRAMA = 47, [VI] */ CLASS_CHARACTER, -+ }; - - static_assert(U_LB_COUNT == mozilla::ArrayLength(sUnicodeLineBreakToClass), - "Gecko vs ICU LineBreak class mismatch"); - - auto cls = GetLineBreakClass(u); - MOZ_ASSERT(cls < mozilla::ArrayLength(sUnicodeLineBreakToClass)); - - // Overrides based on rules for the different line-break values given in - diff --git a/user/zotero/lfs64.patch b/user/zotero/lfs64.patch deleted file mode 100644 index bae8b5d..0000000 --- a/user/zotero/lfs64.patch +++ /dev/null @@ -1,35 +0,0 @@ -force stat() instead of stat64() on 32-bit --- ---- a/xpcom/io/nsLocalFileUnix.h -+++ b/xpcom/io/nsLocalFileUnix.h -@@ -21,7 +21,7 @@ - - // stat64 and lstat64 are deprecated on OS X. Normal stat and lstat are - // 64-bit by default on OS X 10.6+. --#if defined(HAVE_STAT64) && defined(HAVE_LSTAT64) && !defined(XP_DARWIN) -+#if 0 && defined(HAVE_STAT64) && defined(HAVE_LSTAT64) && !defined(XP_DARWIN) - # if defined(AIX) - # if defined STAT - # undef STAT ---- a/mozglue/baseprofiler/core/shared-libraries-linux.cc -+++ b/mozglue/baseprofiler/core/shared-libraries-linux.cc -@@ -178,7 +178,7 @@ - return false; - } - --#if defined(__x86_64__) || defined(__aarch64__) || \ -+#if 1 || defined(__x86_64__) || defined(__aarch64__) || \ - (defined(__mips__) && _MIPS_SIM == _ABI64) || \ - !(defined(GP_OS_linux) || defined(GP_OS_android)) - ---- a/security/sandbox/linux/broker/SandboxBrokerUtils.h -+++ b/security/sandbox/linux/broker/SandboxBrokerUtils.h -@@ -15,7 +15,7 @@ - // calls. We'll intercept those and handle them in the stat functions - // but must be sure to use the right structure layout. - --#if defined(__NR_stat64) || defined(__NR_fstatat64) -+#if 0 && (defined(__NR_stat64) || defined(__NR_fstatat64) ) - typedef struct stat64 statstruct; - # define statsyscall stat64 - # define lstatsyscall lstat64 diff --git a/user/zotero/llvm18-bindgen.patch b/user/zotero/llvm18-bindgen.patch deleted file mode 100644 index 67270f3..0000000 --- a/user/zotero/llvm18-bindgen.patch +++ /dev/null @@ -1,619 +0,0 @@ -Patch-Source: https://github.com/chimera-linux/cports/blob/899c997/contrib/thunderbird/patches/llvm18-bindgen.patch -https://github.com/rust-lang/rust-bindgen/pull/2689 --- -diff --git a/ir/item.rs b/ir/item.rs -index 40f6f7d..87d09da 100644 ---- a/third_party/rust/bindgen/ir/item.rs -+++ b/third_party/rust/bindgen/ir/item.rs -@@ -6,8 +6,8 @@ use super::annotations::Annotations; - use super::comp::{CompKind, MethodKind}; - use super::context::{BindgenContext, ItemId, PartialType, TypeId}; - use super::derive::{ -- CanDeriveCopy, CanDeriveDebug, CanDeriveDefault, CanDeriveEq, -- CanDeriveHash, CanDeriveOrd, CanDerivePartialEq, CanDerivePartialOrd, -+ CanDeriveCopy, CanDeriveDebug, CanDeriveDefault, CanDeriveEq, CanDeriveHash, CanDeriveOrd, -+ CanDerivePartialEq, CanDerivePartialOrd, - }; - use super::dot::DotAttributes; - use super::function::{Function, FunctionKind}; -@@ -59,10 +59,7 @@ pub trait ItemCanonicalPath { - /// Get the namespace-aware canonical path for this item. This means that if - /// namespaces are disabled, you'll get a single item, and otherwise you get - /// the whole path. -- fn namespace_aware_canonical_path( -- &self, -- ctx: &BindgenContext, -- ) -> Vec; -+ fn namespace_aware_canonical_path(&self, ctx: &BindgenContext) -> Vec; - - /// Get the canonical path for this item. - fn canonical_path(&self, ctx: &BindgenContext) -> Vec; -@@ -159,11 +156,7 @@ where - { - type Extra = (); - -- fn as_template_param( -- &self, -- ctx: &BindgenContext, -- _: &(), -- ) -> Option { -+ fn as_template_param(&self, ctx: &BindgenContext, _: &()) -> Option { - ctx.resolve_item((*self).into()).as_template_param(ctx, &()) - } - } -@@ -171,11 +164,7 @@ where - impl AsTemplateParam for Item { - type Extra = (); - -- fn as_template_param( -- &self, -- ctx: &BindgenContext, -- _: &(), -- ) -> Option { -+ fn as_template_param(&self, ctx: &BindgenContext, _: &()) -> Option { - self.kind.as_template_param(ctx, self) - } - } -@@ -183,16 +172,10 @@ impl AsTemplateParam for Item { - impl AsTemplateParam for ItemKind { - type Extra = Item; - -- fn as_template_param( -- &self, -- ctx: &BindgenContext, -- item: &Item, -- ) -> Option { -+ fn as_template_param(&self, ctx: &BindgenContext, item: &Item) -> Option { - match *self { - ItemKind::Type(ref ty) => ty.as_template_param(ctx, item), -- ItemKind::Module(..) | -- ItemKind::Function(..) | -- ItemKind::Var(..) => None, -+ ItemKind::Module(..) | ItemKind::Function(..) | ItemKind::Var(..) => None, - } - } - } -@@ -214,10 +197,7 @@ impl ItemCanonicalPath for T - where - T: Copy + Into, - { -- fn namespace_aware_canonical_path( -- &self, -- ctx: &BindgenContext, -- ) -> Vec { -+ fn namespace_aware_canonical_path(&self, ctx: &BindgenContext) -> Vec { - debug_assert!( - ctx.in_codegen_phase(), - "You're not supposed to call this yet" -@@ -282,9 +262,7 @@ impl Trace for Item { - // There are some types, like resolved type references, where we - // don't want to stop collecting types even though they may be - // opaque. -- if ty.should_be_traced_unconditionally() || -- !self.is_opaque(ctx, &()) -- { -+ if ty.should_be_traced_unconditionally() || !self.is_opaque(ctx, &()) { - ty.trace(ctx, tracer, self); - } - } -@@ -450,11 +428,7 @@ impl Item { - } - - /// Construct a new opaque item type. -- pub fn new_opaque_type( -- with_id: ItemId, -- ty: &clang::Type, -- ctx: &mut BindgenContext, -- ) -> TypeId { -+ pub fn new_opaque_type(with_id: ItemId, ty: &clang::Type, ctx: &mut BindgenContext) -> TypeId { - let location = ty.declaration().location(); - let ty = Opaque::from_clang_ty(ty, ctx); - let kind = ItemKind::Type(ty); -@@ -497,12 +471,11 @@ impl Item { - self.ancestors(ctx) - .filter(|id| { - ctx.resolve_item(*id).as_module().map_or(false, |module| { -- !module.is_inline() || -- ctx.options().conservative_inline_namespaces -+ !module.is_inline() || ctx.options().conservative_inline_namespaces - }) - }) -- .count() + -- 1 -+ .count() -+ + 1 - } - - /// Get this `Item`'s comment, if it has any, already preprocessed and with -@@ -577,9 +550,9 @@ impl Item { - pub fn is_toplevel(&self, ctx: &BindgenContext) -> bool { - // FIXME: Workaround for some types falling behind when parsing weird - // stl classes, for example. -- if ctx.options().enable_cxx_namespaces && -- self.kind().is_module() && -- self.id() != ctx.root_module() -+ if ctx.options().enable_cxx_namespaces -+ && self.kind().is_module() -+ && self.id() != ctx.root_module() - { - return false; - } -@@ -593,9 +566,7 @@ impl Item { - - if parent_item.id() == ctx.root_module() { - return true; -- } else if ctx.options().enable_cxx_namespaces || -- !parent_item.kind().is_module() -- { -+ } else if ctx.options().enable_cxx_namespaces || !parent_item.kind().is_module() { - return false; - } - -@@ -656,15 +627,13 @@ impl Item { - - let path = self.path_for_allowlisting(ctx); - let name = path[1..].join("::"); -- ctx.options().blocklisted_items.matches(&name) || -- match self.kind { -+ ctx.options().blocklisted_items.matches(&name) -+ || match self.kind { - ItemKind::Type(..) => { -- ctx.options().blocklisted_types.matches(&name) || -- ctx.is_replaced_type(path, self.id) -- } -- ItemKind::Function(..) => { -- ctx.options().blocklisted_functions.matches(&name) -+ ctx.options().blocklisted_types.matches(&name) -+ || ctx.is_replaced_type(path, self.id) - } -+ ItemKind::Function(..) => ctx.options().blocklisted_functions.matches(&name), - // TODO: Add constant / namespace blocklisting? - ItemKind::Var(..) | ItemKind::Module(..) => false, - } -@@ -723,12 +692,7 @@ impl Item { - } - - /// Helper function for full_disambiguated_name -- fn push_disambiguated_name( -- &self, -- ctx: &BindgenContext, -- to: &mut String, -- level: u8, -- ) { -+ fn push_disambiguated_name(&self, ctx: &BindgenContext, to: &mut String, level: u8) { - to.push_str(&self.canonical_name(ctx)); - if let ItemKind::Type(ref ty) = *self.kind() { - if let TypeKind::TemplateInstantiation(ref inst) = *ty.kind() { -@@ -791,16 +755,14 @@ impl Item { - - match *self.kind() { - ItemKind::Var(ref var) => var.name().to_owned(), -- ItemKind::Module(ref module) => { -- module.name().map(ToOwned::to_owned).unwrap_or_else(|| { -- format!("_bindgen_mod_{}", self.exposed_id(ctx)) -- }) -- } -- ItemKind::Type(ref ty) => { -- ty.sanitized_name(ctx).map(Into::into).unwrap_or_else(|| { -- format!("_bindgen_ty_{}", self.exposed_id(ctx)) -- }) -- } -+ ItemKind::Module(ref module) => module -+ .name() -+ .map(ToOwned::to_owned) -+ .unwrap_or_else(|| format!("_bindgen_mod_{}", self.exposed_id(ctx))), -+ ItemKind::Type(ref ty) => ty -+ .sanitized_name(ctx) -+ .map(Into::into) -+ .unwrap_or_else(|| format!("_bindgen_ty_{}", self.exposed_id(ctx))), - ItemKind::Function(ref fun) => { - let mut name = fun.name().to_owned(); - -@@ -839,11 +801,7 @@ impl Item { - /// If `BindgenOptions::disable_nested_struct_naming` is true then returned - /// name is the inner most non-anonymous name plus all the anonymous base names - /// that follows. -- pub fn real_canonical_name( -- &self, -- ctx: &BindgenContext, -- opt: &NameOptions, -- ) -> String { -+ pub fn real_canonical_name(&self, ctx: &BindgenContext, opt: &NameOptions) -> String { - let target = ctx.resolve_item(self.name_target(ctx)); - - // Short-circuit if the target has an override, and just use that. -@@ -874,9 +832,7 @@ impl Item { - }) - .filter(|id| { - if !ctx.options().conservative_inline_namespaces { -- if let ItemKind::Module(ref module) = -- *ctx.resolve_item(*id).kind() -- { -+ if let ItemKind::Module(ref module) = *ctx.resolve_item(*id).kind() { - return !module.is_inline(); - } - } -@@ -947,9 +903,9 @@ impl Item { - let ty_kind = self.kind().as_type().map(|t| t.kind()); - if let Some(ty_kind) = ty_kind { - match *ty_kind { -- TypeKind::Comp(..) | -- TypeKind::TemplateInstantiation(..) | -- TypeKind::Enum(..) => return self.local_id(ctx).to_string(), -+ TypeKind::Comp(..) | TypeKind::TemplateInstantiation(..) | TypeKind::Enum(..) => { -+ return self.local_id(ctx).to_string() -+ } - _ => {} - } - } -@@ -990,8 +946,7 @@ impl Item { - - match *type_.kind() { - TypeKind::Enum(ref enum_) => { -- enum_.computed_enum_variation(ctx, self) == -- EnumVariation::ModuleConsts -+ enum_.computed_enum_variation(ctx, self) == EnumVariation::ModuleConsts - } - TypeKind::Alias(inner_id) => { - // TODO(emilio): Make this "hop through type aliases that aren't -@@ -1018,18 +973,12 @@ impl Item { - ItemKind::Type(_) => cc.types(), - ItemKind::Function(ref f) => match f.kind() { - FunctionKind::Function => cc.functions(), -- FunctionKind::Method(MethodKind::Constructor) => { -- cc.constructors() -- } -- FunctionKind::Method(MethodKind::Destructor) | -- FunctionKind::Method(MethodKind::VirtualDestructor { -- .. -- }) => cc.destructors(), -- FunctionKind::Method(MethodKind::Static) | -- FunctionKind::Method(MethodKind::Normal) | -- FunctionKind::Method(MethodKind::Virtual { .. }) => { -- cc.methods() -- } -+ FunctionKind::Method(MethodKind::Constructor) => cc.constructors(), -+ FunctionKind::Method(MethodKind::Destructor) -+ | FunctionKind::Method(MethodKind::VirtualDestructor { .. }) => cc.destructors(), -+ FunctionKind::Method(MethodKind::Static) -+ | FunctionKind::Method(MethodKind::Normal) -+ | FunctionKind::Method(MethodKind::Virtual { .. }) => cc.methods(), - }, - } - } -@@ -1041,14 +990,9 @@ impl Item { - .borrow_with(|| self.compute_path(ctx, UserMangled::No)) - } - -- fn compute_path( -- &self, -- ctx: &BindgenContext, -- mangled: UserMangled, -- ) -> Vec { -+ fn compute_path(&self, ctx: &BindgenContext, mangled: UserMangled) -> Vec { - if let Some(path) = self.annotations().use_instead_of() { -- let mut ret = -- vec![ctx.resolve_item(ctx.root_module()).name(ctx).get()]; -+ let mut ret = vec![ctx.resolve_item(ctx.root_module()).name(ctx).get()]; - ret.extend_from_slice(path); - return ret; - } -@@ -1059,10 +1003,9 @@ impl Item { - .chain(iter::once(ctx.root_module().into())) - .map(|id| ctx.resolve_item(id)) - .filter(|item| { -- item.id() == target.id() || -- item.as_module().map_or(false, |module| { -- !module.is_inline() || -- ctx.options().conservative_inline_namespaces -+ item.id() == target.id() -+ || item.as_module().map_or(false, |module| { -+ !module.is_inline() || ctx.options().conservative_inline_namespaces - }) - }) - .map(|item| { -@@ -1123,9 +1066,9 @@ impl IsOpaque for Item { - ctx.in_codegen_phase(), - "You're not supposed to call this yet" - ); -- self.annotations.opaque() || -- self.as_type().map_or(false, |ty| ty.is_opaque(ctx, self)) || -- ctx.opaque_by_name(self.path_for_allowlisting(ctx)) -+ self.annotations.opaque() -+ || self.as_type().map_or(false, |ty| ty.is_opaque(ctx, self)) -+ || ctx.opaque_by_name(self.path_for_allowlisting(ctx)) - } - } - -@@ -1225,11 +1168,7 @@ impl HasFloat for Item { - pub type ItemSet = BTreeSet; - - impl DotAttributes for Item { -- fn dot_attributes( -- &self, -- ctx: &BindgenContext, -- out: &mut W, -- ) -> io::Result<()> -+ fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where - W: io::Write, - { -@@ -1306,17 +1245,10 @@ fn visit_child( - } - - impl Item { -- pub(crate) fn builtin_type( -- kind: TypeKind, -- is_const: bool, -- ctx: &mut BindgenContext, -- ) -> TypeId { -+ pub(crate) fn builtin_type(kind: TypeKind, is_const: bool, ctx: &mut BindgenContext) -> TypeId { - // Feel free to add more here, I'm just lazy. - match kind { -- TypeKind::Void | -- TypeKind::Int(..) | -- TypeKind::Pointer(..) | -- TypeKind::Float(..) => {} -+ TypeKind::Void | TypeKind::Int(..) | TypeKind::Pointer(..) | TypeKind::Float(..) => {} - _ => panic!("Unsupported builtin type"), - } - -@@ -1428,52 +1360,44 @@ impl Item { - } - - // Guess how does clang treat extern "C" blocks? -- if cursor.kind() == CXCursor_UnexposedDecl { -- Err(ParseError::Recurse) -- } else { -+ match cursor.kind() { -+ // On Clang 18+, extern "C" is reported accurately as a LinkageSpec. -+ // Older LLVM treat it as UnexposedDecl. -+ CXCursor_LinkageSpec | CXCursor_UnexposedDecl => Err(ParseError::Recurse), - // We allowlist cursors here known to be unhandled, to prevent being - // too noisy about this. -- match cursor.kind() { -- CXCursor_MacroDefinition | -- CXCursor_MacroExpansion | -- CXCursor_UsingDeclaration | -- CXCursor_UsingDirective | -- CXCursor_StaticAssert | -- CXCursor_FunctionTemplate => { -- debug!( -- "Unhandled cursor kind {:?}: {:?}", -- cursor.kind(), -- cursor -- ); -- } -- CXCursor_InclusionDirective => { -- let file = cursor.get_included_file_name(); -- match file { -- None => { -- warn!( -- "Inclusion of a nameless file in {:?}", -- cursor -- ); -- } -- Some(filename) => { -- ctx.include_file(filename); -- } -- } -- } -- _ => { -- // ignore toplevel operator overloads -- let spelling = cursor.spelling(); -- if !spelling.starts_with("operator") { -- warn!( -- "Unhandled cursor kind {:?}: {:?}", -- cursor.kind(), -- cursor -- ); -- } -- } -+ CXCursor_MacroDefinition -+ | CXCursor_MacroExpansion -+ | CXCursor_UsingDeclaration -+ | CXCursor_UsingDirective -+ | CXCursor_StaticAssert -+ | CXCursor_FunctionTemplate => { -+ debug!("Unhandled cursor kind {:?}: {:?}", cursor.kind(), cursor); -+ Err(ParseError::Continue) - } - -- Err(ParseError::Continue) -+ CXCursor_InclusionDirective => { -+ let file = cursor.get_included_file_name(); -+ match file { -+ None => { -+ warn!("Inclusion of a nameless file in {:?}", cursor); -+ } -+ Some(included_file) => { -+ for cb in &ctx.options().parse_callbacks { -+ cb.include_file(&included_file); -+ } -+ } -+ } -+ Err(ParseError::Continue) -+ } -+ _ => { -+ // ignore toplevel operator overloads -+ let spelling = cursor.spelling(); -+ if !spelling.starts_with("operator") { -+ warn!("Unhandled cursor kind {:?}: {:?}", cursor.kind(), cursor); -+ } -+ Err(ParseError::Continue) -+ } - } - } - -@@ -1511,22 +1435,11 @@ impl Item { - - if ctx.collected_typerefs() { - debug!("refs already collected, resolving directly"); -- return Item::from_ty_with_id( -- potential_id, -- &ty, -- location, -- parent_id, -- ctx, -- ) -- .unwrap_or_else(|_| Item::new_opaque_type(potential_id, &ty, ctx)); -+ return Item::from_ty_with_id(potential_id, &ty, location, parent_id, ctx) -+ .unwrap_or_else(|_| Item::new_opaque_type(potential_id, &ty, ctx)); - } - -- if let Some(ty) = ctx.builtin_or_resolved_ty( -- potential_id, -- parent_id, -- &ty, -- Some(location), -- ) { -+ if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, parent_id, &ty, Some(location)) { - debug!("{:?} already resolved: {:?}", ty, location); - return ty; - } -@@ -1586,12 +1499,10 @@ impl Item { - id, ty, location - ); - -- if ty.kind() == clang_sys::CXType_Unexposed || -- location.cur_type().kind() == clang_sys::CXType_Unexposed -+ if ty.kind() == clang_sys::CXType_Unexposed -+ || location.cur_type().kind() == clang_sys::CXType_Unexposed - { -- if ty.is_associated_type() || -- location.cur_type().is_associated_type() -- { -+ if ty.is_associated_type() || location.cur_type().is_associated_type() { - return Ok(Item::new_opaque_type(id, ty, ctx)); - } - -@@ -1618,8 +1529,7 @@ impl Item { - }; - - let comment = decl.raw_comment().or_else(|| location.raw_comment()); -- let annotations = -- Annotations::new(&decl).or_else(|| Annotations::new(&location)); -+ let annotations = Annotations::new(&decl).or_else(|| Annotations::new(&location)); - - if let Some(ref annotations) = annotations { - if let Some(replaced) = annotations.use_instead_of() { -@@ -1627,9 +1537,7 @@ impl Item { - } - } - -- if let Some(ty) = -- ctx.builtin_or_resolved_ty(id, parent_id, ty, Some(location)) -- { -+ if let Some(ty) = ctx.builtin_or_resolved_ty(id, parent_id, ty, Some(location)) { - return Ok(ty); - } - -@@ -1665,9 +1573,7 @@ impl Item { - let result = Type::from_clang_ty(id, ty, location, parent_id, ctx); - let relevant_parent_id = parent_id.unwrap_or(current_module); - let ret = match result { -- Ok(ParseResult::AlreadyResolved(ty)) => { -- Ok(ty.as_type_id_unchecked()) -- } -+ Ok(ParseResult::AlreadyResolved(ty)) => Ok(ty.as_type_id_unchecked()), - Ok(ParseResult::New(item, declaration)) => { - ctx.add_item( - Item::new( -@@ -1698,13 +1604,10 @@ impl Item { - assert_eq!(*finished.decl(), declaration_to_look_for); - } - -- location.visit(|cur| { -- visit_child(cur, id, ty, parent_id, ctx, &mut result) -- }); -+ location.visit(|cur| visit_child(cur, id, ty, parent_id, ctx, &mut result)); - - if valid_decl { -- let partial_ty = -- PartialType::new(declaration_to_look_for, id); -+ let partial_ty = PartialType::new(declaration_to_look_for, id); - ctx.begin_parsing(partial_ty); - } - -@@ -1813,10 +1716,7 @@ impl Item { - // but maintaining these scopes properly would require more changes to - // the whole libclang -> IR parsing code. - -- fn is_template_with_spelling( -- refd: &clang::Cursor, -- spelling: &str, -- ) -> bool { -+ fn is_template_with_spelling(refd: &clang::Cursor, spelling: &str) -> bool { - lazy_static! { - static ref ANON_TYPE_PARAM_RE: regex::Regex = - regex::Regex::new(r"^type\-parameter\-\d+\-\d+$").unwrap(); -@@ -1838,11 +1738,7 @@ impl Item { - } else if location.kind() == clang_sys::CXCursor_TypeRef { - // Situation (2) - match location.referenced() { -- Some(refd) -- if is_template_with_spelling(&refd, &ty_spelling) => -- { -- refd -- } -+ Some(refd) if is_template_with_spelling(&refd, &ty_spelling) => refd, - _ => return None, - } - } else { -@@ -1851,16 +1747,11 @@ impl Item { - - location.visit(|child| { - let child_ty = child.cur_type(); -- if child_ty.kind() == clang_sys::CXCursor_TypeRef && -- child_ty.spelling() == ty_spelling -+ if child_ty.kind() == clang_sys::CXCursor_TypeRef -+ && child_ty.spelling() == ty_spelling - { - match child.referenced() { -- Some(refd) -- if is_template_with_spelling( -- &refd, -- &ty_spelling, -- ) => -- { -+ Some(refd) if is_template_with_spelling(&refd, &ty_spelling) => { - definition = Some(refd); - return clang_sys::CXChildVisit_Break; - } -@@ -1883,12 +1774,7 @@ impl Item { - - if let Some(id) = ctx.get_type_param(&definition) { - if let Some(with_id) = with_id { -- return Some(ctx.build_ty_wrapper( -- with_id, -- id, -- Some(parent), -- &ty, -- )); -+ return Some(ctx.build_ty_wrapper(with_id, id, Some(parent), &ty)); - } else { - return Some(id); - } -@@ -1920,8 +1806,8 @@ impl ItemCanonicalName for Item { - ); - self.canonical_name - .borrow_with(|| { -- let in_namespace = ctx.options().enable_cxx_namespaces || -- ctx.options().disable_name_namespacing; -+ let in_namespace = -+ ctx.options().enable_cxx_namespaces || ctx.options().disable_name_namespacing; - - if in_namespace { - self.name(ctx).within_namespaces().get() -@@ -1934,10 +1820,7 @@ impl ItemCanonicalName for Item { - } - - impl ItemCanonicalPath for Item { -- fn namespace_aware_canonical_path( -- &self, -- ctx: &BindgenContext, -- ) -> Vec { -+ fn namespace_aware_canonical_path(&self, ctx: &BindgenContext) -> Vec { - let mut path = self.canonical_path(ctx); - - // ASSUMPTION: (disable_name_namespacing && cxx_namespaces) diff --git a/user/zotero/llvm18.patch b/user/zotero/llvm18.patch deleted file mode 100644 index 2f0fd99..0000000 --- a/user/zotero/llvm18.patch +++ /dev/null @@ -1,23 +0,0 @@ -Patch-Source: https://github.com/chimera-linux/cports/blob/899c997/contrib/thunderbird/patches/llvm18.patch ---- a/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp -+++ b/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp -@@ -540,7 +540,7 @@ - - webrtc::VideoFrameType ft; - GmpFrameTypeToWebrtcFrameType(aEncodedFrame->FrameType(), &ft); -- uint32_t timestamp = (aEncodedFrame->TimeStamp() * 90ll + 999) / 1000; -+ uint64_t timestamp = (aEncodedFrame->TimeStamp() * 90ll + 999) / 1000; - - GMP_LOG_DEBUG("GMP Encoded: %" PRIu64 ", type %d, len %d", - aEncodedFrame->TimeStamp(), aEncodedFrame->BufferType(), ---- a/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h -+++ b/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h -@@ -302,7 +302,7 @@ - int64_t timestamp_us; - }; - // Map rtp time -> input image data -- DataMutex> mInputImageMap; -+ DataMutex> mInputImageMap; - - MediaEventProducer mInitPluginEvent; - MediaEventProducer mReleasePluginEvent; diff --git a/user/zotero/moz-system-jpeg.patch b/user/zotero/moz-system-jpeg.patch deleted file mode 100644 index 27e9eb2..0000000 --- a/user/zotero/moz-system-jpeg.patch +++ /dev/null @@ -1,15 +0,0 @@ -Patch-Source: https://phabricator.services.mozilla.com/D212612 - -diff --git a/toolkit/moz.configure b/toolkit/moz.configure -index 6d5485325c..c5dcc65dd5 100644 ---- a/toolkit/moz.configure -+++ b/toolkit/moz.configure -@@ -2426,6 +2426,8 @@ with only_when(compile_environment): - & jpeg_arm_neon_vld1q_u8_x4, - ) - -+ set_config("MOZ_SYSTEM_JPEG", True, when="--with-system-jpeg") -+ - - # PNG - # === diff --git a/user/zotero/mozilla-location.keys b/user/zotero/mozilla-location.keys deleted file mode 100644 index 8a3262d..0000000 --- a/user/zotero/mozilla-location.keys +++ /dev/null @@ -1 +0,0 @@ -NjhhZGJjMDEtMDM3OC00Zjc0LTk0N2UtMzBiYzA5NjlhMDc3Cg== diff --git a/user/zotero/no-ccache-stats.patch b/user/zotero/no-ccache-stats.patch deleted file mode 100644 index 4d557a0..0000000 --- a/user/zotero/no-ccache-stats.patch +++ /dev/null @@ -1,13 +0,0 @@ -prevents a call to ccache -diff --git a/python/mozbuild/mozbuild/controller/building.py b/python/mozbuild/mozbuild/controller/building.py -index bf7009a..011c012 100644 ---- a/python/mozbuild/mozbuild/controller/building.py -+++ b/python/mozbuild/mozbuild/controller/building.py -@@ -570,6 +570,7 @@ class BuildMonitor(MozbuildObject): - ) - - def ccache_stats(self, ccache=None): -+ return None - ccache_stats = None - - if ccache is None: diff --git a/user/zotero/nrappkit-qsort.patch b/user/zotero/nrappkit-qsort.patch deleted file mode 100644 index 21d6d45..0000000 --- a/user/zotero/nrappkit-qsort.patch +++ /dev/null @@ -1,34 +0,0 @@ -missing include to use qsort() - -https://bugzil.la/1906955 - ---- a/dom/media/webrtc/transport/third_party/nrappkit/src/registry/registry_local.c 2024-07-09 18:11:39.207125821 +0200 -+++ b/dom/media/webrtc/transport/third_party/nrappkit/src/registry/registry_local.c 2024-07-09 18:12:07.657013364 +0200 -@@ -53,6 +53,7 @@ - #include - #endif - #include -+#include - #include "registry.h" - #include "registry_int.h" - #include "registry_vtbl.h" -@@ -62,6 +63,10 @@ - #include "r_errors.h" - #include "r_macros.h" - -+static int nr_compare_string(const void *arg1, const void *arg2) { -+ return strcasecmp(*(const char **)arg1, *(const char **)arg2); -+} -+ - /* if C were an object-oriented language, nr_scalar_registry_node and - * nr_array_registry_node would subclass nr_registry_node, but it isn't - * object-oriented language, so this is used in cases where the pointer -@@ -1067,7 +1072,7 @@ - } - - assert(sizeof(*arg.children) == sizeof(NR_registry)); -- qsort(arg.children, arg.length, sizeof(*arg.children), (void*)strcasecmp); -+ qsort(arg.children, arg.length, sizeof(*arg.children), nr_compare_string); - - *length = arg.length; - diff --git a/user/zotero/ppc-musttail.patch b/user/zotero/ppc-musttail.patch deleted file mode 100644 index ebe06c0..0000000 --- a/user/zotero/ppc-musttail.patch +++ /dev/null @@ -1,30 +0,0 @@ -Patch-Source: https://github.com/chimera-linux/cports/blob/506127954653ccebf9b82df1452cce4ed0dae3b1/contrib/thunderbird/patches/ppc-musttail.patch --- -commit 5e66655e1456c9d26637ceaed3f4533b537322c4 -Author: Daniel Kolesa -Date: Sat May 13 23:00:04 2023 +0200 - - disable musttail on ppc - - 41:38.04 LLVM ERROR: failed to perform tail call elimination on a call site marked musttail - 41:38.04 PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. - 41:38.04 Stack dump: - 41:38.04 0. Running pass 'Function Pass Manager' on module '/builddir/thunderbird-114.0_beta1/obj-powerpc64le-unknown-linux-musl/toolkit/library/build/../../../gfx/skia/SkOpts.o'. - 41:38.04 1. Running pass 'PowerPC DAG->DAG Pattern Instruction Selection' on function '@_ZN8portableL15init_lane_masksEPNS_6ParamsEP21SkRasterPipelineStageffff' - 41:38.95 clang-16: error: unable to execute command: Aborted - - To be investigated later. - -diff --git a/gfx/skia/skia/src/core/SkRasterPipeline.h b/gfx/skia/skia/src/core/SkRasterPipeline.h -index 766bb0c..88c6cb2 100644 ---- a/gfx/skia/skia/src/core/SkRasterPipeline.h -+++ b/gfx/skia/skia/src/core/SkRasterPipeline.h -@@ -24,7 +24,7 @@ enum SkColorType : int; - struct SkImageInfo; - struct skcms_TransferFunction; - --#if __has_cpp_attribute(clang::musttail) && !defined(__EMSCRIPTEN__) && !defined(SK_CPU_ARM32) -+#if __has_cpp_attribute(clang::musttail) && !defined(__EMSCRIPTEN__) && !defined(SK_CPU_ARM32) && !defined(__powerpc__) - #define SK_HAS_MUSTTAIL 1 - #else - #define SK_HAS_MUSTTAIL 0 diff --git a/user/zotero/ppc-webrtc.patch b/user/zotero/ppc-webrtc.patch deleted file mode 100644 index bf4afdd..0000000 --- a/user/zotero/ppc-webrtc.patch +++ /dev/null @@ -1,23 +0,0 @@ -Patch-Source: https://github.com/chimera-linux/cports/blob/506127954653ccebf9b82df1452cce4ed0dae3b1/contrib/thunderbird/patches/ppc64-webrtc.patch --- -commit 010bfb0441168d51e0fffe98d1f50e0602e7947f -Author: Daniel Kolesa -Date: Sat May 13 23:40:41 2023 +0200 - - fix webrtc on ppc64 - -diff --git a/third_party/libwebrtc/moz.build b/third_party/libwebrtc/moz.build -index 976cf37..d35d447 100644 ---- a/third_party/libwebrtc/moz.build -+++ b/third_party/libwebrtc/moz.build -@@ -643,3 +643,10 @@ if CONFIG["CPU_ARCH"] == "x86_64" and CONFIG["OS_TARGET"] == "WINNT": - "/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/vector_math_avx2_gn", - "/third_party/libwebrtc/modules/desktop_capture/desktop_capture_differ_sse2_gn" - ] -+ -+if CONFIG["CPU_ARCH"] == "ppc64" and CONFIG["OS_TARGET"] == "Linux": -+ -+ DIRS += [ -+ "/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn", -+ "/third_party/libwebrtc/modules/desktop_capture/primitives_gn" -+ ] diff --git a/user/zotero/python-deps.patch b/user/zotero/python-deps.patch deleted file mode 100644 index dfdd3b2..0000000 --- a/user/zotero/python-deps.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/python/sites/mach.txt b/python/sites/mach.txt -index 55cc6fb..51bf67d 100644 ---- a/python/sites/mach.txt -+++ b/python/sites/mach.txt -@@ -141,5 +141,5 @@ pypi-optional:glean-sdk==52.7.0:telemetry will not be collected - # Mach gracefully handles the case where `psutil` is unavailable. - # We aren't (yet) able to pin packages in automation, so we have to - # support down to the oldest locally-installed version (5.4.2). --pypi-optional:psutil>=5.4.2,<=5.9.4:telemetry will be missing some data --pypi-optional:zstandard>=0.11.1,<=0.22.0:zstd archives will not be possible to extract -+pypi-optional:psutil>=5.4.2,<=5.10.0:telemetry will be missing some data -+pypi-optional:zstandard>=0.11.1,<=0.24.0:zstd archives will not be possible to extract diff --git a/user/zotero/rust-lto-thin.patch b/user/zotero/rust-lto-thin.patch deleted file mode 100644 index 788fcea..0000000 --- a/user/zotero/rust-lto-thin.patch +++ /dev/null @@ -1,12 +0,0 @@ -set rust crate lto to thin to not use fatlto for gkrust which fails sometimes ---- a/config/makefiles/rust.mk -+++ b/config/makefiles/rust.mk -@@ -92,7 +92,7 @@ - # Never enable when coverage is enabled to work around https://github.com/rust-lang/rust/issues/90045. - ifndef MOZ_CODE_COVERAGE - ifeq (,$(findstring gkrust_gtest,$(RUST_LIBRARY_FILE))) --cargo_rustc_flags += -Clto$(if $(filter full,$(MOZ_LTO_RUST_CROSS)),=fat) -+cargo_rustc_flags += -Clto=thin - endif - # We need -Cembed-bitcode=yes for all crates when using -Clto. - RUSTFLAGS += -Cembed-bitcode=yes diff --git a/user/zotero/rust1.78-packed-to-portable_simd.patch b/user/zotero/rust1.78-packed-to-portable_simd.patch deleted file mode 100644 index e03f577..0000000 --- a/user/zotero/rust1.78-packed-to-portable_simd.patch +++ /dev/null @@ -1,3582 +0,0 @@ -Adapted from https://hg.mozilla.org/mozilla-central/rev/1db2ef126a6a --- - -# HG changeset patch -# User Henri Sivonen -# Date 1714462184 0 -# Node ID 1db2ef126a6a8555dbf50345e16492c977b42e92 -# Parent a545e84b3674c4878f2e618b7bce23058f2ac690 -Bug 1882209 - Update encoding_rs to 0.8.34 to deal with rustc changes. r=glandium,supply-chain-reviewers - -Differential Revision: https://phabricator.services.mozilla.com/D207167 - -diff --git a/.cargo/config.in b/.cargo/config.in ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -35,31 +35,31 @@ git = "https://github.com/gfx-rs/wgpu" - rev = "f71a1bc736fde37509262ca03e91d8f56a13aeb5" - replace-with = "vendored-sources" - - [source."git+https://github.com/glandium/warp?rev=4af45fae95bc98b0eba1ef0db17e1dac471bb23d"] - git = "https://github.com/glandium/warp" - rev = "4af45fae95bc98b0eba1ef0db17e1dac471bb23d" - replace-with = "vendored-sources" - -+[source."git+https://github.com/hsivonen/any_all_workaround?rev=7fb1b7034c9f172aade21ee1c8554e8d8a48af80"] -+git = "https://github.com/hsivonen/any_all_workaround" -+rev = "7fb1b7034c9f172aade21ee1c8554e8d8a48af80" -+replace-with = "vendored-sources" -+ - [source."git+https://github.com/hsivonen/chardetng?rev=3484d3e3ebdc8931493aa5df4d7ee9360a90e76b"] - git = "https://github.com/hsivonen/chardetng" - rev = "3484d3e3ebdc8931493aa5df4d7ee9360a90e76b" - replace-with = "vendored-sources" - - [source."git+https://github.com/hsivonen/chardetng_c?rev=ed8a4c6f900a90d4dbc1d64b856e61490a1c3570"] - git = "https://github.com/hsivonen/chardetng_c" - rev = "ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" - replace-with = "vendored-sources" - --[source."git+https://github.com/hsivonen/packed_simd?rev=e588ceb568878e1a3156ea9ce551d5b63ef0cdc4"] --git = "https://github.com/hsivonen/packed_simd" --rev = "e588ceb568878e1a3156ea9ce551d5b63ef0cdc4" --replace-with = "vendored-sources" -- - [source."git+https://github.com/jfkthame/mapped_hyph.git?rev=c7651a0cffff41996ad13c44f689bd9cd2192c01"] - git = "https://github.com/jfkthame/mapped_hyph.git" - rev = "c7651a0cffff41996ad13c44f689bd9cd2192c01" - replace-with = "vendored-sources" - - [source."git+https://github.com/mozilla-spidermonkey/jsparagus?rev=64ba08e24749616de2344112f226d1ef4ba893ae"] - git = "https://github.com/mozilla-spidermonkey/jsparagus" - rev = "64ba08e24749616de2344112f226d1ef4ba893ae" -diff --git a/Cargo.lock b/Cargo.lock ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -80,16 +80,25 @@ dependencies = [ - name = "android_system_properties" - version = "0.1.5" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" - dependencies = [ - "libc", - ] - -+[[package]] -+name = "any_all_workaround" -+version = "0.1.0" -+source = "git+https://github.com/hsivonen/any_all_workaround?rev=7fb1b7034c9f172aade21ee1c8554e8d8a48af80#7fb1b7034c9f172aade21ee1c8554e8d8a48af80" -+dependencies = [ -+ "cfg-if 1.0.0", -+ "version_check", -+] -+ - [[package]] - name = "anyhow" - version = "1.0.69" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" - - [[package]] - name = "app_services_logger" -@@ -1431,22 +1440,22 @@ dependencies = [ - "encoding_rs", - "nserror", - "nsstring", - "xmldecl", - ] - - [[package]] - name = "encoding_rs" --version = "0.8.33" -+version = "0.8.34" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -+checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" - dependencies = [ -+ "any_all_workaround", - "cfg-if 1.0.0", -- "packed_simd", - ] - - [[package]] - name = "enum-primitive-derive" - version = "0.2.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e" - dependencies = [ -@@ -3901,25 +3910,16 @@ checksum = "8d91edf4fbb970279443471345a4e8c491bf05bb283b3e6c88e4e606fd8c181b" - [[package]] - name = "oxilangtag-ffi" - version = "0.1.0" - dependencies = [ - "nsstring", - "oxilangtag", - ] - --[[package]] --name = "packed_simd" --version = "0.3.9" --source = "git+https://github.com/hsivonen/packed_simd?rev=e588ceb568878e1a3156ea9ce551d5b63ef0cdc4#e588ceb568878e1a3156ea9ce551d5b63ef0cdc4" --dependencies = [ -- "cfg-if 1.0.0", -- "num-traits", --] -- - [[package]] - name = "parking_lot" - version = "0.11.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" - dependencies = [ - "instant", - "lock_api", -diff --git a/Cargo.toml b/Cargo.toml ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -154,22 +154,22 @@ rure = { path = "third_party/rust/rure" } - - # 0.31.1 but without rust-cssparser#342. - # TODO: Remove these, and just use v0.31.1 once bug 1836219 lands - # (which will get syn 2 into the tree). - cssparser = { path = "third_party/rust/cssparser" } - cssparser-macros = { path = "third_party/rust/cssparser-macros" } - - # Other overrides -+any_all_workaround = { git = "https://github.com/hsivonen/any_all_workaround", rev = "7fb1b7034c9f172aade21ee1c8554e8d8a48af80" } - chardetng = { git = "https://github.com/hsivonen/chardetng", rev="3484d3e3ebdc8931493aa5df4d7ee9360a90e76b" } - chardetng_c = { git = "https://github.com/hsivonen/chardetng_c", rev="ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" } - coremidi = { git = "https://github.com/chris-zen/coremidi.git", rev="fc68464b5445caf111e41f643a2e69ccce0b4f83" } - firefox-on-glean = { path = "toolkit/components/glean/api" } - libudev-sys = { path = "dom/webauthn/libudev-sys" } --packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev = "e588ceb568878e1a3156ea9ce551d5b63ef0cdc4" } - midir = { git = "https://github.com/mozilla/midir.git", rev = "519e651241e867af3391db08f9ae6400bc023e18" } - # warp 0.3.3 + https://github.com/seanmonstar/warp/pull/1007 - warp = { git = "https://github.com/glandium/warp", rev = "4af45fae95bc98b0eba1ef0db17e1dac471bb23d" } - - # application-services overrides to make updating them all simpler. - interrupt-support = { git = "https://github.com/mozilla/application-services", rev = "86c84c217036c12283d19368867323a66bf35883" } - sql-support = { git = "https://github.com/mozilla/application-services", rev = "86c84c217036c12283d19368867323a66bf35883" } - sync15 = { git = "https://github.com/mozilla/application-services", rev = "86c84c217036c12283d19368867323a66bf35883" } -diff --git a/config/makefiles/rust.mk b/config/makefiles/rust.mk ---- a/config/makefiles/rust.mk -+++ b/config/makefiles/rust.mk -@@ -260,17 +260,17 @@ export COREAUDIO_SDK_PATH=$(IPHONEOS_SDK - export IPHONEOS_SDK_DIR - PATH := $(topsrcdir)/build/macosx:$(PATH) - endif - endif - - ifndef RUSTC_BOOTSTRAP - RUSTC_BOOTSTRAP := mozglue_static,qcms - ifdef MOZ_RUST_SIMD --RUSTC_BOOTSTRAP := $(RUSTC_BOOTSTRAP),encoding_rs,packed_simd -+RUSTC_BOOTSTRAP := $(RUSTC_BOOTSTRAP),encoding_rs,any_all_workaround - endif - export RUSTC_BOOTSTRAP - endif - - target_rust_ltoable := force-cargo-library-build $(ADD_RUST_LTOABLE) - target_rust_nonltoable := force-cargo-test-run force-cargo-program-build - - ifdef MOZ_PGO_RUST -diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml ---- a/supply-chain/audits.toml -+++ b/supply-chain/audits.toml -@@ -596,16 +596,29 @@ who = "Mike Hommey "] -+description = "Workaround for bad LLVM codegen for boolean reductions on 32-bit ARM" -+homepage = "https://docs.rs/any_all_workaround/" -+documentation = "https://docs.rs/any_all_workaround/" -+readme = "README.md" -+license = "MIT OR Apache-2.0" -+repository = "https://github.com/hsivonen/any_all_workaround" -+ -+[dependencies] -+cfg-if = "1.0" -+ -+[build-dependencies] -+version_check = "0.9" -diff --git a/third_party/rust/packed_simd/LICENSE-APACHE b/third_party/rust/any_all_workaround/LICENSE-APACHE -rename from third_party/rust/packed_simd/LICENSE-APACHE -rename to third_party/rust/any_all_workaround/LICENSE-APACHE -diff --git a/third_party/rust/packed_simd/LICENSE-MIT b/third_party/rust/any_all_workaround/LICENSE-MIT -rename from third_party/rust/packed_simd/LICENSE-MIT -rename to third_party/rust/any_all_workaround/LICENSE-MIT -diff --git a/third_party/rust/any_all_workaround/LICENSE-MIT-QCMS b/third_party/rust/any_all_workaround/LICENSE-MIT-QCMS -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/any_all_workaround/LICENSE-MIT-QCMS -@@ -0,0 +1,21 @@ -+qcms -+Copyright (C) 2009-2024 Mozilla Corporation -+Copyright (C) 1998-2007 Marti Maria -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the "Software"), -+to deal in the Software without restriction, including without limitation -+the rights to use, copy, modify, merge, publish, distribute, sublicense, -+and/or sell copies of the Software, and to permit persons to whom the Software -+is furnished to do so, subject to the following conditions: -+ -+The above copyright notice and this permission notice shall be included in -+all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -+THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -diff --git a/third_party/rust/any_all_workaround/README.md b/third_party/rust/any_all_workaround/README.md -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/any_all_workaround/README.md -@@ -0,0 +1,13 @@ -+# any_all_workaround -+ -+This is a workaround for bad codegen ([Rust bug](https://github.com/rust-lang/portable-simd/issues/146), [LLVM bug](https://github.com/llvm/llvm-project/issues/50466)) for the `any()` and `all()` reductions for NEON-backed SIMD vectors on 32-bit ARM. On other platforms these delegate to `any()` and `all()` in `core::simd`. -+ -+The plan is to abandon this crate once the LLVM bug is fixed or `core::simd` works around the LLVM bug. -+ -+The code is forked from the [`packed_simd` crate](https://raw.githubusercontent.com/hsivonen/packed_simd/d938e39bee9bc5c222f5f2f2a0df9e53b5ce36ae/src/codegen/reductions/mask/arm.rs). -+ -+This crate requires Nightly Rust as it depends on the `portable_simd` feature. -+ -+# License -+ -+`MIT OR Apache-2.0`, since that's how `packed_simd` is licensed. (The ARM intrinsics Rust version workaround is from qcms, see LICENSE-MIT-QCMS.) -diff --git a/third_party/rust/any_all_workaround/build.rs b/third_party/rust/any_all_workaround/build.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/any_all_workaround/build.rs -@@ -0,0 +1,7 @@ -+extern crate version_check as rustc; -+ -+fn main() { -+ if rustc::is_min_version("1.78.0").unwrap_or(false) { -+ println!("cargo:rustc-cfg=stdsimd_split"); -+ } -+} -diff --git a/third_party/rust/any_all_workaround/src/lib.rs b/third_party/rust/any_all_workaround/src/lib.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/any_all_workaround/src/lib.rs -@@ -0,0 +1,110 @@ -+// This code began as a fork of -+// https://raw.githubusercontent.com/rust-lang/packed_simd/d938e39bee9bc5c222f5f2f2a0df9e53b5ce36ae/src/codegen/reductions/mask/arm.rs -+// which didn't have a license header on the file, but Cargo.toml said "MIT OR Apache-2.0". -+// See LICENSE-MIT and LICENSE-APACHE. -+ -+#![no_std] -+#![feature(portable_simd)] -+#![cfg_attr( -+ all( -+ stdsimd_split, -+ target_arch = "arm", -+ target_endian = "little", -+ target_feature = "neon", -+ target_feature = "v7" -+ ), -+ feature(stdarch_arm_neon_intrinsics) -+)] -+#![cfg_attr( -+ all( -+ not(stdsimd_split), -+ target_arch = "arm", -+ target_endian = "little", -+ target_feature = "neon", -+ target_feature = "v7" -+ ), -+ feature(stdsimd) -+)] -+ -+use cfg_if::cfg_if; -+use core::simd::mask16x8; -+use core::simd::mask32x4; -+use core::simd::mask8x16; -+ -+cfg_if! { -+ if #[cfg(all(target_arch = "arm", target_endian = "little", target_feature = "neon", target_feature = "v7"))] { -+ use core::simd::mask8x8; -+ use core::simd::mask16x4; -+ use core::simd::mask32x2; -+ macro_rules! arm_128_v7_neon_impl { -+ ($all:ident, $any:ident, $id:ident, $half:ident, $vpmin:ident, $vpmax:ident) => { -+ #[inline] -+ pub fn $all(s: $id) -> bool { -+ use core::arch::arm::$vpmin; -+ use core::mem::transmute; -+ unsafe { -+ union U { -+ halves: ($half, $half), -+ vec: $id, -+ } -+ let halves = U { vec: s }.halves; -+ let h: $half = transmute($vpmin(transmute(halves.0), transmute(halves.1))); -+ h.all() -+ } -+ } -+ #[inline] -+ pub fn $any(s: $id) -> bool { -+ use core::arch::arm::$vpmax; -+ use core::mem::transmute; -+ unsafe { -+ union U { -+ halves: ($half, $half), -+ vec: $id, -+ } -+ let halves = U { vec: s }.halves; -+ let h: $half = transmute($vpmax(transmute(halves.0), transmute(halves.1))); -+ h.any() -+ } -+ } -+ } -+ } -+ } else { -+ macro_rules! arm_128_v7_neon_impl { -+ ($all:ident, $any:ident, $id:ident, $half:ident, $vpmin:ident, $vpmax:ident) => { -+ #[inline(always)] -+ pub fn $all(s: $id) -> bool { -+ s.all() -+ } -+ #[inline(always)] -+ pub fn $any(s: $id) -> bool { -+ s.any() -+ } -+ } -+ } -+ } -+} -+ -+arm_128_v7_neon_impl!( -+ all_mask8x16, -+ any_mask8x16, -+ mask8x16, -+ mask8x8, -+ vpmin_u8, -+ vpmax_u8 -+); -+arm_128_v7_neon_impl!( -+ all_mask16x8, -+ any_mask16x8, -+ mask16x8, -+ mask16x4, -+ vpmin_u16, -+ vpmax_u16 -+); -+arm_128_v7_neon_impl!( -+ all_mask32x4, -+ any_mask32x4, -+ mask32x4, -+ mask32x2, -+ vpmin_u32, -+ vpmax_u32 -+); -diff --git a/third_party/rust/encoding_rs/.cargo-checksum.json b/third_party/rust/encoding_rs/.cargo-checksum.json ---- a/third_party/rust/encoding_rs/.cargo-checksum.json -+++ b/third_party/rust/encoding_rs/.cargo-checksum.json -@@ -1,1 +1,1 @@ --{"files":{"CONTRIBUTING.md":"ca1901f3e8532fb4cec894fd3664f0eaa898c0c4b961d1b992d1ed54eacf362a","COPYRIGHT":"11789f45bb180841cd362a5eee6789c68ddb573a11105e30768c308a6add0190","Cargo.toml":"42fa83322aa9fd6723b77d35d0cacb92cbb6e7f573ce11c55f5225292866f8f4","Ideas.md":"b7452893f500163868d8de52c09addaf91e1632454ed02e892c467ed7ec39dbd","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c","LICENSE-WHATWG":"838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50","README.md":"d938e8ab0b9ab67e74a1a4f48f23fdce956d0ad3a3f6147ae7612a92763c88d5","ci/miri.sh":"43cb8d82f49e3bfe2d2274b6ccd6f0714a4188ccef0cecc040829883cfdbee25","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"be989dd25c6b946e3e8745fdc8e8a80fcf24b3be99ad0b4b78153ba3f6ab6310","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"c44c002641adb5ebc4368707a8cc0a076d2f33e6a5c27b1b69988eb515f5653d","src/big5.rs":"ec6e2913011a38e9a3e825a1731f139a7ca1d5b264fefae51a3cc1a68a57cef9","src/data.rs":"8a617cc57032092d65850eb27e00de687c80aea3299e839a1f58b42d0b35abf3","src/euc_jp.rs":"32047f5b540188c4cb19c07165f846b9786a09f18e315ed3e9bda1293dae52aa","src/euc_kr.rs":"9b25afc72d9378700eecfac58d55ad1c5946d6cd0ccde2c29c08200ef2de6bb9","src/gb18030.rs":"808587168d73f0c80f8520f0ca9b161866ed2efeb17a05e85fdf3b8efe7ba28a","src/handles.rs":"cc83dc0754751d67f5688a65c5e0191cba02f6bacce81a0813a243cba55eef7a","src/iso_2022_jp.rs":"9bb485e82574f4b7d4b2364f0ff276acb6a0bc111758420a3b0ec5e04c196652","src/lib.rs":"1dc07b818e45846b16ddcaf0de46c8862dd7df8099123ec38b95c3f8ad9c91ec","src/macros.rs":"200997f8870de8bfd8cdc475e92115df42108c0df661e49d3d1cbc32056e1d99","src/mem.rs":"0bf34103e0ad1b842a13a082dee2b920b05cf4fb0f145c9ee7f608f4cb4a544f","src/replacement.rs":"7660b34a53f8c1ca2bdfa0e51e843ec28326950952ad8bc96569feb93ac62308","src/shift_jis.rs":"6951ae67e36b1a12fa3a30734957f444d8b1b4ae0e2bde52060b29bd0f16d9d9","src/simd_funcs.rs":"2612aba86e1d201096d7e47a859bc3444f85934cc82d8adc6d39a4304d9eecfc","src/single_byte.rs":"3c9e9c1f946ae622c725ba9421240c1faa9a05e95fa10dd4642a25cb276a1edc","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"23a2e11b02b3b8d15fb5613a625e3edb2c61e70e3c581abfd638719a4088200d","src/testing.rs":"f59e671e95a98a56f6b573e8c6be4d71e670bf52f7e20eb1605d990aafa1894e","src/utf_16.rs":"c071a147fad38d750c2c247e141b76b929a48007b99f26b2922b9caecdaf2f25","src/utf_8.rs":"7b7d887b347f1aefa03246b028a36a72758a4ce76c28f3b45c19467851aa7839","src/variant.rs":"1fab5363588a1554a7169de8731ea9cded7ac63ea35caabdd1c27a8dde68c27b","src/x_user_defined.rs":"c9c010730dfb9f141d4fed19350c08a21af240913a54bb64f5ca89ff93b6b7d1"},"package":"7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"} -\ No newline at end of file -+{"files":{"CONTRIBUTING.md":"ca1901f3e8532fb4cec894fd3664f0eaa898c0c4b961d1b992d1ed54eacf362a","COPYRIGHT":"11789f45bb180841cd362a5eee6789c68ddb573a11105e30768c308a6add0190","Cargo.toml":"22a4d210c92dae9f32c6944ef340ee8fdd027f99c081577e8907123e2a93383e","Ideas.md":"b7452893f500163868d8de52c09addaf91e1632454ed02e892c467ed7ec39dbd","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c","LICENSE-WHATWG":"838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50","README.md":"1d08aefcb92afa81b18154049c9abbcad4540a23f7172e9f9bbed5af33f1a087","ci/miri.sh":"43cb8d82f49e3bfe2d2274b6ccd6f0714a4188ccef0cecc040829883cfdbee25","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"be989dd25c6b946e3e8745fdc8e8a80fcf24b3be99ad0b4b78153ba3f6ab6310","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"588e38b01e666d5e7462617ea7e90a108d608dec9e016f3d273ac0744af2e05d","src/big5.rs":"ec6e2913011a38e9a3e825a1731f139a7ca1d5b264fefae51a3cc1a68a57cef9","src/data.rs":"8a617cc57032092d65850eb27e00de687c80aea3299e839a1f58b42d0b35abf3","src/euc_jp.rs":"32047f5b540188c4cb19c07165f846b9786a09f18e315ed3e9bda1293dae52aa","src/euc_kr.rs":"9b25afc72d9378700eecfac58d55ad1c5946d6cd0ccde2c29c08200ef2de6bb9","src/gb18030.rs":"808587168d73f0c80f8520f0ca9b161866ed2efeb17a05e85fdf3b8efe7ba28a","src/handles.rs":"b08cef1f5785bb6a4822f2e844c6df1b046b737b7a075e4593eaa8c4208e9fe2","src/iso_2022_jp.rs":"9bb485e82574f4b7d4b2364f0ff276acb6a0bc111758420a3b0ec5e04c196652","src/lib.rs":"834f44b670ec48ee82c0e12223d1567313fdd9f88bca5f4b117c82c1828f559f","src/macros.rs":"200997f8870de8bfd8cdc475e92115df42108c0df661e49d3d1cbc32056e1d99","src/mem.rs":"948571137d3b151df8db4fb2c733e74ae595d055cdf0ad83abcab9341d6adabe","src/replacement.rs":"7660b34a53f8c1ca2bdfa0e51e843ec28326950952ad8bc96569feb93ac62308","src/shift_jis.rs":"6951ae67e36b1a12fa3a30734957f444d8b1b4ae0e2bde52060b29bd0f16d9d9","src/simd_funcs.rs":"05c6e77af74bfe73cd39a752067c11425d6b46e5da419910f54bf75a5c02a984","src/single_byte.rs":"3ad87116fb339434a4b58e8f2b15485f2b66b9f7814d708f16194ed08f6d6ccf","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"23a2e11b02b3b8d15fb5613a625e3edb2c61e70e3c581abfd638719a4088200d","src/testing.rs":"f59e671e95a98a56f6b573e8c6be4d71e670bf52f7e20eb1605d990aafa1894e","src/utf_16.rs":"c071a147fad38d750c2c247e141b76b929a48007b99f26b2922b9caecdaf2f25","src/utf_8.rs":"7b7d887b347f1aefa03246b028a36a72758a4ce76c28f3b45c19467851aa7839","src/variant.rs":"1fab5363588a1554a7169de8731ea9cded7ac63ea35caabdd1c27a8dde68c27b","src/x_user_defined.rs":"9456ca46168ef86c98399a2536f577ef7be3cdde90c0c51392d8ac48519d3fae"},"package":"b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"} -\ No newline at end of file -diff --git a/third_party/rust/encoding_rs/Cargo.toml b/third_party/rust/encoding_rs/Cargo.toml ---- a/third_party/rust/encoding_rs/Cargo.toml -+++ b/third_party/rust/encoding_rs/Cargo.toml -@@ -6,18 +6,19 @@ - # to registry (e.g., crates.io) dependencies. - # - # If you are reading this file be aware that the original Cargo.toml - # will likely look very different (and much more reasonable). - # See Cargo.toml.orig for the original contents. - - [package] - edition = "2018" -+rust-version = "1.36" - name = "encoding_rs" --version = "0.8.33" -+version = "0.8.34" - authors = ["Henri Sivonen "] - description = "A Gecko-oriented implementation of the Encoding Standard" - homepage = "https://docs.rs/encoding_rs/" - documentation = "https://docs.rs/encoding_rs/" - readme = "README.md" - keywords = [ - "encoding", - "web", -@@ -31,23 +32,23 @@ categories = [ - "internationalization", - ] - license = "(Apache-2.0 OR MIT) AND BSD-3-Clause" - repository = "https://github.com/hsivonen/encoding_rs" - - [profile.release] - lto = true - -+[dependencies.any_all_workaround] -+version = "0.1.0" -+optional = true -+ - [dependencies.cfg-if] - version = "1.0" - --[dependencies.packed_simd] --version = "0.3.9" --optional = true -- - [dependencies.serde] - version = "1.0" - optional = true - - [dev-dependencies.bincode] - version = "1.0" - - [dev-dependencies.serde_derive] -@@ -69,15 +70,9 @@ fast-legacy-encode = [ - "fast-hanja-encode", - "fast-kanji-encode", - "fast-gb-hanzi-encode", - "fast-big5-hanzi-encode", - ] - less-slow-big5-hanzi-encode = [] - less-slow-gb-hanzi-encode = [] - less-slow-kanji-encode = [] --simd-accel = [ -- "packed_simd", -- "packed_simd/into_bits", --] -- --[badges.travis-ci] --repository = "hsivonen/encoding_rs" -+simd-accel = ["any_all_workaround"] -diff --git a/third_party/rust/encoding_rs/README.md b/third_party/rust/encoding_rs/README.md ---- a/third_party/rust/encoding_rs/README.md -+++ b/third_party/rust/encoding_rs/README.md -@@ -162,50 +162,36 @@ wrappers. - * [C++](https://github.com/hsivonen/recode_cpp) - - ## Optional features - - There are currently these optional cargo features: - - ### `simd-accel` - --Enables SIMD acceleration using the nightly-dependent `packed_simd` crate. -+Enables SIMD acceleration using the nightly-dependent `portable_simd` standard -+library feature. - - This is an opt-in feature, because enabling this feature _opts out_ of Rust's - guarantees of future compilers compiling old code (aka. "stability story"). - - Currently, this has not been tested to be an improvement except for these --targets: -+targets and enabling the `simd-accel` feature is expected to break the build -+on other targets: - - * x86_64 - * i686 - * aarch64 - * thumbv7neon - - If you use nightly Rust, you use targets whose first component is one of the - above, and you are prepared _to have to revise your configuration when updating - Rust_, you should enable this feature. Otherwise, please _do not_ enable this - feature. - --_Note!_ If you are compiling for a target that does not have 128-bit SIMD --enabled as part of the target definition and you are enabling 128-bit SIMD --using `-C target_feature`, you need to enable the `core_arch` Cargo feature --for `packed_simd` to compile a crates.io snapshot of `core_arch` instead of --using the standard-library copy of `core::arch`, because the `core::arch` --module of the pre-compiled standard library has been compiled with the --assumption that the CPU doesn't have 128-bit SIMD. At present this applies --mainly to 32-bit ARM targets whose first component does not include the --substring `neon`. -- --The encoding_rs side of things has not been properly set up for POWER, --PowerPC, MIPS, etc., SIMD at this time, so even if you were to follow --the advice from the previous paragraph, you probably shouldn't use --the `simd-accel` option on the less mainstream architectures at this --time. -- - Used by Firefox. - - ### `serde` - - Enables support for serializing and deserializing `&'static Encoding`-typed - struct fields using [Serde][1]. - - [1]: https://serde.rs/ -@@ -376,18 +362,19 @@ It is a goal to support the latest stabl - the version of Rust that's used for Firefox Nightly. - - At this time, there is no firm commitment to support a version older than - what's required by Firefox, and there is no commitment to treat MSRV changes - as semver-breaking, because this crate depends on `cfg-if`, which doesn't - appear to treat MSRV changes as semver-breaking, so it would be useless for - this crate to treat MSRV changes as semver-breaking. - --As of 2021-02-04, MSRV appears to be Rust 1.36.0 for using the crate and -+As of 2024-04-04, MSRV appears to be Rust 1.36.0 for using the crate and - 1.42.0 for doc tests to pass without errors about the global allocator. -+With the `simd-accel` feature, the MSRV is even higher. - - ## Compatibility with rust-encoding - - A compatibility layer that implements the rust-encoding API on top of - encoding_rs is - [provided as a separate crate](https://github.com/hsivonen/encoding_rs_compat) - (cannot be uploaded to crates.io). The compatibility layer was originally - written with the assuption that Firefox would need it, but it is not currently -@@ -441,20 +428,27 @@ To regenerate the generated code: - - [x] Implement the rust-encoding API in terms of encoding_rs. - - [x] Add SIMD acceleration for Aarch64. - - [x] Investigate the use of NEON on 32-bit ARM. - - [ ] ~Investigate Björn Höhrmann's lookup table acceleration for UTF-8 as - adapted to Rust in rust-encoding.~ - - [x] Add actually fast CJK encode options. - - [ ] ~Investigate [Bob Steagall's lookup table acceleration for UTF-8](https://github.com/BobSteagall/CppNow2018/blob/master/FastConversionFromUTF-8/Fast%20Conversion%20From%20UTF-8%20with%20C%2B%2B%2C%20DFAs%2C%20and%20SSE%20Intrinsics%20-%20Bob%20Steagall%20-%20C%2B%2BNow%202018.pdf).~ - - [x] Provide a build mode that works without `alloc` (with lesser API surface). --- [ ] Migrate to `std::simd` once it is stable and declare 1.0. -+- [x] Migrate to `std::simd` ~once it is stable and declare 1.0.~ -+- [ ] Migrate `unsafe` slice access by larger types than `u8`/`u16` to `align_to`. - - ## Release Notes - -+### 0.8.34 -+ -+* Use the `portable_simd` nightly feature of the standard library instead of the `packed_simd` crate. Only affects the `simd-accel` optional nightly feature. -+* Internal documentation improvements and minor code improvements around `unsafe`. -+* Added `rust-version` to `Cargo.toml`. -+ - ### 0.8.33 - - * Use `packed_simd` instead of `packed_simd_2` again now that updates are back under the `packed_simd` name. Only affects the `simd-accel` optional nightly feature. - - ### 0.8.32 - - * Removed `build.rs`. (This removal should resolve false positives reported by some antivirus products. This may break some build configurations that have opted out of Rust's guarantees against future build breakage.) - * Internal change to what API is used for reinterpreting the lane configuration of SIMD vectors. -diff --git a/third_party/rust/encoding_rs/src/ascii.rs b/third_party/rust/encoding_rs/src/ascii.rs ---- a/third_party/rust/encoding_rs/src/ascii.rs -+++ b/third_party/rust/encoding_rs/src/ascii.rs -@@ -46,71 +46,87 @@ cfg_if! { - #[allow(dead_code)] - #[inline(always)] - fn likely(b: bool) -> bool { - b - } - } - } - -+// Safety invariants for masks: data & mask = 0 for valid ASCII or basic latin utf-16 -+ - // `as` truncates, so works on 32-bit, too. - #[allow(dead_code)] - pub const ASCII_MASK: usize = 0x8080_8080_8080_8080u64 as usize; - - // `as` truncates, so works on 32-bit, too. - #[allow(dead_code)] - pub const BASIC_LATIN_MASK: usize = 0xFF80_FF80_FF80_FF80u64 as usize; - - #[allow(unused_macros)] - macro_rules! ascii_naive { - ($name:ident, $src_unit:ty, $dst_unit:ty) => { -+ /// Safety: src and dst must have len_unit elements and be aligned -+ /// Safety-usable invariant: will return Some() when it fails -+ /// to convert. The first value will be a u8 that is > 127. - #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - // Yes, manually omitting the bound check here matters - // a lot for perf. - for i in 0..len { -+ // Safety: len invariant used here - let code_unit = *(src.add(i)); -+ // Safety: Upholds safety-usable invariant here - if code_unit > 127 { - return Some((code_unit, i)); - } -+ // Safety: len invariant used here - *(dst.add(i)) = code_unit as $dst_unit; - } - return None; - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_alu { - ($name:ident, -+ // safety invariant: src/dst MUST be u8 - $src_unit:ty, - $dst_unit:ty, -+ // Safety invariant: stride_fn must consume and produce two usizes, and return the index of the first non-ascii when it fails - $stride_fn:ident) => { -+ /// Safety: src and dst must have len elements, src is valid for read, dst is valid for -+ /// write -+ /// Safety-usable invariant: will return Some() when it fails -+ /// to convert. The first value will be a u8 that is > 127. - #[cfg_attr(feature = "cargo-clippy", allow(never_loop, cast_ptr_alignment))] - #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - let mut offset = 0usize; - // This loop is only broken out of as a `goto` forward - loop { -+ // Safety: until_alignment becomes the number of bytes we need to munch until we are aligned to usize - let mut until_alignment = { - // Check if the other unit aligns if we move the narrower unit - // to alignment. - // if ::core::mem::size_of::<$src_unit>() == ::core::mem::size_of::<$dst_unit>() { - // ascii_to_ascii - let src_alignment = (src as usize) & ALU_ALIGNMENT_MASK; - let dst_alignment = (dst as usize) & ALU_ALIGNMENT_MASK; - if src_alignment != dst_alignment { -+ // Safety: bails early and ends up in the naïve branch where usize-alignment doesn't matter - break; - } - (ALU_ALIGNMENT - src_alignment) & ALU_ALIGNMENT_MASK - // } else if ::core::mem::size_of::<$src_unit>() < ::core::mem::size_of::<$dst_unit>() { - // ascii_to_basic_latin - // let src_until_alignment = (ALIGNMENT - ((src as usize) & ALIGNMENT_MASK)) & ALIGNMENT_MASK; - // if (dst.add(src_until_alignment) as usize) & ALIGNMENT_MASK != 0 { - // break; -@@ -129,74 +145,104 @@ macro_rules! ascii_alu { - // Moving pointers to alignment seems to be a pessimization on - // x86_64 for operations that have UTF-16 as the internal - // Unicode representation. However, since it seems to be a win - // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except - // mixed results when encoding from UTF-16 and since x86 and - // x86_64 should be using SSE2 in due course, keeping the move - // to alignment here. It would be good to test on more ARM CPUs - // and on real MIPS and POWER hardware. -+ // -+ // Safety: This is the naïve code once again, for `until_alignment` bytes - while until_alignment != 0 { - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety: Upholds safety-usable invariant here - return Some((code_unit, offset)); - } - *(dst.add(offset)) = code_unit as $dst_unit; -+ // Safety: offset is the number of bytes copied so far - offset += 1; - until_alignment -= 1; - } - let len_minus_stride = len - ALU_STRIDE_SIZE; - loop { -+ // Safety: num_ascii is known to be a byte index of a non-ascii byte due to stride_fn's invariant - if let Some(num_ascii) = $stride_fn( -+ // Safety: These are known to be valid and aligned since we have at -+ // least ALU_STRIDE_SIZE data in these buffers, and offset is the -+ // number of elements copied so far, which according to the -+ // until_alignment calculation above will cause both src and dst to be -+ // aligned to usize after this add - src.add(offset) as *const usize, - dst.add(offset) as *mut usize, - ) { - offset += num_ascii; -+ // Safety: Upholds safety-usable invariant here by indexing into non-ascii byte - return Some((*(src.add(offset)), offset)); - } -+ // Safety: offset continues to be the number of bytes copied so far, and -+ // maintains usize alignment for the next loop iteration - offset += ALU_STRIDE_SIZE; -+ // Safety: This is `offset > len - stride. This loop will continue as long as -+ // `offset <= len - stride`, which means there are `stride` bytes to still be read. - if offset > len_minus_stride { - break; - } - } - } - break; - } -+ -+ // Safety: This is the naïve code, same as ascii_naive, and has no requirements -+ // other than src/dst being valid for the the right lens - while offset < len { -+ // Safety: len invariant used here - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety: Upholds safety-usable invariant here - return Some((code_unit, offset)); - } -+ // Safety: len invariant used here - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! basic_latin_alu { - ($name:ident, -+ // safety invariant: use u8 for src/dest for ascii, and u16 for basic_latin - $src_unit:ty, - $dst_unit:ty, -+ // safety invariant: stride function must munch ALU_STRIDE_SIZE*size(src_unit) bytes off of src and -+ // write ALU_STRIDE_SIZE*size(dst_unit) bytes to dst - $stride_fn:ident) => { -+ /// Safety: src and dst must have len elements, src is valid for read, dst is valid for -+ /// write -+ /// Safety-usable invariant: will return Some() when it fails -+ /// to convert. The first value will be a u8 that is > 127. - #[cfg_attr( - feature = "cargo-clippy", - allow(never_loop, cast_ptr_alignment, cast_lossless) - )] - #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - let mut offset = 0usize; - // This loop is only broken out of as a `goto` forward - loop { -+ // Safety: until_alignment becomes the number of bytes we need to munch from src/dest until we are aligned to usize -+ // We ensure basic-latin has the same alignment as ascii, starting with ascii since it is smaller. - let mut until_alignment = { - // Check if the other unit aligns if we move the narrower unit - // to alignment. - // if ::core::mem::size_of::<$src_unit>() == ::core::mem::size_of::<$dst_unit>() { - // ascii_to_ascii - // let src_alignment = (src as usize) & ALIGNMENT_MASK; - // let dst_alignment = (dst as usize) & ALIGNMENT_MASK; - // if src_alignment != dst_alignment { -@@ -232,66 +278,89 @@ macro_rules! basic_latin_alu { - // Moving pointers to alignment seems to be a pessimization on - // x86_64 for operations that have UTF-16 as the internal - // Unicode representation. However, since it seems to be a win - // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except - // mixed results when encoding from UTF-16 and since x86 and - // x86_64 should be using SSE2 in due course, keeping the move - // to alignment here. It would be good to test on more ARM CPUs - // and on real MIPS and POWER hardware. -+ // -+ // Safety: This is the naïve code once again, for `until_alignment` bytes - while until_alignment != 0 { - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety: Upholds safety-usable invariant here - return Some((code_unit, offset)); - } - *(dst.add(offset)) = code_unit as $dst_unit; -+ // Safety: offset is the number of bytes copied so far - offset += 1; - until_alignment -= 1; - } - let len_minus_stride = len - ALU_STRIDE_SIZE; - loop { - if !$stride_fn( -+ // Safety: These are known to be valid and aligned since we have at -+ // least ALU_STRIDE_SIZE data in these buffers, and offset is the -+ // number of elements copied so far, which according to the -+ // until_alignment calculation above will cause both src and dst to be -+ // aligned to usize after this add - src.add(offset) as *const usize, - dst.add(offset) as *mut usize, - ) { - break; - } -+ // Safety: offset continues to be the number of bytes copied so far, and -+ // maintains usize alignment for the next loop iteration - offset += ALU_STRIDE_SIZE; -+ // Safety: This is `offset > len - stride. This loop will continue as long as -+ // `offset <= len - stride`, which means there are `stride` bytes to still be read. - if offset > len_minus_stride { - break; - } - } - } - break; - } -+ // Safety: This is the naïve code once again, for leftover bytes - while offset < len { -+ // Safety: len invariant used here - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety: Upholds safety-usable invariant here - return Some((code_unit, offset)); - } -+ // Safety: len invariant used here - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! latin1_alu { -+ // safety invariant: stride function must munch ALU_STRIDE_SIZE*size(src_unit) bytes off of src and -+ // write ALU_STRIDE_SIZE*size(dst_unit) bytes to dst - ($name:ident, $src_unit:ty, $dst_unit:ty, $stride_fn:ident) => { -+ /// Safety: src and dst must have len elements, src is valid for read, dst is valid for -+ /// write - #[cfg_attr( - feature = "cargo-clippy", - allow(never_loop, cast_ptr_alignment, cast_lossless) - )] - #[inline(always)] - pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) { - let mut offset = 0usize; - // This loop is only broken out of as a `goto` forward - loop { -+ // Safety: until_alignment becomes the number of bytes we need to munch from src/dest until we are aligned to usize -+ // We ensure the UTF-16 side has the same alignment as the Latin-1 side, starting with Latin-1 since it is smaller. - let mut until_alignment = { - if ::core::mem::size_of::<$src_unit>() < ::core::mem::size_of::<$dst_unit>() { - // unpack - let src_until_alignment = (ALU_ALIGNMENT - - ((src as usize) & ALU_ALIGNMENT_MASK)) - & ALU_ALIGNMENT_MASK; - if (dst.wrapping_add(src_until_alignment) as usize) & ALU_ALIGNMENT_MASK - != 0 -@@ -308,373 +377,485 @@ macro_rules! latin1_alu { - != 0 - { - break; - } - dst_until_alignment - } - }; - if until_alignment + ALU_STRIDE_SIZE <= len { -+ // Safety: This is the naïve code once again, for `until_alignment` bytes - while until_alignment != 0 { - let code_unit = *(src.add(offset)); - *(dst.add(offset)) = code_unit as $dst_unit; -+ // Safety: offset is the number of bytes copied so far - offset += 1; - until_alignment -= 1; - } - let len_minus_stride = len - ALU_STRIDE_SIZE; - loop { - $stride_fn( -+ // Safety: These are known to be valid and aligned since we have at -+ // least ALU_STRIDE_SIZE data in these buffers, and offset is the -+ // number of elements copied so far, which according to the -+ // until_alignment calculation above will cause both src and dst to be -+ // aligned to usize after this add - src.add(offset) as *const usize, - dst.add(offset) as *mut usize, - ); -+ // Safety: offset continues to be the number of bytes copied so far, and -+ // maintains usize alignment for the next loop iteration - offset += ALU_STRIDE_SIZE; -+ // Safety: This is `offset > len - stride. This loop will continue as long as -+ // `offset <= len - stride`, which means there are `stride` bytes to still be read. - if offset > len_minus_stride { - break; - } - } - } - break; - } -+ // Safety: This is the naïve code once again, for leftover bytes - while offset < len { -+ // Safety: len invariant used here - let code_unit = *(src.add(offset)); - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_simd_check_align { - ( - $name:ident, - $src_unit:ty, - $dst_unit:ty, -+ // Safety: This function must require aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_both_aligned:ident, -+ // Safety: This function must require aligned/unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_src_aligned:ident, -+ // Safety: This function must require unaligned/aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_dst_aligned:ident, -+ // Safety: This function must require unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_neither_aligned:ident - ) => { -+ /// Safety: src/dst must be valid for reads/writes of `len` elements of their units. -+ /// -+ /// Safety-usable invariant: will return Some() when it encounters non-ASCII, with the first element in the Some being -+ /// guaranteed to be non-ASCII (> 127), and the second being the offset where it is found - #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `SIMD_STRIDE_SIZE` elements. - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; - // XXX Should we first process one stride unconditionally as unaligned to - // avoid the cost of the branchiness below if the first stride fails anyway? - // XXX Should we just use unaligned SSE2 access unconditionally? It seems that - // on Haswell, it would make sense to just use unaligned and not bother - // checking. Need to benchmark older architectures before deciding. - let dst_masked = (dst as usize) & SIMD_ALIGNMENT_MASK; -+ // Safety: checking whether src is aligned - if ((src as usize) & SIMD_ALIGNMENT_MASK) == 0 { -+ // Safety: Checking whether dst is aligned - if dst_masked == 0 { - loop { -+ // Safety: We're valid to read/write SIMD_STRIDE_SIZE elements and have the appropriate alignments - if !$stride_both_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE` which means we always have at least `SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } else { - loop { -+ // Safety: We're valid to read/write SIMD_STRIDE_SIZE elements and have the appropriate alignments - if !$stride_src_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE` which means we always have at least `SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - } else { - if dst_masked == 0 { - loop { -+ // Safety: We're valid to read/write SIMD_STRIDE_SIZE elements and have the appropriate alignments - if !$stride_dst_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE` which means we always have at least `SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } else { - loop { -+ // Safety: We're valid to read/write SIMD_STRIDE_SIZE elements and have the appropriate alignments - if !$stride_neither_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE` which means we always have at least `SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - } - } - while offset < len { -+ // Safety: uses len invariant here and below - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety: upholds safety-usable invariant - return Some((code_unit, offset)); - } - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_simd_check_align_unrolled { - ( - $name:ident, - $src_unit:ty, - $dst_unit:ty, -+ // Safety: This function must require aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_both_aligned:ident, -+ // Safety: This function must require aligned/unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_src_aligned:ident, -+ // Safety: This function must require unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_neither_aligned:ident, -+ // Safety: This function must require aligned src/dest that are valid for reading/writing 2*SIMD_STRIDE_SIZE src_unit/dst_unit - $double_stride_both_aligned:ident, -+ // Safety: This function must require aligned/unaligned src/dest that are valid for reading/writing 2*SIMD_STRIDE_SIZE src_unit/dst_unit - $double_stride_src_aligned:ident - ) => { -- #[inline(always)] -+ /// Safety: src/dst must be valid for reads/writes of `len` elements of their units. -+ /// -+ /// Safety-usable invariant: will return Some() when it encounters non-ASCII, with the first element in the Some being -+ /// guaranteed to be non-ASCII (> 127), and the second being the offset where it is found #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - let unit_size = ::core::mem::size_of::<$src_unit>(); - let mut offset = 0usize; - // This loop is only broken out of as a goto forward without - // actually looping - 'outer: loop { -+ // Safety: if this check succeeds we're valid for reading/writing at least `SIMD_STRIDE_SIZE` elements. - if SIMD_STRIDE_SIZE <= len { - // First, process one unaligned -+ // Safety: this is safe to call since we're valid for this read/write - if !$stride_neither_aligned(src, dst) { - break 'outer; - } - offset = SIMD_STRIDE_SIZE; - - // We have now seen 16 ASCII bytes. Let's guess that - // there will be enough more to justify more expense - // in the case of non-ASCII. - // Use aligned reads for the sake of old microachitectures. -+ // -+ // Safety: this correctly calculates the number of src_units that need to be read before the remaining list is aligned. -+ // This is less that SIMD_ALIGNMENT, which is also SIMD_STRIDE_SIZE (as documented) - let until_alignment = ((SIMD_ALIGNMENT - - ((src.add(offset) as usize) & SIMD_ALIGNMENT_MASK)) - & SIMD_ALIGNMENT_MASK) - / unit_size; -- // This addition won't overflow, because even in the 32-bit PAE case the -+ // Safety: This addition won't overflow, because even in the 32-bit PAE case the - // address space holds enough code that the slice length can't be that - // close to address space size. - // offset now equals SIMD_STRIDE_SIZE, hence times 3 below. -+ // -+ // Safety: if this check succeeds we're valid for reading/writing at least `2 * SIMD_STRIDE_SIZE` elements plus `until_alignment`. -+ // The extra SIMD_STRIDE_SIZE in the condition is because `offset` is already `SIMD_STRIDE_SIZE`. - if until_alignment + (SIMD_STRIDE_SIZE * 3) <= len { - if until_alignment != 0 { -+ // Safety: this is safe to call since we're valid for this read/write (and more), and don't care about alignment -+ // This will copy over bytes that get decoded twice since it's not incrementing `offset` by SIMD_STRIDE_SIZE. This is fine. - if !$stride_neither_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += until_alignment; - } -+ // Safety: At this point we're valid for reading/writing 2*SIMD_STRIDE_SIZE elements -+ // Safety: Now `offset` is aligned for `src` - let len_minus_stride_times_two = len - (SIMD_STRIDE_SIZE * 2); -+ // Safety: This is whether dst is aligned - let dst_masked = (dst.add(offset) as usize) & SIMD_ALIGNMENT_MASK; - if dst_masked == 0 { - loop { -+ // Safety: both are aligned, we can call the aligned function. We're valid for reading/writing double stride from the initial condition -+ // and the loop break condition below - if let Some(advance) = - $double_stride_both_aligned(src.add(offset), dst.add(offset)) - { - offset += advance; - let code_unit = *(src.add(offset)); -+ // Safety: uses safety-usable invariant on ascii_to_ascii_simd_double_stride to return -+ // guaranteed non-ascii - return Some((code_unit, offset)); - } - offset += SIMD_STRIDE_SIZE * 2; -+ // Safety: This is `offset > len - 2 * SIMD_STRIDE_SIZE` which means we always have at least `2 * SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride_times_two { - break; - } - } -+ // Safety: We're valid for reading/writing one more, and can still assume alignment - if offset + SIMD_STRIDE_SIZE <= len { - if !$stride_both_aligned(src.add(offset), dst.add(offset)) { - break 'outer; - } - offset += SIMD_STRIDE_SIZE; - } - } else { - loop { -+ // Safety: only src is aligned here. We're valid for reading/writing double stride from the initial condition -+ // and the loop break condition below - if let Some(advance) = - $double_stride_src_aligned(src.add(offset), dst.add(offset)) - { - offset += advance; - let code_unit = *(src.add(offset)); -+ // Safety: uses safety-usable invariant on ascii_to_ascii_simd_double_stride to return -+ // guaranteed non-ascii - return Some((code_unit, offset)); - } - offset += SIMD_STRIDE_SIZE * 2; -+ // Safety: This is `offset > len - 2 * SIMD_STRIDE_SIZE` which means we always have at least `2 * SIMD_STRIDE_SIZE` elements to munch next time. -+ - if offset > len_minus_stride_times_two { - break; - } - } -+ // Safety: We're valid for reading/writing one more, and can still assume alignment - if offset + SIMD_STRIDE_SIZE <= len { - if !$stride_src_aligned(src.add(offset), dst.add(offset)) { - break 'outer; - } - offset += SIMD_STRIDE_SIZE; - } - } - } else { - // At most two iterations, so unroll - if offset + SIMD_STRIDE_SIZE <= len { -+ // Safety: The check above ensures we're allowed to read/write this, and we don't use alignment - if !$stride_neither_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; - if offset + SIMD_STRIDE_SIZE <= len { -+ // Safety: The check above ensures we're allowed to read/write this, and we don't use alignment - if !$stride_neither_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; - } - } - } - } - break 'outer; - } - while offset < len { -+ // Safety: relies straightforwardly on the `len` invariant - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety-usable invariant upheld here - return Some((code_unit, offset)); - } - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! latin1_simd_check_align { - ( - $name:ident, - $src_unit:ty, - $dst_unit:ty, -+ // Safety: This function must require aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_both_aligned:ident, -+ // Safety: This function must require aligned/unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_src_aligned:ident, -+ // Safety: This function must require unaligned/aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_dst_aligned:ident, -+ // Safety: This function must require unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_neither_aligned:ident -+ - ) => { -+ /// Safety: src/dst must be valid for reads/writes of `len` elements of their units. - #[inline(always)] - pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) { - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `SIMD_STRIDE_SIZE` elements. - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; -+ // Whether dst is aligned - let dst_masked = (dst as usize) & SIMD_ALIGNMENT_MASK; -+ // Whether src is aligned - if ((src as usize) & SIMD_ALIGNMENT_MASK) == 0 { - if dst_masked == 0 { - loop { -+ // Safety: Both were aligned, we can use the aligned function - $stride_both_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE`, which means in the next iteration we're valid for -+ // reading/writing at least SIMD_STRIDE_SIZE elements. - if offset > len_minus_stride { - break; - } - } - } else { - loop { -+ // Safety: src was aligned, dst was not - $stride_src_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE`, which means in the next iteration we're valid for -+ // reading/writing at least SIMD_STRIDE_SIZE elements. - if offset > len_minus_stride { - break; - } - } - } - } else { - if dst_masked == 0 { - loop { -+ // Safety: src was aligned, dst was not - $stride_dst_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE`, which means in the next iteration we're valid for -+ // reading/writing at least SIMD_STRIDE_SIZE elements. - if offset > len_minus_stride { - break; - } - } - } else { - loop { -+ // Safety: Neither were aligned - $stride_neither_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE`, which means in the next iteration we're valid for -+ // reading/writing at least SIMD_STRIDE_SIZE elements. - if offset > len_minus_stride { - break; - } - } - } - } - } - while offset < len { -+ // Safety: relies straightforwardly on the `len` invariant - let code_unit = *(src.add(offset)); - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - } - }; - } - - #[allow(unused_macros)] - macro_rules! latin1_simd_check_align_unrolled { - ( - $name:ident, - $src_unit:ty, - $dst_unit:ty, -+ // Safety: This function must require aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_both_aligned:ident, -+ // Safety: This function must require aligned/unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_src_aligned:ident, -+ // Safety: This function must require unaligned/aligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_dst_aligned:ident, -+ // Safety: This function must require unaligned src/dest that are valid for reading/writing SIMD_STRIDE_SIZE src_unit/dst_unit - $stride_neither_aligned:ident - ) => { -+ /// Safety: src/dst must be valid for reads/writes of `len` elements of their units. - #[inline(always)] - pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) { - let unit_size = ::core::mem::size_of::<$src_unit>(); - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `SIMD_STRIDE_SIZE` elements. - if SIMD_STRIDE_SIZE <= len { -+ // Safety: this correctly calculates the number of src_units that need to be read before the remaining list is aligned. -+ // This is by definition less than SIMD_STRIDE_SIZE. - let mut until_alignment = ((SIMD_STRIDE_SIZE - - ((src as usize) & SIMD_ALIGNMENT_MASK)) - & SIMD_ALIGNMENT_MASK) - / unit_size; - while until_alignment != 0 { -+ // Safety: This is a straightforward copy, since until_alignment is < SIMD_STRIDE_SIZE < len, this is in-bounds - *(dst.add(offset)) = *(src.add(offset)) as $dst_unit; - offset += 1; - until_alignment -= 1; - } -+ // Safety: here offset will be `until_alignment`, i.e. enough to align `src`. - let len_minus_stride = len - SIMD_STRIDE_SIZE; -+ // Safety: if this check succeeds we're valid for reading/writing at least `2 * SIMD_STRIDE_SIZE` elements. - if offset + SIMD_STRIDE_SIZE * 2 <= len { - let len_minus_stride_times_two = len_minus_stride - SIMD_STRIDE_SIZE; -+ // Safety: at this point src is known to be aligned at offset, dst is not. - if (dst.add(offset) as usize) & SIMD_ALIGNMENT_MASK == 0 { - loop { -+ // Safety: We checked alignment of dst above, we can use the alignment functions. We're allowed to read/write 2*SIMD_STRIDE_SIZE elements, which we do. - $stride_both_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; - $stride_both_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - 2 * SIMD_STRIDE_SIZE` which means we always have at least `2 * SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride_times_two { - break; - } - } - } else { - loop { -+ // Safety: we ensured alignment of src already. - $stride_src_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; - $stride_src_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - 2 * SIMD_STRIDE_SIZE` which means we always have at least `2 * SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride_times_two { - break; - } - } - } - } -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE` which means we are valid to munch SIMD_STRIDE_SIZE more elements, which we do - if offset < len_minus_stride { - $stride_src_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; - } - } - while offset < len { -+ // Safety: uses len invariant here and below - let code_unit = *(src.add(offset)); - // On x86_64, this loop autovectorizes but in the pack - // case there are instructions whose purpose is to make sure - // each u16 in the vector is truncated before packing. However, - // since we don't care about saturating behavior of SSE2 packing - // when the input isn't Latin1, those instructions are useless. - // Unfortunately, using the `assume` intrinsic to lie to the - // optimizer doesn't make LLVM omit the trunctation that we -@@ -688,138 +869,180 @@ macro_rules! latin1_simd_check_align_unr - offset += 1; - } - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_simd_unalign { -+ // Safety: stride_neither_aligned must be a function that requires src/dest be valid for unaligned reads/writes for SIMD_STRIDE_SIZE elements of type src_unit/dest_unit - ($name:ident, $src_unit:ty, $dst_unit:ty, $stride_neither_aligned:ident) => { -+ /// Safety: src and dst must be valid for reads/writes of len elements of type src_unit/dst_unit -+ /// -+ /// Safety-usable invariant: will return Some() when it encounters non-ASCII, with the first element in the Some being -+ /// guaranteed to be non-ASCII (> 127), and the second being the offset where it is found - #[inline(always)] - pub unsafe fn $name( - src: *const $src_unit, - dst: *mut $dst_unit, - len: usize, - ) -> Option<($src_unit, usize)> { - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `stride` elements. - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; - loop { -+ // Safety: We know we're valid for `stride` reads/writes, so we can call this function. We don't need alignment. - if !$stride_neither_aligned(src.add(offset), dst.add(offset)) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // This is `offset > len - stride` which means we always have at least `stride` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - while offset < len { -+ // Safety: Uses len invariant here and below - let code_unit = *(src.add(offset)); - if code_unit > 127 { -+ // Safety-usable invariant upheld here - return Some((code_unit, offset)); - } - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! latin1_simd_unalign { -+ // Safety: stride_neither_aligned must be a function that requires src/dest be valid for unaligned reads/writes for SIMD_STRIDE_SIZE elements of type src_unit/dest_unit - ($name:ident, $src_unit:ty, $dst_unit:ty, $stride_neither_aligned:ident) => { -+ /// Safety: src and dst must be valid for unaligned reads/writes of len elements of type src_unit/dst_unit - #[inline(always)] - pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) { - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `stride` elements. - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; - loop { -+ // Safety: We know we're valid for `stride` reads/writes, so we can call this function. We don't need alignment. - $stride_neither_aligned(src.add(offset), dst.add(offset)); - offset += SIMD_STRIDE_SIZE; -+ // This is `offset > len - stride` which means we always have at least `stride` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - while offset < len { -+ // Safety: Uses len invariant here - let code_unit = *(src.add(offset)); - *(dst.add(offset)) = code_unit as $dst_unit; - offset += 1; - } - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_to_ascii_simd_stride { -+ // Safety: load/store must be valid for 16 bytes of read/write, which may be unaligned. (candidates: `(load|store)(16|8)_(unaligned|aligned)` functions) - ($name:ident, $load:ident, $store:ident) => { -+ /// Safety: src and dst must be valid for 16 bytes of read/write according to -+ /// the $load/$store fn, which may allow for unaligned reads/writes or require -+ /// alignment to either 16x8 or u8x16. - #[inline(always)] - pub unsafe fn $name(src: *const u8, dst: *mut u8) -> bool { - let simd = $load(src); - if !simd_is_ascii(simd) { - return false; - } - $store(dst, simd); - true - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_to_ascii_simd_double_stride { -+ // Safety: store must be valid for 32 bytes of write, which may be unaligned (candidates: `store(8|16)_(aligned|unaligned)`) - ($name:ident, $store:ident) => { -+ /// Safety: src must be valid for 32 bytes of aligned u8x16 read -+ /// dst must be valid for 32 bytes of unaligned write according to -+ /// the $store fn, which may allow for unaligned writes or require -+ /// alignment to either 16x8 or u8x16. -+ /// -+ /// Safety-usable invariant: Returns Some(index) if the element at `index` is invalid ASCII - #[inline(always)] - pub unsafe fn $name(src: *const u8, dst: *mut u8) -> Option { - let first = load16_aligned(src); - let second = load16_aligned(src.add(SIMD_STRIDE_SIZE)); - $store(dst, first); - if unlikely(!simd_is_ascii(first | second)) { -+ // Safety: mask_ascii produces a mask of all the high bits. - let mask_first = mask_ascii(first); - if mask_first != 0 { -+ // Safety: on little endian systems this will be the number of ascii bytes -+ // before the first non-ascii, i.e. valid for indexing src -+ // TODO SAFETY: What about big-endian systems? - return Some(mask_first.trailing_zeros() as usize); - } - $store(dst.add(SIMD_STRIDE_SIZE), second); - let mask_second = mask_ascii(second); -+ // Safety: on little endian systems this will be the number of ascii bytes -+ // before the first non-ascii, i.e. valid for indexing src - return Some(SIMD_STRIDE_SIZE + mask_second.trailing_zeros() as usize); - } - $store(dst.add(SIMD_STRIDE_SIZE), second); - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_to_basic_latin_simd_stride { -+ // Safety: load/store must be valid for 16 bytes of read/write, which may be unaligned. (candidates: `(load|store)(16|8)_(unaligned|aligned)` functions) - ($name:ident, $load:ident, $store:ident) => { -+ /// Safety: src and dst must be valid for 16/32 bytes of read/write according to -+ /// the $load/$store fn, which may allow for unaligned reads/writes or require -+ /// alignment to either 16x8 or u8x16. - #[inline(always)] - pub unsafe fn $name(src: *const u8, dst: *mut u16) -> bool { - let simd = $load(src); - if !simd_is_ascii(simd) { - return false; - } - let (first, second) = simd_unpack(simd); - $store(dst, first); - $store(dst.add(8), second); - true - } - }; - } - - #[allow(unused_macros)] - macro_rules! ascii_to_basic_latin_simd_double_stride { -+ // Safety: store must be valid for 16 bytes of write, which may be unaligned - ($name:ident, $store:ident) => { -+ /// Safety: src must be valid for 2*SIMD_STRIDE_SIZE bytes of aligned reads, -+ /// aligned to either 16x8 or u8x16. -+ /// dst must be valid for 2*SIMD_STRIDE_SIZE bytes of aligned or unaligned reads - #[inline(always)] - pub unsafe fn $name(src: *const u8, dst: *mut u16) -> Option { - let first = load16_aligned(src); - let second = load16_aligned(src.add(SIMD_STRIDE_SIZE)); - let (a, b) = simd_unpack(first); - $store(dst, a); -+ // Safety: divide by 2 since it's a u16 pointer - $store(dst.add(SIMD_STRIDE_SIZE / 2), b); - if unlikely(!simd_is_ascii(first | second)) { - let mask_first = mask_ascii(first); - if mask_first != 0 { - return Some(mask_first.trailing_zeros() as usize); - } - let (c, d) = simd_unpack(second); - $store(dst.add(SIMD_STRIDE_SIZE), c); -@@ -832,47 +1055,59 @@ macro_rules! ascii_to_basic_latin_simd_d - $store(dst.add(SIMD_STRIDE_SIZE + (SIMD_STRIDE_SIZE / 2)), d); - None - } - }; - } - - #[allow(unused_macros)] - macro_rules! unpack_simd_stride { -+ // Safety: load/store must be valid for 16 bytes of read/write, which may be unaligned. (candidates: `(load|store)(16|8)_(unaligned|aligned)` functions) - ($name:ident, $load:ident, $store:ident) => { -+ /// Safety: src and dst must be valid for 16 bytes of read/write according to -+ /// the $load/$store fn, which may allow for unaligned reads/writes or require -+ /// alignment to either 16x8 or u8x16. - #[inline(always)] - pub unsafe fn $name(src: *const u8, dst: *mut u16) { - let simd = $load(src); - let (first, second) = simd_unpack(simd); - $store(dst, first); - $store(dst.add(8), second); - } - }; - } - - #[allow(unused_macros)] - macro_rules! basic_latin_to_ascii_simd_stride { -+ // Safety: load/store must be valid for 16 bytes of read/write, which may be unaligned. (candidates: `(load|store)(16|8)_(unaligned|aligned)` functions) - ($name:ident, $load:ident, $store:ident) => { -+ /// Safety: src and dst must be valid for 32/16 bytes of read/write according to -+ /// the $load/$store fn, which may allow for unaligned reads/writes or require -+ /// alignment to either 16x8 or u8x16. - #[inline(always)] - pub unsafe fn $name(src: *const u16, dst: *mut u8) -> bool { - let first = $load(src); - let second = $load(src.add(8)); - if simd_is_basic_latin(first | second) { - $store(dst, simd_pack(first, second)); - true - } else { - false - } - } - }; - } - - #[allow(unused_macros)] - macro_rules! pack_simd_stride { -+ // Safety: load/store must be valid for 16 bytes of read/write, which may be unaligned. (candidates: `(load|store)(16|8)_(unaligned|aligned)` functions) - ($name:ident, $load:ident, $store:ident) => { -+ /// Safety: src and dst must be valid for 32/16 bytes of read/write according to -+ /// the $load/$store fn, which may allow for unaligned reads/writes or require -+ /// alignment to either 16x8 or u8x16. - #[inline(always)] - pub unsafe fn $name(src: *const u16, dst: *mut u8) { - let first = $load(src); - let second = $load(src.add(8)); - $store(dst, simd_pack(first, second)); - } - }; - } -@@ -888,24 +1123,28 @@ cfg_if! { - // pub const ALIGNMENT: usize = 8; - - pub const ALU_STRIDE_SIZE: usize = 16; - - pub const ALU_ALIGNMENT: usize = 8; - - pub const ALU_ALIGNMENT_MASK: usize = 7; - -+ // Safety for stride macros: We stick to the load8_aligned/etc family of functions. We consistently produce -+ // neither_unaligned variants using only unaligned inputs. - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_neither_aligned, load16_unaligned, store16_unaligned); - - ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_neither_aligned, load16_unaligned, store8_unaligned); - unpack_simd_stride!(unpack_stride_neither_aligned, load16_unaligned, store8_unaligned); - - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_neither_aligned, load8_unaligned, store16_unaligned); - pack_simd_stride!(pack_stride_neither_aligned, load8_unaligned, store16_unaligned); - -+ // Safety for conversion macros: We use the unalign macro with unalign functions above. All stride functions were produced -+ // by stride macros that universally munch a single SIMD_STRIDE_SIZE worth of elements. - ascii_simd_unalign!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride_neither_aligned); - ascii_simd_unalign!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_neither_aligned); - ascii_simd_unalign!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_neither_aligned); - latin1_simd_unalign!(unpack_latin1, u8, u16, unpack_stride_neither_aligned); - latin1_simd_unalign!(pack_latin1, u16, u8, pack_stride_neither_aligned); - } else if #[cfg(all(feature = "simd-accel", target_endian = "little", target_feature = "neon"))] { - // SIMD with different instructions for aligned and unaligned loads and stores. - // -@@ -914,16 +1153,19 @@ cfg_if! { - // but the benchmark results I see don't agree. - - pub const SIMD_STRIDE_SIZE: usize = 16; - - pub const MAX_STRIDE_SIZE: usize = 16; - - pub const SIMD_ALIGNMENT_MASK: usize = 15; - -+ // Safety for stride macros: We stick to the load8_aligned/etc family of functions. We consistently name -+ // aligned/unaligned functions according to src/dst being aligned/unaligned -+ - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_both_aligned, load16_aligned, store16_aligned); - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_src_aligned, load16_aligned, store16_unaligned); - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_dst_aligned, load16_unaligned, store16_aligned); - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_neither_aligned, load16_unaligned, store16_unaligned); - - ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_both_aligned, load16_aligned, store8_aligned); - ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_src_aligned, load16_aligned, store8_unaligned); - ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_dst_aligned, load16_unaligned, store8_aligned); -@@ -939,36 +1181,43 @@ cfg_if! { - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_dst_aligned, load8_unaligned, store16_aligned); - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_neither_aligned, load8_unaligned, store16_unaligned); - - pack_simd_stride!(pack_stride_both_aligned, load8_aligned, store16_aligned); - pack_simd_stride!(pack_stride_src_aligned, load8_aligned, store16_unaligned); - pack_simd_stride!(pack_stride_dst_aligned, load8_unaligned, store16_aligned); - pack_simd_stride!(pack_stride_neither_aligned, load8_unaligned, store16_unaligned); - -+ // Safety for conversion macros: We use the correct pattern of both/src/dst/neither here. All stride functions were produced -+ // by stride macros that universally munch a single SIMD_STRIDE_SIZE worth of elements. -+ - ascii_simd_check_align!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride_both_aligned, ascii_to_ascii_stride_src_aligned, ascii_to_ascii_stride_dst_aligned, ascii_to_ascii_stride_neither_aligned); - ascii_simd_check_align!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_both_aligned, ascii_to_basic_latin_stride_src_aligned, ascii_to_basic_latin_stride_dst_aligned, ascii_to_basic_latin_stride_neither_aligned); - ascii_simd_check_align!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_both_aligned, basic_latin_to_ascii_stride_src_aligned, basic_latin_to_ascii_stride_dst_aligned, basic_latin_to_ascii_stride_neither_aligned); - latin1_simd_check_align!(unpack_latin1, u8, u16, unpack_stride_both_aligned, unpack_stride_src_aligned, unpack_stride_dst_aligned, unpack_stride_neither_aligned); - latin1_simd_check_align!(pack_latin1, u16, u8, pack_stride_both_aligned, pack_stride_src_aligned, pack_stride_dst_aligned, pack_stride_neither_aligned); - } else if #[cfg(all(feature = "simd-accel", target_feature = "sse2"))] { - // SIMD with different instructions for aligned and unaligned loads and stores. - // - // Newer microarchitectures are not supposed to have a performance difference between - // aligned and unaligned SSE2 loads and stores when the address is actually aligned, - // but the benchmark results I see don't agree. - - pub const SIMD_STRIDE_SIZE: usize = 16; - -+ /// Safety-usable invariant: This should be identical to SIMD_STRIDE_SIZE (used by ascii_simd_check_align_unrolled) - pub const SIMD_ALIGNMENT: usize = 16; - - pub const MAX_STRIDE_SIZE: usize = 16; - - pub const SIMD_ALIGNMENT_MASK: usize = 15; - -+ // Safety for stride macros: We stick to the load8_aligned/etc family of functions. We consistently name -+ // aligned/unaligned functions according to src/dst being aligned/unaligned -+ - ascii_to_ascii_simd_double_stride!(ascii_to_ascii_simd_double_stride_both_aligned, store16_aligned); - ascii_to_ascii_simd_double_stride!(ascii_to_ascii_simd_double_stride_src_aligned, store16_unaligned); - - ascii_to_basic_latin_simd_double_stride!(ascii_to_basic_latin_simd_double_stride_both_aligned, store8_aligned); - ascii_to_basic_latin_simd_double_stride!(ascii_to_basic_latin_simd_double_stride_src_aligned, store8_unaligned); - - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_both_aligned, load16_aligned, store16_aligned); - ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_src_aligned, load16_aligned, store16_unaligned); -@@ -984,33 +1233,43 @@ cfg_if! { - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_both_aligned, load8_aligned, store16_aligned); - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_src_aligned, load8_aligned, store16_unaligned); - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_dst_aligned, load8_unaligned, store16_aligned); - basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_neither_aligned, load8_unaligned, store16_unaligned); - - pack_simd_stride!(pack_stride_both_aligned, load8_aligned, store16_aligned); - pack_simd_stride!(pack_stride_src_aligned, load8_aligned, store16_unaligned); - -+ // Safety for conversion macros: We use the correct pattern of both/src/dst/neither/double_both/double_src here. All stride functions were produced -+ // by stride macros that universally munch a single SIMD_STRIDE_SIZE worth of elements. -+ - ascii_simd_check_align_unrolled!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride_both_aligned, ascii_to_ascii_stride_src_aligned, ascii_to_ascii_stride_neither_aligned, ascii_to_ascii_simd_double_stride_both_aligned, ascii_to_ascii_simd_double_stride_src_aligned); - ascii_simd_check_align_unrolled!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_both_aligned, ascii_to_basic_latin_stride_src_aligned, ascii_to_basic_latin_stride_neither_aligned, ascii_to_basic_latin_simd_double_stride_both_aligned, ascii_to_basic_latin_simd_double_stride_src_aligned); - - ascii_simd_check_align!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_both_aligned, basic_latin_to_ascii_stride_src_aligned, basic_latin_to_ascii_stride_dst_aligned, basic_latin_to_ascii_stride_neither_aligned); - latin1_simd_check_align_unrolled!(unpack_latin1, u8, u16, unpack_stride_both_aligned, unpack_stride_src_aligned, unpack_stride_dst_aligned, unpack_stride_neither_aligned); - latin1_simd_check_align_unrolled!(pack_latin1, u16, u8, pack_stride_both_aligned, pack_stride_src_aligned, pack_stride_dst_aligned, pack_stride_neither_aligned); - } else if #[cfg(all(target_endian = "little", target_pointer_width = "64"))] { - // Aligned ALU word, little-endian, 64-bit - -+ /// Safety invariant: this is the amount of bytes consumed by -+ /// unpack_alu. This will be twice the pointer width, as it consumes two usizes. -+ /// This is also the number of bytes produced by pack_alu. -+ /// This is also the number of u16 code units produced/consumed by unpack_alu/pack_alu respectively. - pub const ALU_STRIDE_SIZE: usize = 16; - - pub const MAX_STRIDE_SIZE: usize = 16; - -+ // Safety invariant: this is the pointer width in bytes - pub const ALU_ALIGNMENT: usize = 8; - -+ // Safety invariant: this is a mask for getting the bits of a pointer not aligned to ALU_ALIGNMENT - pub const ALU_ALIGNMENT_MASK: usize = 7; - -+ /// Safety: dst must point to valid space for writing four `usize`s - #[inline(always)] - unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) { - let first = ((0x0000_0000_FF00_0000usize & word) << 24) | - ((0x0000_0000_00FF_0000usize & word) << 16) | - ((0x0000_0000_0000_FF00usize & word) << 8) | - (0x0000_0000_0000_00FFusize & word); - let second = ((0xFF00_0000_0000_0000usize & word) >> 8) | - ((0x00FF_0000_0000_0000usize & word) >> 16) | -@@ -1019,22 +1278,24 @@ cfg_if! { - let third = ((0x0000_0000_FF00_0000usize & second_word) << 24) | - ((0x0000_0000_00FF_0000usize & second_word) << 16) | - ((0x0000_0000_0000_FF00usize & second_word) << 8) | - (0x0000_0000_0000_00FFusize & second_word); - let fourth = ((0xFF00_0000_0000_0000usize & second_word) >> 8) | - ((0x00FF_0000_0000_0000usize & second_word) >> 16) | - ((0x0000_FF00_0000_0000usize & second_word) >> 24) | - ((0x0000_00FF_0000_0000usize & second_word) >> 32); -+ // Safety: fn invariant used here - *dst = first; - *(dst.add(1)) = second; - *(dst.add(2)) = third; - *(dst.add(3)) = fourth; - } - -+ /// Safety: dst must point to valid space for writing two `usize`s - #[inline(always)] - unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) { - let word = ((0x00FF_0000_0000_0000usize & second) << 8) | - ((0x0000_00FF_0000_0000usize & second) << 16) | - ((0x0000_0000_00FF_0000usize & second) << 24) | - ((0x0000_0000_0000_00FFusize & second) << 32) | - ((0x00FF_0000_0000_0000usize & first) >> 24) | - ((0x0000_00FF_0000_0000usize & first) >> 16) | -@@ -1043,70 +1304,88 @@ cfg_if! { - let second_word = ((0x00FF_0000_0000_0000usize & fourth) << 8) | - ((0x0000_00FF_0000_0000usize & fourth) << 16) | - ((0x0000_0000_00FF_0000usize & fourth) << 24) | - ((0x0000_0000_0000_00FFusize & fourth) << 32) | - ((0x00FF_0000_0000_0000usize & third) >> 24) | - ((0x0000_00FF_0000_0000usize & third) >> 16) | - ((0x0000_0000_00FF_0000usize & third) >> 8) | - (0x0000_0000_0000_00FFusize & third); -+ // Safety: fn invariant used here - *dst = word; - *(dst.add(1)) = second_word; - } - } else if #[cfg(all(target_endian = "little", target_pointer_width = "32"))] { - // Aligned ALU word, little-endian, 32-bit - -+ /// Safety invariant: this is the amount of bytes consumed by -+ /// unpack_alu. This will be twice the pointer width, as it consumes two usizes. -+ /// This is also the number of bytes produced by pack_alu. -+ /// This is also the number of u16 code units produced/consumed by unpack_alu/pack_alu respectively. - pub const ALU_STRIDE_SIZE: usize = 8; - - pub const MAX_STRIDE_SIZE: usize = 8; - -+ // Safety invariant: this is the pointer width in bytes - pub const ALU_ALIGNMENT: usize = 4; - -+ // Safety invariant: this is a mask for getting the bits of a pointer not aligned to ALU_ALIGNMENT - pub const ALU_ALIGNMENT_MASK: usize = 3; - -+ /// Safety: dst must point to valid space for writing four `usize`s - #[inline(always)] - unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) { - let first = ((0x0000_FF00usize & word) << 8) | - (0x0000_00FFusize & word); - let second = ((0xFF00_0000usize & word) >> 8) | - ((0x00FF_0000usize & word) >> 16); - let third = ((0x0000_FF00usize & second_word) << 8) | - (0x0000_00FFusize & second_word); - let fourth = ((0xFF00_0000usize & second_word) >> 8) | - ((0x00FF_0000usize & second_word) >> 16); -+ // Safety: fn invariant used here - *dst = first; - *(dst.add(1)) = second; - *(dst.add(2)) = third; - *(dst.add(3)) = fourth; - } - -+ /// Safety: dst must point to valid space for writing two `usize`s - #[inline(always)] - unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) { - let word = ((0x00FF_0000usize & second) << 8) | - ((0x0000_00FFusize & second) << 16) | - ((0x00FF_0000usize & first) >> 8) | - (0x0000_00FFusize & first); - let second_word = ((0x00FF_0000usize & fourth) << 8) | - ((0x0000_00FFusize & fourth) << 16) | - ((0x00FF_0000usize & third) >> 8) | - (0x0000_00FFusize & third); -+ // Safety: fn invariant used here - *dst = word; - *(dst.add(1)) = second_word; - } - } else if #[cfg(all(target_endian = "big", target_pointer_width = "64"))] { - // Aligned ALU word, big-endian, 64-bit - -+ /// Safety invariant: this is the amount of bytes consumed by -+ /// unpack_alu. This will be twice the pointer width, as it consumes two usizes. -+ /// This is also the number of bytes produced by pack_alu. -+ /// This is also the number of u16 code units produced/consumed by unpack_alu/pack_alu respectively. - pub const ALU_STRIDE_SIZE: usize = 16; - - pub const MAX_STRIDE_SIZE: usize = 16; - -+ // Safety invariant: this is the pointer width in bytes - pub const ALU_ALIGNMENT: usize = 8; - -+ // Safety invariant: this is a mask for getting the bits of a pointer not aligned to ALU_ALIGNMENT - pub const ALU_ALIGNMENT_MASK: usize = 7; - -+ /// Safety: dst must point to valid space for writing four `usize`s - #[inline(always)] - unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) { - let first = ((0xFF00_0000_0000_0000usize & word) >> 8) | - ((0x00FF_0000_0000_0000usize & word) >> 16) | - ((0x0000_FF00_0000_0000usize & word) >> 24) | - ((0x0000_00FF_0000_0000usize & word) >> 32); - let second = ((0x0000_0000_FF00_0000usize & word) << 24) | - ((0x0000_0000_00FF_0000usize & word) << 16) | -@@ -1115,22 +1394,24 @@ cfg_if! { - let third = ((0xFF00_0000_0000_0000usize & second_word) >> 8) | - ((0x00FF_0000_0000_0000usize & second_word) >> 16) | - ((0x0000_FF00_0000_0000usize & second_word) >> 24) | - ((0x0000_00FF_0000_0000usize & second_word) >> 32); - let fourth = ((0x0000_0000_FF00_0000usize & second_word) << 24) | - ((0x0000_0000_00FF_0000usize & second_word) << 16) | - ((0x0000_0000_0000_FF00usize & second_word) << 8) | - (0x0000_0000_0000_00FFusize & second_word); -+ // Safety: fn invariant used here - *dst = first; - *(dst.add(1)) = second; - *(dst.add(2)) = third; - *(dst.add(3)) = fourth; - } - -+ /// Safety: dst must point to valid space for writing two `usize`s - #[inline(always)] - unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) { - let word = ((0x00FF0000_00000000usize & first) << 8) | - ((0x000000FF_00000000usize & first) << 16) | - ((0x00000000_00FF0000usize & first) << 24) | - ((0x00000000_000000FFusize & first) << 32) | - ((0x00FF0000_00000000usize & second) >> 24) | - ((0x000000FF_00000000usize & second) >> 16) | -@@ -1139,67 +1420,80 @@ cfg_if! { - let second_word = ((0x00FF0000_00000000usize & third) << 8) | - ((0x000000FF_00000000usize & third) << 16) | - ((0x00000000_00FF0000usize & third) << 24) | - ((0x00000000_000000FFusize & third) << 32) | - ((0x00FF0000_00000000usize & fourth) >> 24) | - ((0x000000FF_00000000usize & fourth) >> 16) | - ((0x00000000_00FF0000usize & fourth) >> 8) | - (0x00000000_000000FFusize & fourth); -+ // Safety: fn invariant used here - *dst = word; - *(dst.add(1)) = second_word; - } - } else if #[cfg(all(target_endian = "big", target_pointer_width = "32"))] { - // Aligned ALU word, big-endian, 32-bit - -+ /// Safety invariant: this is the amount of bytes consumed by -+ /// unpack_alu. This will be twice the pointer width, as it consumes two usizes. -+ /// This is also the number of bytes produced by pack_alu. -+ /// This is also the number of u16 code units produced/consumed by unpack_alu/pack_alu respectively. - pub const ALU_STRIDE_SIZE: usize = 8; - - pub const MAX_STRIDE_SIZE: usize = 8; - -+ // Safety invariant: this is the pointer width in bytes - pub const ALU_ALIGNMENT: usize = 4; - -+ // Safety invariant: this is a mask for getting the bits of a pointer not aligned to ALU_ALIGNMENT - pub const ALU_ALIGNMENT_MASK: usize = 3; - -+ /// Safety: dst must point to valid space for writing four `usize`s - #[inline(always)] - unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) { - let first = ((0xFF00_0000usize & word) >> 8) | - ((0x00FF_0000usize & word) >> 16); - let second = ((0x0000_FF00usize & word) << 8) | - (0x0000_00FFusize & word); - let third = ((0xFF00_0000usize & second_word) >> 8) | - ((0x00FF_0000usize & second_word) >> 16); - let fourth = ((0x0000_FF00usize & second_word) << 8) | - (0x0000_00FFusize & second_word); -+ // Safety: fn invariant used here - *dst = first; - *(dst.add(1)) = second; - *(dst.add(2)) = third; - *(dst.add(3)) = fourth; - } - -+ /// Safety: dst must point to valid space for writing two `usize`s - #[inline(always)] - unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) { - let word = ((0x00FF_0000usize & first) << 8) | - ((0x0000_00FFusize & first) << 16) | - ((0x00FF_0000usize & second) >> 8) | - (0x0000_00FFusize & second); - let second_word = ((0x00FF_0000usize & third) << 8) | - ((0x0000_00FFusize & third) << 16) | - ((0x00FF_0000usize & fourth) >> 8) | - (0x0000_00FFusize & fourth); -+ // Safety: fn invariant used here - *dst = word; - *(dst.add(1)) = second_word; - } - } else { - ascii_naive!(ascii_to_ascii, u8, u8); - ascii_naive!(ascii_to_basic_latin, u8, u16); - ascii_naive!(basic_latin_to_ascii, u16, u8); - } - } - - cfg_if! { -+ // Safety-usable invariant: this counts the zeroes from the "first byte" of utf-8 data packed into a usize -+ // with the target endianness - if #[cfg(target_endian = "little")] { - #[allow(dead_code)] - #[inline(always)] - fn count_zeros(word: usize) -> u32 { - word.trailing_zeros() - } - } else { - #[allow(dead_code)] -@@ -1207,208 +1501,272 @@ cfg_if! { - fn count_zeros(word: usize) -> u32 { - word.leading_zeros() - } - } - } - - cfg_if! { - if #[cfg(all(feature = "simd-accel", target_endian = "little", target_arch = "disabled"))] { -+ /// Safety-usable invariant: Will return the value and position of the first non-ASCII byte in the slice in a Some if found. -+ /// In other words, the first element of the Some is always `> 127` - #[inline(always)] - pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> { - let src = slice.as_ptr(); - let len = slice.len(); - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading/writing at least `stride` elements. - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; - loop { -+ // Safety: src at offset is valid for a `SIMD_STRIDE_SIZE` read - let simd = unsafe { load16_unaligned(src.add(offset)) }; - if !simd_is_ascii(simd) { - break; - } - offset += SIMD_STRIDE_SIZE; -+ // This is `offset > len - SIMD_STRIDE_SIZE` which means we always have at least `SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - while offset < len { - let code_unit = slice[offset]; - if code_unit > 127 { -+ // Safety: Safety-usable invariant upheld here - return Some((code_unit, offset)); - } - offset += 1; - } - None - } - } else if #[cfg(all(feature = "simd-accel", target_feature = "sse2"))] { -+ /// Safety-usable invariant: will return Some() when it encounters non-ASCII, with the first element in the Some being -+ /// guaranteed to be non-ASCII (> 127), and the second being the offset where it is found - #[inline(always)] - pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> { - let src = slice.as_ptr(); - let len = slice.len(); - let mut offset = 0usize; -+ // Safety: if this check succeeds we're valid for reading at least `stride` elements. - if SIMD_STRIDE_SIZE <= len { - // First, process one unaligned vector -+ // Safety: src is valid for a `SIMD_STRIDE_SIZE` read - let simd = unsafe { load16_unaligned(src) }; - let mask = mask_ascii(simd); - if mask != 0 { - offset = mask.trailing_zeros() as usize; - let non_ascii = unsafe { *src.add(offset) }; - return Some((non_ascii, offset)); - } - offset = SIMD_STRIDE_SIZE; -+ // Safety: Now that offset has changed we don't yet know how much it is valid for - - // We have now seen 16 ASCII bytes. Let's guess that - // there will be enough more to justify more expense - // in the case of non-ASCII. - // Use aligned reads for the sake of old microachitectures. -+ // Safety: this correctly calculates the number of src_units that need to be read before the remaining list is aligned. -+ // This is by definition less than SIMD_ALIGNMENT, which is defined to be equal to SIMD_STRIDE_SIZE. - let until_alignment = unsafe { (SIMD_ALIGNMENT - ((src.add(offset) as usize) & SIMD_ALIGNMENT_MASK)) & SIMD_ALIGNMENT_MASK }; - // This addition won't overflow, because even in the 32-bit PAE case the - // address space holds enough code that the slice length can't be that - // close to address space size. - // offset now equals SIMD_STRIDE_SIZE, hence times 3 below. -+ // -+ // Safety: if this check succeeds we're valid for reading at least `2 * SIMD_STRIDE_SIZE` elements plus `until_alignment`. -+ // The extra SIMD_STRIDE_SIZE in the condition is because `offset` is already `SIMD_STRIDE_SIZE`. - if until_alignment + (SIMD_STRIDE_SIZE * 3) <= len { - if until_alignment != 0 { -+ // Safety: this is safe to call since we're valid for this read (and more), and don't care about alignment -+ // This will copy over bytes that get decoded twice since it's not incrementing `offset` by SIMD_STRIDE_SIZE. This is fine. - let simd = unsafe { load16_unaligned(src.add(offset)) }; - let mask = mask_ascii(simd); - if mask != 0 { - offset += mask.trailing_zeros() as usize; - let non_ascii = unsafe { *src.add(offset) }; - return Some((non_ascii, offset)); - } - offset += until_alignment; - } -+ // Safety: At this point we're valid for reading 2*SIMD_STRIDE_SIZE elements -+ // Safety: Now `offset` is aligned for `src` - let len_minus_stride_times_two = len - (SIMD_STRIDE_SIZE * 2); - loop { -+ // Safety: We were valid for this read, and were aligned. - let first = unsafe { load16_aligned(src.add(offset)) }; - let second = unsafe { load16_aligned(src.add(offset + SIMD_STRIDE_SIZE)) }; - if !simd_is_ascii(first | second) { -+ // Safety: mask_ascii produces a mask of all the high bits. - let mask_first = mask_ascii(first); - if mask_first != 0 { -+ // Safety: on little endian systems this will be the number of ascii bytes -+ // before the first non-ascii, i.e. valid for indexing src -+ // TODO SAFETY: What about big-endian systems? - offset += mask_first.trailing_zeros() as usize; - } else { - let mask_second = mask_ascii(second); -+ // Safety: on little endian systems this will be the number of ascii bytes -+ // before the first non-ascii, i.e. valid for indexing src - offset += SIMD_STRIDE_SIZE + mask_second.trailing_zeros() as usize; - } -+ // Safety: We know this is non-ASCII, and can uphold the safety-usable invariant here - let non_ascii = unsafe { *src.add(offset) }; -+ - return Some((non_ascii, offset)); - } - offset += SIMD_STRIDE_SIZE * 2; -+ // Safety: This is `offset > len - 2 * SIMD_STRIDE_SIZE` which means we always have at least `2 * SIMD_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride_times_two { - break; - } - } -+ // Safety: if this check succeeds we're valid for reading at least `SIMD_STRIDE_SIZE` - if offset + SIMD_STRIDE_SIZE <= len { -- let simd = unsafe { load16_aligned(src.add(offset)) }; -- let mask = mask_ascii(simd); -+ // Safety: We were valid for this read, and were aligned. -+ let simd = unsafe { load16_aligned(src.add(offset)) }; -+ // Safety: mask_ascii produces a mask of all the high bits. -+ let mask = mask_ascii(simd); - if mask != 0 { -+ // Safety: on little endian systems this will be the number of ascii bytes -+ // before the first non-ascii, i.e. valid for indexing src - offset += mask.trailing_zeros() as usize; - let non_ascii = unsafe { *src.add(offset) }; -+ // Safety: We know this is non-ASCII, and can uphold the safety-usable invariant here - return Some((non_ascii, offset)); - } - offset += SIMD_STRIDE_SIZE; - } - } else { -+ // Safety: this is the unaligned branch - // At most two iterations, so unroll -+ // Safety: if this check succeeds we're valid for reading at least `SIMD_STRIDE_SIZE` - if offset + SIMD_STRIDE_SIZE <= len { -+ // Safety: We're valid for this read but must use an unaligned read - let simd = unsafe { load16_unaligned(src.add(offset)) }; - let mask = mask_ascii(simd); - if mask != 0 { - offset += mask.trailing_zeros() as usize; - let non_ascii = unsafe { *src.add(offset) }; -+ // Safety-usable invariant upheld here (same as above) - return Some((non_ascii, offset)); - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: if this check succeeds we're valid for reading at least `SIMD_STRIDE_SIZE` - if offset + SIMD_STRIDE_SIZE <= len { -+ // Safety: We're valid for this read but must use an unaligned read - let simd = unsafe { load16_unaligned(src.add(offset)) }; - let mask = mask_ascii(simd); - if mask != 0 { - offset += mask.trailing_zeros() as usize; - let non_ascii = unsafe { *src.add(offset) }; -+ // Safety-usable invariant upheld here (same as above) - return Some((non_ascii, offset)); - } - offset += SIMD_STRIDE_SIZE; - } - } - } - } - while offset < len { -+ // Safety: relies straightforwardly on the `len` invariant - let code_unit = unsafe { *(src.add(offset)) }; - if code_unit > 127 { -+ // Safety-usable invariant upheld here - return Some((code_unit, offset)); - } - offset += 1; - } - None - } - } else { -+ // Safety-usable invariant: returns byte index of first non-ascii byte - #[inline(always)] - fn find_non_ascii(word: usize, second_word: usize) -> Option { - let word_masked = word & ASCII_MASK; - let second_masked = second_word & ASCII_MASK; - if (word_masked | second_masked) == 0 { -+ // Both are ascii, invariant upheld - return None; - } - if word_masked != 0 { - let zeros = count_zeros(word_masked); -- // `zeros` now contains 7 (for the seven bits of non-ASCII) -+ // `zeros` now contains 0 to 7 (for the seven bits of masked ASCII in little endian, -+ // or up to 7 bits of non-ASCII in big endian if the first byte is non-ASCII) - // plus 8 times the number of ASCII in text order before the - // non-ASCII byte in the little-endian case or 8 times the number of ASCII in - // text order before the non-ASCII byte in the big-endian case. - let num_ascii = (zeros >> 3) as usize; -+ // Safety-usable invariant upheld here - return Some(num_ascii); - } - let zeros = count_zeros(second_masked); -- // `zeros` now contains 7 (for the seven bits of non-ASCII) -+ // `zeros` now contains 0 to 7 (for the seven bits of masked ASCII in little endian, -+ // or up to 7 bits of non-ASCII in big endian if the first byte is non-ASCII) - // plus 8 times the number of ASCII in text order before the - // non-ASCII byte in the little-endian case or 8 times the number of ASCII in - // text order before the non-ASCII byte in the big-endian case. - let num_ascii = (zeros >> 3) as usize; -+ // Safety-usable invariant upheld here - Some(ALU_ALIGNMENT + num_ascii) - } - -+ /// Safety: `src` must be valid for the reads of two `usize`s -+ /// -+ /// Safety-usable invariant: will return byte index of first non-ascii byte - #[inline(always)] - unsafe fn validate_ascii_stride(src: *const usize) -> Option { - let word = *src; - let second_word = *(src.add(1)); - find_non_ascii(word, second_word) - } - -+ /// Safety-usable invariant: will return Some() when it encounters non-ASCII, with the first element in the Some being -+ /// guaranteed to be non-ASCII (> 127), and the second being the offset where it is found - #[cfg_attr(feature = "cargo-clippy", allow(cast_ptr_alignment))] - #[inline(always)] - pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> { - let src = slice.as_ptr(); - let len = slice.len(); - let mut offset = 0usize; - let mut until_alignment = (ALU_ALIGNMENT - ((src as usize) & ALU_ALIGNMENT_MASK)) & ALU_ALIGNMENT_MASK; -+ // Safety: If this check fails we're valid to read `until_alignment + ALU_STRIDE_SIZE` elements - if until_alignment + ALU_STRIDE_SIZE <= len { - while until_alignment != 0 { - let code_unit = slice[offset]; - if code_unit > 127 { -+ // Safety-usable invairant upheld here - return Some((code_unit, offset)); - } - offset += 1; - until_alignment -= 1; - } -+ // Safety: At this point we have read until_alignment elements and -+ // are valid for `ALU_STRIDE_SIZE` more. - let len_minus_stride = len - ALU_STRIDE_SIZE; - loop { -+ // Safety: we were valid for this read - let ptr = unsafe { src.add(offset) as *const usize }; - if let Some(num_ascii) = unsafe { validate_ascii_stride(ptr) } { - offset += num_ascii; -+ // Safety-usable invairant upheld here using the invariant from validate_ascii_stride() - return Some((unsafe { *(src.add(offset)) }, offset)); - } - offset += ALU_STRIDE_SIZE; -+ // Safety: This is `offset > ALU_STRIDE_SIZE` which means we always have at least `2 * ALU_STRIDE_SIZE` elements to munch next time. - if offset > len_minus_stride { - break; - } - } - } - while offset < len { - let code_unit = slice[offset]; - if code_unit > 127 { -+ // Safety-usable invairant upheld here - return Some((code_unit, offset)); - } - offset += 1; - } - None - } - - } -@@ -1423,70 +1781,88 @@ cfg_if! { - // vector reads without vector writes. - - pub const ALU_STRIDE_SIZE: usize = 8; - - pub const ALU_ALIGNMENT: usize = 4; - - pub const ALU_ALIGNMENT_MASK: usize = 3; - } else { -+ // Safety: src points to two valid `usize`s, dst points to four valid `usize`s - #[inline(always)] - unsafe fn unpack_latin1_stride_alu(src: *const usize, dst: *mut usize) { -+ // Safety: src safety invariant used here - let word = *src; - let second_word = *(src.add(1)); -+ // Safety: dst safety invariant passed down - unpack_alu(word, second_word, dst); - } - -+ // Safety: src points to four valid `usize`s, dst points to two valid `usize`s - #[inline(always)] - unsafe fn pack_latin1_stride_alu(src: *const usize, dst: *mut usize) { -+ // Safety: src safety invariant used here - let first = *src; - let second = *(src.add(1)); - let third = *(src.add(2)); - let fourth = *(src.add(3)); -+ // Safety: dst safety invariant passed down - pack_alu(first, second, third, fourth, dst); - } - -+ // Safety: src points to two valid `usize`s, dst points to four valid `usize`s - #[inline(always)] - unsafe fn ascii_to_basic_latin_stride_alu(src: *const usize, dst: *mut usize) -> bool { -+ // Safety: src safety invariant used here - let word = *src; - let second_word = *(src.add(1)); - // Check if the words contains non-ASCII - if (word & ASCII_MASK) | (second_word & ASCII_MASK) != 0 { - return false; - } -+ // Safety: dst safety invariant passed down - unpack_alu(word, second_word, dst); - true - } - -+ // Safety: src points four valid `usize`s, dst points to two valid `usize`s - #[inline(always)] - unsafe fn basic_latin_to_ascii_stride_alu(src: *const usize, dst: *mut usize) -> bool { -+ // Safety: src safety invariant used here - let first = *src; - let second = *(src.add(1)); - let third = *(src.add(2)); - let fourth = *(src.add(3)); - if (first & BASIC_LATIN_MASK) | (second & BASIC_LATIN_MASK) | (third & BASIC_LATIN_MASK) | (fourth & BASIC_LATIN_MASK) != 0 { - return false; - } -+ // Safety: dst safety invariant passed down - pack_alu(first, second, third, fourth, dst); - true - } - -+ // Safety: src, dst both point to two valid `usize`s each -+ // Safety-usable invariant: Will return byte index of first non-ascii byte. - #[inline(always)] - unsafe fn ascii_to_ascii_stride(src: *const usize, dst: *mut usize) -> Option { -+ // Safety: src safety invariant used here - let word = *src; - let second_word = *(src.add(1)); -+ // Safety: src safety invariant used here - *dst = word; - *(dst.add(1)) = second_word; -+ // Relies on safety-usable invariant here - find_non_ascii(word, second_word) - } - - basic_latin_alu!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_alu); - basic_latin_alu!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_alu); - latin1_alu!(unpack_latin1, u8, u16, unpack_latin1_stride_alu); - latin1_alu!(pack_latin1, u16, u8, pack_latin1_stride_alu); -+ // Safety invariant upheld: ascii_to_ascii_stride will return byte index of first non-ascii if found - ascii_alu!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride); - } - } - - pub fn ascii_valid_up_to(bytes: &[u8]) -> usize { - match validate_ascii(bytes) { - None => bytes.len(), - Some((_, num_valid)) => num_valid, -diff --git a/third_party/rust/encoding_rs/src/handles.rs b/third_party/rust/encoding_rs/src/handles.rs ---- a/third_party/rust/encoding_rs/src/handles.rs -+++ b/third_party/rust/encoding_rs/src/handles.rs -@@ -29,17 +29,17 @@ use crate::simd_funcs::*; - #[cfg(all( - feature = "simd-accel", - any( - target_feature = "sse2", - all(target_endian = "little", target_arch = "aarch64"), - all(target_endian = "little", target_feature = "neon") - ) - ))] --use packed_simd::u16x8; -+use core::simd::u16x8; - - use super::DecoderResult; - use super::EncoderResult; - use crate::ascii::*; - use crate::utf_8::convert_utf8_to_utf16_up_to_invalid; - use crate::utf_8::utf8_valid_up_to; - - pub enum Space { -@@ -85,84 +85,100 @@ impl Endian for LittleEndian { - const OPPOSITE_ENDIAN: bool = false; - - #[cfg(target_endian = "big")] - const OPPOSITE_ENDIAN: bool = true; - } - - #[derive(Debug, Copy, Clone)] - struct UnalignedU16Slice { -+ // Safety invariant: ptr must be valid for reading 2*len bytes - ptr: *const u8, - len: usize, - } - - impl UnalignedU16Slice { -+ /// Safety: ptr must be valid for reading 2*len bytes - #[inline(always)] - pub unsafe fn new(ptr: *const u8, len: usize) -> UnalignedU16Slice { -+ // Safety: field invariant passed up to caller here - UnalignedU16Slice { ptr, len } - } - - #[inline(always)] - pub fn trim_last(&mut self) { - assert!(self.len > 0); -+ // Safety: invariant upheld here: a slice is still valid with a shorter len - self.len -= 1; - } - - #[inline(always)] - pub fn at(&self, i: usize) -> u16 { - use core::mem::MaybeUninit; - - assert!(i < self.len); - unsafe { - let mut u: MaybeUninit = MaybeUninit::uninit(); -+ // Safety: i is at most len - 1, which works here - ::core::ptr::copy_nonoverlapping(self.ptr.add(i * 2), u.as_mut_ptr() as *mut u8, 2); -+ // Safety: valid read above lets us do this - u.assume_init() - } - } - - #[cfg(feature = "simd-accel")] - #[inline(always)] - pub fn simd_at(&self, i: usize) -> u16x8 { -+ // Safety: i/len are on the scale of u16s, each one corresponds to 2 u8s - assert!(i + SIMD_STRIDE_SIZE / 2 <= self.len); - let byte_index = i * 2; -+ // Safety: load16_unaligned needs SIMD_STRIDE_SIZE=16 u8 elements to read, -+ // or 16/2 = 8 u16 elements to read. -+ // We have checked that we have at least that many above. -+ - unsafe { to_u16_lanes(load16_unaligned(self.ptr.add(byte_index))) } - } - - #[inline(always)] - pub fn len(&self) -> usize { - self.len - } - - #[inline(always)] - pub fn tail(&self, from: usize) -> UnalignedU16Slice { - // XXX the return value should be restricted not to - // outlive self. - assert!(from <= self.len); -+ // Safety: This upholds the same invariant: `from` is in bounds and we're returning a shorter slice - unsafe { UnalignedU16Slice::new(self.ptr.add(from * 2), self.len - from) } - } - - #[cfg(feature = "simd-accel")] - #[inline(always)] - pub fn copy_bmp_to(&self, other: &mut [u16]) -> Option<(u16, usize)> { - assert!(self.len <= other.len()); - let mut offset = 0; -+ // Safety: SIMD_STRIDE_SIZE is measured in bytes, whereas len is in u16s. We check we can -+ // munch SIMD_STRIDE_SIZE / 2 u16s which means we can write SIMD_STRIDE_SIZE u8s - if SIMD_STRIDE_SIZE / 2 <= self.len { - let len_minus_stride = self.len - SIMD_STRIDE_SIZE / 2; - loop { - let mut simd = self.simd_at(offset); - if E::OPPOSITE_ENDIAN { - simd = simd_byte_swap(simd); - } -+ // Safety: we have enough space on the other side to write this - unsafe { - store8_unaligned(other.as_mut_ptr().add(offset), simd); - } - if contains_surrogates(simd) { - break; - } - offset += SIMD_STRIDE_SIZE / 2; -+ // Safety: This ensures we still have space for writing SIMD_STRIDE_SIZE u8s - if offset > len_minus_stride { - break; - } - } - } - while offset < self.len { - let unit = swap_if_opposite_endian::(self.at(offset)); - other[offset] = unit; -@@ -231,33 +247,37 @@ fn copy_unaligned_basic_latin_to_ascii( - src: UnalignedU16Slice, - dst: &mut [u8], - ) -> CopyAsciiResult { - let len = ::core::cmp::min(src.len(), dst.len()); - let mut offset = 0; -+ // Safety: This check ensures we are able to read/write at least SIMD_STRIDE_SIZE elements - if SIMD_STRIDE_SIZE <= len { - let len_minus_stride = len - SIMD_STRIDE_SIZE; - loop { - let mut first = src.simd_at(offset); - let mut second = src.simd_at(offset + (SIMD_STRIDE_SIZE / 2)); - if E::OPPOSITE_ENDIAN { - first = simd_byte_swap(first); - second = simd_byte_swap(second); - } - if !simd_is_basic_latin(first | second) { - break; - } - let packed = simd_pack(first, second); -+ // Safety: We are able to write SIMD_STRIDE_SIZE elements in this iteration - unsafe { - store16_unaligned(dst.as_mut_ptr().add(offset), packed); - } - offset += SIMD_STRIDE_SIZE; -+ // Safety: This is `offset > len - SIMD_STRIDE_SIZE`, which ensures that we can write at least SIMD_STRIDE_SIZE elements -+ // in the next iteration - if offset > len_minus_stride { - break; - } - } - } - copy_unaligned_basic_latin_to_ascii_alu::(src.tail(offset), &mut dst[offset..], offset) - } - -@@ -632,94 +652,106 @@ impl<'a> Utf16Destination<'a> { - #[inline(always)] - fn write_astral(&mut self, astral: u32) { - debug_assert!(astral > 0xFFFF); - debug_assert!(astral <= 0x10_FFFF); - self.write_code_unit((0xD7C0 + (astral >> 10)) as u16); - self.write_code_unit((0xDC00 + (astral & 0x3FF)) as u16); - } - #[inline(always)] -- pub fn write_surrogate_pair(&mut self, high: u16, low: u16) { -+ fn write_surrogate_pair(&mut self, high: u16, low: u16) { - self.write_code_unit(high); - self.write_code_unit(low); - } - #[inline(always)] - fn write_big5_combination(&mut self, combined: u16, combining: u16) { - self.write_bmp_excl_ascii(combined); - self.write_bmp_excl_ascii(combining); - } -+ // Safety-usable invariant: CopyAsciiResult::GoOn will only contain bytes >=0x80 - #[inline(always)] - pub fn copy_ascii_from_check_space_bmp<'b>( - &'b mut self, - source: &mut ByteSource, - ) -> CopyAsciiResult<(DecoderResult, usize, usize), (u8, Utf16BmpHandle<'b, 'a>)> { - let non_ascii_ret = { - let src_remaining = &source.slice[source.pos..]; - let dst_remaining = &mut self.slice[self.pos..]; - let (pending, length) = if dst_remaining.len() < src_remaining.len() { - (DecoderResult::OutputFull, dst_remaining.len()) - } else { - (DecoderResult::InputEmpty, src_remaining.len()) - }; -+ // Safety: This function is documented as needing valid pointers for src/dest and len, which -+ // is true since we've passed the minumum length of the two - match unsafe { - ascii_to_basic_latin(src_remaining.as_ptr(), dst_remaining.as_mut_ptr(), length) - } { - None => { - source.pos += length; - self.pos += length; - return CopyAsciiResult::Stop((pending, source.pos, self.pos)); - } -+ // Safety: the function is documented as returning bytes >=0x80 in the Some - Some((non_ascii, consumed)) => { - source.pos += consumed; - self.pos += consumed; - source.pos += 1; // +1 for non_ascii -+ // Safety: non-ascii bubbled out here - non_ascii - } - } - }; -+ // Safety: non-ascii returned here - CopyAsciiResult::GoOn((non_ascii_ret, Utf16BmpHandle::new(self))) - } -+ // Safety-usable invariant: CopyAsciiResult::GoOn will only contain bytes >=0x80 - #[inline(always)] - pub fn copy_ascii_from_check_space_astral<'b>( - &'b mut self, - source: &mut ByteSource, - ) -> CopyAsciiResult<(DecoderResult, usize, usize), (u8, Utf16AstralHandle<'b, 'a>)> { - let non_ascii_ret = { - let dst_len = self.slice.len(); - let src_remaining = &source.slice[source.pos..]; - let dst_remaining = &mut self.slice[self.pos..]; - let (pending, length) = if dst_remaining.len() < src_remaining.len() { - (DecoderResult::OutputFull, dst_remaining.len()) - } else { - (DecoderResult::InputEmpty, src_remaining.len()) - }; -+ // Safety: This function is documented as needing valid pointers for src/dest and len, which -+ // is true since we've passed the minumum length of the two - match unsafe { - ascii_to_basic_latin(src_remaining.as_ptr(), dst_remaining.as_mut_ptr(), length) - } { - None => { - source.pos += length; - self.pos += length; - return CopyAsciiResult::Stop((pending, source.pos, self.pos)); - } -+ // Safety: the function is documented as returning bytes >=0x80 in the Some - Some((non_ascii, consumed)) => { - source.pos += consumed; - self.pos += consumed; - if self.pos + 1 < dst_len { - source.pos += 1; // +1 for non_ascii -+ // Safety: non-ascii bubbled out here - non_ascii - } else { - return CopyAsciiResult::Stop(( - DecoderResult::OutputFull, - source.pos, - self.pos, - )); - } - } - } - }; -+ // Safety: non-ascii returned here - CopyAsciiResult::GoOn((non_ascii_ret, Utf16AstralHandle::new(self))) - } - #[inline(always)] - pub fn copy_utf8_up_to_invalid_from(&mut self, source: &mut ByteSource) { - let src_remaining = &source.slice[source.pos..]; - let dst_remaining = &mut self.slice[self.pos..]; - let (read, written) = convert_utf8_to_utf16_up_to_invalid(src_remaining, dst_remaining); - source.pos += read; -diff --git a/third_party/rust/encoding_rs/src/lib.rs b/third_party/rust/encoding_rs/src/lib.rs ---- a/third_party/rust/encoding_rs/src/lib.rs -+++ b/third_party/rust/encoding_rs/src/lib.rs -@@ -684,37 +684,26 @@ - //! TIS-620windows-874 - //! - //! - //! - //! See the section [_UTF-16LE, UTF-16BE and Unicode Encoding Schemes_](#utf-16le-utf-16be-and-unicode-encoding-schemes) - //! for discussion about the UTF-16 family. - - #![no_std] --#![cfg_attr(feature = "simd-accel", feature(core_intrinsics))] -+#![cfg_attr(feature = "simd-accel", feature(core_intrinsics, portable_simd))] - - #[cfg(feature = "alloc")] - #[cfg_attr(test, macro_use)] - extern crate alloc; - - extern crate core; - #[macro_use] - extern crate cfg_if; - --#[cfg(all( -- feature = "simd-accel", -- any( -- target_feature = "sse2", -- all(target_endian = "little", target_arch = "aarch64"), -- all(target_endian = "little", target_feature = "neon") -- ) --))] --#[macro_use(shuffle)] --extern crate packed_simd; -- - #[cfg(feature = "serde")] - extern crate serde; - - #[cfg(all(test, feature = "serde"))] - extern crate bincode; - #[cfg(all(test, feature = "serde"))] - #[macro_use] - extern crate serde_derive; -diff --git a/third_party/rust/encoding_rs/src/mem.rs b/third_party/rust/encoding_rs/src/mem.rs ---- a/third_party/rust/encoding_rs/src/mem.rs -+++ b/third_party/rust/encoding_rs/src/mem.rs -@@ -111,16 +111,21 @@ macro_rules! by_unit_check_alu { - until_alignment -= 1; - } - if accu >= $bound { - return false; - } - } - let len_minus_stride = len - ALU_ALIGNMENT / unit_size; - if offset + (4 * (ALU_ALIGNMENT / unit_size)) <= len { -+ // Safety: the above check lets us perform 4 consecutive reads of -+ // length ALU_ALIGNMENT / unit_size. ALU_ALIGNMENT is the size of usize, and unit_size -+ // is the size of the `src` pointer, so this is equal to performing four usize reads. -+ // -+ // This invariant is upheld on all loop iterations - let len_minus_unroll = len - (4 * (ALU_ALIGNMENT / unit_size)); - loop { - let unroll_accu = unsafe { *(src.add(offset) as *const usize) } - | unsafe { - *(src.add(offset + (ALU_ALIGNMENT / unit_size)) as *const usize) - } - | unsafe { - *(src.add(offset + (2 * (ALU_ALIGNMENT / unit_size))) -@@ -129,22 +134,24 @@ macro_rules! by_unit_check_alu { - | unsafe { - *(src.add(offset + (3 * (ALU_ALIGNMENT / unit_size))) - as *const usize) - }; - if unroll_accu & $mask != 0 { - return false; - } - offset += 4 * (ALU_ALIGNMENT / unit_size); -+ // Safety: this check lets us continue to perform the 4 reads earlier - if offset > len_minus_unroll { - break; - } - } - } - while offset <= len_minus_stride { -+ // Safety: the above check lets us perform one usize read. - accu |= unsafe { *(src.add(offset) as *const usize) }; - offset += ALU_ALIGNMENT / unit_size; - } - } - } - for &unit in &buffer[offset..] { - accu |= unit as usize; - } -@@ -184,16 +191,21 @@ macro_rules! by_unit_check_simd { - until_alignment -= 1; - } - if accu >= $bound { - return false; - } - } - let len_minus_stride = len - SIMD_STRIDE_SIZE / unit_size; - if offset + (4 * (SIMD_STRIDE_SIZE / unit_size)) <= len { -+ // Safety: the above check lets us perform 4 consecutive reads of -+ // length SIMD_STRIDE_SIZE / unit_size. SIMD_STRIDE_SIZE is the size of $simd_ty, and unit_size -+ // is the size of the `src` pointer, so this is equal to performing four $simd_ty reads. -+ // -+ // This invariant is upheld on all loop iterations - let len_minus_unroll = len - (4 * (SIMD_STRIDE_SIZE / unit_size)); - loop { - let unroll_accu = unsafe { *(src.add(offset) as *const $simd_ty) } - | unsafe { - *(src.add(offset + (SIMD_STRIDE_SIZE / unit_size)) - as *const $simd_ty) - } - | unsafe { -@@ -203,23 +215,25 @@ macro_rules! by_unit_check_simd { - | unsafe { - *(src.add(offset + (3 * (SIMD_STRIDE_SIZE / unit_size))) - as *const $simd_ty) - }; - if !$func(unroll_accu) { - return false; - } - offset += 4 * (SIMD_STRIDE_SIZE / unit_size); -+ // Safety: this check lets us continue to perform the 4 reads earlier - if offset > len_minus_unroll { - break; - } - } - } - let mut simd_accu = $splat; - while offset <= len_minus_stride { -+ // Safety: the above check lets us perform one $simd_ty read. - simd_accu = simd_accu | unsafe { *(src.add(offset) as *const $simd_ty) }; - offset += SIMD_STRIDE_SIZE / unit_size; - } - if !$func(simd_accu) { - return false; - } - } - } -@@ -229,18 +243,18 @@ macro_rules! by_unit_check_simd { - accu < $bound - } - }; - } - - cfg_if! { - if #[cfg(all(feature = "simd-accel", any(target_feature = "sse2", all(target_endian = "little", target_arch = "aarch64"), all(target_endian = "little", target_feature = "neon"))))] { - use crate::simd_funcs::*; -- use packed_simd::u8x16; -- use packed_simd::u16x8; -+ use core::simd::u8x16; -+ use core::simd::u16x8; - - const SIMD_ALIGNMENT: usize = 16; - - const SIMD_ALIGNMENT_MASK: usize = 15; - - by_unit_check_simd!(is_ascii_impl, u8, u8x16::splat(0), u8x16, 0x80, simd_is_ascii); - by_unit_check_simd!(is_basic_latin_impl, u16, u16x8::splat(0), u16x8, 0x80, simd_is_basic_latin); - by_unit_check_simd!(is_utf16_latin1_impl, u16, u16x8::splat(0), u16x8, 0x100, simd_is_latin1); -diff --git a/third_party/rust/encoding_rs/src/simd_funcs.rs b/third_party/rust/encoding_rs/src/simd_funcs.rs ---- a/third_party/rust/encoding_rs/src/simd_funcs.rs -+++ b/third_party/rust/encoding_rs/src/simd_funcs.rs -@@ -2,65 +2,84 @@ - // file at the top-level directory of this distribution. - // - // Licensed under the Apache License, Version 2.0 or the MIT license - // , at your - // option. This file may not be copied, modified, or distributed - // except according to those terms. - --use packed_simd::u16x8; --use packed_simd::u8x16; --use packed_simd::IntoBits; -+use any_all_workaround::all_mask16x8; -+use any_all_workaround::all_mask8x16; -+use any_all_workaround::any_mask16x8; -+use any_all_workaround::any_mask8x16; -+use core::simd::cmp::SimdPartialEq; -+use core::simd::cmp::SimdPartialOrd; -+use core::simd::mask16x8; -+use core::simd::mask8x16; -+use core::simd::simd_swizzle; -+use core::simd::u16x8; -+use core::simd::u8x16; -+use core::simd::ToBytes; - - // TODO: Migrate unaligned access to stdlib code if/when the RFC - // https://github.com/rust-lang/rfcs/pull/1725 is implemented. - -+/// Safety invariant: ptr must be valid for an unaligned read of 16 bytes - #[inline(always)] - pub unsafe fn load16_unaligned(ptr: *const u8) -> u8x16 { -- let mut simd = ::core::mem::uninitialized(); -- ::core::ptr::copy_nonoverlapping(ptr, &mut simd as *mut u8x16 as *mut u8, 16); -- simd -+ let mut simd = ::core::mem::MaybeUninit::::uninit(); -+ ::core::ptr::copy_nonoverlapping(ptr, simd.as_mut_ptr() as *mut u8, 16); -+ // Safety: copied 16 bytes of initialized memory into this, it is now initialized -+ simd.assume_init() - } - -+/// Safety invariant: ptr must be valid for an aligned-for-u8x16 read of 16 bytes - #[allow(dead_code)] - #[inline(always)] - pub unsafe fn load16_aligned(ptr: *const u8) -> u8x16 { - *(ptr as *const u8x16) - } - -+/// Safety invariant: ptr must be valid for an unaligned store of 16 bytes - #[inline(always)] - pub unsafe fn store16_unaligned(ptr: *mut u8, s: u8x16) { - ::core::ptr::copy_nonoverlapping(&s as *const u8x16 as *const u8, ptr, 16); - } - -+/// Safety invariant: ptr must be valid for an aligned-for-u8x16 store of 16 bytes - #[allow(dead_code)] - #[inline(always)] - pub unsafe fn store16_aligned(ptr: *mut u8, s: u8x16) { - *(ptr as *mut u8x16) = s; - } - -+/// Safety invariant: ptr must be valid for an unaligned read of 16 bytes - #[inline(always)] - pub unsafe fn load8_unaligned(ptr: *const u16) -> u16x8 { -- let mut simd = ::core::mem::uninitialized(); -- ::core::ptr::copy_nonoverlapping(ptr as *const u8, &mut simd as *mut u16x8 as *mut u8, 16); -- simd -+ let mut simd = ::core::mem::MaybeUninit::::uninit(); -+ ::core::ptr::copy_nonoverlapping(ptr as *const u8, simd.as_mut_ptr() as *mut u8, 16); -+ // Safety: copied 16 bytes of initialized memory into this, it is now initialized -+ simd.assume_init() - } - -+/// Safety invariant: ptr must be valid for an aligned-for-u16x8 read of 16 bytes - #[allow(dead_code)] - #[inline(always)] - pub unsafe fn load8_aligned(ptr: *const u16) -> u16x8 { - *(ptr as *const u16x8) - } - -+/// Safety invariant: ptr must be valid for an unaligned store of 16 bytes - #[inline(always)] - pub unsafe fn store8_unaligned(ptr: *mut u16, s: u16x8) { - ::core::ptr::copy_nonoverlapping(&s as *const u16x8 as *const u8, ptr as *mut u8, 16); - } - -+/// Safety invariant: ptr must be valid for an aligned-for-u16x8 store of 16 bytes - #[allow(dead_code)] - #[inline(always)] - pub unsafe fn store8_aligned(ptr: *mut u16, s: u16x8) { - *(ptr as *mut u16x8) = s; - } - - cfg_if! { - if #[cfg(all(target_feature = "sse2", target_arch = "x86_64"))] { -@@ -95,234 +114,241 @@ cfg_if! { - pub fn simd_byte_swap(s: u16x8) -> u16x8 { - let left = s << 8; - let right = s >> 8; - left | right - } - - #[inline(always)] - pub fn to_u16_lanes(s: u8x16) -> u16x8 { -- s.into_bits() -+ u16x8::from_ne_bytes(s) - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { - - // Expose low-level mask instead of higher-level conclusion, - // because the non-ASCII case would perform less well otherwise. -+ // Safety-usable invariant: This returned value is whether each high bit is set - #[inline(always)] - pub fn mask_ascii(s: u8x16) -> i32 { - unsafe { -- _mm_movemask_epi8(s.into_bits()) -+ _mm_movemask_epi8(s.into()) - } - } - - } else { - - } - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { - #[inline(always)] - pub fn simd_is_ascii(s: u8x16) -> bool { - unsafe { -- _mm_movemask_epi8(s.into_bits()) == 0 -+ // Safety: We have cfg()d the correct platform -+ _mm_movemask_epi8(s.into()) == 0 - } - } - } else if #[cfg(target_arch = "aarch64")]{ - #[inline(always)] - pub fn simd_is_ascii(s: u8x16) -> bool { - unsafe { -- vmaxvq_u8(s.into_bits()) < 0x80 -+ // Safety: We have cfg()d the correct platform -+ vmaxvq_u8(s.into()) < 0x80 - } - } - } else { - #[inline(always)] - pub fn simd_is_ascii(s: u8x16) -> bool { - // This optimizes better on ARM than - // the lt formulation. - let highest_ascii = u8x16::splat(0x7F); -- !s.gt(highest_ascii).any() -+ !any_mask8x16(s.simd_gt(highest_ascii)) - } - } - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { - #[inline(always)] - pub fn simd_is_str_latin1(s: u8x16) -> bool { - if simd_is_ascii(s) { - return true; - } - let above_str_latin1 = u8x16::splat(0xC4); -- s.lt(above_str_latin1).all() -+ s.simd_lt(above_str_latin1).all() - } - } else if #[cfg(target_arch = "aarch64")]{ - #[inline(always)] - pub fn simd_is_str_latin1(s: u8x16) -> bool { - unsafe { -- vmaxvq_u8(s.into_bits()) < 0xC4 -+ // Safety: We have cfg()d the correct platform -+ vmaxvq_u8(s.into()) < 0xC4 - } - } - } else { - #[inline(always)] - pub fn simd_is_str_latin1(s: u8x16) -> bool { - let above_str_latin1 = u8x16::splat(0xC4); -- s.lt(above_str_latin1).all() -+ all_mask8x16(s.simd_lt(above_str_latin1)) - } - } - } - - cfg_if! { - if #[cfg(target_arch = "aarch64")]{ - #[inline(always)] - pub fn simd_is_basic_latin(s: u16x8) -> bool { - unsafe { -- vmaxvq_u16(s.into_bits()) < 0x80 -+ // Safety: We have cfg()d the correct platform -+ vmaxvq_u16(s.into()) < 0x80 - } - } - - #[inline(always)] - pub fn simd_is_latin1(s: u16x8) -> bool { - unsafe { -- vmaxvq_u16(s.into_bits()) < 0x100 -+ // Safety: We have cfg()d the correct platform -+ vmaxvq_u16(s.into()) < 0x100 - } - } - } else { - #[inline(always)] - pub fn simd_is_basic_latin(s: u16x8) -> bool { - let above_ascii = u16x8::splat(0x80); -- s.lt(above_ascii).all() -+ all_mask16x8(s.simd_lt(above_ascii)) - } - - #[inline(always)] - pub fn simd_is_latin1(s: u16x8) -> bool { - // For some reason, on SSE2 this formulation - // seems faster in this case while the above - // function is better the other way round... - let highest_latin1 = u16x8::splat(0xFF); -- !s.gt(highest_latin1).any() -+ !any_mask16x8(s.simd_gt(highest_latin1)) - } - } - } - - #[inline(always)] - pub fn contains_surrogates(s: u16x8) -> bool { - let mask = u16x8::splat(0xF800); - let surrogate_bits = u16x8::splat(0xD800); -- (s & mask).eq(surrogate_bits).any() -+ any_mask16x8((s & mask).simd_eq(surrogate_bits)) - } - - cfg_if! { - if #[cfg(target_arch = "aarch64")]{ - macro_rules! aarch64_return_false_if_below_hebrew { - ($s:ident) => ({ - unsafe { -- if vmaxvq_u16($s.into_bits()) < 0x0590 { -+ // Safety: We have cfg()d the correct platform -+ if vmaxvq_u16($s.into()) < 0x0590 { - return false; - } - } - }) - } - - macro_rules! non_aarch64_return_false_if_all { - ($s:ident) => () - } - } else { - macro_rules! aarch64_return_false_if_below_hebrew { - ($s:ident) => () - } - - macro_rules! non_aarch64_return_false_if_all { - ($s:ident) => ({ -- if $s.all() { -+ if all_mask16x8($s) { - return false; - } - }) - } - } - } - - macro_rules! in_range16x8 { - ($s:ident, $start:expr, $end:expr) => {{ - // SIMD sub is wrapping -- ($s - u16x8::splat($start)).lt(u16x8::splat($end - $start)) -+ ($s - u16x8::splat($start)).simd_lt(u16x8::splat($end - $start)) - }}; - } - - #[inline(always)] - pub fn is_u16x8_bidi(s: u16x8) -> bool { - // We try to first quickly refute the RTLness of the vector. If that - // fails, we do the real RTL check, so in that case we end up wasting - // the work for the up-front quick checks. Even the quick-check is - // two-fold in order to return `false` ASAP if everything is below - // Hebrew. - - aarch64_return_false_if_below_hebrew!(s); - -- let below_hebrew = s.lt(u16x8::splat(0x0590)); -+ let below_hebrew = s.simd_lt(u16x8::splat(0x0590)); - - non_aarch64_return_false_if_all!(below_hebrew); - -- if (below_hebrew | in_range16x8!(s, 0x0900, 0x200F) | in_range16x8!(s, 0x2068, 0xD802)).all() { -+ if all_mask16x8( -+ below_hebrew | in_range16x8!(s, 0x0900, 0x200F) | in_range16x8!(s, 0x2068, 0xD802), -+ ) { - return false; - } - - // Quick refutation failed. Let's do the full check. - -- (in_range16x8!(s, 0x0590, 0x0900) -- | in_range16x8!(s, 0xFB1D, 0xFE00) -- | in_range16x8!(s, 0xFE70, 0xFEFF) -- | in_range16x8!(s, 0xD802, 0xD804) -- | in_range16x8!(s, 0xD83A, 0xD83C) -- | s.eq(u16x8::splat(0x200F)) -- | s.eq(u16x8::splat(0x202B)) -- | s.eq(u16x8::splat(0x202E)) -- | s.eq(u16x8::splat(0x2067))) -- .any() -+ any_mask16x8( -+ (in_range16x8!(s, 0x0590, 0x0900) -+ | in_range16x8!(s, 0xFB1D, 0xFE00) -+ | in_range16x8!(s, 0xFE70, 0xFEFF) -+ | in_range16x8!(s, 0xD802, 0xD804) -+ | in_range16x8!(s, 0xD83A, 0xD83C) -+ | s.simd_eq(u16x8::splat(0x200F)) -+ | s.simd_eq(u16x8::splat(0x202B)) -+ | s.simd_eq(u16x8::splat(0x202E)) -+ | s.simd_eq(u16x8::splat(0x2067))), -+ ) - } - - #[inline(always)] - pub fn simd_unpack(s: u8x16) -> (u16x8, u16x8) { -- unsafe { -- let first: u8x16 = shuffle!( -- s, -- u8x16::splat(0), -- [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23] -- ); -- let second: u8x16 = shuffle!( -- s, -- u8x16::splat(0), -- [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31] -- ); -- (first.into_bits(), second.into_bits()) -- } -+ let first: u8x16 = simd_swizzle!( -+ s, -+ u8x16::splat(0), -+ [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23] -+ ); -+ let second: u8x16 = simd_swizzle!( -+ s, -+ u8x16::splat(0), -+ [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31] -+ ); -+ (u16x8::from_ne_bytes(first), u16x8::from_ne_bytes(second)) - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { - #[inline(always)] - pub fn simd_pack(a: u16x8, b: u16x8) -> u8x16 { - unsafe { -- _mm_packus_epi16(a.into_bits(), b.into_bits()).into_bits() -+ // Safety: We have cfg()d the correct platform -+ _mm_packus_epi16(a.into(), b.into()).into() - } - } - } else { - #[inline(always)] - pub fn simd_pack(a: u16x8, b: u16x8) -> u8x16 { -- unsafe { -- let first: u8x16 = a.into_bits(); -- let second: u8x16 = b.into_bits(); -- shuffle!( -- first, -- second, -- [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30] -- ) -- } -+ let first: u8x16 = a.to_ne_bytes(); -+ let second: u8x16 = b.to_ne_bytes(); -+ simd_swizzle!( -+ first, -+ second, -+ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30] -+ ) - } - } - } - - #[cfg(test)] - mod tests { - use super::*; - use alloc::vec::Vec; -diff --git a/third_party/rust/encoding_rs/src/single_byte.rs b/third_party/rust/encoding_rs/src/single_byte.rs ---- a/third_party/rust/encoding_rs/src/single_byte.rs -+++ b/third_party/rust/encoding_rs/src/single_byte.rs -@@ -48,16 +48,19 @@ impl SingleByteDecoder { - CopyAsciiResult::GoOn((mut non_ascii, mut handle)) => 'middle: loop { - // Start non-boilerplate - // - // Since the non-ASCIIness of `non_ascii` is hidden from - // the optimizer, it can't figure out that it's OK to - // statically omit the bound check when accessing - // `[u16; 128]` with an index - // `non_ascii as usize - 0x80usize`. -+ // -+ // Safety: `non_ascii` is a u8 byte >=0x80, from the invariants -+ // on Utf8Destination::copy_ascii_from_check_space_bmp() - let mapped = - unsafe { *(self.table.get_unchecked(non_ascii as usize - 0x80usize)) }; - // let mapped = self.table[non_ascii as usize - 0x80usize]; - if mapped == 0u16 { - return ( - DecoderResult::Malformed(1, 0), - source.consumed(), - handle.written(), -@@ -146,82 +149,103 @@ impl SingleByteDecoder { - dst: &mut [u16], - _last: bool, - ) -> (DecoderResult, usize, usize) { - let (pending, length) = if dst.len() < src.len() { - (DecoderResult::OutputFull, dst.len()) - } else { - (DecoderResult::InputEmpty, src.len()) - }; -+ // Safety invariant: converted <= length. Quite often we have `converted < length` -+ // which will be separately marked. - let mut converted = 0usize; - 'outermost: loop { - match unsafe { -+ // Safety: length is the minimum length, `src/dst + x` will always be valid for reads/writes of `len - x` - ascii_to_basic_latin( - src.as_ptr().add(converted), - dst.as_mut_ptr().add(converted), - length - converted, - ) - } { - None => { - return (pending, length, length); - } - Some((mut non_ascii, consumed)) => { -+ // Safety invariant: `converted <= length` upheld, since this can only consume -+ // up to `length - converted` bytes. -+ // -+ // Furthermore, in this context, -+ // we can assume `converted < length` since this branch is only ever hit when -+ // ascii_to_basic_latin fails to consume the entire slice - converted += consumed; - 'middle: loop { - // `converted` doesn't count the reading of `non_ascii` yet. - // Since the non-ASCIIness of `non_ascii` is hidden from - // the optimizer, it can't figure out that it's OK to - // statically omit the bound check when accessing - // `[u16; 128]` with an index - // `non_ascii as usize - 0x80usize`. -+ // -+ // Safety: We can rely on `non_ascii` being between `0x80` and `0xFF` due to -+ // the invariants of `ascii_to_basic_latin()`, and our table has enough space for that. - let mapped = - unsafe { *(self.table.get_unchecked(non_ascii as usize - 0x80usize)) }; - // let mapped = self.table[non_ascii as usize - 0x80usize]; - if mapped == 0u16 { - return ( - DecoderResult::Malformed(1, 0), - converted + 1, // +1 `for non_ascii` - converted, - ); - } - unsafe { -- // The bound check has already been performed -+ // Safety: As mentioned above, `converted < length` - *(dst.get_unchecked_mut(converted)) = mapped; - } -+ // Safety: `converted <= length` upheld, since `converted < length` before this - converted += 1; - // Next, handle ASCII punctuation and non-ASCII without - // going back to ASCII acceleration. Non-ASCII scripts - // use ASCII punctuation, so this avoid going to - // acceleration just for punctuation/space and then - // failing. This is a significant boost to non-ASCII - // scripts. - // TODO: Split out Latin converters without this part - // this stuff makes Latin script-conversion slower. - if converted == length { - return (pending, length, length); - } -+ // Safety: We are back to `converted < length` because of the == above -+ // and can perform this check. - let mut b = unsafe { *(src.get_unchecked(converted)) }; -+ // Safety: `converted < length` is upheld for this loop - 'innermost: loop { - if b > 127 { - non_ascii = b; - continue 'middle; - } - // Testing on Haswell says that we should write the - // byte unconditionally instead of trying to unread it - // to make it part of the next SIMD stride. - unsafe { -+ // Safety: `converted < length` is true for this loop - *(dst.get_unchecked_mut(converted)) = u16::from(b); - } -+ // Safety: We are now at `converted <= length`. We should *not* `continue` -+ // the loop without reverifying - converted += 1; - if b < 60 { - // We've got punctuation - if converted == length { - return (pending, length, length); - } -+ // Safety: we're back to `converted <= length` because of the == above - b = unsafe { *(src.get_unchecked(converted)) }; -+ // Safety: The loop continues as `converted < length` - continue 'innermost; - } - // We've got markup or ASCII text - continue 'outermost; - } - } - } - } -@@ -229,16 +253,18 @@ impl SingleByteDecoder { - } - - pub fn latin1_byte_compatible_up_to(&self, buffer: &[u8]) -> usize { - let mut bytes = buffer; - let mut total = 0; - loop { - if let Some((non_ascii, offset)) = validate_ascii(bytes) { - total += offset; -+ // Safety: We can rely on `non_ascii` being between `0x80` and `0xFF` due to -+ // the invariants of `ascii_to_basic_latin()`, and our table has enough space for that. - let mapped = unsafe { *(self.table.get_unchecked(non_ascii as usize - 0x80usize)) }; - if mapped != u16::from(non_ascii) { - return total; - } - total += 1; - bytes = &bytes[offset + 1..]; - } else { - return total; -@@ -379,64 +405,89 @@ impl SingleByteEncoder { - dst: &mut [u8], - _last: bool, - ) -> (EncoderResult, usize, usize) { - let (pending, length) = if dst.len() < src.len() { - (EncoderResult::OutputFull, dst.len()) - } else { - (EncoderResult::InputEmpty, src.len()) - }; -+ // Safety invariant: converted <= length. Quite often we have `converted < length` -+ // which will be separately marked. - let mut converted = 0usize; - 'outermost: loop { - match unsafe { -+ // Safety: length is the minimum length, `src/dst + x` will always be valid for reads/writes of `len - x` - basic_latin_to_ascii( - src.as_ptr().add(converted), - dst.as_mut_ptr().add(converted), - length - converted, - ) - } { - None => { - return (pending, length, length); - } - Some((mut non_ascii, consumed)) => { -+ // Safety invariant: `converted <= length` upheld, since this can only consume -+ // up to `length - converted` bytes. -+ // -+ // Furthermore, in this context, -+ // we can assume `converted < length` since this branch is only ever hit when -+ // ascii_to_basic_latin fails to consume the entire slice - converted += consumed; - 'middle: loop { - // `converted` doesn't count the reading of `non_ascii` yet. - match self.encode_u16(non_ascii) { - Some(byte) => { - unsafe { -+ // Safety: we're allowed this access since `converted < length` - *(dst.get_unchecked_mut(converted)) = byte; - } - converted += 1; -+ // `converted <= length` now - } - None => { - // At this point, we need to know if we - // have a surrogate. - let high_bits = non_ascii & 0xFC00u16; - if high_bits == 0xD800u16 { - // high surrogate - if converted + 1 == length { - // End of buffer. This surrogate is unpaired. - return ( - EncoderResult::Unmappable('\u{FFFD}'), - converted + 1, // +1 `for non_ascii` - converted, - ); - } -+ // Safety: convered < length from outside the match, and `converted + 1 != length`, -+ // So `converted + 1 < length` as well. We're in bounds - let second = - u32::from(unsafe { *src.get_unchecked(converted + 1) }); - if second & 0xFC00u32 != 0xDC00u32 { - return ( - EncoderResult::Unmappable('\u{FFFD}'), - converted + 1, // +1 `for non_ascii` - converted, - ); - } - // The next code unit is a low surrogate. - let astral: char = unsafe { -+ // Safety: We can rely on non_ascii being 0xD800-0xDBFF since the high bits are 0xD800 -+ // Then, (non_ascii << 10 - 0xD800 << 10) becomes between (0 to 0x3FF) << 10, which is between -+ // 0x400 to 0xffc00. Adding the 0x10000 gives a range of 0x10400 to 0x10fc00. Subtracting the 0xDC00 -+ // gives 0x2800 to 0x102000 -+ // The second term is between 0xDC00 and 0xDFFF from the check above. This gives a maximum -+ // possible range of (0x10400 + 0xDC00) to (0x102000 + 0xDFFF) which is 0x1E000 to 0x10ffff. -+ // This is in range. -+ // -+ // From a Unicode principles perspective this can also be verified as we have checked that `non_ascii` is a high surrogate -+ // (0xD800..=0xDBFF), and that `second` is a low surrogate (`0xDC00..=0xDFFF`), and we are applying reverse of the UTC16 transformation -+ // algorithm , by applying the high surrogate - 0xD800 to the -+ // high ten bits, and the low surrogate - 0xDc00 to the low ten bits, and then adding 0x10000 - ::core::char::from_u32_unchecked( - (u32::from(non_ascii) << 10) + second - - (((0xD800u32 << 10) - 0x1_0000u32) + 0xDC00u32), - ) - }; - return ( - EncoderResult::Unmappable(astral), - converted + 2, // +2 `for non_ascii` and `second` -@@ -451,52 +502,63 @@ impl SingleByteEncoder { - converted, - ); - } - return ( - EncoderResult::unmappable_from_bmp(non_ascii), - converted + 1, // +1 `for non_ascii` - converted, - ); -+ // Safety: This branch diverges, so no need to uphold invariants on `converted` - } - } - // Next, handle ASCII punctuation and non-ASCII without - // going back to ASCII acceleration. Non-ASCII scripts - // use ASCII punctuation, so this avoid going to - // acceleration just for punctuation/space and then - // failing. This is a significant boost to non-ASCII - // scripts. - // TODO: Split out Latin converters without this part - // this stuff makes Latin script-conversion slower. - if converted == length { - return (pending, length, length); - } -+ // Safety: we're back to `converted < length` due to the == above and can perform -+ // the unchecked read - let mut unit = unsafe { *(src.get_unchecked(converted)) }; - 'innermost: loop { -+ // Safety: This loop always begins with `converted < length`, see -+ // the invariant outside and the comment on the continue below - if unit > 127 { - non_ascii = unit; - continue 'middle; - } - // Testing on Haswell says that we should write the - // byte unconditionally instead of trying to unread it - // to make it part of the next SIMD stride. - unsafe { -+ // Safety: Can rely on converted < length - *(dst.get_unchecked_mut(converted)) = unit as u8; - } - converted += 1; -+ // `converted <= length` here - if unit < 60 { - // We've got punctuation - if converted == length { - return (pending, length, length); - } -+ // Safety: `converted < length` due to the == above. The read is safe. - unit = unsafe { *(src.get_unchecked(converted)) }; -+ // Safety: This only happens if `converted < length`, maintaining it - continue 'innermost; - } - // We've got markup or ASCII text - continue 'outermost; -+ // Safety: All other routes to here diverge so the continue is the only -+ // way to run the innermost loop. - } - } - } - } - } - } - } - -diff --git a/third_party/rust/encoding_rs/src/x_user_defined.rs b/third_party/rust/encoding_rs/src/x_user_defined.rs ---- a/third_party/rust/encoding_rs/src/x_user_defined.rs -+++ b/third_party/rust/encoding_rs/src/x_user_defined.rs -@@ -9,22 +9,23 @@ - - use super::*; - use crate::handles::*; - use crate::variant::*; - - cfg_if! { - if #[cfg(feature = "simd-accel")] { - use simd_funcs::*; -- use packed_simd::u16x8; -+ use core::simd::u16x8; -+ use core::simd::cmp::SimdPartialOrd; - - #[inline(always)] - fn shift_upper(unpacked: u16x8) -> u16x8 { - let highest_ascii = u16x8::splat(0x7F); -- unpacked + unpacked.gt(highest_ascii).select(u16x8::splat(0xF700), u16x8::splat(0)) } -+ unpacked + unpacked.simd_gt(highest_ascii).select(u16x8::splat(0xF700), u16x8::splat(0)) } - } else { - } - } - - pub struct UserDefinedDecoder; - - impl UserDefinedDecoder { - pub fn new() -> VariantDecoder { -@@ -111,20 +112,25 @@ impl UserDefinedDecoder { - } else { - (DecoderResult::InputEmpty, src.len()) - }; - // Not bothering with alignment - let tail_start = length & !0xF; - let simd_iterations = length >> 4; - let src_ptr = src.as_ptr(); - let dst_ptr = dst.as_mut_ptr(); -+ // Safety: This is `for i in 0..length / 16` - for i in 0..simd_iterations { -+ // Safety: This is in bounds: length is the minumum valid length for both src/dst -+ // and i ranges to length/16, so multiplying by 16 will always be `< length` and can do -+ // a 16 byte read - let input = unsafe { load16_unaligned(src_ptr.add(i * 16)) }; - let (first, second) = simd_unpack(input); - unsafe { -+ // Safety: same as above, but this is two consecutive 8-byte reads - store8_unaligned(dst_ptr.add(i * 16), shift_upper(first)); - store8_unaligned(dst_ptr.add((i * 16) + 8), shift_upper(second)); - } - } - let src_tail = &src[tail_start..length]; - let dst_tail = &mut dst[tail_start..length]; - src_tail - .iter() diff --git a/user/zotero/sandbox-fork.patch b/user/zotero/sandbox-fork.patch deleted file mode 100644 index c7222ab..0000000 --- a/user/zotero/sandbox-fork.patch +++ /dev/null @@ -1,15 +0,0 @@ -make SYS_fork non-fatal, musl uses it for fork(2) - ---- a/security/sandbox/linux/SandboxFilter.cpp -+++ b/security/sandbox/linux/SandboxFilter.cpp -@@ -1253,6 +1253,10 @@ - // usually do something reasonable on error. - case __NR_clone: - return ClonePolicy(Error(EPERM)); -+#ifdef __NR_fork -+ case __NR_fork: -+ return Error(ENOSYS); -+#endif - - # ifdef __NR_fadvise64 - case __NR_fadvise64: diff --git a/user/zotero/sandbox-largefile.patch b/user/zotero/sandbox-largefile.patch deleted file mode 100644 index f1cf28b..0000000 --- a/user/zotero/sandbox-largefile.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/security/sandbox/linux/SandboxFilter.cpp 2020-11-23 22:41:14.556378950 +0100 -+++ b/security/sandbox/linux/SandboxFilter.cpp 2020-11-23 22:40:23.595806444 +0100 -@@ -68,7 +68,13 @@ - - // The headers define O_LARGEFILE as 0 on x86_64, but we need the - // actual value because it shows up in file flags. --#define O_LARGEFILE_REAL 00100000 -+#if defined(__x86_64__) || defined(__i386__) || defined(__mips__) -+#define O_LARGEFILE_REAL 0100000 -+#elif defined(__powerpc__) -+#define O_LARGEFILE_REAL 0200000 -+#else -+#define O_LARGEFILE_REAL O_LARGEFILE -+#endif - - // Not part of UAPI, but userspace sees it in F_GETFL; see bug 1650751. - #define FMODE_NONOTIFY 0x4000000 diff --git a/user/zotero/sandbox-sched_setscheduler.patch b/user/zotero/sandbox-sched_setscheduler.patch deleted file mode 100644 index ffdf126..0000000 --- a/user/zotero/sandbox-sched_setscheduler.patch +++ /dev/null @@ -1,24 +0,0 @@ -upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1657849 -diff --git a/security/sandbox/linux/SandboxFilter.cpp b/security/sandbox/linux/SandboxFilter.cpp -index ed958bc..9824433 100644 ---- a/security/sandbox/linux/SandboxFilter.cpp -+++ b/security/sandbox/linux/SandboxFilter.cpp -@@ -1751,6 +1751,6 @@ class GMPSandboxPolicy : public SandboxPolicyCommon { - case __NR_sched_get_priority_max: -+ case __NR_sched_setscheduler: - return Allow(); - case __NR_sched_getparam: -- case __NR_sched_getscheduler: -- case __NR_sched_setscheduler: { -+ case __NR_sched_getscheduler: { - Arg pid(0); -@@ -1926,3 +1926,2 @@ class RDDSandboxPolicy final : public SandboxPolicyCommon { - case __NR_sched_getscheduler: -- case __NR_sched_setscheduler: - case __NR_sched_getattr: -@@ -1932,2 +1931,5 @@ class RDDSandboxPolicy final : public SandboxPolicyCommon { - } -+ // sched_setscheduler gets special treatment here (bug 1657849): -+ case __NR_sched_setscheduler: -+ return Allow(); - diff --git a/user/zotero/stab.h b/user/zotero/stab.h deleted file mode 100644 index 6f70af3..0000000 --- a/user/zotero/stab.h +++ /dev/null @@ -1,71 +0,0 @@ -/* $OpenBSD: stab.h,v 1.3 2003/06/02 19:34:12 millert Exp $ */ -/* $NetBSD: stab.h,v 1.4 1994/10/26 00:56:25 cgd Exp $ */ - -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stab.h 5.2 (Berkeley) 4/4/91 - */ - -#ifndef _STAB_H_ -#define _STAB_H_ - -/* - * The following are symbols used by various debuggers and by the Pascal - * compiler. Each of them must have one (or more) of the bits defined by - * the N_STAB mask set. - */ - -#define N_GSYM 0x20 /* global symbol */ -#define N_FNAME 0x22 /* F77 function name */ -#define N_FUN 0x24 /* procedure name */ -#define N_STSYM 0x26 /* data segment variable */ -#define N_LCSYM 0x28 /* bss segment variable */ -#define N_MAIN 0x2a /* main function name */ -#define N_PC 0x30 /* global Pascal symbol */ -#define N_RSYM 0x40 /* register variable */ -#define N_SLINE 0x44 /* text segment line number */ -#define N_DSLINE 0x46 /* data segment line number */ -#define N_BSLINE 0x48 /* bss segment line number */ -#define N_SSYM 0x60 /* structure/union element */ -#define N_SO 0x64 /* main source file name */ -#define N_LSYM 0x80 /* stack variable */ -#define N_BINCL 0x82 /* include file beginning */ -#define N_SOL 0x84 /* included source file name */ -#define N_PSYM 0xa0 /* parameter variable */ -#define N_EINCL 0xa2 /* include file end */ -#define N_ENTRY 0xa4 /* alternate entry point */ -#define N_LBRAC 0xc0 /* left bracket */ -#define N_EXCL 0xc2 /* deleted include file */ -#define N_RBRAC 0xe0 /* right bracket */ -#define N_BCOMM 0xe2 /* begin common */ -#define N_ECOMM 0xe4 /* end common */ -#define N_ECOML 0xe8 /* end common (local name) */ -#define N_LENG 0xfe /* length of preceding entry */ - -#endif /* !_STAB_H_ */ diff --git a/user/zotero/vendor-prefs.js b/user/zotero/vendor-prefs.js deleted file mode 100644 index 3b75075..0000000 --- a/user/zotero/vendor-prefs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Use LANG environment variable to choose locale -pref("intl.locale.requested", ""); - -// Use system-provided dictionaries -pref("spellchecker.dictionary_path", "/usr/share/hunspell"); - -// Disable default browser checking. -pref("browser.shell.checkDefaultBrowser", false); - -// Don't disable our bundled extensions in the application directory -pref("extensions.autoDisableScopes", 11); -pref("extensions.shownSelectionUI", true); diff --git a/user/zotero/zotero.desktop b/user/zotero/zotero.desktop deleted file mode 100644 index 249ae57..0000000 --- a/user/zotero/zotero.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Zotero -GenericName=Zotero Standalone. Is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources. -Icon=zotero -Exec=/usr/bin/zotero -url %U -Categories=Office -Terminal=false -MimeType=x-scheme-handler/zotero diff --git a/user/zotero/zotero_build-modifications.patch b/user/zotero/zotero_build-modifications.patch deleted file mode 100644 index 22aa90e..0000000 --- a/user/zotero/zotero_build-modifications.patch +++ /dev/null @@ -1,144 +0,0 @@ -diff --git a/zotero/app/build.sh b/zotero/app/build.sh -index 649d629..7d078b8 100755 ---- a/zotero/app/build.sh -+++ b/zotero/app/build.sh -@@ -59,10 +59,7 @@ function abspath { - } - - function check_lfs_file { -- if [ "$(head --bytes 5 "$1")" = "versi" ]; then -- echo "$1 not checked out -- install Git LFS and run 'git lfs pull'" >&2 -- exit 1 -- fi -+ return 0 - } - - SOURCE_DIR="" -@@ -840,18 +837,13 @@ if [ $BUILD_LINUX == 1 ]; then - cp -r "$runtime_path/"!(application.ini|browser|defaults|devtools-files|crashreporter|crashreporter.ini|firefox|pingsender|precomplete|removed-files|run-mozilla.sh|update-settings.ini|updater|updater.ini) "$APPDIR" - - # Use our own launcher that calls the original Firefox executable with -app -- mv "$APPDIR"/firefox-bin "$APPDIR"/zotero-bin -+ mv "$APPDIR"/firefox-esr "$APPDIR"/zotero-bin - cp "$CALLDIR/linux/zotero" "$APPDIR"/zotero - - # Copy Ubuntu launcher files - cp "$CALLDIR/linux/zotero.desktop" "$APPDIR" - cp "$CALLDIR/linux/set_launcher_icon" "$APPDIR" - -- # Use our own updater, because Mozilla's requires updates signed by Mozilla -- check_lfs_file "$CALLDIR/linux/updater.tar.xz" -- tar xf "$CALLDIR/linux/updater.tar.xz" --to-stdout updater-$arch > "$APPDIR/updater" -- chmod 755 "$APPDIR/updater" -- - # Copy app files - rsync -a "$base_dir/" "$APPDIR/" - -@@ -860,6 +852,7 @@ if [ $BUILD_LINUX == 1 ]; then - cp -RH "$CALLDIR/modules/zotero-libreoffice-integration/install" "$APPDIR/integration/libreoffice" - - # Copy icons -+ mkdir -p "$APPDIR"/icons - cp "$CALLDIR/linux/icons/icon32.png" "$APPDIR/icons/" - cp "$CALLDIR/linux/icons/icon64.png" "$APPDIR/icons/" - cp "$CALLDIR/linux/icons/icon128.png" "$APPDIR/icons/" - -diff --git a/zotero/app/build.sh.orig b/zotero/app/build.sh -index 702f499..3ee7e34 100755 ---- a/zotero/app/build.sh.orig -+++ b/zotero/app/build.sh -@@ -189,7 +189,7 @@ BUILD_ID=`date +%Y%m%d%H%M%S` - # Paths to Gecko runtimes - MAC_RUNTIME_PATH="$CALLDIR/xulrunner/Firefox.app" - WIN_RUNTIME_PATH_PREFIX="$CALLDIR/xulrunner/firefox-" --LINUX_RUNTIME_PATH_PREFIX="$CALLDIR/xulrunner/firefox-" -+LINUX_RUNTIME_PATH_PREFIX="$CALLDIR/xulrunner/firefox" - - base_dir="$BUILD_DIR/base" - app_dir="$BUILD_DIR/base/app" -@@ -223,8 +223,8 @@ elif [ $BUILD_WIN == 1 ]; then - unzip -qj "${WIN_RUNTIME_PATH_PREFIX}win-x64"/omni.ja "hyphenation/*" -d "$app_dir"/hyphenation/ - elif [ $BUILD_LINUX == 1 ]; then - # Non-arch-specific files, so just use 64-bit version -- cp -Rp "${LINUX_RUNTIME_PATH_PREFIX}x86_64"/browser/omni "$app_dir" -- unzip -qj "${LINUX_RUNTIME_PATH_PREFIX}x86_64"/omni.ja "hyphenation/*" -d "$app_dir"/hyphenation/ -+ cp -Rp "${LINUX_RUNTIME_PATH_PREFIX}"/browser/omni "$app_dir" -+ unzip -qj "${LINUX_RUNTIME_PATH_PREFIX}"/omni.ja "hyphenation/*" -d "$app_dir"/hyphenation/ - fi - set -e - cd $omni_dir -@@ -825,11 +825,11 @@ if [ $BUILD_LINUX == 1 ]; then - fi - - for arch in $archs; do -- runtime_path="${LINUX_RUNTIME_PATH_PREFIX}${arch}" -+ runtime_path="${LINUX_RUNTIME_PATH_PREFIX}" - - # Set up directory -- echo 'Building Zotero_linux-'$arch -- APPDIR="$STAGE_DIR/Zotero_linux-$arch" -+ echo 'Building Zotero_linux' -+ APPDIR="$STAGE_DIR/Zotero_linux" - rm -rf "$APPDIR" - mkdir "$APPDIR" - -diff --git a/zotero/app/scripts/fetch_xulrunner.orig b/zotero/app/scripts/fetch_xulrunner -index 2b57bfb..2bbc110 100755 ---- a/zotero/app/scripts/fetch_xulrunner.orig -+++ b/zotero/app/scripts/fetch_xulrunner -@@ -134,15 +134,6 @@ function modify_omni { - # Continue using app.update.auto in prefs.js on Windows - replace_line 'PER_INSTALLATION_PREFS_PLATFORMS = \["win"\]' 'PER_INSTALLATION_PREFS_PLATFORMS = []' modules/UpdateUtils.sys.mjs - -- # Prompt if major update is available instead of installing automatically on restart -- replace_line 'if \(!updateAuto\) \{' 'if (update.type == "major") { -- LOG("UpdateService:_selectAndInstallUpdate - prompting because it is a major update"); -- AUSTLMY.pingCheckCode(this._pingSuffix, AUSTLMY.CHK_SHOWPROMPT_PREF); -- Services.obs.notifyObservers(update, "update-available", "show-prompt"); -- return; -- } -- if (!updateAuto) {' modules/UpdateService.sys.mjs -- - # Avoid console warning about resource://gre/modules/FxAccountsCommon.js - replace_line 'const logins = this._data.logins;' 'const logins = this._data.logins; if (this._data.logins.length != -1) return;' modules/LoginStore.sys.mjs - -@@ -516,36 +507,10 @@ fi - - if [ $BUILD_LINUX == 1 ]; then - GECKO_VERSION="$GECKO_VERSION_LINUX" -- DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION" - -- -- # Include 32-bit build if not in CI -- if [[ "${CI:-}" = "1" ]] || [[ "${SKIP_32:-}" = "1" ]]; then -- arches="x86_64" -- else -- arches="i686 x86_64" -- fi -- for arch in $arches; do -- xdir="firefox-$arch" -- rm -rf $xdir -- -- archived_file="firefox-$GECKO_VERSION-$arch.tar.bz2" -- if [ -e "$archived_file" ]; then -- echo "Using $archived_file" -- cp "$archived_file" "firefox-$GECKO_VERSION.tar.bz2" -- else -- curl -O "$DOWNLOAD_URL/linux-$arch/en-US/firefox-$GECKO_VERSION.tar.bz2" -- fi -- -- tar xvf firefox-$GECKO_VERSION.tar.bz2 -- mv firefox firefox-$arch -- -- pushd firefox-$arch -- modify_omni $arch -- popd -- echo $($SCRIPT_DIR/xulrunner_hash -p l) > hash-linux -- rm "firefox-$GECKO_VERSION.tar.bz2" -- done -+ pushd firefox -+ modify_omni linux64 -+ popd - fi - - echo Done diff --git a/user/zotero/zotero_drop-jazzer.patch b/user/zotero/zotero_drop-jazzer.patch deleted file mode 100644 index 4644e66..0000000 --- a/user/zotero/zotero_drop-jazzer.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/zotero/pdf-worker/pdf.js/package.json.orig b/zotero/pdf-worker/pdf.js/package.json -index 3025926..13f8b7a 100644 ---- a/zotero/pdf-worker/pdf.js/package.json.orig -+++ b/zotero/pdf-worker/pdf.js/package.json -@@ -7,7 +7,6 @@ - "@babel/runtime": "^7.24.8", - "@fluent/bundle": "^0.18.0", - "@fluent/dom": "^0.10.0", -- "@jazzer.js/core": "^2.1.0", - "@metalsmith/layouts": "^2.7.0", - "@metalsmith/markdown": "^1.10.0", - "autoprefixer": "^10.4.19", diff --git a/user/zotero/zotero_test-drop-build.patch b/user/zotero/zotero_test-drop-build.patch deleted file mode 100644 index a318f84..0000000 --- a/user/zotero/zotero_test-drop-build.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/zotero/test/runtests.sh.orig b/zotero/test/runtests.sh -index d83914a..ec91848 100755 ---- a/zotero/test/runtests.sh.orig -+++ b/zotero/test/runtests.sh -@@ -154,18 +154,6 @@ fi - # Clean up on exit - trap "{ rm -rf \"$TEMPDIR\"; }" EXIT - --# Check if build watch process is running --# If not, run now --if [[ -z "$CI" ]] && ! ps | grep js-build/build.js | grep -v grep > /dev/null; then -- echo -- echo "Running JS build process" -- cd "$ROOT_DIR" -- NODE_OPTIONS=--openssl-legacy-provider npm run build || exit $? -- echo --fi -- --ZOTERO_TEST=1 "$ROOT_DIR/app/scripts/dir_build" -q -- - makePath FX_PROFILE "$PROFILE" - MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$Z_EXECUTABLE" -profile "$FX_PROFILE" \ - -test "$TESTS" -grep "$GREP" -ZoteroTest $Z_ARGS diff --git a/user/zotero/zotero_test-fix-chars.patch b/user/zotero/zotero_test-fix-chars.patch deleted file mode 100644 index de0daa0..0000000 --- a/user/zotero/zotero_test-fix-chars.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/zotero/node_modules/mocha/mocha.js.orig b/zotero/node_modules/mocha/mocha.js -index c3e0c12..95fff4d 100644 ---- a/zotero/node_modules/mocha/mocha.js.orig -+++ b/zotero/node_modules/mocha/mocha.js -@@ -11473,9 +11473,9 @@ - - var browser$1 = { - info: 'ℹ️', -- success: '✅', -+ success: '✔', - warning: '⚠️', -- error: '❌️' -+ error: 'x' - }; - - var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_events) diff --git a/user/zotero/zotero_test-push-timeout-to-30sec.patch b/user/zotero/zotero_test-push-timeout-to-30sec.patch deleted file mode 100644 index e3c5a10..0000000 --- a/user/zotero/zotero_test-push-timeout-to-30sec.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/zotero/test/runtests.sh.orig b/zotero/test/runtests.sh -index d83914a3baa..e00efdb6506 100755 ---- a/zotero/test/runtests.sh.orig -+++ b/zotero/test/runtests.sh -@@ -146,7 +146,7 @@ user_pref("extensions.zoteroOpenOfficeIntegration.skipInstallation", true); - EOF - - if [ -n "$CI" ]; then -- Z_ARGS="$Z_ARGS -ZoteroAutomatedTest -ZoteroTestTimeout 15000" -+ Z_ARGS="$Z_ARGS -ZoteroAutomatedTest -ZoteroTestTimeout 30000" - else - Z_ARGS="$Z_ARGS -jsconsole" - fi From 3ffe64d0d49e01172f3e377e3e080a75f8f3bc39 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:07:07 -0400 Subject: [PATCH 023/313] user/forgejo-aneksajo: drop due to move to iports --- user/forgejo-aneksajo/APKBUILD | 112 ------------------ user/forgejo-aneksajo/forgejo-aneksajo.ini | 26 ---- user/forgejo-aneksajo/forgejo-aneksajo.initd | 15 --- .../forgejo-aneksajo.pre-install | 7 -- 4 files changed, 160 deletions(-) delete mode 100644 user/forgejo-aneksajo/APKBUILD delete mode 100644 user/forgejo-aneksajo/forgejo-aneksajo.ini delete mode 100644 user/forgejo-aneksajo/forgejo-aneksajo.initd delete mode 100644 user/forgejo-aneksajo/forgejo-aneksajo.pre-install diff --git a/user/forgejo-aneksajo/APKBUILD b/user/forgejo-aneksajo/APKBUILD deleted file mode 100644 index ca50a59..0000000 --- a/user/forgejo-aneksajo/APKBUILD +++ /dev/null @@ -1,112 +0,0 @@ -# Contributor: Carlo Landmeter -# Contributor: 6543 <6543@obermui.de> -# Contributor: techknowlogick -# Contributor: Patrycja Rosa -# Maintainer: Antoine Martin (ayakael) -pkgname=forgejo-aneksajo -pkgver=8.0.1 -_gittag=v$pkgver-git-annex0 -pkgrel=0 -pkgdesc="Self-hosted Git service written in Go with git-annex support" -url="https://forgejo.org" -# riscv64: builds fail https://codeberg.org/forgejo/forgejo/issues/3025 -arch="all !riscv64" -license="MIT" -depends="git git-lfs gnupg" -makedepends="go nodejs npm" -checkdepends="bash openssh openssh-keygen sqlite tzdata" -install="$pkgname.pre-install" -pkgusers="forgejo" -pkggroups="www-data" -subpackages="$pkgname-openrc" -source="$pkgname-$_gittag.tar.gz::https://codeberg.org/matrss/forgejo-aneksajo/archive/$_gittag.tar.gz - $pkgname.initd - $pkgname.ini - " -builddir="$srcdir/forgejo-aneksajo" -options="!check net chmod-clean" # broken with GIT_CEILING - -# secfixes: -# 7.0.4-r0: -# - CVE-2024-24789 -# 7.0.3-r0: -# - CVE-2024-24788 -# 1.21.10.0-r0: -# - CVE-2023-45288 -# 1.21.3.0-r0: -# - CVE-2023-48795 - -export GOCACHE="${GOCACHE:-"$srcdir/go-cache"}" -export GOTMPDIR="${GOTMPDIR:-"$srcdir"}" -export GOMODCACHE="${GOMODCACHE:-"$srcdir/go"}" - -# Skip tests for archs that fail unrelated in CI -case "$CARCH" in -s390x|x86|armhf|armv7) options="$options !check" ;; -esac - -prepare() { - default_prepare - - npm ci -} - -build() { - # XXX: LARGEFILE64 - export CGO_CFLAGS="$CFLAGS -O2 -D_LARGEFILE64_SOURCE" - export TAGS="bindata sqlite sqlite_unlock_notify" - export GITEA_VERSION="$pkgver" - export EXTRA_GOFLAGS="$GOFLAGS" - export CGO_LDFLAGS="$LDFLAGS" - unset LDFLAGS - ## make FHS compliant - local setting="code.gitea.io/gitea/modules/setting" - export LDFLAGS="$LDFLAGS -X $setting.CustomConf=/etc/forgejo/app.ini" - export LDFLAGS="$LDFLAGS -X $setting.AppWorkPath=/var/lib/forgejo/" - - make -j1 build -} - -check() { - local home="$srcdir"/home - mkdir -p "$home" - install -d -m700 "$home"/.ssh - touch "$home"/.gitconfig - - env GITEA_ROOT="$home" HOME="$home" GITEA_WORK_DIR="$(pwd)" timeout -s ABRT 20m make -j1 test-sqlite - ## "make test" - modified (exclude broken tests) - ## 'code.gitea.io/gitea/modules/migrations': github hase rate limits! 403 API - local tests=$(go list ./... | grep -v /vendor/ | - grep -v 'code.gitea.io/gitea/modules/migrations' | - grep -v 'code.gitea.io/gitea/modules/charset' | - grep -v 'code.gitea.io/gitea/models/migrations' | - grep -v 'code.gitea.io/gitea/services/migrations' | - grep -v 'code.gitea.io/gitea/integrations') - env GITEA_CONF="$PWD/tests/sqlite.ini" GITEA_ROOT="$home" HOME="$home" GO111MODULE=on go test -mod=vendor -tags='sqlite sqlite_unlock_notify' $tests - -} - -package() { - for dir in $pkgname $pkgname/git $pkgname/data $pkgname/db $pkgname/custom; do - install -dm750 -o forgejo -g www-data \ - "$pkgdir"/var/lib/$dir - done - - install -dm755 -o forgejo -g www-data "$pkgdir"/var/log/forgejo - - # TODO: rename when upstream does - install -Dm755 -g www-data gitea "$pkgdir"/usr/bin/forgejo - - install -Dm644 -o forgejo -g www-data "$srcdir"/forgejo-aneksajo.ini \ - "$pkgdir"/etc/forgejo/app.ini - chown forgejo:www-data "$pkgdir"/etc/forgejo - - install -Dm755 "$srcdir"/forgejo-aneksajo.initd \ - "$pkgdir"/etc/init.d/forgejo -} - -sha512sums=" -d8e273d369c934eec7ff84795cd0d896cda53bc1a2d17f610dd8476ff92dc50c4a24c4598366ef8aac3be52ddef6630489043183085334376c30bc5d4d5f15c2 forgejo-aneksajo-v8.0.1-git-annex0.tar.gz -eb93a9f6c8f204de5c813f58727015f53f9feaab546589e016c60743131559f04fc1518f487b6d2a0e7fa8fab6d4a67cd0cd9713a7ccd9dec767a8c1ddebe129 forgejo-aneksajo.initd -b537b41b6b3a945274a6028800f39787b48c318425a37cf5d40ace0d1b305444fd07f17b4acafcd31a629bedd7d008b0bb3e30f82ffeb3d7e7e947bdbe0ff4f3 forgejo-aneksajo.ini -" diff --git a/user/forgejo-aneksajo/forgejo-aneksajo.ini b/user/forgejo-aneksajo/forgejo-aneksajo.ini deleted file mode 100644 index 3b46259..0000000 --- a/user/forgejo-aneksajo/forgejo-aneksajo.ini +++ /dev/null @@ -1,26 +0,0 @@ -# Configuration cheat sheet: https://forgejo.org/docs/latest/admin/config-cheat-sheet/ - -RUN_USER = forgejo -RUN_MODE = prod - -[repository] -ROOT = /var/lib/forgejo/git -SCRIPT_TYPE = sh - -[server] -STATIC_ROOT_PATH = /usr/share/webapps/forgejo -APP_DATA_PATH = /var/lib/forgejo/data -LFS_START_SERVER = true - -[database] -DB_TYPE = sqlite3 -PATH = /var/lib/forgejo/db/forgejo.db -SSL_MODE = disable - -[session] -PROVIDER = file - -[log] -ROOT_PATH = /var/log/forgejo -MODE = file -LEVEL = Info diff --git a/user/forgejo-aneksajo/forgejo-aneksajo.initd b/user/forgejo-aneksajo/forgejo-aneksajo.initd deleted file mode 100644 index 24dd085..0000000 --- a/user/forgejo-aneksajo/forgejo-aneksajo.initd +++ /dev/null @@ -1,15 +0,0 @@ -#!/sbin/openrc-run - -supervisor=supervise-daemon -name=forgejo -command="/usr/bin/forgejo" -command_user="${FORGEJO_USER:-forgejo}:www-data" -command_args="web --config '${FORGEJO_CONF:-/etc/forgejo/app.ini}'" -supervise_daemon_args="--env FORGEJO_WORK_DIR='${FORGEJO_WORK_DIR:-/var/lib/forgejo}' --chdir '${FORGEJO_WORK_DIR:-/var/lib/forgejo}' --stdout '${FORGEJO_LOG_FILE:-/var/log/forgejo/http.log}' --stderr '${FORGEJO_LOG_FILE:-/var/log/forgejo/http.log}'" -pidfile="/run/forgejo.pid" - -depend() { - use logger dns - need net - after firewall mysql postgresql -} diff --git a/user/forgejo-aneksajo/forgejo-aneksajo.pre-install b/user/forgejo-aneksajo/forgejo-aneksajo.pre-install deleted file mode 100644 index c7e8b7b..0000000 --- a/user/forgejo-aneksajo/forgejo-aneksajo.pre-install +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -addgroup -S -g 82 www-data 2>/dev/null -adduser -S -D -h /var/lib/forgejo -s /bin/sh -G www-data -g forgejo forgejo 2>/dev/null \ - && passwd -u forgejo 2>/dev/null - -exit 0 From fb7a3fe81bde6dadda0ae865905be17d9d9e1d0b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:07:46 -0400 Subject: [PATCH 024/313] user/caprine: drop due to move to aports --- user/caprine/APKBUILD | 66 ------------------------------------ user/caprine/caprine.desktop | 9 ----- user/caprine/caprine.js | 29 ---------------- 3 files changed, 104 deletions(-) delete mode 100644 user/caprine/APKBUILD delete mode 100644 user/caprine/caprine.desktop delete mode 100644 user/caprine/caprine.js diff --git a/user/caprine/APKBUILD b/user/caprine/APKBUILD deleted file mode 100644 index 73c3e02..0000000 --- a/user/caprine/APKBUILD +++ /dev/null @@ -1,66 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=caprine -pkgver=2.59.1 -pkgrel=0 -pkgdesc="Elegant Facebook Messenger desktop app" -arch="x86_64 aarch64" # bloced by electron -url="https://github.com/sindresorhus/caprine" -license="MIT" -depends="electron" -makedepends="npm findutils coreutils" -options="!check" -source=" - $pkgname-$pkgver.tar.gz::https://github.com/sindresorhus/caprine/archive/refs/tags/v$pkgver.tar.gz - caprine.desktop - caprine.js - " - -build() { - npm install --ignore-scripts - npx --yes patch-package - npx tsc - rm -r node_modules - npm install --ignore-scripts --production - npx --yes patch-package -} - -package() { - local appdir=/usr/lib/$pkgname - - install -d "$pkgdir"$appdir - cp -r ./* "$pkgdir"$appdir - - install -dm755 "$pkgdir/usr/share/pixmaps" - install -m644 build/icon.png "$pkgdir/usr/share/pixmaps/$pkgname.png" - - install -Dm755 "$srcdir"/$pkgname.js "$pkgdir"/usr/bin/$pkgname - install -Dm644 "$srcdir"/$pkgname.desktop \ - "$pkgdir"/usr/share/applications/$pkgname.desktop - - install -dm755 "$pkgdir"/usr/share/licenses/$pkgname - ln -s "$(realpath -m --relative-to=/usr/share/licenses/$pkgname $appdir/license)" \ - "$pkgdir"/usr/share/licenses/$pkgname - - # Clean up - rm -r "$pkgdir"$appdir/build - rm -r "$pkgdir"$appdir/source - rm -r "$pkgdir"$appdir/tsconfig.json - find "$pkgdir"$appdir \ - -name "package.json" \ - -exec sed -e "s|$srcdir/$pkgname|$appdir|" \ - -i {} \; \ - -or -name ".*" -prune -exec rm -r '{}' \; \ - -or -name "bin" -prune -exec rm -r '{}' \; \ - -or -name "example" -prune -exec rm -r '{}' \; \ - -or -name "examples" -prune -exec rm -r '{}' \; \ - -or -name "man" -prune -exec rm -r '{}' \; \ - -or -name "scripts" -prune -exec rm -r '{}' \; \ - -or -name "test" -prune -exec rm -r '{}' \; -} -sha512sums=" -a525bafb6a53dd2dbdfc4b9b3e96d3939d93be950a3287f2a5ef6465d5a6b64ecda79b6d393023d067f939e1a6e85debc35f83bbb1f758011db9d94dd9ff8a72 caprine-2.59.1.tar.gz -a469e3bea24926119e51642b777ef794c5fa65421107903f967c36d81bbb1adb3d52469ce3a3301b2c890f1aa53ab989ded22a7c6e811fb8cf0a582dbd835e19 caprine.desktop -44280c62ce43bdafa8528729371fccb16b8a0e3db7aca28d5c157ae0144dca5fbb023b8883b561955aa28ab62e967f2674d8c6bcaff186e2cdd0e7ba8beab9ac caprine.js -" diff --git a/user/caprine/caprine.desktop b/user/caprine/caprine.desktop deleted file mode 100644 index b17bbd5..0000000 --- a/user/caprine/caprine.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Caprine -GenericName=IM Client -Comment=Unofficial Facebook Messenger app -Icon=caprine -Exec=caprine -Categories=GTK;InstantMessaging;Network; -StartupNotify=true diff --git a/user/caprine/caprine.js b/user/caprine/caprine.js deleted file mode 100644 index a963ee6..0000000 --- a/user/caprine/caprine.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/electron - -const name = 'caprine'; - -const {app} = require('electron'); -const fs = require('fs'); -const path = require('path'); - -// Change command name. -const fd = fs.openSync('/proc/self/comm', fs.constants.O_WRONLY); -fs.writeSync(fd, name); -fs.closeSync(fd); - -// Remove first command line argument (/usr/bin/electron). -process.argv.splice(0, 1); - -// Set application paths. -const appPath = path.join(path.dirname(__dirname), 'lib', name); -const packageJson = require(path.join(appPath, 'package.json')); -const productName = packageJson.productName; -app.setAppPath(appPath); -app.setDesktopName(name + '.desktop'); -app.setName(productName); -app.setPath('userCache', path.join(app.getPath('cache'), productName)); -app.setPath('userData', path.join(app.getPath('appData'), productName)); -app.setVersion(packageJson.version); - -// Run the application. -require('module')._load(appPath, module, true); From 0414f8624230c18de5937e69c072fac9ffac6eb5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:26:36 -0400 Subject: [PATCH 025/313] backports/py3-django-debug-toolbar: drop due to in community --- backports/py3-django-debug-toolbar/APKBUILD | 38 --------------------- 1 file changed, 38 deletions(-) delete mode 100644 backports/py3-django-debug-toolbar/APKBUILD diff --git a/backports/py3-django-debug-toolbar/APKBUILD b/backports/py3-django-debug-toolbar/APKBUILD deleted file mode 100644 index b0974d3..0000000 --- a/backports/py3-django-debug-toolbar/APKBUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Contributor: Leonardo Arena -# Maintainer: Will Sinatra -pkgname=py3-django-debug-toolbar -_pkgname=django-debug-toolbar -pkgver=4.3 -pkgrel=1 -pkgdesc="Configurable set of panels that display various debug information about the current request/response" -options="!check" # Requires unpackaged Selenium python3 module -url="https://github.com/jazzband/django-debug-toolbar" -arch="noarch" -license="BSD-3-Clause" -depends="py3-django py3-sqlparse" -makedepends=" - py3-gpep517 - py3-hatchling - " -# options="!check" #no testsuite -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/jazzband/$_pkgname/archive/$pkgver.tar.gz" -builddir="$srcdir"/$_pkgname-$pkgver - -replaces="py-django-debug-toolbar" # Backwards compatibility -provides="py-django-debug-toolbar=$pkgver-r$pkgrel" # Backwards compatibility - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -caa8563d38e8c96305828b7a07006ce2ee0afae099d70d75d332f2196fc3ffcf7f3848440ea22c00f2b918029477672a172e30714f6f73a630404175aef3b925 py3-django-debug-toolbar-4.3.tar.gz -" From 5771d091516aebe4d591b8daacda51c0f45f4520 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:28:02 -0400 Subject: [PATCH 026/313] backports/py3-pyqt6-sip: drop due to in community --- backports/py3-pyqt6-sip/APKBUILD | 36 -------------------------------- 1 file changed, 36 deletions(-) delete mode 100644 backports/py3-pyqt6-sip/APKBUILD diff --git a/backports/py3-pyqt6-sip/APKBUILD b/backports/py3-pyqt6-sip/APKBUILD deleted file mode 100644 index 59f6c14..0000000 --- a/backports/py3-pyqt6-sip/APKBUILD +++ /dev/null @@ -1,36 +0,0 @@ -# Contributor: Rosie K Languet -# Maintainer: Rosie K Languet -pkgname=py3-pyqt6-sip -pkgver=13.8.0 -pkgrel=0 -pkgdesc="The sip module support for PyQt6" -url="https://riverbankcomputing.com/software/sip" -arch="all" -license="custom:sip" -depends="python3" -makedepends=" - py3-gpep517 - py3-setuptools - py3-wheel - python3-dev - " -source="https://pypi.python.org/packages/source/P/PyQt6-sip/PyQt6_sip-$pkgver.tar.gz" -options="!check" # No tests -builddir="$srcdir/PyQt6_sip-$pkgver" - -build() { - export CFLAGS="$CFLAGS -O2 -flto=auto" - export CXXFLAGS="$CXXFLAGS -O2 -flto=auto" - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -6947690e61fe65a21f61d034ae9de7b7adb001c59a4a362933c5441648fe27140b43666efa73f981b138cfc73fac72777bb7318b98accc3c7f808687e3fc5d81 PyQt6_sip-13.8.0.tar.gz -" From 9e2e00cd44e191d5c3f68d834750ff175a6c7a87 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:28:26 -0400 Subject: [PATCH 027/313] backports/py3-qt6: drop due to in community --- backports/py3-qt6/APKBUILD | 59 -------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 backports/py3-qt6/APKBUILD diff --git a/backports/py3-qt6/APKBUILD b/backports/py3-qt6/APKBUILD deleted file mode 100644 index fbf7cb7..0000000 --- a/backports/py3-qt6/APKBUILD +++ /dev/null @@ -1,59 +0,0 @@ -# Contributor: Rosie K Languet -# Maintainer: Rosie K Languet -pkgname=py3-qt6 -pkgver=6.7.1 -pkgrel=0 -pkgdesc="Python 3 bindings for the Qt toolkit" -url="https://www.riverbankcomputing.com/software/pyqt/" -arch="all" -license="GPL-3.0-only" -depends=" - py3-pyqt6-sip - python3 - " -makedepends=" - libx11-dev - py3-dbus-dev - py3-opengl - py3-pyqt-builder - py3-sip - python3-dev - qt6-qtbase-dev - qt6-qtconnectivity-dev - qt6-qtdeclarative-dev - qt6-qtmultimedia-dev - qt6-qtserialport-dev - qt6-qtsvg-dev - qt6-qttools-dev - qt6-qtwebchannel-dev - qt6-qtwebsockets-dev - " - -subpackages="$pkgname-pyc" -source="https://pypi.python.org/packages/source/P/PyQt6/PyQt6-$pkgver.tar.gz" -builddir="$srcdir/PyQt6-$pkgver" - -build() { - export CFLAGS="$CFLAGS -O2 -flto=auto" - export CXXFLAGS="$CXXFLAGS -O2 -flto=auto" - sip-build \ - --confirm-license \ - --qmake /usr/lib/qt6/bin/qmake \ - --api-dir /usr/share/qt6/qsci/api/python \ - --pep484-pyi \ - --no-make - make -C build -} - -check() { - make -C build check -} - -package() { - make DESTDIR="$pkgdir" INSTALL_ROOT="$pkgdir" -C build install -j1 - python3 -m compileall -j 0 "$pkgdir"/usr/lib/python3* -} - -sha512sums=" -1e0fec009e1823b06460fd96eddc00ed31388c20f6d832aa0ebaa130baf06d83514df43af7961c3cb2872570d27e539d6db7bf6143ccdfd61a19da7521be2c7e PyQt6-6.7.1.tar.gz -" From 26657f4d5792bab7105b555b2896d2b61a41b59b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:28:51 -0400 Subject: [PATCH 028/313] backports/py3-sip: drop due to in community --- backports/py3-sip/APKBUILD | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 backports/py3-sip/APKBUILD diff --git a/backports/py3-sip/APKBUILD b/backports/py3-sip/APKBUILD deleted file mode 100644 index 8469075..0000000 --- a/backports/py3-sip/APKBUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Contributor: Francesco Colista -# Maintainer: Francesco Colista -pkgname=py3-sip -pkgver=6.8.6 -pkgrel=0 -pkgdesc="A tool that makes it easy to create Python bindings for C and C++ libraries" -options="!check" # No testsuite -url="https://www.riverbankcomputing.com/software/sip/" -arch="all" -license="custom:sip" -depends=" - py3-packaging - py3-ply - py3-setuptools - py3-toml - " -makedepends="python3-dev py3-gpep517 py3-wheel" -subpackages="$pkgname-pyc" -source="https://pypi.python.org/packages/source/s/sip/sip-$pkgver.tar.gz" -builddir="$srcdir/sip-$pkgver" - -replaces="py-sip" # Backwards comptibility -provides="py-sip=$pkgver-r$pkgrel" # Backwards comptibility - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/sip-*.whl -} - -sha512sums=" -c884c58fc51708e2dd247453f2214e6b01d7e1a9a0166b4228feb5d996310ace2665238dde26af34907e596a0a1c710fc130ae79297f430f73f639a3eb781a50 sip-6.8.6.tar.gz -" From 367a606da2084261b0a7f60064de0802d62aa32b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 16 Oct 2024 20:38:26 -0400 Subject: [PATCH 029/313] user/signal-desktop: upgrade to 7.29.0 --- backports/signal-desktop/APKBUILD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index b96bba4..30a07b9 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.28.0 +pkgver=7.29.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" @@ -66,8 +66,8 @@ makedepends=" options="net !check" # use _check_depends to validate this - _libsignalver=0.58.0 -_ringrtcver=2.48.1 +_libsignalver=0.58.0 +_ringrtcver=2.48.3 _webrtcver=6613c _stokenizerver=0.2.1 @@ -475,9 +475,9 @@ package() { } sha512sums=" -fa557adb65bce33d7c5823c39603ceda8c4f5743d078153f967f94eb423ff0f30eac3a7252fcfdee56b45b5f27f73a86614732171bd9bb474f9f48615daca6f0 Signal-Desktop-7.28.0.tar.gz +b97155dc2ca70436d6fdf15fff059f905f065738a288679aeee2199d43824206f4c7e4bae0c228b55b4cc76b7e00875b738ee4f7dea3c2a5414acec3e208aa1e Signal-Desktop-7.29.0.tar.gz 6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz -0190f5a08a9107c818a4770fe37c8b56bd11a99b5514da27cf0941e03b5681fb710b31d9474d05bcf2ac4035ef8703b6767c1780e25edff02ed982d73d8a8e42 ringrtc-2.48.1.tar.gz +6777354b60650c6c3d359714f3aff92a315996f3725ba05c74ed054d3c4ba5506406b30c940853b5ba426ac0271cdb4dd930a759c570f486a70e1f5adc5a2aae ringrtc-2.48.3.tar.gz fe04fcf13f55b124f03ce9d516b1c53fc4f20c6a016819c62eeaa0500eda92c5a0c0d7dc5d1e360a27691dfd404c254e91bed9fb25d0fc40a27795c1b674a82e webrtc-6613c.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch From 6e698a0974ab593d207ceea7854d3943cd718991 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 27 Oct 2024 13:13:08 -0400 Subject: [PATCH 030/313] forgejo: add update check workflows --- .forgejo/bin/check_ver.sh | 31 +++++ .forgejo/bin/create_issue.sh | 166 +++++++++++++++++++++++++ .forgejo/workflows/check-community.yml | 27 ++++ .forgejo/workflows/check-testing.yml | 27 ++++ .forgejo/workflows/check-user.yml | 27 ++++ 5 files changed, 278 insertions(+) create mode 100755 .forgejo/bin/check_ver.sh create mode 100755 .forgejo/bin/create_issue.sh create mode 100644 .forgejo/workflows/check-community.yml create mode 100644 .forgejo/workflows/check-testing.yml create mode 100644 .forgejo/workflows/check-user.yml diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh new file mode 100755 index 0000000..e4b7fd7 --- /dev/null +++ b/.forgejo/bin/check_ver.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# expects the following env variables: +# downstream: downstream repo + +repo=${downstream/*\/} + +curl --silent $downstream/x86_64/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX + +owned_by_you=$(awk -v RS= -v ORS="\n\n" '/m:Antoine Martin \(ayakael\) /' APKINDEX | awk -F ':' '{if($1=="o"){print $2}}' | sort | uniq) + +echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages owned by you" + +rm -f out_of_date not_in_anitya + +for pkg in $owned_by_you; do + upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version') + downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') + downstream_version=${downstream_version/-*} + + if [ -z "$upstream_version" ]; then + echo "$pkg not in anitya" + echo "$pkg" >> not_in_anitya + elif [ "$downstream_version" != "$(printf '%s\n' $upstream_version $downstream_version | sort -V | head -n 1)" ]; then + echo "$pkg higher downstream" + continue + elif [ "$upstream_version" != "$downstream_version" ]; then + echo "$pkg upstream version $upstream_version does not match downstream version $downstream_version" + echo "$pkg $downstream_version $upstream_version $repo" >> out_of_date + fi +done diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh new file mode 100755 index 0000000..2db1be6 --- /dev/null +++ b/.forgejo/bin/create_issue.sh @@ -0,0 +1,166 @@ +#!/bin/bash + +# expects: +# env variable FORGEJO_TOKEN +# file out_of_date + +IFS=' +' +repo=${downstream/*\/} + +does_it_exist() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + query="$repo/$name: upgrade to $upstream_version" + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + if [ "$result" == "[]" ]; then + return 1 + fi +} + +is_it_old() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + query="$repo/$name: upgrade to $upstream_version" + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + result_title="$(echo $result | jq -r '.[].title' )" + result_id="$(echo $result | jq -r '.[].number' )" + result_downstream_version="$(echo $result_title | awk '{print $4}')" + result_upstream_version="$(echo $result_title | awk '{print $6}')" + + if [ "$downstream_version" != "$result_downstream_version" ] || [ "$upstream_version" != "$result_upstream_version" ]; then + echo $result_id + else + echo 0 + fi +} + +update_title() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + id=$5 + + result=$(curl --silent -X 'PATCH' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"$repo/$name: upgrade to $upstream_version\" + }" + ) + + return 0 +} + +create_issue() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + result=$(curl --silent -X 'POST' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"$repo/$name: upgrade to $upstream_version\", + \"labels\": [ + $LABEL_NUMBER + ] + }") + + return 0 +} + +if [ -f out_of_date ]; then + out_of_date="$(cat out_of_date)" + + echo "Detected $(wc -l out_of_date) out-of-date packages, creating issues" + + for pkg in $out_of_date; do + name="$(echo $pkg | awk '{print $1}')" + downstream_version="$(echo $pkg | awk '{print $2}')" + upstream_version="$(echo $pkg | awk '{print $3}')" + repo="$(echo $pkg | awk '{print $4}')" + + if does_it_exist $name $downstream_version $upstream_version $repo; then + echo "Issue for $repo/$name already exists" + continue + fi + + id=$(is_it_old $name $downstream_version $upstream_version $repo) + + if [ "$id" != "0" ] && [ -n "$id" ]; then + echo "Issue for $repo/$name needs updating" + update_title $name $downstream_version $upstream_version $repo $id + continue + fi + + echo "Creating issue for $repo/$name" + create_issue $name $downstream_version $upstream_version $repo + done +fi + +if [ -f not_in_anitya ]; then + query="Add missing $repo packages to anitya" + query="$(echo $query | sed 's| |%20|g')" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + if [ "$result" == "[]" ]; then + echo "Creating anitya issue" + result=$(curl --silent -X 'POST' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"Add missing $repo packages to anitya\", + \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\", + \"labels\": [ + $LABEL_NUMBER + ] + }") + + else + echo "Updating anitya issue" + result_id="$(echo $result | jq -r '.[].number' )" + result=$(curl --silent -X 'PATCH' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\" + }" + ) + fi +fi diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml new file mode 100644 index 0000000..a3d2524 --- /dev/null +++ b/.forgejo/workflows/check-community.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '@hourly' + +jobs: + check-community: + name: Check community repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/edge/community + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml new file mode 100644 index 0000000..b55147b --- /dev/null +++ b/.forgejo/workflows/check-testing.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '@hourly' + +jobs: + check-community: + name: Check testing repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/edge/testing + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml new file mode 100644 index 0000000..f07ec6e --- /dev/null +++ b/.forgejo/workflows/check-user.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '@hourly' + +jobs: + check-user: + name: Check user repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://ayakael.net/api/packages/forge/alpine/edge/user + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From 9bf9771b8c7803e4f0f928da2c5b948215c0dfc7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 27 Oct 2024 17:01:04 -0400 Subject: [PATCH 031/313] forgejo: update is_it_old to use new title format --- .forgejo/bin/create_issue.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 2db1be6..2e8e1e6 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -45,10 +45,9 @@ is_it_old() { result_title="$(echo $result | jq -r '.[].title' )" result_id="$(echo $result | jq -r '.[].number' )" - result_downstream_version="$(echo $result_title | awk '{print $4}')" - result_upstream_version="$(echo $result_title | awk '{print $6}')" + result_upstream_version="$(echo $result_title | awk '{print $4}')" - if [ "$downstream_version" != "$result_downstream_version" ] || [ "$upstream_version" != "$result_upstream_version" ]; then + if [ "$upstream_version" != "$result_upstream_version" ]; then echo $result_id else echo 0 From 7814f05e1c69724f580f9f2c973e34852952e754 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 28 Oct 2024 08:21:30 -0400 Subject: [PATCH 032/313] Check every day at 5 am instead of hourly --- .forgejo/workflows/check-community.yml | 2 +- .forgejo/workflows/check-testing.yml | 2 +- .forgejo/workflows/check-user.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index a3d2524..fdaa184 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -2,7 +2,7 @@ on: workflow_dispatch: schedule: - - cron: '@hourly' + - cron: '0 5 * * *' jobs: check-community: diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index b55147b..2b8f7ed 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -2,7 +2,7 @@ on: workflow_dispatch: schedule: - - cron: '@hourly' + - cron: '0 5 * * *' jobs: check-community: diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml index f07ec6e..09b0f3c 100644 --- a/.forgejo/workflows/check-user.yml +++ b/.forgejo/workflows/check-user.yml @@ -2,7 +2,7 @@ on: workflow_dispatch: schedule: - - cron: '@hourly' + - cron: '0 5 * * *' jobs: check-user: From 97ed4992d7d7eead70ee08018be08edcc7e6c594 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 29 Oct 2024 07:06:50 -0400 Subject: [PATCH 033/313] forgejo: Fix is_it_old logics --- .forgejo/bin/create_issue.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 2e8e1e6..d162758 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -34,7 +34,7 @@ is_it_old() { upstream_version=$3 repo=$4 - query="$repo/$name: upgrade to $upstream_version" + query="$repo/$name: upgrade to" query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" result="$(curl --silent -X 'GET' \ From 257e0199923bc7c1160e9ab012fa4909f0059add Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 29 Oct 2024 07:07:21 -0400 Subject: [PATCH 034/313] forgejo: fix typo in check-community --- .forgejo/workflows/check-community.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index fdaa184..9385687 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -13,7 +13,7 @@ jobs: env: downstream: https://dl-cdn.alpinelinux.org/alpine/edge/community FORGEJO_TOKEN: ${{ secrets.forgejo_token }} - LABEL_NUMER: 4 + LABEL_NUMBER: 4 steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From b345573aa1eba95a8d8c40c7c5797ca5cd5633d1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 29 Oct 2024 08:56:16 -0400 Subject: [PATCH 035/313] forgejo: chose highest version when dealing with multiple downstream_versions --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index e4b7fd7..7a1f534 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -15,7 +15,7 @@ rm -f out_of_date not_in_anitya for pkg in $owned_by_you; do upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version') - downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') + downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) downstream_version=${downstream_version/-*} if [ -z "$upstream_version" ]; then From 396c98208d47781f42e761dda10dbc8720e3544e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 29 Oct 2024 09:01:48 -0400 Subject: [PATCH 036/313] backports/caprine: new aport --- backports/caprine/APKBUILD | 65 +++++++++++++++++++++++++++++++ backports/caprine/caprine.desktop | 9 +++++ backports/caprine/caprine.sh | 2 + 3 files changed, 76 insertions(+) create mode 100644 backports/caprine/APKBUILD create mode 100644 backports/caprine/caprine.desktop create mode 100644 backports/caprine/caprine.sh diff --git a/backports/caprine/APKBUILD b/backports/caprine/APKBUILD new file mode 100644 index 0000000..c77c50e --- /dev/null +++ b/backports/caprine/APKBUILD @@ -0,0 +1,65 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=caprine +pkgver=2.60.1 +pkgrel=1 +pkgdesc="Elegant Facebook Messenger desktop app" +arch="x86_64 aarch64" # blocked by electron +url="https://github.com/sindresorhus/caprine" +license="MIT" +depends="electron" +makedepends="npm findutils coreutils" +options="!check" # No test suite +source=" + $pkgname-$pkgver.tar.gz::https://github.com/sindresorhus/caprine/archive/refs/tags/v$pkgver.tar.gz + caprine.desktop + caprine.sh + " + +build() { + npm install --ignore-scripts + npx --yes patch-package + npx tsc + rm -r node_modules + npm install --ignore-scripts --production + npx --yes patch-package +} + +package() { + local appdir=/usr/lib/caprine + + install -d "$pkgdir"$appdir + cp -r ./* "$pkgdir"$appdir + + install -dm755 "$pkgdir/usr/share/pixmaps" + install -m644 build/icon.png "$pkgdir/usr/share/pixmaps/$pkgname.png" + + install -Dm755 "$srcdir"/caprine.sh "$pkgdir"/usr/bin/caprine + install -Dm644 "$srcdir"/caprine.desktop \ + "$pkgdir"/usr/share/applications/caprine.desktop + + install -dm755 "$pkgdir"/usr/share/licenses/caprine + ln -s "$(realpath -m --relative-to=/usr/share/licenses/caprine $appdir/license)" \ + "$pkgdir"/usr/share/licenses/caprine + + # Clean up + rm -r "$pkgdir"$appdir/build + rm -r "$pkgdir"$appdir/source + rm -r "$pkgdir"$appdir/tsconfig.json + find "$pkgdir"$appdir \ + -name "package.json" \ + -exec sed -e "s|$srcdir/caprine|$appdir|" \ + -i {} \; \ + -or -name ".*" -prune -exec rm -r '{}' \; \ + -or -name "bin" -prune -exec rm -r '{}' \; \ + -or -name "example" -prune -exec rm -r '{}' \; \ + -or -name "examples" -prune -exec rm -r '{}' \; \ + -or -name "man" -prune -exec rm -r '{}' \; \ + -or -name "scripts" -prune -exec rm -r '{}' \; \ + -or -name "test" -prune -exec rm -r '{}' \; +} +sha512sums=" +0df7f233c91f5a044dcffde94b976c6ad71e6d355518615c48cd825a249c01d63f455de31ece69193a66ca0fd8157506f9b88088da1bd47fc75e9d3800784ed0 caprine-2.60.1.tar.gz +a469e3bea24926119e51642b777ef794c5fa65421107903f967c36d81bbb1adb3d52469ce3a3301b2c890f1aa53ab989ded22a7c6e811fb8cf0a582dbd835e19 caprine.desktop +3ad8994c1a0417e73d622587769e527b4236a32c1a89442ff76413b75b4392d667c9e2908979b453e5926e54db6d94b31625340c5a94e84e91ea77f56feae778 caprine.sh +" diff --git a/backports/caprine/caprine.desktop b/backports/caprine/caprine.desktop new file mode 100644 index 0000000..b17bbd5 --- /dev/null +++ b/backports/caprine/caprine.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Application +Name=Caprine +GenericName=IM Client +Comment=Unofficial Facebook Messenger app +Icon=caprine +Exec=caprine +Categories=GTK;InstantMessaging;Network; +StartupNotify=true diff --git a/backports/caprine/caprine.sh b/backports/caprine/caprine.sh new file mode 100644 index 0000000..bf0f8de --- /dev/null +++ b/backports/caprine/caprine.sh @@ -0,0 +1,2 @@ +#!/bin/sh +/usr/bin/electron "/usr/lib/caprine" From a362d7747a4344f28632425ce7574d954544a66c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 20:32:09 -0500 Subject: [PATCH 037/313] user/paperless-ngx: disable due to uvicorn --- user/paperless-ngx/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/paperless-ngx/APKBUILD b/user/paperless-ngx/APKBUILD index 3e017fb..9a6e7ab 100644 --- a/user/paperless-ngx/APKBUILD +++ b/user/paperless-ngx/APKBUILD @@ -8,7 +8,8 @@ url="https://github.com/paperless-ngx/paperless-ngx" license="GPL-3.0-only" # s390x: ocrmypdf py3-joblib py3-scikit-learn py3-watchfiles # armhf / ppc64le: py3-uvloop -arch="noarch !s390x !armhf !ppc64le" +# all: uvicorn doesn't yet work with websockets 14 +# arch="noarch !s390x !armhf !ppc64le" install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install" depends=" file From 4fce7364ca6898da2e22da57d8ef5011a311fe45 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 20:33:21 -0500 Subject: [PATCH 038/313] user/protobuf: drop --- user/protobuf/APKBUILD | 168 ------------------------- user/protobuf/exclude.patch | 40 ------ user/protobuf/protoc-cmake.patch | 27 ---- user/protobuf/ruby-fix-cflags.patch | 18 --- user/protobuf/skip-failing-tests.patch | 99 --------------- user/protobuf/soversion.patch | 39 ------ user/protobuf/trim-rakefile.patch | 79 ------------ 7 files changed, 470 deletions(-) delete mode 100644 user/protobuf/APKBUILD delete mode 100644 user/protobuf/exclude.patch delete mode 100644 user/protobuf/protoc-cmake.patch delete mode 100644 user/protobuf/ruby-fix-cflags.patch delete mode 100644 user/protobuf/skip-failing-tests.patch delete mode 100644 user/protobuf/soversion.patch delete mode 100644 user/protobuf/trim-rakefile.patch diff --git a/user/protobuf/APKBUILD b/user/protobuf/APKBUILD deleted file mode 100644 index ec56f54..0000000 --- a/user/protobuf/APKBUILD +++ /dev/null @@ -1,168 +0,0 @@ -# Contributor: Sheila Aman -# Maintainer: Natanael Copa -pkgname=protobuf -_gemname=google-protobuf -pkgver=23.4 -_rubyver=3.23.4 -pkgrel=2 -pkgdesc="Library for extensible, efficient structure packing" -url="https://github.com/protocolbuffers/protobuf" -arch="all" -license="BSD-3-Clause" -depends=" - protoc=$pkgver-r$pkgrel - libprotoc=$pkgver-r$pkgrel - libprotobuf=$pkgver-r$pkgrel - libprotobuf-lite=$pkgver-r$pkgrel - " -depends_dev=" - protoc=$pkgver-r$pkgrel - zlib-dev - " -makedepends=" - $depends_dev - abseil-cpp-dev - cmake - ruby3.2 - ruby3.2-dev - ruby3.2-rake - samurai - " -checkdepends="gtest-dev" -subpackages=" - ruby3.2-$_gemname:_ruby - $pkgname-dev - $pkgname-vim::noarch - protoc - libprotoc - libprotobuf - libprotobuf-lite - " - # exclude.patch -source="$pkgname-$pkgver.tar.gz::https://github.com/protocolbuffers/protobuf/archive/refs/tags/v$pkgver.tar.gz - exclude.patch - protoc-cmake.patch - ruby-fix-cflags.patch - skip-failing-tests.patch - soversion.patch - trim-rakefile.patch - " - -# fails some -case "$CARCH" in -armhf) options="$options !check" ;; -esac - -build() { - export CFLAGS="$CFLAGS -DNDEBUG -O2 -flto=auto" - export CXXFLAGS="$CXXFLAGS -DNDEBUG -O2 -flto=auto -Wno-deprecated-declarations" - - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=None \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DBUILD_SHARED_LIBS=ON \ - -Dprotobuf_BUILD_TESTS="$(want_check && echo ON || echo OFF)" \ - -Dprotobuf_BUILD_LIBPROTOC=ON \ - -Dprotobuf_ABSL_PROVIDER="package" \ - -Dprotobuf_ALLOW_CCACHE=ON \ - -Dprotobuf_USE_EXTERNAL_GTEST=ON - cmake --build build - - cd "$builddir"/ruby - - export PATH="$PATH:$builddir/build" - - # Generate proto files for built-in protocols. - rake genproto - - gem build $_gemname.gemspec - gem install --local \ - --install-dir dist \ - --ignore-dependencies \ - --no-document \ - --verbose \ - $_gemname -} - -# TODO: Run tests for ruby gem. -check() { - ctest --test-dir build --output-on-failure -} - -package() { - DESTDIR="$pkgdir" cmake --install build - - sed -i \ - -e "/Requires:/s|;| |g" \ - -e "/Requires:/s|::|_|g" \ - "$pkgdir"/usr/lib/pkgconfig/protobuf.pc - - install -Dm644 editors/proto.vim \ - "$pkgdir"/usr/share/vim/vimfiles/syntax/proto.vim - - local gemdir="$pkgdir/$(ruby -e 'puts Gem.default_dir')" - cd ruby/dist - - mkdir -p "$gemdir" - cp -r extensions gems specifications "$gemdir"/ - - # Remove duplicated .so libs (should be only in extensions directory). - find "$gemdir"/gems/ -name "*.so" -delete - - # Remove unnecessary files. - cd "$gemdir"/gems/$_gemname-$_rubyver - rm -r ext/ -} - -_ruby() { - depends="" - pkgdesc="Ruby bindings to Google's data interchange format" - - amove usr/lib/ruby/gems -} - -vim() { - pkgdesc="Vim syntax for $pkgname" - depends="" - install_if="$pkgname=$pkgver-r$pkgrel vim" - - amove usr/share/vim/vimfiles/syntax/proto.vim -} - -libprotoc() { - depends="" - pkgdesc="Runtime library for Protocol Buffer compiler" - - amove usr/lib/libprotoc.so.* -} - -protoc() { - depends="" - pkgdesc="Protocol buffer compiler binary and library" - - amove usr/bin/protoc* -} - -libprotobuf() { - depends="" - pkgdesc="Runtime library for C++ users of protocol buffers" - - amove usr/lib/libprotobuf.so.* -} - -lite() { - depends="" - pkgdesc="Runtime library for C++ users with 'lite runtime' setting of protocol buffers" - - amove usr/lib/libprotobuf-lite.so.* -} - -sha512sums=" -b93a4e0339ecbe085796de5b6c61feae35229d40db9019c043090bcaa483a1cce78a99487c5638482c68832fcede5579a0e5ec731221a88359b80db9bb6dc566 protobuf-23.4.tar.gz -0d46d105a0670ab5cfcb04ed534927a71613234a88efede0b20d426e1caaa708e6ff275a09c5dab7786fe26e69e0882f022b893302e4869006b4ac55fc6172e5 exclude.patch -16b8ee0e50dbb2144ddb83654a63e410b4218e667b6b8b77c7b6f9797508f63c3e8be0f9711841bb6ebbed0883cda2394b219a62b468240f65f4dac418b5a56e protoc-cmake.patch -0cb202a6151ae3746c09e85f2e4ce9abb0d810d4a3c84cb647fde407cf8d13894d3c9b340e06d7a3a85669da1899db265d26d8309d59249f841a40a66e045c83 ruby-fix-cflags.patch -b5070f8e150920c316130ba40f46c66eefddc634844f5d6b8ee11f6824a3707b3e74f68aa0612c16305bf096050214c6120e693225e07e0cea80e68a7830f863 skip-failing-tests.patch -850dc1d6fd3ea01f1689fd700ac35e7da0882092ab34c616702e01bdf4b5327b8ab27381ecf291431a94f54c89d31707a4a171929937e880543974cb64f9e685 soversion.patch -13514a456a50d7243baa23fe43586fc4544cda87b9e2a5afe9d2fac8afca8e8853f9b42232c3fff4c5cf2df443af32f944f451daa1d604d80fd03ee4e7abed3e trim-rakefile.patch -" diff --git a/user/protobuf/exclude.patch b/user/protobuf/exclude.patch deleted file mode 100644 index 9c63c0a..0000000 --- a/user/protobuf/exclude.patch +++ /dev/null @@ -1,40 +0,0 @@ -don't install the utf8_range lib into disk. -also remove it from .pc/cmake, it's statically linked into protobuf and never needed on disk after --- -diff --git a/cmake/install.cmake b/cmake/install.cmake -index e7eb210..73e1897 100644 ---- a/cmake/install.cmake -+++ b/cmake/install.cmake -@@ -4,7 +4,6 @@ foreach(_target IN LISTS protobuf_ABSL_USED_TARGETS) - string(REPLACE :: _ _modified_target ${_target}) - list(APPEND _pc_targets ${_modified_target}) - endforeach() --list(APPEND _pc_targets "utf8_range") - - set(_protobuf_PC_REQUIRES "") - set(_sep "") -diff --git a/cmake/protobuf-config.cmake.in b/cmake/protobuf-config.cmake.in -index 44805c7..1a8d243 100644 ---- a/cmake/protobuf-config.cmake.in -+++ b/cmake/protobuf-config.cmake.in -@@ -4,7 +4,6 @@ include("${CMAKE_CURRENT_LIST_DIR}/protobuf-options.cmake") - # Depend packages - @_protobuf_FIND_ZLIB@ - @_protobuf_FIND_ABSL@ --@_protobuf_FIND_UTF8_RANGE@ - - # Imported targets - include("${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake") -diff --git a/cmake/utf8_range.cmake b/cmake/utf8_range.cmake -index f411a8c..770f94c 100644 ---- a/cmake/utf8_range.cmake -+++ b/cmake/utf8_range.cmake -@@ -8,7 +8,7 @@ if (NOT TARGET utf8_range) - endif() - - set(utf8_range_ENABLE_INSTALL ${protobuf_INSTALL} CACHE BOOL "Set install") -- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/utf8_range third_party/utf8_range) -+ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/utf8_range third_party/utf8_range EXCLUDE_FROM_ALL) - include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/utf8_range) - endif () - diff --git a/user/protobuf/protoc-cmake.patch b/user/protobuf/protoc-cmake.patch deleted file mode 100644 index 4c1ae7a..0000000 --- a/user/protobuf/protoc-cmake.patch +++ /dev/null @@ -1,27 +0,0 @@ -Patch-Source: https://github.com/protocolbuffers/protobuf/pull/13206 --- -From 2e62ef1eaa2e712afc5f87aa2c55d478fe96230d Mon Sep 17 00:00:00 2001 -From: Antonio Rojas -Date: Wed, 5 Jul 2023 13:03:11 +0200 -Subject: [PATCH] Handle BUILD_TYPE=None in protobuf-module.cmake - -Fixes Protobuf_PROTOC_EXECUTABLE being undefined in that case. ---- - cmake/protobuf-module.cmake.in | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/cmake/protobuf-module.cmake.in b/cmake/protobuf-module.cmake.in -index 0bb05e38fad..e5b2b2e4b3a 100644 ---- a/cmake/protobuf-module.cmake.in -+++ b/cmake/protobuf-module.cmake.in -@@ -153,6 +153,10 @@ if(NOT Protobuf_PROTOC_EXECUTABLE AND TARGET protobuf::protoc) - get_target_property(Protobuf_PROTOC_EXECUTABLE protobuf::protoc - IMPORTED_LOCATION_NOCONFIG) - endif() -+ if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}") -+ get_target_property(Protobuf_PROTOC_EXECUTABLE protobuf::protoc -+ IMPORTED_LOCATION_NONE) -+ endif() - endif() - - # Version info variable diff --git a/user/protobuf/ruby-fix-cflags.patch b/user/protobuf/ruby-fix-cflags.patch deleted file mode 100644 index 24b1d57..0000000 --- a/user/protobuf/ruby-fix-cflags.patch +++ /dev/null @@ -1,18 +0,0 @@ -Using builder flags - -diff --git a/ruby/ext/google/protobuf_c/extconf.rb b/ruby/ext/google/protobuf_c/extconf.rb -index b7c439b..0bbc15c 100755 ---- a/ruby/ext/google/protobuf_c/extconf.rb -+++ b/ruby/ext/google/protobuf_c/extconf.rb -@@ -7,9 +7,9 @@ ext_name = "google/protobuf_c" - dir_config(ext_name) - - if RUBY_PLATFORM =~ /darwin/ || RUBY_PLATFORM =~ /linux/ || RUBY_PLATFORM =~ /freebsd/ -- $CFLAGS += " -std=gnu99 -O3 -DNDEBUG -fvisibility=hidden -Wall -Wsign-compare -Wno-declaration-after-statement" -+ $CFLAGS += " -std=gnu99 -DNDEBUG -fvisibility=hidden -Wall -Wsign-compare -Wno-declaration-after-statement" - else -- $CFLAGS += " -std=gnu99 -O3 -DNDEBUG" -+ $CFLAGS += " -std=gnu99 -DNDEBUG" - end - - if RUBY_PLATFORM =~ /linux/ diff --git a/user/protobuf/skip-failing-tests.patch b/user/protobuf/skip-failing-tests.patch deleted file mode 100644 index be0c71b..0000000 --- a/user/protobuf/skip-failing-tests.patch +++ /dev/null @@ -1,99 +0,0 @@ -diff --git a/src/google/protobuf/any_test.cc b/src/google/protobuf/any_test.cc -index 8b544d9..0f27dbe 100644 ---- a/src/google/protobuf/any_test.cc -+++ b/src/google/protobuf/any_test.cc -@@ -62,13 +62,6 @@ TEST(AnyTest, TestPackAndUnpack) { - EXPECT_EQ(12345, submessage.int32_value()); - } - --TEST(AnyTest, TestPackFromSerializationExceedsSizeLimit) { -- protobuf_unittest::TestAny submessage; -- submessage.mutable_text()->resize(INT_MAX, 'a'); -- protobuf_unittest::TestAny message; -- EXPECT_FALSE(message.mutable_any_value()->PackFrom(submessage)); --} -- - TEST(AnyTest, TestUnpackWithTypeMismatch) { - protobuf_unittest::TestAny payload; - payload.set_int32_value(13); -diff --git a/src/google/protobuf/arena_unittest.cc b/src/google/protobuf/arena_unittest.cc -index 4832cff..aa45a25 100644 ---- a/src/google/protobuf/arena_unittest.cc -+++ b/src/google/protobuf/arena_unittest.cc -@@ -1392,11 +1392,11 @@ TEST(ArenaTest, SpaceAllocated_and_Used) { - options.initial_block_size = arena_block.size(); - Arena arena_2(options); - EXPECT_EQ(1024, arena_2.SpaceAllocated()); -- EXPECT_EQ(0, arena_2.SpaceUsed()); -+// EXPECT_EQ(0, arena_2.SpaceUsed()); - EXPECT_EQ(1024, arena_2.Reset()); - Arena::CreateArray(&arena_2, 55); - EXPECT_EQ(1024, arena_2.SpaceAllocated()); -- EXPECT_EQ(Align8(55), arena_2.SpaceUsed()); -+// EXPECT_EQ(Align8(55), arena_2.SpaceUsed()); - EXPECT_EQ(1024, arena_2.Reset()); - } - -@@ -1460,11 +1460,11 @@ TEST(ArenaTest, BlockSizeSmallerThanAllocation) { - - *Arena::Create(&arena) = 42; - EXPECT_GE(arena.SpaceAllocated(), 8); -- EXPECT_EQ(8, arena.SpaceUsed()); -+// EXPECT_EQ(8, arena.SpaceUsed()); - - *Arena::Create(&arena) = 42; - EXPECT_GE(arena.SpaceAllocated(), 16); -- EXPECT_EQ(16, arena.SpaceUsed()); -+// EXPECT_EQ(16, arena.SpaceUsed()); - } - } - -diff --git a/src/google/protobuf/extension_set_unittest.cc b/src/google/protobuf/extension_set_unittest.cc -index ccd1c9b..f420da3 100644 ---- a/src/google/protobuf/extension_set_unittest.cc -+++ b/src/google/protobuf/extension_set_unittest.cc -@@ -871,17 +871,17 @@ TEST(ExtensionSetTest, SpaceUsedExcludingSelf) { - } while (0) - - TEST_REPEATED_EXTENSIONS_SPACE_USED(int32, int32_t, 101); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(int64, int64_t, 102); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(int64, int64_t, 102); - TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32, uint32_t, 103); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64, uint64_t, 104); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64, uint64_t, 104); - TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32, int32_t, 105); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64, int64_t, 106); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64, int64_t, 106); - TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32, uint32_t, 107); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64, uint64_t, 108); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64, uint64_t, 108); - TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32_t, 109); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64_t, 110); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64_t, 110); - TEST_REPEATED_EXTENSIONS_SPACE_USED(float, float, 111); -- TEST_REPEATED_EXTENSIONS_SPACE_USED(double, double, 112); -+ //TEST_REPEATED_EXTENSIONS_SPACE_USED(double, double, 112); - TEST_REPEATED_EXTENSIONS_SPACE_USED(bool, bool, true); - TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int, - unittest::TestAllTypes::FOO); -diff --git a/src/google/protobuf/wire_format_unittest.inc b/src/google/protobuf/wire_format_unittest.inc -index 4c7d047..7906cfa 100644 ---- a/src/google/protobuf/wire_format_unittest.inc -+++ b/src/google/protobuf/wire_format_unittest.inc -@@ -1537,6 +1537,7 @@ TEST_F(Utf8ValidationTest, ParseRepeatedString) { - - // Test the old VerifyUTF8String() function, which may still be called by old - // generated code. -+#if 0 - TEST_F(Utf8ValidationTest, OldVerifyUTF8String) { - std::string data(kInvalidUTF8String); - -@@ -1555,7 +1556,7 @@ TEST_F(Utf8ValidationTest, OldVerifyUTF8String) { - WireFormat::SERIALIZE); - } - } -- -+#endif - - TEST(RepeatedVarint, Int32) { - RepeatedField v; diff --git a/user/protobuf/soversion.patch b/user/protobuf/soversion.patch deleted file mode 100644 index 25d6959..0000000 --- a/user/protobuf/soversion.patch +++ /dev/null @@ -1,39 +0,0 @@ -Patch-Source: https://gitlab.archlinux.org/archlinux/packaging/packages/protobuf/-/blob/e93df92fead2d46cc2825a866af3f402d498439c/soversion.patch -use an soversion that actually makes sense and not just the full pkgver --- -diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake -index 9b1de677b4f..276c99c489e 100644 ---- a/cmake/libprotobuf-lite.cmake -+++ b/cmake/libprotobuf-lite.cmake -@@ -30,6 +30,7 @@ if(protobuf_BUILD_SHARED_LIBS) - endif() - set_target_properties(libprotobuf-lite PROPERTIES - VERSION ${protobuf_VERSION} -+ SOVERSION ${protobuf_VERSION_MINOR} - OUTPUT_NAME ${LIB_PREFIX}protobuf-lite - DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}") - add_library(protobuf::libprotobuf-lite ALIAS libprotobuf-lite) -diff --git a/cmake/libprotobuf.cmake b/cmake/libprotobuf.cmake -index aa3efc9a68a..0f34d20b97d 100644 ---- a/cmake/libprotobuf.cmake -+++ b/cmake/libprotobuf.cmake -@@ -33,6 +33,7 @@ if(protobuf_BUILD_SHARED_LIBS) - endif() - set_target_properties(libprotobuf PROPERTIES - VERSION ${protobuf_VERSION} -+ SOVERSION ${protobuf_VERSION_MINOR} - OUTPUT_NAME ${LIB_PREFIX}protobuf - DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}") - add_library(protobuf::libprotobuf ALIAS libprotobuf) -diff --git a/cmake/libprotoc.cmake b/cmake/libprotoc.cmake -index 72b4a1abb92..91e8bbeb04e 100644 ---- a/cmake/libprotoc.cmake -+++ b/cmake/libprotoc.cmake -@@ -24,6 +24,7 @@ endif() - set_target_properties(libprotoc PROPERTIES - COMPILE_DEFINITIONS LIBPROTOC_EXPORTS - VERSION ${protobuf_VERSION} -+ SOVERSION ${protobuf_VERSION_MINOR} - OUTPUT_NAME ${LIB_PREFIX}protoc - DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}") - add_library(protobuf::libprotoc ALIAS libprotoc) diff --git a/user/protobuf/trim-rakefile.patch b/user/protobuf/trim-rakefile.patch deleted file mode 100644 index d8a3b87..0000000 --- a/user/protobuf/trim-rakefile.patch +++ /dev/null @@ -1,79 +0,0 @@ -diff --git a/ruby/Rakefile b/ruby/Rakefile -index c05e115..20144b7 100644 ---- a/ruby/Rakefile -+++ b/ruby/Rakefile -@@ -1,6 +1,4 @@ - require "rubygems" --require "rubygems/package_task" --require "rake/extensiontask" unless RUBY_PLATFORM == "java" - require "rake/testtask" - - spec = Gem::Specification.load("google-protobuf.gemspec") -@@ -95,57 +93,6 @@ else - FileUtils.cp(utf8_root+"/range2-neon.c", "ext/google/protobuf_c") - FileUtils.cp(utf8_root+"/range2-sse.c", "ext/google/protobuf_c") - end -- -- Rake::ExtensionTask.new("protobuf_c", spec) do |ext| -- unless RUBY_PLATFORM =~ /darwin/ -- # TODO: also set "no_native to true" for mac if possible. As is, -- # "no_native" can only be set if the RUBY_PLATFORM doing -- # cross-compilation is contained in the "ext.cross_platform" array. -- ext.no_native = true -- end -- ext.ext_dir = "ext/google/protobuf_c" -- ext.lib_dir = "lib/google" -- ext.cross_compile = true -- ext.cross_platform = [ -- 'x86-mingw32', 'x64-mingw32', 'x64-mingw-ucrt', -- 'x86_64-linux', 'x86-linux', -- 'x86_64-darwin', 'arm64-darwin', -- ] -- end -- -- task 'gem:java' do -- sh "rm Gemfile.lock" -- require 'rake_compiler_dock' -- # Specify the repo root as the working and mount directory to provide access -- # to the java directory -- repo_root = File.realdirpath File.join(Dir.pwd, '..') -- RakeCompilerDock.sh <<-"EOT", platform: 'jruby', rubyvm: :jruby, mountdir: repo_root, workdir: repo_root -- sudo apt-get install maven -y && \ -- cd java && mvn install -Dmaven.test.skip=true && cd ../ruby && \ -- bundle && \ -- IN_DOCKER=true rake compile gem -- EOT -- end -- -- task 'gem:windows' do -- sh "rm Gemfile.lock" -- require 'rake_compiler_dock' -- ['x86-mingw32', 'x64-mingw32', 'x64-mingw-ucrt', 'x86_64-linux', 'x86-linux'].each do |plat| -- RakeCompilerDock.sh <<-"EOT", platform: plat -- bundle && \ -- IN_DOCKER=true rake native:#{plat} pkg/#{spec.full_name}-#{plat}.gem RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0:2.6.0 -- EOT -- end -- end -- -- if RUBY_PLATFORM =~ /darwin/ -- task 'gem:native' do -- system "rake genproto" -- system "rake cross native gem RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0:2.6.0" -- end -- else -- task 'gem:native' => [:genproto, 'gem:windows', 'gem:java'] -- end - end - - task :genproto => genproto_output -@@ -154,9 +101,6 @@ task :clean do - sh "rm -f #{genproto_output.join(' ')}" - end - --Gem::PackageTask.new(spec) do |pkg| --end -- - # Skip build/genproto in Bazel builds, where we expect this to - # be done already. - Rake::TestTask.new(:test => ENV['BAZEL'] == 'true' ? [] : [:build, :genproto]) do |t| From 9e18a02c6ac83e8c361cc5c1eac40144b80457a3 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 20:33:41 -0500 Subject: [PATCH 039/313] user/sane: FTBFS --- user/sane/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/sane/APKBUILD b/user/sane/APKBUILD index 1eb5756..62a8a34 100644 --- a/user/sane/APKBUILD +++ b/user/sane/APKBUILD @@ -7,7 +7,8 @@ pkgver=1.1.1 pkgrel=3 pkgdesc="Scanner Access Now Easy - universal scanner interface" url="http://www.sane-project.org/" -arch="all" +# FTBFS +# arch="all" license="GPL-2.0-or-later GPL-2.0-or-later-with-sane-exception Public-Domain" makedepends="diffutils file libtool libusb-dev v4l-utils-dev net-snmp-dev avahi-dev curl-dev libpng-dev libjpeg-turbo-dev tiff-dev libgphoto2-dev From 00e537997327ca1ceb33e41efe6f094c7eb93078 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 20:34:19 -0500 Subject: [PATCH 040/313] user/tandoor-recipes: FTBFS --- user/tandoor-recipes/APKBUILD | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user/tandoor-recipes/APKBUILD b/user/tandoor-recipes/APKBUILD index 72a3d33..6ae8824 100644 --- a/user/tandoor-recipes/APKBUILD +++ b/user/tandoor-recipes/APKBUILD @@ -4,7 +4,8 @@ pkgname=tandoor-recipes pkgver=1.5.12 pkgrel=1 pkgdesc="Application for managing recipes, planning meals, building shopping lists, etc." -arch="noarch" +# FTBFS +# arch="noarch" url="https://github.com/TandoorRecipes/recipes" license="AGPL-3.0-only" depends=" @@ -56,7 +57,7 @@ depends=" py3-requests py3-six py3-uritemplate - py3-validators~=0.20 + py3-validators~0.20 py3-webdavclient3 py3-whitenoise py3-yaml From 3ea85f37b5200c17a2b65978f77edb5e640a3a36 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:57:33 -0400 Subject: [PATCH 041/313] backports/calibre: upgrade to 7.20.0 --- backports/calibre/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/calibre/APKBUILD b/backports/calibre/APKBUILD index 79582ee..74af5a9 100644 --- a/backports/calibre/APKBUILD +++ b/backports/calibre/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Cowington Post pkgname=calibre -pkgver=7.12.0 +pkgver=7.20.0 pkgrel=0 pkgdesc="Ebook management application" # qt6-webengine @@ -59,6 +59,7 @@ makedepends=" qt6-qtbase-dev uchardet-dev xdg-utils + ffmpeg-dev " subpackages=" $pkgname-pyc @@ -100,7 +101,6 @@ package() { python3 setup.py install \ --staging-root="$pkgdir"/usr \ - --no-compile \ --system-plugins-location=/usr/share/calibre/system-plugins cp -a man-pages/ "$pkgdir"/usr/share/man @@ -111,6 +111,6 @@ package() { } sha512sums=" -ee654260d7047f0579a659b8907439a407fb561affcef84141126840452e7b98d10bb5e0a69e0cc809d9ba68729570900a0e7251f18b2056a94b0213880f1363 calibre-7.12.0.tar.xz +3b6e2d4ed8d0755096b466f4bdcc8b6ca4810398caa2322c1efc30280680ff8b10dc5fb8cb763bed8fee82746e7c51c6f31f56e5d9689d5f43c671442004c532 calibre-7.20.0.tar.xz eb8e7ce40ff8b8daf6e7e55a5dff8ec4dff06c45744266bb48b3194e92ab1196bc91468203e3c2ca1e5144166a7d6be90e6cf0253513e761b56a4c85be4c2c76 0001-calibre-no-update.patch " From 88653d4dbd5e2169c5eead558a05990cb0414b7b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:57:51 -0400 Subject: [PATCH 042/313] backports/caprine: bump pkgrel --- backports/caprine/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/caprine/APKBUILD b/backports/caprine/APKBUILD index c77c50e..9a73d39 100644 --- a/backports/caprine/APKBUILD +++ b/backports/caprine/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Antoine Martin (ayakael) pkgname=caprine pkgver=2.60.1 -pkgrel=1 +pkgrel=2 pkgdesc="Elegant Facebook Messenger desktop app" arch="x86_64 aarch64" # blocked by electron url="https://github.com/sindresorhus/caprine" From 53e39d64e5fb42d1bb3e1afba439428fc6578efd Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:58:25 -0400 Subject: [PATCH 043/313] backports/coin: bump pkgrel --- backports/coin/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/coin/APKBUILD b/backports/coin/APKBUILD index 7881fd9..723ea30 100644 --- a/backports/coin/APKBUILD +++ b/backports/coin/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=coin pkgver=4.0.0 -pkgrel=6 +pkgrel=7 pkgdesc="OpenGL OpenInventor compatible graphics library" url="https://github.com/coin3d/coin" license="BSD-3-Clause" From 7c899e25cbd2ca98bf85dea985b01764f744351e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:58:57 -0400 Subject: [PATCH 044/313] backports/cura: bump pkgrel --- backports/cura/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backports/cura/APKBUILD b/backports/cura/APKBUILD index c6964f8..7c669be 100644 --- a/backports/cura/APKBUILD +++ b/backports/cura/APKBUILD @@ -7,12 +7,13 @@ pkgver=5.2.2 pkgrel=1 pkgdesc="3D printer / slicing GUI built on top of the Uranium framework" url="https://ultimaker.com/software/ultimaker-cura" -arch="noarch !ppc64le !x86 !armhf !riscv64 !s390x !armv7" # ppc64le: no py3-keyring +# ppc64le: no py3-keyring # x86: no curaengine # armhf: no uranium, qt5-qtquickcontrols, qt5-qtquickcontrols2, qt5-qtgraphicaleffects # riscv64: no uranium # s390x: no py3-trimesh, no py3-numpy-stl # armv7: no py3-trimesh +arch="noarch !ppc64le !x86 !armhf !riscv64 !s390x !armv7" license="LGPL-3.0-or-later" # add cura-binary-data to depends when packaged depends=" From 53280efc8788d3855ce41cb414afa6dd681e6111 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:59:14 -0400 Subject: [PATCH 045/313] backports/electron: upgrade to 33.0.2 --- backports/electron/APKBUILD | 153 +++++----- backports/electron/compiler.patch | 23 +- .../electron/disable-failing-tests.patch | 18 -- .../{icon.patch => electron_icon.patch} | 0 ...patch => electron_python-jinja-3.10.patch} | 0 .../electron_system-zlib-headers.patch | 10 + ...ode.patch => electron_unbundle-node.patch} | 13 +- ...hash.patch => electron_webpack-hash.patch} | 0 .../fix-missing-cstdint-include-musl.patch | 13 - backports/electron/import-version.patch | 15 - backports/electron/libstdc++13.patch | 269 ------------------ backports/electron/mman.patch | 13 - backports/electron/musl-sandbox.patch | 10 +- backports/electron/no-execinfo.patch | 14 +- backports/electron/no-mallinfo.patch | 18 +- .../electron/partalloc-no-tagging-arm64.patch | 11 + backports/electron/perfetto-libstdc++.patch | 20 -- backports/electron/pvalloc.patch | 14 +- backports/electron/quiche-array.patch | 12 - backports/electron/random-fixes.patch | 94 ------ backports/electron/system-zstd.patch | 46 --- 21 files changed, 142 insertions(+), 624 deletions(-) rename backports/electron/{icon.patch => electron_icon.patch} (100%) rename backports/electron/{python-jinja-3.10.patch => electron_python-jinja-3.10.patch} (100%) create mode 100644 backports/electron/electron_system-zlib-headers.patch rename backports/electron/{unbundle-node.patch => electron_unbundle-node.patch} (78%) rename backports/electron/{webpack-hash.patch => electron_webpack-hash.patch} (100%) delete mode 100644 backports/electron/fix-missing-cstdint-include-musl.patch delete mode 100644 backports/electron/import-version.patch delete mode 100644 backports/electron/libstdc++13.patch delete mode 100644 backports/electron/mman.patch delete mode 100644 backports/electron/perfetto-libstdc++.patch delete mode 100644 backports/electron/quiche-array.patch delete mode 100644 backports/electron/random-fixes.patch delete mode 100644 backports/electron/system-zstd.patch diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index a35cba1..12d58f4 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,16 +1,18 @@ -# Maintainer: lauren n. liberda +# Contributor: lauren n. liberda +# Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=30.0.9 -_semver="${pkgver/_beta/-beta.}" +pkgver=33.0.2 +_gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 -_chromium=124.0.6367.233 -_copium_tag=124.5 +_chromium=130.0.6723.59 +_copium_tag=129.1 _depot_tools=495b23b39aaba2ca3b55dd27cadc523f1cb17ee6 pkgdesc="Electron cross-platform desktop toolkit" url="https://github.com/electron/electron" arch="aarch64 x86_64" # same as chromium license="MIT" depends="gtk+3.0 so:libudev.so.1 xdg-utils" +_llvmver=19 makedepends=" ada-dev alsa-lib-dev @@ -22,7 +24,7 @@ makedepends=" bzip2-dev c-ares-dev cairo-dev - clang-dev + clang$_llvmver-dev clang-extra-tools compiler-rt crc32c-dev @@ -44,12 +46,12 @@ makedepends=" gzip harfbuzz-dev hdrhistogram-c-dev - highway-dev hunspell-dev http-parser-dev hwdata-dev java-jdk jpeg-dev + jsoncpp-dev krb5-dev lcms2-dev libarchive-tools @@ -75,7 +77,7 @@ makedepends=" libxslt-dev linux-headers lld - llvm + llvm$_llvmver mesa-dev minizip-dev nghttp2-dev @@ -95,11 +97,16 @@ makedepends=" py3-six python3 qt5-qtbase-dev + re2-dev rsync rust + rust-bindgen samurai + snappy-dev speex-dev + spirv-tools-dev sqlite-dev + woff2-dev xcb-proto yarn zlib-dev @@ -107,21 +114,18 @@ makedepends=" " subpackages="$pkgname-lang $pkgname-dev" # the lower patches are specific to electron, the top ones are from the equivalent chromium version -source="https://ab-sn.lnl.gay/electron-$_semver-$_chromium.tar.zst +source=" + https://ayakael.net/api/packages/mirrors/generic/electron/$_gittag/electron-$_gittag-$_chromium.tar.zst copium-$_copium_tag.tar.gz::https://codeberg.org/selfisekai/copium/archive/$_copium_tag.tar.gz chromium-revert-drop-of-system-java.patch compiler.patch disable-dns_config_service.patch disable-failing-tests.patch fc-cache-version.patch - fix-missing-cstdint-include-musl.patch fix-opus.patch fstatat-32bit.patch gdbinit.patch generic-sensor-include.patch - import-version.patch - libstdc++13.patch - mman.patch musl-auxv.patch musl-sandbox.patch musl-tid-caching.patch @@ -131,18 +135,15 @@ source="https://ab-sn.lnl.gay/electron-$_semver-$_chromium.tar.zst no-res-ninit-nclose.patch no-sandbox-settls.patch partalloc-no-tagging-arm64.patch - perfetto-libstdc++.patch pvalloc.patch - random-fixes.patch - quiche-array.patch - system-zstd.patch temp-failure-retry.patch yes-musl.patch - icon.patch - python-jinja-3.10.patch - webpack-hash.patch - unbundle-node.patch + electron_icon.patch + electron_python-jinja-3.10.patch + electron_webpack-hash.patch + electron_unbundle-node.patch + electron_system-zlib-headers.patch default.conf electron.desktop @@ -150,21 +151,23 @@ source="https://ab-sn.lnl.gay/electron-$_semver-$_chromium.tar.zst " _copium_patches=" cr124-iwyu-sys-select-dawn-terminal.patch - cr124-libwebp-shim-sharpyuv.patch + cr126-aarch64-musl-unsupported-relocation.patch + cr129-ffmpeg-no-noh264parse.patch + cr129-musl-metricts-imports.patch " # tests are todo for some base checks options="!check net suid" -builddir="$srcdir/electron-$_semver-$_chromium" +builddir="$srcdir/electron-$_gittag-$_chromium" export PATH="$PATH:/usr/lib/qt5/bin" -export CC=clang -export CXX=clang++ +export CC=clang-$_llvmver +export CXX=clang++-$_llvmver # required to find the tools export AR=llvm-ar export NM=llvm-nm -export LD=clang++ +export LD=clang++-$_llvmver # less log spam, reproducible export CFLAGS="${CFLAGS/-g/} -O2 -Wno-builtin-macro-redefined -Wno-deprecated-declarations -Wno-shift-count-overflow -Wno-ignored-attributes" @@ -188,6 +191,7 @@ snapshot() { # vpython3 execs system python3 with this set export VPYTHON_BYPASS="manually managed python not supported by chrome operations" export CHROMIUM_BUILDTOOLS_PATH="$srcdir/src/buildtools" + export DEPOT_TOOLS_UPDATE=0 mkdir -p "$srcdir" cd "$srcdir" @@ -205,7 +209,7 @@ snapshot() { echo "solutions = [ { \"name\": \"src/electron\", - \"url\": \"https://github.com/electron/electron.git@v$_semver\", + \"url\": \"https://github.com/electron/electron.git@$_gittag\", \"deps_file\": \"DEPS\", \"managed\": False, \"custom_deps\": { @@ -220,8 +224,7 @@ snapshot() { --nohooks python3 src/build/landmines.py - python3 src/build/util/lastchange.py -o src/build/util/LASTCHANGE - python3 src/build/util/lastchange.py -s src/third_party/dawn \ + python3 src/build/util/lastchange.py -o src/build/util/LASTCHANGE \ --revision src/gpu/webgpu/DAWN_VERSION python3 src/build/util/lastchange.py -m GPU_LISTS_VERSION \ --revision-id-only --header src/gpu/config/gpu_lists_version.h @@ -234,26 +237,27 @@ snapshot() { python3 src/electron/script/apply_all_patches.py \ src/electron/patches/config.json - mv src $pkgname-$_semver-$_chromium + mv src $pkgname-$_gittag-$_chromium # extra binaries are most likely things we don't want, so nuke them all - for elf in $(scanelf -RA -F "%F" $pkgname-$_semver-$_chromium); do + for elf in $(scanelf -RA -F "%F" $pkgname-$_gittag-$_chromium); do rm -f "$elf" done msg "generating tarball.. (this takes a while)" - tar -cf $pkgname-$_semver-$_chromium.tar \ + tar -cf $pkgname-$_gittag-$_chromium.tar \ --exclude="ChangeLog*" \ --exclude="testdata/*" \ --exclude="test_data/*" \ --exclude="android_rust_toolchain/*" \ + --exclude="third_party/instrumented_libs/binaries" \ --exclude-backups \ --exclude-caches-all \ --exclude-vcs \ - $pkgname-$_semver-$_chromium + $pkgname-$_gittag-$_chromium - zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv $pkgname-$_semver-$_chromium.tar -o "$SRCDEST"/$pkgname-$_semver-$_chromium.tar.zst - mcli cp "$SRCDEST"/$pkgname-$_semver-$_chromium.tar.zst "$_distbucket" + zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv $pkgname-$_gittag-$_chromium.tar -o "$SRCDEST"/$pkgname-$_gittag-$_chromium.tar.zst + mcli cp "$SRCDEST"/$pkgname-$_gittag-$_chromium.tar.zst "$_distbucket" } prepare() { @@ -267,7 +271,7 @@ prepare() { ;; esac done - if [ ! -z "$failed" ]; then + if [ -n "$failed" ]; then error "The following patches failed to apply:" for i in $failed; do printf " %s\n" "$i" >&2 @@ -291,9 +295,9 @@ prepare() { git config commit.gpgsign false git add LICENSE git commit -m "init" - git tag "v$_semver" + git tag "$_gittag" git pack-refs - yarn install --frozen-lockfile --no-scripts + yarn install --frozen-lockfile --ignore-scripts ) ( @@ -303,10 +307,11 @@ prepare() { # reusable system library settings # flatbuffers - tensorflow has a few static_asserts for a specific patch version + # highway - requires highway>=1.1.0 (arm failures) # libavif - https://github.com/AOMediaCodec/libavif/commit/50a541469c98009016af8dcc9f83a1be79f3a7d9 # libaom - https://aomedia.googlesource.com/aom/+/706ee36dcc82%5E%21/ # but watch this space: https://aomedia-review.googlesource.com/c/aom/+/188606 - # jsoncpp, re2, snappy, swiftshader, vulkan, woff2 - needs use_custom_libcxx=false + # jsoncpp, re2, snappy, swiftshader-*, woff2 - requires use_custom_libcxx=false local chromium_use_system=" brotli crc32c @@ -317,7 +322,6 @@ prepare() { fontconfig freetype harfbuzz-ng - highway icu libdrm libevent @@ -333,8 +337,9 @@ prepare() { zstd " - for _lib in $chromium_use_system jinja2 libjpeg_turbo; do + for _lib in $chromium_use_system jinja2 libjpeg_turbo unrar; do msg "Removing buildscripts for system provided $_lib" + _lib="${_lib/swiftshader-/swiftshader/third_party/}" find . -type f -path "*third_party/$_lib/*" \ \! -path "*third_party/$_lib/chromium/*" \ \! -path "*third_party/$_lib/google/*" \ @@ -387,6 +392,12 @@ prepare() { $chromium_use_system python3 third_party/libaddressinput/chromium/tools/update-strings.py + # flatc is used in build workflows since https://crrev.com/c/5595037, + # but the pre-generated files are still checked-in. remove to make sure + # they're not used. (if used, they will break builds on version mismatch.) + # https://github.com/tensorflow/tensorflow/issues/62298 + # find third_party/tflite/ -name '*_generated.h' -delete + # prevent annoying errors when regenerating gni sed -i 's,^update_readme$,#update_readme,' \ third_party/libvpx/generate_gni.sh @@ -399,8 +410,7 @@ prepare() { sed -i -e 's/\/malloc/' -e 's/\/free/' \ third_party/blink/renderer/core/xml/*.cc \ third_party/blink/renderer/core/xml/parser/xml_document_parser.cc \ - third_party/libxml/chromium/*.cc \ - third_party/maldoca/src/maldoca/ole/oss_utils.h + third_party/libxml/chromium/*.cc _configure } @@ -409,8 +419,6 @@ _configure() { cd "$builddir" msg "Configuring build" - local clang_ver="$(clang -dumpversion)" - case "$USE_CCACHE" in 1) local cc_wrapper="ccache" @@ -433,7 +441,7 @@ _configure() { chrome_pgo_phase=0 clang_base_path=\"/usr\" clang_use_chrome_plugins=false - clang_version=\"${clang_ver%%.*}\" + clang_version=\"$_llvmver\" custom_toolchain=\"//build/toolchain/linux/unbundle:default\" disable_fieldtrial_testing_config=true enable_hangout_services_extension=true @@ -453,11 +461,12 @@ _configure() { is_official_build=true link_pulseaudio=true proprietary_codecs=true - regenerate_x11_protos=true rtc_link_pipewire=true rtc_use_pipewire=true rustc_version=\"yes\" + rust_bindgen_root=\"/usr\" rust_sysroot_absolute=\"/usr\" + safe_browsing_use_unrar=false symbol_level=$symbol_level treat_warnings_as_errors=false use_custom_libcxx=true @@ -490,15 +499,12 @@ _configure() { build() { export PATH="$PATH:/usr/lib/qt5/bin" - # ~1 GB per concurrent job is not enough with gcc - _njobs="${NJOBS:-"$(python3 -c 'import os; print(max((os.cpu_count() - (10 if os.uname().machine == "aarch64" else 8), 1)))')"}" - - ninja -C out/Release -j$_njobs \ + ninja -C out/Release \ + copy_node_headers \ electron_dist_zip \ node_gypi_headers \ node_version_header - cp -vf out/Release/gen/node_headers/include/node/config.gypi third_party/electron_node/config.gypi } package() { @@ -512,13 +518,7 @@ package() { install -Dm755 "$srcdir"/default.conf "$pkgdir"/etc/electron/default.conf mkdir -p "$pkgdir"/usr/include/electron - - ( - cd third_party/electron_node/ - HEADERS_ONLY=1 python3 ./tools/install.py install "$pkgdir" "/usr/include/electron/node_headers" - ) - # required overrides - install -Dm644 out/Release/gen/node_headers/include/node/* -t "$pkgdir"/usr/include/electron/node_headers/include/node + cp -rv "$builddir"/out/Release/gen/node_headers "$pkgdir"/usr/include/electron ln -sv /usr/include/electron/node_headers/include/node "$pkgdir"/usr/include/electron/node mkdir -p "$pkgdir"/usr/include/electron/node_headers/include/nan @@ -544,41 +544,34 @@ lang() { } sha512sums=" -97024407a16fb41ec56fcc6df5552165ce4eea34fc51b17ecbf30a7e35406baccf8a3001a795a06d1e92d32e134d9d7a18d59fa74eda1b1bc23b59bc4947929b electron-30.0.9-124.0.6367.233.tar.zst -13c647dc2024e27ae8a4d7e8f1202037a342f4a7054477226665c332029e1b6f1d8b99004c2b2809bcf1e6c19b1359ef5e1c971552d7ced59c5b43d5a836af88 copium-124.5.tar.gz +6523db0feb88a742a8c7228481ae25ed9ea4eaf1cbab84d9a91212bf3590f1b87fd244bc6583e90e78ab15e4be28cc70ddaa270d582c68eaa131e3be455c58fe electron-v33.0.2-130.0.6723.59.tar.zst +6138b3dbf3903c78f4ca1ed5a6c3c3c485471ded31976010484ce8893d03953df2b8f066a4fe84bbde5ae7ef9bbff664ef917e247b2e95dd471de40f2774d7d0 copium-129.1.tar.gz 29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch -54eb147c0af2ba096d1df375a289b339ee855ab1a9114e7c747753f0274a6bafb7212c1859b7885454c4529d9a5e3bd9559fc14e8e006f23ccd381895fa68d15 compiler.patch +53b7cdee8f7bfb4c9371cb385c473e34ed3d8ac7efaa43c0af061107560be30d8747b07fb0b16c01079b8c770f2c721bb5a8081313b7c126856ea4078a74da2a compiler.patch 4057cc78f10bfd64092bc35a373869abb1d68b880cdbca70422f39ffd78a929c19c7728d4d4c40709aaba25581148a93ae5343e724849fd35323062ed68753fa disable-dns_config_service.patch -111bc22fb704d97759988268a40d6b356c51b0bd7a8119a694e905ffe21850ff64e91566cd0dd0c9d62fcb46dca8acc821436c34eb0ba78be872ee4f7ec88a7b disable-failing-tests.patch +2470904846e3adde2c9506f9e78220daca0932320b628dd3d427bf2b7c17a8f7880cb97e787b046c28de7aca642e1a8d30824d6049905976da77e7473baa64da disable-failing-tests.patch 5fc5c012c1db6cf1ba82f38c6f3f4f5ca3a209e47ac708a74de379b018e0649b7694877c9571ef79002dde875ffc07b458a3355425f1c01867f362c66c2bc1bf fc-cache-version.patch -9200f78bad70e95c648a5e8392d50642190600f655c6baa366ff6467ebad52d3b3f305dad58f3610da67136f4b723557653b174ec5c25be8d8737ee04d9ee09f fix-missing-cstdint-include-musl.patch b24563e9a738c00fce7ff2fbdee3d7c024d9125d7c74d9ab90af6bdb16f7ec8419f2c8aa78c0640f6d5d81c17dc2c673a194401d354f466749672729b48ed068 fix-opus.patch c63dee5044353eb306a39ca1526158c0f003ab310ecb03d1c368dc2a979454590c84b8d3c15484517d5e66bb8add9b231da9abbadf2e50850abd72ac1345c4ab fstatat-32bit.patch 33ee60863cc438ef57ffef92ba4cf67a856a5ffc16138bce241bcf87e47b15154aa86918e793c26f7ec4dc62a445257ad5673ed7001daf22c4043cf6cc57da7f gdbinit.patch 36a764fa73443b47d38050b52dbe6ad2fa8d67201ff4ccdbad13b52308ef165ca046aac6f9609fe35890a6485f0f3e672e78cc41e3e44f3cdc7f145e540524e8 generic-sensor-include.patch -8de65109ece27ea63bd469f2220c56b8c752ba0a50fdf390082a2d5ae74b8e010199126175569f6d5084270dd4e0571e68aec32c0bca8211a6699925b3a09124 import-version.patch -c49a1b06e061faa430d66dd5b404ef6c843e4d8a6e9012e963009a161b4726f8eb92c4da8fa710f8861f6e4daa8be5f68abee41a7d9fc02f2a0eb61ce53b5fdd libstdc++13.patch -e75f57ae34c97ca1caf15fa4b4106c6c1e79c31ed66869cf92ed9ea0c449886c9511e455047c17c1e9ad8b9a46ad4948511a4f2995a4b6030fb4d1c7ae21d038 mman.patch 99bcc7dd485b404a90c606a96addab1d900852128d44fb8cea8acc7303189ef87c89a7b0e749fd0e10c5ef5f6bf1fadeb5c16a34503cab6a59938ce2653d887e musl-auxv.patch -50c274a420bb8a7f14fcb56e40920dac8f708792a4520789b4987facea459bef88113d5a2b60fa8c57bee6e92bff3617d6b73fa305c8c44614c638971cffd440 musl-sandbox.patch +51f1959bd622af26a1c3a1f4b0ad9a5bfa461057aa4cf9960c568dddf8ac47d55989c277f5d5ab5db040a04c54925a531af7a1cc767559218b408eaa6bdd7577 musl-sandbox.patch e7163ac5810ac85366cef2447412287c856e3d67c6b77f219a6e5a418b1965b98e449c409424ad0704a5bded9355dd0aec3dc4585918ce5a2ab36c079707afe2 musl-tid-caching.patch 92eb002718026611f5542362ad69b67f0a398ff71b3fca5c05d55cb5c6f9f29334e5e127bb4860cfaa3fba0f0d4c901e2b98808217e7dc02e254a64a5c9521aa musl-v8-monotonic-pthread-cont_timedwait.patch -73bca6c6f9873f2f11cef04f3f41f71e0ae86e7e2d77e14db4298675fec390744c5081f6fdb14052e5ee2b5885be1198c3aa6068eb2b656d1a665c0c3f36e708 no-execinfo.patch -8e17101d69e23b456a9c03dc2fe95bcd56846389707ba6f4720192a9e9168406d20d9168dbebbb3a47d921ec92e478f0e390f46e6b9bb43a34dda217c6e6448b no-mallinfo.patch +a250cff50d282b02ce0f28880d0a2b4fb8e7df51bc072bfeeddc561c29a7c76453dbcbc7b17b82966a7b30a31409d2555720d1dcf963e1b3fb8a2a06a6abcf46 no-execinfo.patch +0b41aeb6b212f9c3f61aa0a8d3085c9e865a2e68f3270ceec2376aab67f337ac46eaea7da36d3fd7219e2a1cb731b7aa2d3fb619a374d2b7653976b9f4f384bb no-mallinfo.patch e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9c46ea066405857536964a36436a68eecf7da7952736333cf no-res-ninit-nclose.patch 6dc4d8dc92e685dace62265a1ddb3aebc558aed54d20ff6d36b030be0c48d7e84662326c31363612492574d9a03c62653cdc21a60995b97dee1d75cae86a9f9b no-sandbox-settls.patch -d4ac7f350806b4410ccb1df3b0ad7e90a7b6d724a16919761aa2d47a6f21008c7374da528b05b754ee712b85d23adfb113c7f7b9ca2ed5b47644fe3ea0cb9119 partalloc-no-tagging-arm64.patch -8e1aca983890c78d81a6f888b2cf1aa42878d1f8523e87d63b800e1e468cbfd33e5ff6a0975775ca222fe82f30c6497da95505da01b091c8776a44c98ac86f0f perfetto-libstdc++.patch -2eb434b4fc6aee77026492644cd86772a543d9845f112a75cd4c3e1f25c9435cc31f8454c1c73223451fc9be69b86e822ff68821978f67f2fc8bcba50296d8e0 pvalloc.patch -803b8117c65132f76bec42054a4b2257a078b15b07fd08645fec2dfd51aa4e0075a9015300cd579d4ae0d757d9850b9988e080cfc2eea093f6684fdf82c4722c random-fixes.patch -86f612dd2b39602984a75b1b11c2ab8bc8cc6b4e78fae998570a777a6901ae45fdcdb22e46dd006dab703a0674e64c72cf8120af2dc5b9e78004f402c7e65358 quiche-array.patch -b3beb98b539fe160fbc493ba410ae0f68540cc4b6834f1f8ce9a22c3f4f59ef5d583ad48793e10549fd02a701f833a3969791ef4524322cd1e715ca5bf226bc8 system-zstd.patch +f2b08538ff57c50b3772a07ca91845f9d45f4a5112f608b6192d4fb5d7be48f478c0c36194d95ab7bbf933e0278e5c6d578619d8643895cdc40386eebc5b975f partalloc-no-tagging-arm64.patch +03f829a2da633533ef3fd0f287f5ec602d936a97a98b53cd2415553c2537ae9d571f35397ca7c9fb3f4b0806c300e3b189569f8d979ca132e1a2a4dae7206396 pvalloc.patch e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb temp-failure-retry.patch 914ccf649d7771f19f209ab97f99c481aebc6f66174d68e8b539f6ad4a70bc8cb0fae2df6dadbf0415958ffb3574c420fe029079dcce45f5e5add4db2e903566 yes-musl.patch -465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec icon.patch -e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 python-jinja-3.10.patch -2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 webpack-hash.patch -ebb18a0e2eba4b4606e900fa82f4b57fe91dcbdc943e17544bccb3c9a011a49b4331cdbee59629e44b80184bad4ea54ec887c0bfcd00cda8d5686060dbf365e3 unbundle-node.patch +465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch +e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch +2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch +57aa81d46b9cc931092d9d9b3cb4a9859f86c183a236bc5cca6abbaeca86b82bf1b537dd9cb3412114fa4e86087c0022ee3f7e88de974d29b309e9d1714df7a5 electron_unbundle-node.patch +1b35edcf0b41e39e20c4d64dbb978bcaab8036f2fe839930709b269c50cb1321458a15b4d0013246f9e03f58f250a1e3a57ea910db1aa0adbd602a6a11ad33b9 electron_system-zlib-headers.patch e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e default.conf 191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463 electron.desktop 5f7ba5ad005f196facec1c0f26108356b64cafb1e5cfa462ff714a33b8a4c757ac00bfcb080da09eb5b65032f8eb245d9676a61ec554515d125ed63912708648 electron-launcher.sh diff --git a/backports/electron/compiler.patch b/backports/electron/compiler.patch index fedc978..cce8a23 100644 --- a/backports/electron/compiler.patch +++ b/backports/electron/compiler.patch @@ -1,12 +1,12 @@ --- ./build/config/compiler/BUILD.gn.orig +++ ./build/config/compiler/BUILD.gn -@@ -613,24 +613,6 @@ +@@ -568,24 +568,6 @@ } } -- # TODO(crbug.com/1488374): This causes binary size growth and potentially +- # TODO(crbug.com/40283598): This causes binary size growth and potentially - # other problems. -- # TODO(crbug.com/1491036): This isn't supported by Cronet's mainline llvm version. +- # TODO(crbug.com/40284925): This isn't supported by Cronet's mainline llvm version. - if (default_toolchain != "//build/toolchain/cros:target" && - !llvm_android_mainline) { - cflags += [ @@ -22,10 +22,10 @@ - } - } - - # TODO(crbug.com/1235145): Investigate why/if this should be needed. + # TODO(crbug.com/40192287): Investigate why/if this should be needed. if (is_win) { cflags += [ "/clang:-ffp-contract=off" ] -@@ -1005,17 +987,6 @@ +@@ -998,17 +980,6 @@ # `-nodefaultlibs` from the linker invocation from Rust, which would be used # to compile dylibs on Android, such as for constructing unit test APKs. "-Cdefault-linker-libraries", @@ -43,7 +43,7 @@ ] if (!is_win || force_rustc_color_output) { -@@ -1182,8 +1153,8 @@ +@@ -1175,8 +1146,8 @@ } else if (current_cpu == "arm") { if (is_clang && !is_android && !is_nacl && !(is_chromeos_lacros && is_chromeos_device)) { @@ -54,7 +54,7 @@ } if (!is_nacl) { cflags += [ -@@ -1197,8 +1168,8 @@ +@@ -1190,8 +1161,8 @@ } else if (current_cpu == "arm64") { if (is_clang && !is_android && !is_nacl && !is_fuchsia && !(is_chromeos_lacros && is_chromeos_device)) { @@ -65,7 +65,7 @@ } } else if (current_cpu == "mipsel" && !is_nacl) { ldflags += [ "-Wl,--hash-style=sysv" ] -@@ -1983,7 +1954,7 @@ +@@ -1982,7 +1953,7 @@ defines = [ "_HAS_NODISCARD" ] } } else { @@ -76,7 +76,7 @@ cflags += [ "-Wextra" ] --- ./build/config/rust.gni.orig +++ ./build/config/rust.gni -@@ -186,11 +186,11 @@ +@@ -185,11 +185,11 @@ rust_abi_target = "" if (is_linux || is_chromeos) { if (current_cpu == "arm64") { @@ -91,7 +91,7 @@ } else if (current_cpu == "arm") { if (arm_float_abi == "hard") { float_suffix = "hf" -@@ -199,13 +199,13 @@ +@@ -198,15 +198,15 @@ } if (arm_arch == "armv7-a" || arm_arch == "armv7") { # No way to inform Rust about the -a suffix. @@ -101,6 +101,9 @@ - rust_abi_target = "arm-unknown-linux-gnueabi" + float_suffix + rust_abi_target = "armv6-alpine-linux-musleabi" + float_suffix } + } else if (current_cpu == "riscv64") { +- rust_abi_target = "riscv64gc-unknown-linux-gnu" ++ rust_abi_target = "riscv64-alpine-linux-musl" } else { # Best guess for other future platforms. - rust_abi_target = current_cpu + "-unknown-linux-gnu" diff --git a/backports/electron/disable-failing-tests.patch b/backports/electron/disable-failing-tests.patch index 2ee8f2b..84d0027 100644 --- a/backports/electron/disable-failing-tests.patch +++ b/backports/electron/disable-failing-tests.patch @@ -160,24 +160,6 @@ ProcessAlternativeServicesTest.Process*: crashed ? TEST_F(FileUtilTest, FILEToFile) { ScopedFILE stream; ---- a/base/debug/stack_trace_unittest.cc -+++ b/base/debug/stack_trace_unittest.cc -@@ -345,6 +345,7 @@ - // sometimes we read fp / pc from the place that previously held - // uninitialized value. - // TODO(crbug.com/1132511): Enable this test on Fuchsia. -+#if 0 - #if defined(MEMORY_SANITIZER) || BUILDFLAG(IS_FUCHSIA) - #define MAYBE_TraceStackFramePointersFromBuffer \ - DISABLED_TraceStackFramePointersFromBuffer -@@ -357,6 +358,7 @@ - const void* frames[kDepth]; - ExpectStackFramePointers(frames, kDepth, /*copy_stack=*/true); - } -+#endif - - #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_APPLE) - #define MAYBE_StackEnd StackEnd --- a/base/threading/platform_thread_unittest.cc +++ b/base/threading/platform_thread_unittest.cc @@ -416,6 +416,7 @@ diff --git a/backports/electron/icon.patch b/backports/electron/electron_icon.patch similarity index 100% rename from backports/electron/icon.patch rename to backports/electron/electron_icon.patch diff --git a/backports/electron/python-jinja-3.10.patch b/backports/electron/electron_python-jinja-3.10.patch similarity index 100% rename from backports/electron/python-jinja-3.10.patch rename to backports/electron/electron_python-jinja-3.10.patch diff --git a/backports/electron/electron_system-zlib-headers.patch b/backports/electron/electron_system-zlib-headers.patch new file mode 100644 index 0000000..0dc5c8e --- /dev/null +++ b/backports/electron/electron_system-zlib-headers.patch @@ -0,0 +1,10 @@ +--- ./electron/BUILD.gn.orig ++++ ./electron/BUILD.gn +@@ -1565,7 +1565,6 @@ + public_deps = header_groups + [ + ":node_gypi_headers", + ":node_version_header", +- ":zlib_headers", + ] + } + diff --git a/backports/electron/unbundle-node.patch b/backports/electron/electron_unbundle-node.patch similarity index 78% rename from backports/electron/unbundle-node.patch rename to backports/electron/electron_unbundle-node.patch index 08122af..d69f5ae 100644 --- a/backports/electron/unbundle-node.patch +++ b/backports/electron/electron_unbundle-node.patch @@ -52,9 +52,11 @@ if (use_system_cares) { configs += [ ":cares" ] } else { ---- ./electron/script/generate-config-gypi.py.orig -+++ ./electron/script/generate-config-gypi.py -@@ -62,6 +62,11 @@ +diff --git a/./electron/script/generate-config-gypi.py.orig b/./electron/script/generate-config-gypi.py +index b41cd7eb450..bc4098debb5 100755 +--- a/./electron/script/generate-config-gypi.py.orig ++++ b/./electron/script/generate-config-gypi.py +@@ -62,6 +62,11 @@ def main(target_file, target_cpu): # Used by certain versions of node-gyp. v['build_v8_with_gn'] = 'false' @@ -63,6 +65,5 @@ + if v.get(f'node_shared_{dep}') is not None: + v[f'node_shared_{dep}'] = 'true' + - with open(target_file, 'w+') as f: - f.write(pprint.pformat(config, indent=2)) - + with open(target_file, 'w+', encoding='utf-8') as file_out: + file_out.write(pprint.pformat(config, indent=2)) diff --git a/backports/electron/webpack-hash.patch b/backports/electron/electron_webpack-hash.patch similarity index 100% rename from backports/electron/webpack-hash.patch rename to backports/electron/electron_webpack-hash.patch diff --git a/backports/electron/fix-missing-cstdint-include-musl.patch b/backports/electron/fix-missing-cstdint-include-musl.patch deleted file mode 100644 index 00f16af..0000000 --- a/backports/electron/fix-missing-cstdint-include-musl.patch +++ /dev/null @@ -1,13 +0,0 @@ -Patch-Source: https://github.com/void-linux/void-packages/blob/378db3cf5087877588aebaaa8ca3c9d94dfb54e0/srcpkgs/chromium/patches/fix-missing-cstdint-include-musl.patch -fixed in https://github.com/google/quiche/commit/4d4820f0a959be7fa22285d114a5b5b8676f10fe --- ---- a/net/third_party/quiche/src/quiche/http2/adapter/window_manager.h -+++ b/net/third_party/quiche/src/quiche/http2/adapter/window_manager.h -@@ -3,6 +3,7 @@ - - #include - -+#include - #include - - #include "common/platform/api/quiche_export.h" diff --git a/backports/electron/import-version.patch b/backports/electron/import-version.patch deleted file mode 100644 index d275038..0000000 --- a/backports/electron/import-version.patch +++ /dev/null @@ -1,15 +0,0 @@ -they fixed the import to be glibc conditional, but now nothing is imported so -all the string functions are missing. --- ---- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc -+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc -@@ -61,8 +61,7 @@ - - // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch - // of lacros-chrome is complete. --#if defined(__GLIBC__) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) --#include -+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) - - #include "base/linux_util.h" - #include "base/strings/string_split.h" diff --git a/backports/electron/libstdc++13.patch b/backports/electron/libstdc++13.patch deleted file mode 100644 index c49f7e8..0000000 --- a/backports/electron/libstdc++13.patch +++ /dev/null @@ -1,269 +0,0 @@ -missing libstdc++13 includes --- ---- a/third_party/openscreen/src/platform/base/error.h -+++ b/third_party/openscreen/src/platform/base/error.h -@@ -6,6 +6,7 @@ - #define PLATFORM_BASE_ERROR_H_ - - #include -+#include - #include - #include - #include ---- a/ui/base/prediction/kalman_filter.h -+++ b/ui/base/prediction/kalman_filter.h -@@ -8,6 +8,8 @@ - #include "base/component_export.h" - #include "ui/gfx/geometry/matrix3_f.h" - -+#include -+ - namespace ui { - - // This Kalman filter is used to predict state in one axles. ---- a/ui/events/types/scroll_types.h -+++ b/ui/events/types/scroll_types.h -@@ -5,6 +5,8 @@ - #ifndef UI_EVENTS_TYPES_SCROLL_TYPES_H_ - #define UI_EVENTS_TYPES_SCROLL_TYPES_H_ - -+#include -+ - namespace ui { - - enum class ScrollGranularity : uint8_t { ---- a/third_party/webrtc/rtc_base/system/file_wrapper.h -+++ b/third_party/webrtc/rtc_base/system/file_wrapper.h -@@ -14,6 +14,7 @@ - #include - #include - -+#include - #include - - #include "absl/strings/string_view.h" ---- a/third_party/pdfium/constants/annotation_flags.h -+++ b/third_party/pdfium/constants/annotation_flags.h -@@ -5,6 +5,8 @@ - #ifndef CONSTANTS_ANNOTATION_FLAGS_H_ - #define CONSTANTS_ANNOTATION_FLAGS_H_ - -+#include -+ - namespace pdfium { - namespace annotation_flags { - ---- a/third_party/s2cellid/src/s2/util/math/mathutil.h -+++ b/third_party/s2cellid/src/s2/util/math/mathutil.h -@@ -21,6 +21,7 @@ - #ifndef S2_UTIL_MATH_MATHUTIL_H_ - #define S2_UTIL_MATH_MATHUTIL_H_ - -+#include - #include - - class MathUtil { ---- a/third_party/s2cellid/src/s2/s1angle.h -+++ b/third_party/s2cellid/src/s2/s1angle.h -@@ -24,6 +24,7 @@ - #define S2_S1ANGLE_H_ - - #include -+#include - #include - #include - #include ---- a/third_party/maldoca/src/maldoca/ole/header.h -+++ b/third_party/maldoca/src/maldoca/ole/header.h -@@ -45,6 +45,8 @@ - - #include "absl/strings/string_view.h" - -+#include -+ - namespace maldoca { - - class OLEHeader { ---- a/components/password_manager/core/browser/generation/password_generator.h -+++ b/components/password_manager/core/browser/generation/password_generator.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_GENERATION_PASSWORD_GENERATOR_H_ - #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_GENERATION_PASSWORD_GENERATOR_H_ - -+#include - #include - - ---- a/base/debug/profiler.h -+++ b/base/debug/profiler.h -@@ -7,6 +7,7 @@ - - #include - -+#include - #include - - #include "base/base_export.h" ---- a/components/dom_distiller/core/url_utils.h -+++ b/components/dom_distiller/core/url_utils.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_DOM_DISTILLER_CORE_URL_UTILS_H_ - #define COMPONENTS_DOM_DISTILLER_CORE_URL_UTILS_H_ - -+#include - #include - - #include "base/strings/string_piece_forward.h" ---- a/components/feature_engagement/internal/event_storage_validator.h -+++ b/components/feature_engagement/internal/event_storage_validator.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_FEATURE_ENGAGEMENT_INTERNAL_EVENT_STORAGE_VALIDATOR_H_ - #define COMPONENTS_FEATURE_ENGAGEMENT_INTERNAL_EVENT_STORAGE_VALIDATOR_H_ - -+#include - #include - - namespace feature_engagement { ---- a/chrome/test/chromedriver/chrome/web_view_impl.cc -+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - ---- a/cc/trees/target_property.cc -+++ b/cc/trees/target_property.cc -@@ -2,6 +2,8 @@ - // Use of this source code is governed by a BSD-style license that can be - // found in the LICENSE file. - -+#include -+ - #include "cc/trees/target_property.h" - - #include "ui/gfx/animation/keyframe/target_property.h" ---- a/gpu/config/gpu_feature_info.h -+++ b/gpu/config/gpu_feature_info.h -@@ -5,6 +5,7 @@ - #ifndef GPU_CONFIG_GPU_FEATURE_INFO_H_ - #define GPU_CONFIG_GPU_FEATURE_INFO_H_ - -+#include - #include - #include - ---- a/gpu/config/gpu_driver_bug_workarounds.h -+++ b/gpu/config/gpu_driver_bug_workarounds.h -@@ -5,6 +5,7 @@ - #ifndef GPU_CONFIG_GPU_DRIVER_BUG_WORKAROUNDS_H_ - #define GPU_CONFIG_GPU_DRIVER_BUG_WORKAROUNDS_H_ - -+#include - #include - - #include "build/build_config.h" ---- a/third_party/blink/public/common/page_state/page_state.h -+++ b/third_party/blink/public/common/page_state/page_state.h -@@ -5,6 +5,7 @@ - #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_H_ - #define THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_H_ - -+#include - #include - #include - ---- a/pdf/document_attachment_info.h -+++ b/pdf/document_attachment_info.h -@@ -5,6 +5,7 @@ - #ifndef PDF_DOCUMENT_ATTACHMENT_INFO_H_ - #define PDF_DOCUMENT_ATTACHMENT_INFO_H_ - -+#include - #include - - ---- a/components/payments/content/utility/fingerprint_parser.h -+++ b/components/payments/content/utility/fingerprint_parser.h -@@ -7,6 +7,7 @@ - - #include - -+#include - #include - #include - ---- a/media/base/video_transformation.h -+++ b/media/base/video_transformation.h -@@ -5,6 +5,7 @@ - #ifndef MEDIA_BASE_VIDEO_TRANSFORMATION_H_ - #define MEDIA_BASE_VIDEO_TRANSFORMATION_H_ - -+#include - #include - - #include "base/numerics/math_constants.h" ---- a/components/omnibox/browser/on_device_head_model.h -+++ b/components/omnibox/browser/on_device_head_model.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_HEAD_MODEL_H_ - #define COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_HEAD_MODEL_H_ - -+#include - #include - #include - #include ---- a/components/autofill/core/browser/autofill_ablation_study.h -+++ b/components/autofill/core/browser/autofill_ablation_study.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_ABLATION_STUDY_H_ - #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_ABLATION_STUDY_H_ - -+#include - #include - - class GURL; ---- a/components/autofill/core/browser/strike_databases/strike_database_base.h -+++ b/components/autofill/core/browser/strike_databases/strike_database_base.h -@@ -5,6 +5,7 @@ - #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASES_STRIKE_DATABASE_BASE_H_ - #define COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASES_STRIKE_DATABASE_BASE_H_ - -+#include - #include - #include - #include ---- a/chrome/browser/resource_coordinator/decision_details.h -+++ b/chrome/browser/resource_coordinator/decision_details.h -@@ -5,6 +5,7 @@ - #ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_DECISION_DETAILS_H_ - #define CHROME_BROWSER_RESOURCE_COORDINATOR_DECISION_DETAILS_H_ - -+#include - #include - #include - ---- a/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_stream_sender_delegate.h -+++ b/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_stream_sender_delegate.h -@@ -8,6 +8,8 @@ - #include "absl/strings/string_view.h" - #include "quiche/quic/platform/api/quic_export.h" - -+#include -+ - namespace quic { - - // This interface writes encoder/decoder data to peer. ---- a/third_party/perfetto/include/perfetto/base/export.h -+++ b/third_party/perfetto/include/perfetto/base/export.h -@@ -17,6 +17,8 @@ - #ifndef INCLUDE_PERFETTO_BASE_EXPORT_H_ - #define INCLUDE_PERFETTO_BASE_EXPORT_H_ - -+#include -+ - #include "perfetto/base/build_config.h" - #include "perfetto/public/abi/export.h" - diff --git a/backports/electron/mman.patch b/backports/electron/mman.patch deleted file mode 100644 index d15605a..0000000 --- a/backports/electron/mman.patch +++ /dev/null @@ -1,13 +0,0 @@ -needed for PKEY_DISABLE_WRITE. these are documented as also being from sys/ -mman.h with GNU_SOURCE, but musl doesn't do that, so these are strictly from -kernel headers ---- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc -+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc -@@ -60,6 +60,7 @@ - #include - #include - #include -+#include - #endif // BUILDFLAG(IS_POSIX) - - #if BUILDFLAG(ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT) && BUILDFLAG(IS_MAC) diff --git a/backports/electron/musl-sandbox.patch b/backports/electron/musl-sandbox.patch index 52c3b21..ccd9423 100644 --- a/backports/electron/musl-sandbox.patch +++ b/backports/electron/musl-sandbox.patch @@ -45,7 +45,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc ./sandbox/linux/s index d9d1882..0567557 100644 --- a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc -@@ -392,6 +392,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) { +@@ -438,6 +438,7 @@ #if defined(__i386__) case __NR_waitpid: #endif @@ -53,7 +53,7 @@ index d9d1882..0567557 100644 return true; case __NR_clone: // Should be parameter-restricted. case __NR_setns: // Privileged. -@@ -404,7 +405,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) { +@@ -450,7 +451,6 @@ #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) case __NR_set_thread_area: #endif @@ -61,16 +61,16 @@ index d9d1882..0567557 100644 case __NR_unshare: #if !defined(__mips__) && !defined(__aarch64__) case __NR_vfork: -@@ -514,6 +514,8 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) { - case __NR_mlock: +@@ -549,6 +549,8 @@ case __NR_munlock: case __NR_munmap: + case __NR_mseal: + case __NR_mremap: + case __NR_membarrier: return true; case __NR_madvise: case __NR_mincore: -@@ -531,7 +533,6 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) { +@@ -566,7 +568,6 @@ case __NR_modify_ldt: #endif case __NR_mprotect: diff --git a/backports/electron/no-execinfo.patch b/backports/electron/no-execinfo.patch index b1705f5..12064ba 100644 --- a/backports/electron/no-execinfo.patch +++ b/backports/electron/no-execinfo.patch @@ -37,16 +37,16 @@ for discussion about this, see https://www.openwall.com/lists/musl/2021/07/16/1 #define HAVE_FCNTL_H 1 --- a/base/debug/stack_trace.cc +++ b/base/debug/stack_trace.cc -@@ -291,7 +291,7 @@ - } - std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const { +@@ -311,7 +311,7 @@ + + std::string StackTrace::ToStringWithPrefix(cstring_view prefix_string) const { std::stringstream stream; -#if !defined(__UCLIBC__) && !defined(_AIX) +#if defined(__GLIBC__) && !defined(_AIX) - if (ShouldSuppressOutput()) { - return "Backtrace suppressed."; - } -@@ -301,7 +301,7 @@ + OutputToStreamWithPrefix(&stream, prefix_string); + #endif + return stream.str(); +@@ -335,7 +335,7 @@ } std::ostream& operator<<(std::ostream& os, const StackTrace& s) { diff --git a/backports/electron/no-mallinfo.patch b/backports/electron/no-mallinfo.patch index 37abb3f..1f2d541 100644 --- a/backports/electron/no-mallinfo.patch +++ b/backports/electron/no-mallinfo.patch @@ -102,23 +102,23 @@ musl does not implement mallinfo()/mallinfo2() #define HAVE_MALLOC_H 1 --- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc -@@ -717,7 +717,7 @@ +@@ -660,7 +660,7 @@ - #endif // !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_ANDROID) + #endif // !PA_BUILDFLAG(IS_APPLE) && !PA_BUILDFLAG(IS_ANDROID) --#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +-#if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) +#if 0 SHIM_ALWAYS_EXPORT struct mallinfo mallinfo(void) __THROW { - base::SimplePartitionStatsDumper allocator_dumper; + partition_alloc::SimplePartitionStatsDumper allocator_dumper; Allocator()->DumpStats("malloc", true, &allocator_dumper); --- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc -@@ -24,7 +24,7 @@ - #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +@@ -29,7 +29,7 @@ + #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) // Platforms on which we override weak libc symbols. --#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -+#if (BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) || BUILDFLAG(IS_CHROMEOS) +-#if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) ++#if (PA_BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) || PA_BUILDFLAG(IS_CHROMEOS) - NOINLINE void FreeForTest(void* data) { + PA_NOINLINE void FreeForTest(void* data) { free(data); diff --git a/backports/electron/partalloc-no-tagging-arm64.patch b/backports/electron/partalloc-no-tagging-arm64.patch index e5c7525..fb33151 100644 --- a/backports/electron/partalloc-no-tagging-arm64.patch +++ b/backports/electron/partalloc-no-tagging-arm64.patch @@ -12,3 +12,14 @@ to make the partalloc support code for it work. declare_args() { # Causes all the allocations to be routed via allocator_shim.cc. Usually, +--- ./base/allocator/partition_allocator/src/partition_alloc/aarch64_support.h.orig ++++ ./base/allocator/partition_allocator/src/partition_alloc/aarch64_support.h +@@ -10,7 +10,7 @@ + #include "partition_alloc/build_config.h" + #include "partition_alloc/partition_alloc_buildflags.h" + +-#if PA_BUILDFLAG(IS_ANDROID) || PA_BUILDFLAG(IS_LINUX) ++#if PA_BUILDFLAG(IS_ANDROID) || (PA_BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) + #define HAS_HW_CAPS + #endif + diff --git a/backports/electron/perfetto-libstdc++.patch b/backports/electron/perfetto-libstdc++.patch deleted file mode 100644 index 31ff9d9..0000000 --- a/backports/electron/perfetto-libstdc++.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/third_party/perfetto/src/trace_processor/perfetto_sql/engine/created_function.cc -+++ b/third_party/perfetto/src/trace_processor/perfetto_sql/engine/created_function.cc -@@ -107,7 +107,7 @@ - // the destructors run correctly for non-trivial members of the - // union. - using Data = -- std::variant; -+ std::variant; - - StoredSqlValue(SqlValue value) { - switch (value.type) { -@@ -132,7 +132,7 @@ - } - - SqlValue AsSqlValue() { -- if (std::holds_alternative(data)) { -+ if (std::holds_alternative(data)) { - return SqlValue(); - } else if (std::holds_alternative(data)) { - return SqlValue::Long(std::get(data)); diff --git a/backports/electron/pvalloc.patch b/backports/electron/pvalloc.patch index 1d874d6..145e05b 100644 --- a/backports/electron/pvalloc.patch +++ b/backports/electron/pvalloc.patch @@ -2,24 +2,24 @@ the pvalloc/valloc symbols are obsolete and not implemented in musl -- --- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc +++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc -@@ -375,7 +375,7 @@ +@@ -410,7 +410,7 @@ ASSERT_GE(aligned_allocs_intercepted_by_alignment[128], 1u); ASSERT_GE(aligned_allocs_intercepted_by_size[53], 1u); --#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) -+#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && defined(__GLIBC__) +-#if PA_BUILDFLAG(IS_POSIX) && !PA_BUILDFLAG(IS_ANDROID) ++#if (PA_BUILDFLAG(IS_POSIX) && defined(__GLIBC__)) && !PA_BUILDFLAG(IS_ANDROID) void* pvalloc_ptr = pvalloc(67); ASSERT_NE(nullptr, pvalloc_ptr); ASSERT_EQ(0u, reinterpret_cast(pvalloc_ptr) % kPageSize); -@@ -414,7 +414,7 @@ +@@ -449,7 +449,7 @@ free(memalign_ptr); ASSERT_GE(frees_intercepted_by_addr[Hash(memalign_ptr)], 1u); --#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) -+#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && defined(__GLIBC__) +-#if PA_BUILDFLAG(IS_POSIX) && !PA_BUILDFLAG(IS_ANDROID) ++#if (PA_BUILDFLAG(IS_POSIX) && defined(__GLIBC__)) && !PA_BUILDFLAG(IS_ANDROID) free(pvalloc_ptr); ASSERT_GE(frees_intercepted_by_addr[Hash(pvalloc_ptr)], 1u); - #endif // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) + #endif // PA_BUILDFLAG(IS_POSIX) && !PA_BUILDFLAG(IS_ANDROID) --- a/base/process/memory_unittest.cc +++ b/base/process/memory_unittest.cc @@ -359,7 +359,7 @@ diff --git a/backports/electron/quiche-array.patch b/backports/electron/quiche-array.patch deleted file mode 100644 index d016b38..0000000 --- a/backports/electron/quiche-array.patch +++ /dev/null @@ -1,12 +0,0 @@ -needed for push_back on array --- ---- a/net/third_party/quiche/src/quiche/common/quiche_endian.h -+++ b/net/third_party/quiche/src/quiche/common/quiche_endian.h -@@ -6,6 +6,7 @@ - #define QUICHE_COMMON_QUICHE_ENDIAN_H_ - - #include -+#include - #include - #include - diff --git a/backports/electron/random-fixes.patch b/backports/electron/random-fixes.patch deleted file mode 100644 index 5bfdef5..0000000 --- a/backports/electron/random-fixes.patch +++ /dev/null @@ -1,94 +0,0 @@ -Patch-Source: https://gitlab.archlinux.org/archlinux/packaging/packages/chromium/-/blob/c073b0c20935d7eb452732e0f3b2860a96c3db21/random-build-fixes.patch --- -diff --git a/chrome/browser/download/bubble/download_bubble_update_service.cc b/chrome/browser/download/bubble/download_bubble_update_service.cc -index 41b647f7b44..8940c6bb7fc 100644 ---- a/chrome/browser/download/bubble/download_bubble_update_service.cc -+++ b/chrome/browser/download/bubble/download_bubble_update_service.cc -@@ -91,7 +91,7 @@ ItemSortKey GetSortKey(const Item& item) { - // Helper to get an iterator to the last element in the cache. The cache - // must not be empty. - template --SortedItems::const_iterator GetLastIter(const SortedItems& cache) { -+typename SortedItems::const_iterator GetLastIter(const SortedItems& cache) { - CHECK(!cache.empty()); - auto it = cache.end(); - return std::prev(it); -@@ -967,9 +967,9 @@ bool DownloadBubbleUpdateService::CacheManager::RemoveItemFromCacheImpl( - } - - template --SortedItems::iterator -+typename SortedItems::iterator - DownloadBubbleUpdateService::CacheManager::RemoveItemFromCacheByIter( -- SortedItems::iterator iter, -+ typename SortedItems::iterator iter, - SortedItems& cache, - IterMap& iter_map) { - CHECK(iter != cache.end()); -diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc -index c0708681ebd..98b8494d170 100644 ---- a/chrome/test/chromedriver/capabilities.cc -+++ b/chrome/test/chromedriver/capabilities.cc -@@ -355,7 +355,7 @@ Status ParseMobileEmulation(const base::Value& option, - "'version' field of type string"); - } - -- brands.emplace_back(*brand, *version); -+ brands.emplace_back(BrandVersion{*brand, *version}); - } - - client_hints.brands = std::move(brands); -@@ -392,7 +392,7 @@ Status ParseMobileEmulation(const base::Value& option, - "a 'version' field of type string"); - } - -- full_version_list.emplace_back(*brand, *version); -+ full_version_list.emplace_back(BrandVersion{*brand, *version}); - } - - client_hints.full_version_list = std::move(full_version_list); -diff --git a/components/optimization_guide/core/tflite_model_executor.h b/components/optimization_guide/core/tflite_model_executor.h -index c4f750f4684..b5635f4108b 100644 ---- a/components/optimization_guide/core/tflite_model_executor.h -+++ b/components/optimization_guide/core/tflite_model_executor.h -@@ -189,7 +189,7 @@ class TFLiteModelExecutor : public ModelExecutor { - void SendForBatchExecution( - BatchExecutionCallback callback_on_complete, - base::TimeTicks start_time, -- ModelExecutor::ConstRefInputVector inputs) -+ typename ModelExecutor::ConstRefInputVector inputs) - override { - DCHECK(execution_task_runner_->RunsTasksInCurrentSequence()); - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc b/third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc -index 2dc0b304092..a82f255090b 100644 ---- a/third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc -+++ b/third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc -@@ -169,7 +169,7 @@ class HTMLFastPathParser { - using Span = base::span; - using USpan = base::span; - // 32 matches that used by HTMLToken::Attribute. -- typedef std::conditional, -+ typedef typename std::conditional, - UCharLiteralBuffer<32>, - LCharLiteralBuffer<32>>::type LiteralBufferType; - typedef UCharLiteralBuffer<32> UCharLiteralBufferType; -diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc -index f0b49139147..a308fb67982 100644 ---- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc -+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc -@@ -91,12 +91,12 @@ void CanvasStyle::ApplyToFlags(cc::PaintFlags& flags, - case kGradient: - GetCanvasGradient()->GetGradient()->ApplyToFlags(flags, SkMatrix::I(), - ImageDrawOptions()); -- flags.setColor(SkColor4f(0.0f, 0.0f, 0.0f, global_alpha)); -+ flags.setColor(SkColor4f{0.0f, 0.0f, 0.0f, global_alpha}); - break; - case kImagePattern: - GetCanvasPattern()->GetPattern()->ApplyToFlags( - flags, AffineTransformToSkMatrix(GetCanvasPattern()->GetTransform())); -- flags.setColor(SkColor4f(0.0f, 0.0f, 0.0f, global_alpha)); -+ flags.setColor(SkColor4f{0.0f, 0.0f, 0.0f, global_alpha}); - break; - default: - NOTREACHED(); diff --git a/backports/electron/system-zstd.patch b/backports/electron/system-zstd.patch deleted file mode 100644 index 0fcd3ef..0000000 --- a/backports/electron/system-zstd.patch +++ /dev/null @@ -1,46 +0,0 @@ -From ae3ae3711784865bdc38bf119a6182a7b8dae91c Mon Sep 17 00:00:00 2001 -From: Matt Jolly -Date: Sun, 17 Sep 2023 16:51:42 +1000 -Subject: [PATCH] Add system-zstd - ---- a/build/linux/unbundle/replace_gn_files.py -+++ b/build/linux/unbundle/replace_gn_files.py -@@ -74,6 +74,7 @@ REPLACEMENTS = { - # - 'woff2': 'third_party/woff2/BUILD.gn', - 'zlib': 'third_party/zlib/BUILD.gn', -+ 'zstd': 'third_party/zstd/BUILD.gn', - } - - ---- /dev/null -+++ b/build/linux/unbundle/zstd.gn -@@ -0,0 +1,25 @@ -+import("//build/config/linux/pkg_config.gni") -+import("//build/shim_headers.gni") -+ -+pkg_config("system_zstd") { -+ packages = [ "libzstd" ] -+} -+ -+shim_headers("zstd_shim") { -+ root_path = "src/lib" -+ headers = [ -+ "zdict.h", -+ "zstd.h", -+ "zstd_errors.h", -+ ] -+} -+ -+source_set("zstd") { -+ deps = [ ":zstd_shim" ] -+ public_configs = [ ":system_zstd" ] -+} -+ -+source_set("decompress") { -+ deps = [ ":zstd_shim" ] -+ public_configs = [ ":system_zstd" ] -+} --- -2.42.0 - From 3bea445fde061e7e17d0dec6f6502f2dfb72e31b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 09:59:36 -0400 Subject: [PATCH 046/313] backports/electron-tasje: upgrade to 0.7.3 --- backports/electron-tasje/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/electron-tasje/APKBUILD b/backports/electron-tasje/APKBUILD index 71648c7..ac8776a 100644 --- a/backports/electron-tasje/APKBUILD +++ b/backports/electron-tasje/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=electron-tasje -pkgver=0.7.1 +pkgver=0.7.3 pkgrel=0 pkgdesc="Tiny replacement for electron-builder" url="https://codeberg.org/selfisekai/electron_tasje/" @@ -31,5 +31,5 @@ package() { } sha512sums=" -665ccbd6cb357c25d55daed4ad3b3ce008da258054951d9d069a5b12e72dd5812d534f906868e6b18e78949f058069a961c394c6f21ab3b3fab5393c330445e5 electron_tasje-0.7.1.tar.gz +251b7eabe74acdb5c7394f9d4d735b736acf555352785a9896ddaeed37632b238e823e1bb639e1f5a44a50455957ec41e1a585a3b2a9919b5818bb40843bd877 electron_tasje-0.7.3.tar.gz " From 8006b26b7442fc58d7984c4462d81dbc80405a02 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:00:10 -0400 Subject: [PATCH 047/313] backports/fdm-materials: bump pkgrel --- backports/fdm-materials/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/fdm-materials/APKBUILD b/backports/fdm-materials/APKBUILD index 5bde97d..5780f02 100644 --- a/backports/fdm-materials/APKBUILD +++ b/backports/fdm-materials/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=fdm-materials pkgver=5.2.2 -pkgrel=0 +pkgrel=1 pkgdesc="FDM Material Database" url="https://github.com/Ultimaker/fdm_materials" arch="noarch" From b0845ca9b6fba369ae16a5a606af44e181b78d4c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:02:03 -0400 Subject: [PATCH 048/313] user/freecad: move from backports due to aports drop --- {backports => user}/freecad/APKBUILD | 0 {backports => user}/freecad/missing-include-cstdint.patch | 0 {backports => user}/freecad/no-execinfo.patch | 0 {backports => user}/freecad/no-workaround-spnav.patch | 0 {backports => user}/freecad/numpy-1.20.patch | 0 {backports => user}/freecad/opencascade-7.8.0.patch | 0 {backports => user}/freecad/resourceDirectory.patch | 0 {backports => user}/freecad/tests.patch | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {backports => user}/freecad/APKBUILD (100%) rename {backports => user}/freecad/missing-include-cstdint.patch (100%) rename {backports => user}/freecad/no-execinfo.patch (100%) rename {backports => user}/freecad/no-workaround-spnav.patch (100%) rename {backports => user}/freecad/numpy-1.20.patch (100%) rename {backports => user}/freecad/opencascade-7.8.0.patch (100%) rename {backports => user}/freecad/resourceDirectory.patch (100%) rename {backports => user}/freecad/tests.patch (100%) diff --git a/backports/freecad/APKBUILD b/user/freecad/APKBUILD similarity index 100% rename from backports/freecad/APKBUILD rename to user/freecad/APKBUILD diff --git a/backports/freecad/missing-include-cstdint.patch b/user/freecad/missing-include-cstdint.patch similarity index 100% rename from backports/freecad/missing-include-cstdint.patch rename to user/freecad/missing-include-cstdint.patch diff --git a/backports/freecad/no-execinfo.patch b/user/freecad/no-execinfo.patch similarity index 100% rename from backports/freecad/no-execinfo.patch rename to user/freecad/no-execinfo.patch diff --git a/backports/freecad/no-workaround-spnav.patch b/user/freecad/no-workaround-spnav.patch similarity index 100% rename from backports/freecad/no-workaround-spnav.patch rename to user/freecad/no-workaround-spnav.patch diff --git a/backports/freecad/numpy-1.20.patch b/user/freecad/numpy-1.20.patch similarity index 100% rename from backports/freecad/numpy-1.20.patch rename to user/freecad/numpy-1.20.patch diff --git a/backports/freecad/opencascade-7.8.0.patch b/user/freecad/opencascade-7.8.0.patch similarity index 100% rename from backports/freecad/opencascade-7.8.0.patch rename to user/freecad/opencascade-7.8.0.patch diff --git a/backports/freecad/resourceDirectory.patch b/user/freecad/resourceDirectory.patch similarity index 100% rename from backports/freecad/resourceDirectory.patch rename to user/freecad/resourceDirectory.patch diff --git a/backports/freecad/tests.patch b/user/freecad/tests.patch similarity index 100% rename from backports/freecad/tests.patch rename to user/freecad/tests.patch From 86b3f95e1bb7455ce37ffbecaeeb6a59ed6a7016 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:02:34 -0400 Subject: [PATCH 049/313] backports/freetube: bump pkgrel --- backports/freetube/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/freetube/APKBUILD b/backports/freetube/APKBUILD index ecd6add..3d4ac08 100644 --- a/backports/freetube/APKBUILD +++ b/backports/freetube/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) pkgname=freetube pkgver=0.21.3 -pkgrel=0 +pkgrel=2 pkgdesc="An open source desktop YouTube player built with privacy in mind." arch="x86_64 aarch64" # blocked by electron license="AGPL-3.0-only" From ad6f3d1c77c4b89f7c60302a61d1e399829db65f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:03:05 -0400 Subject: [PATCH 050/313] backports/libmedc: bump pkgrel --- backports/libmedc/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD index ffc22e4..8976805 100644 --- a/backports/libmedc/APKBUILD +++ b/backports/libmedc/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=libmedc pkgver=4.1.1 -pkgrel=3 +pkgrel=4 pkgdesc="Open source library for numerical simulation" url="https://www.salome-platform.org/" arch="all" From f2e1f14f999ba4b84a9436dbf9917190761cca6e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:03:42 -0400 Subject: [PATCH 051/313] user/looking-glass: move from backports due to custom version --- {backports => user}/looking-glass/APKBUILD | 0 {backports => user}/looking-glass/looking-glass.post-deinstall | 0 {backports => user}/looking-glass/missing-includes.patch | 0 .../looking-glass/module_1075-fix-build-linux64.patch | 0 .../looking-glass/module_1124-fix-build-linux610.patch | 0 {backports => user}/looking-glass/obs-plugins-lib.patch | 0 {backports => user}/looking-glass/werror.patch | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {backports => user}/looking-glass/APKBUILD (100%) rename {backports => user}/looking-glass/looking-glass.post-deinstall (100%) rename {backports => user}/looking-glass/missing-includes.patch (100%) rename {backports => user}/looking-glass/module_1075-fix-build-linux64.patch (100%) rename {backports => user}/looking-glass/module_1124-fix-build-linux610.patch (100%) rename {backports => user}/looking-glass/obs-plugins-lib.patch (100%) rename {backports => user}/looking-glass/werror.patch (100%) diff --git a/backports/looking-glass/APKBUILD b/user/looking-glass/APKBUILD similarity index 100% rename from backports/looking-glass/APKBUILD rename to user/looking-glass/APKBUILD diff --git a/backports/looking-glass/looking-glass.post-deinstall b/user/looking-glass/looking-glass.post-deinstall similarity index 100% rename from backports/looking-glass/looking-glass.post-deinstall rename to user/looking-glass/looking-glass.post-deinstall diff --git a/backports/looking-glass/missing-includes.patch b/user/looking-glass/missing-includes.patch similarity index 100% rename from backports/looking-glass/missing-includes.patch rename to user/looking-glass/missing-includes.patch diff --git a/backports/looking-glass/module_1075-fix-build-linux64.patch b/user/looking-glass/module_1075-fix-build-linux64.patch similarity index 100% rename from backports/looking-glass/module_1075-fix-build-linux64.patch rename to user/looking-glass/module_1075-fix-build-linux64.patch diff --git a/backports/looking-glass/module_1124-fix-build-linux610.patch b/user/looking-glass/module_1124-fix-build-linux610.patch similarity index 100% rename from backports/looking-glass/module_1124-fix-build-linux610.patch rename to user/looking-glass/module_1124-fix-build-linux610.patch diff --git a/backports/looking-glass/obs-plugins-lib.patch b/user/looking-glass/obs-plugins-lib.patch similarity index 100% rename from backports/looking-glass/obs-plugins-lib.patch rename to user/looking-glass/obs-plugins-lib.patch diff --git a/backports/looking-glass/werror.patch b/user/looking-glass/werror.patch similarity index 100% rename from backports/looking-glass/werror.patch rename to user/looking-glass/werror.patch From d7fb3c54198f5755597bb3a01f7c7b278a4100f9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:04:22 -0400 Subject: [PATCH 052/313] backports/nlopt: upgrade to 2.8.0 --- backports/nlopt/APKBUILD | 59 +++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/backports/nlopt/APKBUILD b/backports/nlopt/APKBUILD index 0be29fe..49b6b8b 100644 --- a/backports/nlopt/APKBUILD +++ b/backports/nlopt/APKBUILD @@ -1,38 +1,71 @@ # Contributor: Anjandev Momi -# Maintainer: Anjandev Momi +# Maintainer: Celeste +maintainer="Celeste " pkgname=nlopt -pkgver=2.7.1 +pkgver=2.8.0 pkgrel=0 -pkgdesc="library for nonlinear optimization, wrapping many algorithms for global and local, constrained or unconstrained, optimization" -url="https://github.com/stevengj/nlopt/" +pkgdesc="Library for nonlinear optimization" +url="https://github.com/stevengj/nlopt" arch="all" license="LGPL-2.1-or-later" -makedepends="samurai cmake" -subpackages="$pkgname-dev $pkgname-doc" +makedepends=" + cmake + guile-dev + python3-dev + samurai + swig + " +subpackages=" + $pkgname-dev + $pkgname-doc + $pkgname-guile + " source="$pkgname-$pkgver.tar.gz::https://github.com/stevengj/nlopt/archive/refs/tags/v$pkgver.tar.gz" +case "$CARCH" in +# octave unavailable on these 3 archs +s390x|riscv64|ppc64le) ;; +*) + makedepends="$makedepends octave-dev" + subpackages="$subpackages $pkgname-octave" + ;; +esac + build() { if [ "$CBUILD" != "$CHOST" ]; then - CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" + local crossopts="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" fi cmake -B build -G Ninja \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_SHARED_LIBS=True \ - -DCMAKE_BUILD_TYPE=minsizerel \ - $CMAKE_CROSSOPTS . + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + $crossopts cmake --build build } check() { - cd build - CTEST_OUTPUT_ON_FAILURE=TRUE ctest + ctest --test-dir build --output-on-failure } package() { DESTDIR="$pkgdir" cmake --install build } +guile() { + pkgdesc="$pkgdesc (Guile bindings)" + depends="$pkgname=$pkgver-r$pkgrel guile" + + amove usr/lib/guile usr/share/guile +} + +octave() { + pkgdesc="$pkgdesc (Octave bindings)" + depends="$pkgname=$pkgver-r$pkgrel octave" + + amove usr/lib/octave usr/share/octave +} + sha512sums=" -e23cb522fc696010574c14b72be85acc0f8ccf0bf208bf2b8789c57d6c5a6e6d419ee10330581518b1c1567018ae909b626ce7761d4fbd5bf112916871e420e2 nlopt-2.7.1.tar.gz +cb294caa5532e11ae0d22ed849705920bbae79f712144c840a5ca865ef8e6a15c6c9540c81ced0c3c05b9f44c360d50f74e235e69d893be34b7e1c5599f07c71 nlopt-2.8.0.tar.gz " From ea066664d784ded04dbcf1d75e3253b2cdc5f29c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:04:45 -0400 Subject: [PATCH 053/313] backports/openssl1.1-compat: bump pkgrel --- backports/openssl1.1-compat/APKBUILD | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/backports/openssl1.1-compat/APKBUILD b/backports/openssl1.1-compat/APKBUILD index 294cbc1..fb31eaa 100644 --- a/backports/openssl1.1-compat/APKBUILD +++ b/backports/openssl1.1-compat/APKBUILD @@ -3,7 +3,7 @@ pkgname=openssl1.1-compat pkgver=1.1.1w _abiver=${pkgver%.*} -pkgrel=0 +pkgrel=1 pkgdesc="toolkit for transport layer security (TLS) - version 1.1" url="https://www.openssl.org/" arch="all" @@ -86,6 +86,7 @@ build() { x86_64) _target="linux-x86_64"; _optflags="enable-ec_nistp_64_gcc_128" ;; s390x) _target="linux64-s390x";; riscv64) _target="linux-generic64";; + loongarch64) _target="linux-generic64";; *) msg "Unable to determine architecture from (CARCH=$CARCH)" ; return 1 ;; esac @@ -103,7 +104,7 @@ build() { perl ./Configure \ $_target \ --prefix=/usr \ - --libdir=lib \ + --libdir=/usr/lib \ --openssldir=/etc/ssl1.1 \ shared \ no-zlib \ @@ -144,23 +145,16 @@ package() { _libcrypto() { pkgdesc="Crypto library from openssl" replaces="libressl2.7-libcrypto" - mkdir -p "$subpkgdir"/lib "$subpkgdir"/usr/lib - mv "$pkgdir"/etc "$subpkgdir"/ - for i in "$pkgdir"/usr/lib/libcrypto*; do - mv $i "$subpkgdir"/lib/ - ln -s ../../lib/${i##*/} "$subpkgdir"/usr/lib/${i##*/} - done - mv "$pkgdir"/usr/lib/engines-$_abiver "$subpkgdir"/usr/lib/ + + amove etc + amove usr/lib/libcrypto* + amove usr/lib/engines-$_abiver } _libssl() { pkgdesc="SSL shared libraries" - mkdir -p "$subpkgdir"/lib "$subpkgdir"/usr/lib - for i in "$pkgdir"/usr/lib/libssl*; do - mv $i "$subpkgdir"/lib/ - ln -s ../../lib/${i##*/} "$subpkgdir"/usr/lib/${i##*/} - done + amove usr/lib/libssl* } _static() { From 1253b5be224520c207f8864891824eb79d5f8937 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:05:29 -0400 Subject: [PATCH 054/313] backports/perl-math-random-isaac-xs: bump pkgrel --- backports/perl-math-random-isaac-xs/APKBUILD | 50 ++++++++------------ 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/backports/perl-math-random-isaac-xs/APKBUILD b/backports/perl-math-random-isaac-xs/APKBUILD index 4d27426..8cb2f95 100644 --- a/backports/perl-math-random-isaac-xs/APKBUILD +++ b/backports/perl-math-random-isaac-xs/APKBUILD @@ -1,47 +1,39 @@ -# Automatically generated by apkbuild-cpan, template 2 +# Automatically generated by apkbuild-cpan, template 4 # Contributor: Timo Teräs -# Maintainer: Timo Teräs +# Maintainer: Celeste +maintainer="Celeste " pkgname=perl-math-random-isaac-xs -_pkgreal=Math-Random-ISAAC-XS pkgver=1.004 -pkgrel=7 +pkgrel=8 +#_pkgreal is used by apkbuild-cpan to find modules at MetaCpan +_pkgreal=Math-Random-ISAAC-XS pkgdesc="C implementation of the ISAAC PRNG algorithm" url="https://metacpan.org/release/Math-Random-ISAAC-XS/" arch="all" -license="unrestricted" -cpandepends="" -cpanmakedepends="perl-test-nowarnings" -cpancheckdepends="" -depends="$cpandepends" -makedepends="perl-dev perl-module-build $cpanmakedepends" -checkdepends="$cpancheckdepends" +license="Public-Domain" +depends="perl" +makedepends="perl-dev perl-module-build" +checkdepends="perl-test-nowarnings" subpackages="$pkgname-doc" -source="https://cpan.metacpan.org/authors/id/J/JA/JAWNSY/$_pkgreal-$pkgver.tar.gz" +source="https://cpan.metacpan.org/authors/id/J/JA/JAWNSY/Math-Random-ISAAC-XS-$pkgver.tar.gz" builddir="$srcdir/$_pkgreal-$pkgver" -prepare() { - default_prepare || return 1 - - cd "$builddir" - export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}') - perl Build.PL installdirs=vendor || return 1 -} - build() { - cd "$builddir" export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}') + perl Build.PL \ + --installdirs=vendor \ + --create_packlist=0 ./Build } -package() { - cd "$builddir" - ./Build install destdir="$pkgdir" || return 1 - find "$pkgdir" \( -name perllocal.pod -o -name .packlist \) -delete -} - check() { - cd "$builddir" ./Build test } -sha512sums="40c46b5f247f585a407ef9f36b5874d9cf03ec05963a9d92d988ebd63daf1e37b1b51308845d4596f47b5ad7203953bcb7fbb421c905b526dbe99b246ccb4d87 Math-Random-ISAAC-XS-1.004.tar.gz" +package() { + ./Build install --destdir="$pkgdir" +} + +sha512sums=" +40c46b5f247f585a407ef9f36b5874d9cf03ec05963a9d92d988ebd63daf1e37b1b51308845d4596f47b5ad7203953bcb7fbb421c905b526dbe99b246ccb4d87 Math-Random-ISAAC-XS-1.004.tar.gz +" From dcd308946ac74545589589d2c5c316aa007bc95d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:06:26 -0400 Subject: [PATCH 055/313] backports/py3-apsw: upgrade at 3.46.1.0 --- backports/py3-apsw/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/py3-apsw/APKBUILD b/backports/py3-apsw/APKBUILD index 1259ba3..c0b8c6d 100644 --- a/backports/py3-apsw/APKBUILD +++ b/backports/py3-apsw/APKBUILD @@ -2,8 +2,8 @@ # Maintainer: Francesco Colista pkgname=py3-apsw _pkgname=apsw -pkgver=3.45.2.0 -pkgrel=1 +pkgver=3.46.1.0 +pkgrel=0 pkgdesc="Another Python SQLite Wrapper" url="https://github.com/rogerbinns/apsw" arch="all" @@ -41,6 +41,6 @@ package() { } sha512sums=" -0260f6479d5f1188ad172dfc0dd7e4a03c9d809d2f80c2296e587a19286681bb2ce759b0bd19ec6957e2902f18729b7e79410e4db79dff9918089f57dd510828 py3-apsw-3.45.2.0.zip +8d24825c8346b05a99b8959ce1fd45ae5162c95b020ecc63bd3491bfd1579370a0e6b1a962f7f64a7e7e415846007e64d90b28e2065ae047e228d60b12b9cb02 py3-apsw-3.46.1.0.zip 8f3957bd6fecb5660a7cab367043e4ccdacd87d8963bbe41cc3d525265de28f08aa207099658d785be29c5c90b818c1418f766995cd780d02b8e36252a389758 detect-sqlite-config.patch " From 5e4808302b13f9ea7a7a01f3286fc5aefda644c8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:06:51 -0400 Subject: [PATCH 056/313] backports/py3-arcus: bump pkgrel --- backports/py3-arcus/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-arcus/APKBUILD b/backports/py3-arcus/APKBUILD index 0a04535..1971b01 100644 --- a/backports/py3-arcus/APKBUILD +++ b/backports/py3-arcus/APKBUILD @@ -1,9 +1,9 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=py3-arcus # Needs to be upgraded in sync with libarcus pkgver=5.3.0 -pkgrel=0 +pkgrel=1 pkgdesc="Python bindings for libarcus" url="https://github.com/Ultimaker/pyArcus" arch="all" From ca399a31cc6d47739c0f5c5f5506c02776824c45 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:07:22 -0400 Subject: [PATCH 057/313] backports/py3-colored: bump pkgrel --- backports/py3-colored/APKBUILD | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backports/py3-colored/APKBUILD b/backports/py3-colored/APKBUILD index d11a554..deb152a 100644 --- a/backports/py3-colored/APKBUILD +++ b/backports/py3-colored/APKBUILD @@ -2,13 +2,13 @@ pkgname=py3-colored _pyname=${pkgname/py3-/} pkgver=1.4.4 -pkgrel=2 +pkgrel=3 pkgdesc="Simple Python library for color and formatting in terminal" url="https://gitlab.com/dslackw/colored" arch="noarch" license="MIT" depends="python3" -makedepends="py3-setuptools" +makedepends="py3-setuptools py3-gpep517" checkdepends="py3-pytest" subpackages="$pkgname-pyc" source="https://gitlab.com/dslackw/colored/-/archive/$pkgver/colored-$pkgver.tar.gz" @@ -16,11 +16,14 @@ builddir="$srcdir/$_pyname-$pkgver" options="!check" # No testsuite build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } package() { - python3 setup.py install --prefix=/usr --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From c34ae73f084fea84f5532f330194576937dd3ea3 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:07:47 -0400 Subject: [PATCH 058/313] backports/py3-daemon: drop due to community --- backports/py3-daemon/APKBUILD | 40 ------------------- .../py3-daemon/remove-docutils-depend.patch | 16 -------- 2 files changed, 56 deletions(-) delete mode 100644 backports/py3-daemon/APKBUILD delete mode 100644 backports/py3-daemon/remove-docutils-depend.patch diff --git a/backports/py3-daemon/APKBUILD b/backports/py3-daemon/APKBUILD deleted file mode 100644 index 416cd99..0000000 --- a/backports/py3-daemon/APKBUILD +++ /dev/null @@ -1,40 +0,0 @@ -# Contributor: Noel Kuntze -# Maintainer: Noel Kuntze -pkgname=py3-daemon -pkgver=2.3.2 -pkgrel=4 -pkgdesc="Library to implement a well-behaved Unix daemon process" -url="https://pagure.io/python-daemon" -options="!check" # Has lots of dependencies -arch="noarch" -license="Apache-2.0 AND GPL-3.0-or-later" -depends="py3-setuptools py3-lockfile" -makedepends="py3-docutils" -subpackages="$pkgname-pyc" -source=" - https://pypi.io/packages/source/p/python-daemon/python-daemon-$pkgver.tar.gz - remove-docutils-depend.patch -" -builddir="$srcdir/python-daemon-$pkgver" - -prepare() { - default_prepare - - # Remove unnecessary dependency for building, twine is - # required for uploading the package to pypi which we don't - # do - sed -e '/twine/d' -i setup.py -} - -build() { - python3 setup.py build -} - -package() { - python3 setup.py install --root="$pkgdir" -} - -sha512sums=" -d9f6e6c376a496fae96bd9efed0a56d00a137617a3d1d5ef74802ef176bc813bb1d49bbb9164cdbec03213529f944b32b257bcc64283abfa4a3522ff00826bfd python-daemon-2.3.2.tar.gz -20bc4bce7fba9754d1c9bca298f9b4ff7fe90ecf51769df2020912f370650a5997f91c99c6be2ecffed10a6b359a29b1f64b0c391772451eb3c04769df381015 remove-docutils-depend.patch -" diff --git a/backports/py3-daemon/remove-docutils-depend.patch b/backports/py3-daemon/remove-docutils-depend.patch deleted file mode 100644 index 2bbc3be..0000000 --- a/backports/py3-daemon/remove-docutils-depend.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/setup.py.orig b/setup.py -index 24f0e7cb98a..d712294c20b 100644 ---- a/setup.py.orig -+++ b/setup.py -@@ -96,11 +96,6 @@ setup_kwargs = dict( - ], - ) - --# Docutils is only required for building, but Setuptools can't distinguish --# dependencies properly. --# See . --setup_kwargs['install_requires'].append("docutils") -- - - if __name__ == '__main__': - setup(**setup_kwargs) From f4893f439fa0355e534789e638c69c3d6781b582 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:08:04 -0400 Subject: [PATCH 059/313] backports/py3-pytube: drop due to community --- backports/py3-pytube/APKBUILD | 42 ----------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 backports/py3-pytube/APKBUILD diff --git a/backports/py3-pytube/APKBUILD b/backports/py3-pytube/APKBUILD deleted file mode 100644 index 6d27b69..0000000 --- a/backports/py3-pytube/APKBUILD +++ /dev/null @@ -1,42 +0,0 @@ -# Contributor: Antoine Martin (ayakael) -# Maintainer: Antoine Martin (ayakael) -pkgname=py3-pytube -#_pkgreal is used by apkbuild-pypi to find modules at PyPI -_pkgreal=pytube -pkgver=15.0.0 -pkgrel=1 -pkgdesc="Python 3 library for downloading YouTube Videos." -url="https://pypi.python.org/project/pytube" -arch="noarch" -license="Unlicense" -checkdepends="py3-pytest" -makedepends="py3-setuptools py3-gpep517 py3-wheel" -source="$pkgname-$pkgver.tar.gz::https://github.com/pytube/pytube/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/$_pkgreal-$pkgver" -subpackages="$pkgname-pyc" -# 7/131 units failing due to: -# AttributeError: 'NoneType' object has no attribute 'register_on_progress_callback' -# AttributeError: 'YouTube' object has no attribute 'stream_monostate' -# StopIteration -options="!check" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer "$builddir"/.dist/*.whl - .testenv/bin/python3 -m pytest -v -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -fc28d87c56bae9da3def68224a03687cc521c26e6f38dd41abe81e84f91bb2cab73dc8c7dbbc388787cf066f7d7304c78162cc60c544b99e75187b760c64b4a3 py3-pytube-15.0.0.tar.gz -" From 192fefd45720235aad1eb0d6461f3a00d6f414ee Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:08:19 -0400 Subject: [PATCH 060/313] backports/py3-utils: drop due to community --- backports/py3-utils/APKBUILD | 46 ------------------- .../fix-setuptools-deprecation.patch | 11 ----- backports/py3-utils/pytest.patch | 14 ------ backports/py3-utils/typing-ext.patch | 22 --------- 4 files changed, 93 deletions(-) delete mode 100644 backports/py3-utils/APKBUILD delete mode 100644 backports/py3-utils/fix-setuptools-deprecation.patch delete mode 100644 backports/py3-utils/pytest.patch delete mode 100644 backports/py3-utils/typing-ext.patch diff --git a/backports/py3-utils/APKBUILD b/backports/py3-utils/APKBUILD deleted file mode 100644 index b89b2bf..0000000 --- a/backports/py3-utils/APKBUILD +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor: Marian Buschsieweke -# Maintainer: Marian Buschsieweke -pkgname=py3-utils -_pkgname=python-utils -pkgver=3.8.1 -pkgrel=1 -pkgdesc="Convenient utilities not included with the standard Python install" -url="https://github.com/WoLpH/python-utils" -arch="noarch" -license="BSD-3-Clause" -makedepends="py3-gpep517 py3-setuptools py3-wheel" -checkdepends="py3-pytest py3-pytest-asyncio py3-loguru" -subpackages="$pkgname-pyc" -source=" - https://files.pythonhosted.org/packages/source/${_pkgname:0:1}/$_pkgname/$_pkgname-$pkgver.tar.gz - - fix-setuptools-deprecation.patch - pytest.patch - typing-ext.patch - " - -builddir="$srcdir/$_pkgname-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 -m pytest -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -ccba9651cc99a8f4e3f13e7ff66a43a40d2e85bc735b6246524269495ff321225a0dcad9abd03ca9cb61b4b1b35a27009fac3fe87e3f748ffc5c87a956acd335 python-utils-3.8.1.tar.gz -c001453b958b8231806ef6a04fcd21e1d252eeec36d4e6cbfce35f0662bae76c3f7484e0e8ff06d68a3e9cc7d19c9cdbf792c13e0101c580bb5e8de9d837fde7 fix-setuptools-deprecation.patch -99cc91ad155f8140aedc9420659c0e560a4d816ac1f85468ddb3a9fdc87526d591da916441d63b601146a86fb2c26f61c9dfbe37e31b86ee605f732e24e7b465 pytest.patch -d68943e3301eaafe2a9ea27f382a2eba1ce98149d8cbbe91aa9222cf76a8f7bebba3d9dbfced54bd88c90688a6e18373f011fbb83cd36cbf2ecd3e36b034aa22 typing-ext.patch -" diff --git a/backports/py3-utils/fix-setuptools-deprecation.patch b/backports/py3-utils/fix-setuptools-deprecation.patch deleted file mode 100644 index 16b5e5a..0000000 --- a/backports/py3-utils/fix-setuptools-deprecation.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/setup.cfg -+++ b/setup.cfg -@@ -2,7 +2,7 @@ - test = pytest - - [metadata] --description-file = README.rst -+description_file = README.rst - - [nosetests] - verbosity = 3 diff --git a/backports/py3-utils/pytest.patch b/backports/py3-utils/pytest.patch deleted file mode 100644 index a7f016d..0000000 --- a/backports/py3-utils/pytest.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/pytest.ini b/pytest.ini -index a8e632a..e28ed7d 100644 ---- a/pytest.ini -+++ b/pytest.ini -@@ -5,9 +5,6 @@ python_files = - - addopts = - --doctest-modules -- --cov python_utils -- --cov-report term-missing --; --mypy - - doctest_optionflags = - ALLOW_UNICODE diff --git a/backports/py3-utils/typing-ext.patch b/backports/py3-utils/typing-ext.patch deleted file mode 100644 index ee6acb2..0000000 --- a/backports/py3-utils/typing-ext.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/python_utils/types.py b/python_utils/types.py -index 01c319a..79ef950 100644 ---- a/python_utils/types.py -+++ b/python_utils/types.py -@@ -1,7 +1,6 @@ - # pyright: reportWildcardImportFromLibrary=false - import datetime - import decimal --from typing_extensions import * # type: ignore # noqa: F403 - from typing import * # type: ignore # pragma: no cover # noqa: F403 - from types import * # type: ignore # pragma: no cover # noqa: F403 - ---- a/setup.py -+++ b/setup.py -@@ -29,7 +29,6 @@ - ), - package_data={'python_utils': ['py.typed']}, - long_description=long_description, -- install_requires=['typing_extensions>3.10.0.2'], - tests_require=['pytest'], - extras_require={ - 'loguru': [ From 42fba3ec091de2a30cc976f716a7ed28f4388939 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:08:34 -0400 Subject: [PATCH 061/313] backports/py3-microdata: drop due to community --- backports/py3-microdata/APKBUILD | 37 -------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 backports/py3-microdata/APKBUILD diff --git a/backports/py3-microdata/APKBUILD b/backports/py3-microdata/APKBUILD deleted file mode 100644 index ecc0268..0000000 --- a/backports/py3-microdata/APKBUILD +++ /dev/null @@ -1,37 +0,0 @@ -# Contributor: Antoine Martin (ayakael) -# Maintainer: Antoine Martin (ayakael) -pkgname=py3-microdata -#_pkgreal is used by apkbuild-pypi to find modules at PyPI -_pkgreal=microdata -pkgver=0.8.0 -pkgrel=0 -pkgdesc="html5lib extension for parsing microdata" -url="https://pypi.python.org/project/microdata" -license="CC0-1.0" -arch="noarch" -depends="py3-html5lib" -makedepends="py3-setuptools py3-gpep517 py3-wheel" -source="$pkgname-$pkgver.tar.gz::https://github.com/edsu/microdata/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/$_pkgreal-$pkgver" -subpackages="$pkgname-pyc" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 setup.py test -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -e48c8c267f595faec97397fae470a3aa1f4f33d9f4ea7d186f07b104166b373ea768db7d73423aedd28af3e310f6b9fa268d946420c6aed9676d15f38396b07e py3-microdata-0.8.0.tar.gz -" From b970b53d5b012a88e23c7172a69f8aa3fab03295 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:09:06 -0400 Subject: [PATCH 062/313] backports/py3-dataparser: fix check --- backports/py3-dateparser/APKBUILD | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backports/py3-dateparser/APKBUILD b/backports/py3-dateparser/APKBUILD index 6a342fb..fa01fe0 100644 --- a/backports/py3-dateparser/APKBUILD +++ b/backports/py3-dateparser/APKBUILD @@ -40,7 +40,9 @@ build() { } check() { - _test_filter='not test_parsing_date_should_fail_using_datetime_strptime_if_locale_is_non_english' + # test_relative_base_setting_2_en fails due to tzinfo mismatch + _test_filter="not test_parsing_date_should_fail_using_datetime_strptime_if_locale_is_non_english \ + and not test_relative_base_setting_2_en" # test_custom_language_detect_fast_text fails due to wrong file format case "$CARCH" in s390x) From 559e9ced7afbefa934690c09585ee301b9147dd8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:09:19 -0400 Subject: [PATCH 063/313] backports/py3-flask-limiter: bump pkgrel --- backports/py3-flask-limiter/APKBUILD | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backports/py3-flask-limiter/APKBUILD b/backports/py3-flask-limiter/APKBUILD index 9555218..afeb6cf 100644 --- a/backports/py3-flask-limiter/APKBUILD +++ b/backports/py3-flask-limiter/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: lauren n. liberda pkgname=py3-flask-limiter pkgver=3.7.0 -pkgrel=0 +pkgrel=1 pkgdesc="Rate Limiting extension for Flask" url="https://github.com/alisaifee/flask-limiter" arch="noarch" @@ -14,7 +14,7 @@ depends=" py3-rich python3 " -makedepends="py3-setuptools" +makedepends="py3-setuptools py3-gpep517" checkdepends=" py3-flask-restful py3-flask-restx @@ -23,7 +23,6 @@ checkdepends=" py3-pytest py3-pytest-cov " -options="!check" # tests depend on unpackaged modules subpackages="$pkgname-pyc" source=" https://github.com/alisaifee/flask-limiter/archive/refs/tags/$pkgver/flask-limiter-$pkgver.tar.gz @@ -31,17 +30,23 @@ source=" our-std-is-good-enough.patch " builddir="$srcdir/flask-limiter-$pkgver" +options="!check" # tests depend on unpackaged modules build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { - pytest + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest } package() { - python3 setup.py install --prefix=/usr --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From 5e12f12d1e8ab53f10c8a44815dc0d656a800898 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:09:55 -0400 Subject: [PATCH 064/313] backports/py3-fuzzywuzzy: move to gpep517 --- backports/py3-fuzzywuzzy/APKBUILD | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/backports/py3-fuzzywuzzy/APKBUILD b/backports/py3-fuzzywuzzy/APKBUILD index ad0fce2..c659b1b 100644 --- a/backports/py3-fuzzywuzzy/APKBUILD +++ b/backports/py3-fuzzywuzzy/APKBUILD @@ -3,28 +3,33 @@ pkgname=py3-fuzzywuzzy _pyname=fuzzywuzzy pkgver=0.18.0 -pkgrel=6 +pkgrel=7 pkgdesc="Fuzzy string matching in python" url="https://github.com/seatgeek/fuzzywuzzy" arch="noarch" license="GPL-2.0-only" depends="python3 py3-levenshtein" -makedepends="py3-setuptools" +makedepends="py3-setuptools py3-gpep517" checkdepends="py3-pytest py3-pycodestyle py3-hypothesis" subpackages="$pkgname-pyc" source="https://files.pythonhosted.org/packages/source/${_pyname%${_pyname#?}}/$_pyname/$_pyname-$pkgver.tar.gz" builddir="$srcdir/$_pyname-$pkgver" build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { - PYTHONPATH="$PWD/build/lib" pytest -v + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest } package() { - python3 setup.py install --skip-build --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From 55ac054f92a004f4aa4a08254336075df946e9e3 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:10:13 -0400 Subject: [PATCH 065/313] backports/py3-limits: upgrade to 3.13.0 --- backports/py3-limits/APKBUILD | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/backports/py3-limits/APKBUILD b/backports/py3-limits/APKBUILD index ed4a82e..814a4bd 100644 --- a/backports/py3-limits/APKBUILD +++ b/backports/py3-limits/APKBUILD @@ -1,8 +1,8 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=py3-limits -pkgver=3.12.0 -pkgrel=0 +pkgver=3.13.0 +pkgrel=1 pkgdesc="Rate limiting using various strategies and storage backends such as redis & memcached" url="https://github.com/alisaifee/limits" arch="noarch" @@ -11,7 +11,7 @@ depends=" py3-deprecated python3 " -makedepends="py3-setuptools" +makedepends="py3-setuptools py3-gpep517" checkdepends=" py3-flaky py3-mongo @@ -22,7 +22,7 @@ checkdepends=" py3-redis " subpackages="$pkgname-pyc" -options="!check" # most tests are integration with db connections, assume all connectors installed +options="!check" # most tests are integration with db connections, assume all connectors installed source=" https://github.com/alisaifee/limits/archive/refs/tags/$pkgver/limits-$pkgver.tar.gz @@ -31,20 +31,25 @@ source=" builddir="$srcdir/limits-$pkgver" build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { - pytest \ + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest \ -m 'not benchmark and not etcd and not integration and not memcached' \ -k 'not aio and not Storage and not strategy' -v } package() { - python3 setup.py install --prefix=/usr --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" -2803dc26b18015e177342ed89e879f4dd680908579c99f9069d695edfa2beb3008b5bc47454ea2120a425bbcbc8a08928ab93a3058b33e11a2ae29431dfd9cd1 limits-3.12.0.tar.gz +0a13d08001c2f95e559ac1be35fa8cc178ad2d41bd5bf7b7e85781a428f550c350c21b92942b5b7e45f0f4c0604e96e579c8a26b5e9ca1196e6605608721030a limits-3.13.0.tar.gz 0364d51f9f879b95c6a4a3c9e9fd3d7d1e15ea214c50ae98cd36826b8c0b2d903cf1128741ac83738e305a207dae8955a0b2c8679484d2d6643e334595bdb1d7 our-std-is-good-enough.patch " From a24da23d5d11a581c9d43b37e18a5f0d1d14e774 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:10:41 -0400 Subject: [PATCH 066/313] backports/py3-mapbox-earcut: move to gpep517 --- backports/py3-mapbox-earcut/APKBUILD | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backports/py3-mapbox-earcut/APKBUILD b/backports/py3-mapbox-earcut/APKBUILD index 99db5b5..fe17670 100644 --- a/backports/py3-mapbox-earcut/APKBUILD +++ b/backports/py3-mapbox-earcut/APKBUILD @@ -1,30 +1,33 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=py3-mapbox-earcut pkgver=1.0.1 -pkgrel=0 +pkgrel=2 pkgdesc="Python bindings for the mapbox earcut c++ library" url="https://github.com/skogler/mapbox_earcut_python" arch="all" license="ISC" depends="py3-numpy" -makedepends="py3-setuptools py3-pybind11-dev python3-dev" -checkdepends="pytest" +makedepends="py3-setuptools py3-pybind11-dev python3-dev py3-gpep517" +checkdepends="py3-pytest" source="$pkgname-$pkgver.tar.gz::https://github.com/skogler/mapbox_earcut_python/archive/refs/tags/v$pkgver.tar.gz" builddir="$srcdir/mapbox_earcut_python-$pkgver" build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { - python3 -m venv --clear --without-pip --system-site-packages test-env - test-env/bin/python3 setup.py install - test-env/bin/python3 -m pytest + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest } package() { - python3 setup.py install --skip-build --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From 88d35e2b2ad24994ef36affaec0272937261bd8d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:11:09 -0400 Subject: [PATCH 067/313] backports/py3-numpy-stl: move to gpep517 --- backports/py3-numpy-stl/APKBUILD | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backports/py3-numpy-stl/APKBUILD b/backports/py3-numpy-stl/APKBUILD index 6ef430b..1c72a2e 100644 --- a/backports/py3-numpy-stl/APKBUILD +++ b/backports/py3-numpy-stl/APKBUILD @@ -1,32 +1,37 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=py3-numpy-stl pkgver=3.0.1 -pkgrel=2 +pkgrel=4 pkgdesc="Library for working with STLs" url="https://github.com/WoLpH/numpy-stl" # s390x: no py3-utils arch="noarch !s390x" license="BSD-3-Clause" depends="python3 py3-utils py3-numpy" -makedepends="py3-setuptools" +makedepends="py3-setuptools py3-gpep517" checkdepends="py3-pytest" subpackages="$pkgname-pyc" source="$pkgname-$pkgver.tar.gz::https://github.com/wolph/numpy-stl/releases/download/v$pkgver/numpy-stl-$pkgver.tar.gz" builddir="$srcdir/numpy-stl-$pkgver" build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl # deselected test needs xvfb-run and fails - pytest \ + .testenv/bin/python3 -m pytest \ --deselect tests/test_ascii.py::test_use_with_qt_with_custom_locale_decimal_delimeter } package() { - python3 setup.py install --skip-build --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From 0f88617c9452e67931bab470036d6ec8c0b19c24 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:11:31 -0400 Subject: [PATCH 068/313] backports/py3-pathvalidate: upgrade to 3.2.1 --- backports/py3-pathvalidate/APKBUILD | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backports/py3-pathvalidate/APKBUILD b/backports/py3-pathvalidate/APKBUILD index 6ea6d42..fc26a08 100644 --- a/backports/py3-pathvalidate/APKBUILD +++ b/backports/py3-pathvalidate/APKBUILD @@ -1,8 +1,8 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=py3-pathvalidate -pkgver=3.2.0 -pkgrel=1 +pkgver=3.2.1 +pkgrel=0 pkgdesc="Python library to sanitize/validate a string such as filenames/file-paths/etc" url="https://github.com/thombashi/pathvalidate" arch="noarch" @@ -11,6 +11,7 @@ depends="python3" makedepends=" py3-gpep517 py3-setuptools + py3-setuptools_scm py3-wheel " checkdepends="py3-pytest py3-click py3-faker" @@ -20,6 +21,7 @@ source="https://github.com/thombashi/pathvalidate/archive/refs/tags/v$pkgver/pat builddir="$srcdir/pathvalidate-$pkgver" build() { + export SETUPTOOLS_SCM_PRETEND_VERSION="$pkgver" gpep517 build-wheel \ --wheel-dir .dist \ --output-fd 3 3>&1 >&2 @@ -31,5 +33,5 @@ package() { } sha512sums=" -d1b0e49028bc5497558d9a0c15b4e3c301cacb439bebccffc467fc23001854877dbc81a214cc6eb34c5a905a88c4f9394f5865a4de42f354b2450a3bfe10bb9e pathvalidate-3.2.0.tar.gz +094bb442258ba58fff11691f5b60976513924443247e808effbc26b9dd6c336f5f84d8e4563643b7def19d9f82170eb9ec6cd89491f9115df8d1634d2aa12206 pathvalidate-3.2.1.tar.gz " From 813dd51cbf1f159151253b92ab310ede3d97f9d1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:11:51 -0400 Subject: [PATCH 069/313] backports/py3-pivy: bump pkgrel --- backports/py3-pivy/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backports/py3-pivy/APKBUILD b/backports/py3-pivy/APKBUILD index 86d3112..31627ea 100644 --- a/backports/py3-pivy/APKBUILD +++ b/backports/py3-pivy/APKBUILD @@ -1,11 +1,11 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=py3-pivy -pkgver=0.6.9_alpha0 +pkgver=0.6.9 pkgrel=0 pkgdesc="Python3 bindings for coin" url="https://github.com/coin3d/pivy" -# riscv64 blocked by py3-pyside6 +# riscv64: blocked by py3-pyside6 arch="all !riscv64" license="ISC" depends="py3-pyside6" @@ -32,5 +32,5 @@ package() { } sha512sums=" -1bfefd58d2921c8be170a97efa30cad53b01f636ea0cf236acca242be4f691669a4c310cd61c64d3e0c55e55e8be96d36945cd244380ddc0b3a06170d0f8b691 py3-pivy-0.6.9_alpha0.tar.gz +fd9587c69ad7468b771fbae59e68620f67a3c20850edadd65bf7994c1789d3444feb419e65dce34c6ee897c98eaca9f2f29f0bbfb4d1f0bbde26e4db56f74f78 py3-pivy-0.6.9.tar.gz " From 404979f01b49bad7f5450cda60ee64757473afab Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:12:06 -0400 Subject: [PATCH 070/313] backports/py3-pyinstrument: upgrade to 4.7.3 --- backports/py3-pyinstrument/APKBUILD | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/backports/py3-pyinstrument/APKBUILD b/backports/py3-pyinstrument/APKBUILD index 50f4f80..e4ab2cf 100644 --- a/backports/py3-pyinstrument/APKBUILD +++ b/backports/py3-pyinstrument/APKBUILD @@ -1,18 +1,29 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: Celeste +maintainer="Celeste " pkgname=py3-pyinstrument -pkgver=4.6.2 -pkgrel=1 +pkgver=4.7.3 +pkgrel=0 pkgdesc="Call stack profiler for Python" url="https://github.com/joerick/pyinstrument" arch="all" license="BSD-3-Clause" -makedepends="py3-gpep517 py3-setuptools py3-wheel python3-dev" -checkdepends="py3-pytest py3-flaky py3-trio py3-greenlet" +makedepends=" + py3-gpep517 + py3-setuptools + py3-wheel + python3-dev + " +checkdepends=" + py3-flaky + py3-greenlet + py3-pytest + py3-pytest-asyncio + py3-trio + " subpackages="$pkgname-pyc" source="$pkgname-$pkgver.tar.gz::https://github.com/joerick/pyinstrument/archive/refs/tags/v$pkgver.tar.gz" builddir="$srcdir/pyinstrument-$pkgver" -options="!check" # currently not working build() { gpep517 build-wheel \ @@ -21,9 +32,13 @@ build() { } check() { + [ -d "pyinstrument" ] && mv -v pyinstrument pyinstrument.src + python3 -m venv --clear --without-pip --system-site-packages .testenv .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 -m pytest + + # test_cmdline.py tries to run "pyinstrument" executable + PATH="$builddir/.testenv/bin:$PATH" .testenv/bin/python3 -m pytest } package() { @@ -31,5 +46,5 @@ package() { } sha512sums=" -da23988e6c68876cb8920ce284326f349425303ae36718c5c479b72b5f5ca5d48ced1674bcab71851f60e81a0985bb668bfa89a8b96cc20a1faa0dd7e623ec50 py3-pyinstrument-4.6.2.tar.gz +24feac08a9726379b749f391bdb6ddbca6d3631cf3515d3ead85ace7a96f213bf60e2cd4d4f3c7cade68b5e481b4bfd562482817befe6322579101a8d91add66 py3-pyinstrument-4.7.3.tar.gz " From 1a345ce163a948052c4dc7c79560bfa9263215b9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:12:38 -0400 Subject: [PATCH 071/313] backports/py3-rapidjson: build using gpep517 --- backports/py3-rapidjson/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-rapidjson/APKBUILD b/backports/py3-rapidjson/APKBUILD index 1418ad7..54cd11f 100644 --- a/backports/py3-rapidjson/APKBUILD +++ b/backports/py3-rapidjson/APKBUILD @@ -1,5 +1,5 @@ -# Contributor: Marian Buschsieweke -# Maintainer: Marian Buschsieweke +# Contributor: Marian Buschsieweke +# Maintainer: Marian Buschsieweke pkgname=py3-rapidjson pkgver=1.12 pkgrel=1 From ea2def9dd22d3cd6f4b25454c50109490b66fb31 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:13:02 -0400 Subject: [PATCH 072/313] backports/py3-rtree: build using gpep517 --- backports/py3-rtree/APKBUILD | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/backports/py3-rtree/APKBUILD b/backports/py3-rtree/APKBUILD index 52acba3..491e8e9 100644 --- a/backports/py3-rtree/APKBUILD +++ b/backports/py3-rtree/APKBUILD @@ -3,7 +3,7 @@ pkgname=py3-rtree _pkgname=rtree pkgver=1.1.0 -pkgrel=1 +pkgrel=2 pkgdesc="Python3 library for r-tree spatial index (wrapper for libspatialindex)" url="https://pypi.org/project/Rtree/" # s390x: Test failed: IndexSerialization::test_interleaving - AssertionError @@ -11,22 +11,27 @@ url="https://pypi.org/project/Rtree/" arch="noarch !s390x" license="MIT" depends="python3 libspatialindex-dev" -makedepends="py3-setuptools py3-wheel" +makedepends="py3-setuptools py3-wheel py3-gpep517" checkdepends="py3-pytest py3-numpy" subpackages="$pkgname-pyc" source="$pkgname-$pkgver.tar.gz::https://github.com/Toblerity/rtree/archive/$pkgver.tar.gz" builddir="$srcdir"/$_pkgname-$pkgver build() { - python3 setup.py build + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 } check() { - python3 -m pytest -v --doctest-modules rtree tests + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest -v --doctest-modules rtree tests } package() { - python3 setup.py install --skip-build --root="$pkgdir" + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl } sha512sums=" From 43a45d318c9680ca2a8c293220ddbd721a173591 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:13:13 -0400 Subject: [PATCH 073/313] backports/py3-svgpath: build using gpep517 --- backports/py3-svgpath/APKBUILD | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backports/py3-svgpath/APKBUILD b/backports/py3-svgpath/APKBUILD index 12901b9..3cfbc91 100644 --- a/backports/py3-svgpath/APKBUILD +++ b/backports/py3-svgpath/APKBUILD @@ -1,8 +1,9 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: Celeste +maintainer="Celeste " pkgname=py3-svgpath pkgver=6.3 -pkgrel=2 +pkgrel=3 pkgdesc="SVG path and object parser" url="https://github.com/regebro/svg.path" arch="noarch" @@ -12,7 +13,8 @@ checkdepends="py3-pytest py3-pillow" subpackages="$pkgname-pyc" source="$pkgname-$pkgver.tar.gz::https://github.com/regebro/svg.path/archive/refs/tags/$pkgver.tar.gz 105_use-better-than-nothing-font.patch - no-install-tests.patch" + no-install-tests.patch + " builddir="$srcdir/svg.path-$pkgver" build() { @@ -22,7 +24,9 @@ build() { } check() { - PYTHONPATH=build/lib pytest + python3 -m venv --clear --without-pip --system-site-packages .testenv + .testenv/bin/python3 -m installer .dist/*.whl + .testenv/bin/python3 -m pytest } package() { From 0f5a3715cea9913cff8628d53012a221a4eda786 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:13:37 -0400 Subject: [PATCH 074/313] backports/py3-trimesh: bump pkgrel --- backports/py3-trimesh/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-trimesh/APKBUILD b/backports/py3-trimesh/APKBUILD index bab0b96..7087c8d 100644 --- a/backports/py3-trimesh/APKBUILD +++ b/backports/py3-trimesh/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=py3-trimesh pkgver=3.22.1 -pkgrel=1 +pkgrel=2 pkgdesc="Python library for working with triangular meshes" url="https://github.com/mikedh/trimesh" # x86, armhf, armv7 Tests fail on int64 to int32 casts on these arches From 37d498e0ef9b843f7285e62e6d400d95cbf671f4 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:13:52 -0400 Subject: [PATCH 075/313] backports/signal-desktop: upgrade to 7.30.0 --- backports/signal-desktop/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 30a07b9..a12c250 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,8 +2,8 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.29.0 -pkgrel=0 +pkgver=7.30.0 +pkgrel=1 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" # same as electron @@ -475,7 +475,7 @@ package() { } sha512sums=" -b97155dc2ca70436d6fdf15fff059f905f065738a288679aeee2199d43824206f4c7e4bae0c228b55b4cc76b7e00875b738ee4f7dea3c2a5414acec3e208aa1e Signal-Desktop-7.29.0.tar.gz +b8c330ac0ec05b31c27c5e8b3a3d269fbd407fc1aa5b3deec7e27810a674deaf4e7075ac424753ba5ed04b6781710531c56d77038201e3cad325c9776cdd3eda Signal-Desktop-7.30.0.tar.gz 6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz 6777354b60650c6c3d359714f3aff92a315996f3725ba05c74ed054d3c4ba5506406b30c940853b5ba426ac0271cdb4dd930a759c570f486a70e1f5adc5a2aae ringrtc-2.48.3.tar.gz fe04fcf13f55b124f03ce9d516b1c53fc4f20c6a016819c62eeaa0500eda92c5a0c0d7dc5d1e360a27691dfd404c254e91bed9fb25d0fc40a27795c1b674a82e webrtc-6613c.tar.zst From b5577c66f133c070b16e58d37ca11ca267c9394a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:14:19 -0400 Subject: [PATCH 076/313] backports/soqt: fix check --- backports/soqt/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/soqt/APKBUILD b/backports/soqt/APKBUILD index 778776e..359bfb2 100644 --- a/backports/soqt/APKBUILD +++ b/backports/soqt/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman -# Maintainer: Aiden Grossman +# Maintainer: pkgname=soqt pkgver=1.6.0 -pkgrel=0 +pkgrel=1 pkgdesc="GUI binding library for coin" url="https://github.com/coin3d/soqt" arch="all" From c73afaf1108cbc9916dbb29220fb3485d1c88af1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 1 Nov 2024 10:14:28 -0400 Subject: [PATCH 077/313] backports/uranium: fix check --- backports/uranium/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/uranium/APKBUILD b/backports/uranium/APKBUILD index 2b98a85..7badd09 100644 --- a/backports/uranium/APKBUILD +++ b/backports/uranium/APKBUILD @@ -42,7 +42,7 @@ build() { check() { # useless code style test with another dependency - ctest -j $JOBS --output-on-failure -T Test + ctest --output-on-failure -T Test } package() { From 7bdf12e9bab6f7ae24f47e53d8dd6c24aef12e7b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:18:23 -0500 Subject: [PATCH 078/313] backports/calibre: upgrade to 7.21.0 --- backports/calibre/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/calibre/APKBUILD b/backports/calibre/APKBUILD index 74af5a9..64a7a04 100644 --- a/backports/calibre/APKBUILD +++ b/backports/calibre/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Cowington Post pkgname=calibre -pkgver=7.20.0 +pkgver=7.21.0 pkgrel=0 pkgdesc="Ebook management application" # qt6-webengine @@ -111,6 +111,6 @@ package() { } sha512sums=" -3b6e2d4ed8d0755096b466f4bdcc8b6ca4810398caa2322c1efc30280680ff8b10dc5fb8cb763bed8fee82746e7c51c6f31f56e5d9689d5f43c671442004c532 calibre-7.20.0.tar.xz +0c2ee610833df83219c0c33b09e1374a8262f1630ccd48e3c4725c92922a3ac5d102ad83fc213457fb9de3efa4f5a2c98ff6dff039828e1661085a1054d7f631 calibre-7.21.0.tar.xz eb8e7ce40ff8b8daf6e7e55a5dff8ec4dff06c45744266bb48b3194e92ab1196bc91468203e3c2ca1e5144166a7d6be90e6cf0253513e761b56a4c85be4c2c76 0001-calibre-no-update.patch " From b91f3b9ff95867ce47871be524f1b6b8669e9234 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:18:38 -0500 Subject: [PATCH 079/313] backports/electron: upgrade to 33.2.1 --- backports/electron/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 12d58f4..72d6e87 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,10 +1,10 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=33.0.2 +pkgver=33.2.1 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 -_chromium=130.0.6723.59 +_chromium=130.0.6723.127 _copium_tag=129.1 _depot_tools=495b23b39aaba2ca3b55dd27cadc523f1cb17ee6 pkgdesc="Electron cross-platform desktop toolkit" @@ -544,7 +544,7 @@ lang() { } sha512sums=" -6523db0feb88a742a8c7228481ae25ed9ea4eaf1cbab84d9a91212bf3590f1b87fd244bc6583e90e78ab15e4be28cc70ddaa270d582c68eaa131e3be455c58fe electron-v33.0.2-130.0.6723.59.tar.zst +e2df4454f4178af859c13aadee4ea04a5b6aa202972cad625e54bc68f5b8c25e098e50d428ec9c1886c37ccf49aaaedb4c5f02fc8bdd498314ba216901932185 electron-v33.2.1-130.0.6723.127.tar.zst 6138b3dbf3903c78f4ca1ed5a6c3c3c485471ded31976010484ce8893d03953df2b8f066a4fe84bbde5ae7ef9bbff664ef917e247b2e95dd471de40f2774d7d0 copium-129.1.tar.gz 29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch 53b7cdee8f7bfb4c9371cb385c473e34ed3d8ac7efaa43c0af061107560be30d8747b07fb0b16c01079b8c770f2c721bb5a8081313b7c126856ea4078a74da2a compiler.patch From e1ba44fb3bfab09c11292c7e6fedfdaa1985064f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:19:07 -0500 Subject: [PATCH 080/313] backports/py3-dateparser: fix tests --- backports/py3-dateparser/APKBUILD | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/backports/py3-dateparser/APKBUILD b/backports/py3-dateparser/APKBUILD index fa01fe0..17b905e 100644 --- a/backports/py3-dateparser/APKBUILD +++ b/backports/py3-dateparser/APKBUILD @@ -1,8 +1,8 @@ -# Maintainer: Hoang Nguyen +maintainer="Hoang Nguyen " pkgname=py3-dateparser _pyname=${pkgname#py3-} pkgver=1.2.0 -pkgrel=1 +pkgrel=0 pkgdesc="Python parser for human readable dates" url="https://github.com/scrapinghub/dateparser" arch="noarch" @@ -41,14 +41,9 @@ build() { check() { # test_relative_base_setting_2_en fails due to tzinfo mismatch - _test_filter="not test_parsing_date_should_fail_using_datetime_strptime_if_locale_is_non_english \ - and not test_relative_base_setting_2_en" # test_custom_language_detect_fast_text fails due to wrong file format - case "$CARCH" in - s390x) - _test_filter="$_test_filter and not test_custom_language_detect_fast_text" - ;; - esac + _test_filter="not test_parsing_date_should_fail_using_datetime_strptime_if_locale_is_non_english \ + and not test_relative_base_setting_2_en and not test_custom_language_detect_fast_text" python3 -m venv --clear --without-pip --system-site-packages .testenv .testenv/bin/python3 -m installer .dist/*.whl From e21b82beb459625b323283c3fca44e8ea980c863 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:19:29 -0500 Subject: [PATCH 081/313] backports/py3-flask-limiter: upgrade to 3.9.2 --- backports/py3-flask-limiter/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backports/py3-flask-limiter/APKBUILD b/backports/py3-flask-limiter/APKBUILD index afeb6cf..9bca96d 100644 --- a/backports/py3-flask-limiter/APKBUILD +++ b/backports/py3-flask-limiter/APKBUILD @@ -1,8 +1,8 @@ # Contributor: lauren n. liberda -# Maintainer: lauren n. liberda +maintainer="lauren n. liberda " pkgname=py3-flask-limiter -pkgver=3.7.0 -pkgrel=1 +pkgver=3.9.2 +pkgrel=0 pkgdesc="Rate Limiting extension for Flask" url="https://github.com/alisaifee/flask-limiter" arch="noarch" @@ -50,6 +50,6 @@ package() { } sha512sums=" -f546536e3efb86571515aac5b578155c240049fb1ccf96e55d4b1814d9e227e41cc18fc587f115706606154bb12a84b381533cf069cdfc56453b0f170ec19449 flask-limiter-3.7.0.tar.gz +69e488a641ab39c088185fabcde19ebb4cbe1683e9143efdf146163bb0254e0c4f8b4b72df407542d540394e7e3b2d7498b9c93c25ae8a8128e05e319f342318 flask-limiter-3.9.2.tar.gz 1b90e9134076cda249695d5ea741db9d205a2ae452c7d6edfe01eb37a221ce6f64b0e8ddcdbbee9b0e0fb16a28e5eabf14f1c1e41e965c7e3b93ea4f42caf553 our-std-is-good-enough.patch " From 76f4a5af17eaae3b1ef379402d610eadce46dd66 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:20:02 -0500 Subject: [PATCH 082/313] backports/py3-privy: bump pkgrel --- backports/py3-pivy/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/py3-pivy/APKBUILD b/backports/py3-pivy/APKBUILD index 31627ea..6b5f0f5 100644 --- a/backports/py3-pivy/APKBUILD +++ b/backports/py3-pivy/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: pkgname=py3-pivy pkgver=0.6.9 -pkgrel=0 +pkgrel=2 pkgdesc="Python3 bindings for coin" url="https://github.com/coin3d/pivy" # riscv64: blocked by py3-pyside6 From 43cc51f815d7f77b085ea21b7d471e3053158d73 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 13:20:23 -0500 Subject: [PATCH 083/313] backports/signal-desktop: upgrade to 7.34.0 --- backports/signal-desktop/APKBUILD | 116 +++++++----------- .../bettersqlite-use-system-sqlcipher.patch | 56 --------- .../signal-desktop/libsignal-auditable.patch | 6 +- .../ringrtc-webrtc-renamed.patch | 4 +- .../signal-use-system-sqlcipher.patch | 43 +++++++ .../signal-desktop/webrtc-compiler.patch | 4 +- backports/signal-desktop/webrtc-gcc13.patch | 8 +- .../signal-desktop/webrtc-shared-libs.patch | 22 ++-- 8 files changed, 109 insertions(+), 150 deletions(-) delete mode 100644 backports/signal-desktop/bettersqlite-use-system-sqlcipher.patch create mode 100644 backports/signal-desktop/signal-use-system-sqlcipher.patch diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index a12c250..0bfb575 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,8 +2,8 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.30.0 -pkgrel=1 +pkgver=7.34.0 +pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" # same as electron @@ -66,9 +66,9 @@ makedepends=" options="net !check" # use _check_depends to validate this -_libsignalver=0.58.0 -_ringrtcver=2.48.3 -_webrtcver=6613c +_libsignalver=0.60.2 +_ringrtcver=2.48.7 +_webrtcver=6723a _stokenizerver=0.2.1 source=" @@ -78,8 +78,8 @@ source=" https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst https://github.com/signalapp/Signal-FTS5-Extension/archive/refs/tags/v$_stokenizerver/stokenizer-$_stokenizerver.tar.gz - bettersqlite-use-system-sqlcipher.patch libsignal-auditable.patch + signal-use-system-sqlcipher.patch signal-disable-updates.patch signal-update-links.patch signal-show-window-please.patch @@ -123,7 +123,8 @@ _check_depends() { local _ringrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/ringrtc\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) local _bsqlitever=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/better-sqlite3\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) local _webrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/ringrtc/v$_ringrtcver/config/version.properties | awk -F '=' '{if($1 == "webrtc.version"){print $2}}' | head -n 1) - local _stokenizerver=$(curl --silent https://raw.githubusercontent.com/signalapp/better-sqlite3/v$_bsqlitever/deps/download.js | grep "const TOKENIZER_VERSION" | awk '{print $4}' | tr -d "'" | tr -d ';' | head -n 1) + local _extensionver=$(curl --silent https://raw.githubusercontent.com/signalapp/better-sqlite3/v$_bsqlitever/deps/download.js | grep "const EXTENSION_VERSION" | awk '{print $4}' | tr -d "'" | tr -d ';' | head -n 1) + local _stokenizerver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Sqlcipher-Extension/refs/tags/v$_extensionver/Cargo.lock | sed -n "/^name = \"signal-tokenizer\"$/,/^$/p" | awk -F ' = ' '{if($1=="version"){print $2}}' | tr -d '"') echo _libsignalver=$_libsignalver echo _ringrtcver=$_ringrtcver @@ -180,38 +181,19 @@ target_cpu_only = True mcli cp "$SRCDEST"/webrtc-$_webrtcver.tar.zst "$_distbucket" } -# manual patches -default_prepare() { :; } - prepare() { - default_prepare - msg "Applying patches" - for x in $source; do - case "$x" in - signal-*.patch) - msg "$x" - patch -p1 -i "$srcdir"/$x -d "$srcdir"/Signal-Desktop-$pkgver - ;; - libsignal-*.patch) - msg "$x" - patch -p1 -i "$srcdir"/$x -d "$srcdir"/libsignal-$_libsignalver - ;; - ringrtc-*.patch) - msg "$x" - patch -p1 -i "$srcdir"/$x -d "$srcdir"/ringrtc-$_ringrtcver - ;; - webrtc-*.patch) - msg "$x" - patch -p1 -i "$srcdir"/$x -d "$srcdir"/webrtc-$_webrtcver - ;; - esac + # Moves to builddir to use abuild patch logics + for i in libsignal-$_libsignalver ringrtc-$_ringrtcver webrtc-$_webrtcver Signal-FTS5-Extension-$_stokenizerver; do + mv "$srcdir"/$i "$builddir"/${i%-*} done msg "Installing signal-desktop JS dependencies" npm ci --ignore-scripts + default_prepare + ( - cd "$srcdir"/webrtc-$_webrtcver + cd "$builddir"/webrtc local use_system=" brotli @@ -272,35 +254,35 @@ prepare() { ) ( - cd "$srcdir"/ringrtc-$_ringrtcver/src/rust + cd "$builddir"/ringrtc/src/rust msg "Installing ringrtc rust dependencies" cargo fetch --target="$CTARGET" --locked ) ( - cd "$srcdir"/libsignal-$_libsignalver + cd "$builddir"/libsignal msg "Installing libsignal rust dependencies" cargo fetch --target="$CTARGET" --locked ) ( - cd "$srcdir"/Signal-FTS5-Extension-$_stokenizerver + cd "$builddir"/Signal-FTS5-Extension msg "Installing signal tokenizer rust dependencies" cargo fetch --target="$CTARGET" --locked ) ( - cd "$srcdir"/ringrtc-$_ringrtcver/src/node + cd "$builddir"/ringrtc/src/node msg "Installing ringrtc js dependencies" npm ci --ignore-scripts ) ( - cd "$srcdir"/libsignal-$_libsignalver/node + cd "$builddir"/libsignal/node # fix target sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' binding.gyp @@ -318,7 +300,7 @@ build() { # required dependency of ringrtc ( - cd "$srcdir"/webrtc-$_webrtcver + cd "$builddir"/webrtc export PATH="$PWD/path:$PATH" # shellcheck disable=2089 @@ -350,18 +332,18 @@ build() { use_lld=true use_sysroot=false " - mkdir -p "$srcdir"/ringrtc-$_ringrtcver/out/release + mkdir -p "$builddir"/ringrtc/out/release msg "Building signal's webrtc" # shellcheck disable=2090,2116 - gn gen "$srcdir"/ringrtc-$_ringrtcver/out/release --args="$(echo $webrtc_args)" - ninja -C "$srcdir"/ringrtc-$_ringrtcver/out/release signaldeswebrtc + gn gen "$builddir"/ringrtc/out/release --args="$(echo $webrtc_args)" + ninja -C "$builddir"/ringrtc/out/release signaldeswebrtc ) ( - cd "$srcdir"/ringrtc-$_ringrtcver + cd "$builddir"/ringrtc msg "Building libringrtc" - OUTPUT_DIR="$srcdir"/ringrtc-$_ringrtcver/out \ + OUTPUT_DIR="$builddir"/ringrtc/out \ cargo auditable build --features electron --release -p ringrtc mkdir -p src/node/build/linux @@ -370,7 +352,7 @@ build() { ) ( - cd "$srcdir"/ringrtc-$_ringrtcver/src/node + cd "$builddir"/ringrtc/src/node msg "Building ringrtc JS glue code" npm run build @@ -380,7 +362,7 @@ build() { # module on npm intentionally unbuildable: https://github.com/signalapp/libsignal/issues/464#issuecomment-1160665052 ( - cd "$srcdir"/libsignal-$_libsignalver/node + cd "$builddir"/libsignal/node msg "Building libsignal" node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source @@ -397,7 +379,7 @@ build() { ) ( - cd "$srcdir"/Signal-FTS5-Extension-$_stokenizerver + cd "$builddir"/Signal-FTS5-Extension msg "Building signal tokenizer" cargo auditable build --features extension --release --frozen @@ -423,25 +405,15 @@ build() { # use our libsignal rm -rf node_modules/@signalapp/libsignal-client/ - mv "$srcdir"/libsignal-$_libsignalver/node/ node_modules/@signalapp/libsignal-client + mv libsignal/node/ node_modules/@signalapp/libsignal-client # use our libringrtc rm -rf node_modules/@signalapp/ringrtc/ - mv "$srcdir"/ringrtc-$_ringrtcver/src/node/ node_modules/@signalapp/ringrtc - - # patch the sqlcipher module - for x in $source; do - case "$x" in - bettersqlite-*.patch) - msg "$x" - patch -Np1 -i "$srcdir"/$x -d "$srcdir"/Signal-Desktop-$pkgver/node_modules/@signalapp/better-sqlite3/ - ;; - esac - done + mv ringrtc/src/node/ node_modules/@signalapp/ringrtc mkdir node_modules/@signalapp/better-sqlite3/tokenizer - mv "$srcdir"/Signal-FTS5-Extension-$_stokenizerver/target/release/libsignal_tokenizer.a node_modules/@signalapp/better-sqlite3/tokenizer/ - mv "$srcdir"/Signal-FTS5-Extension-$_stokenizerver/target/release/signal-tokenizer.h node_modules/@signalapp/better-sqlite3/tokenizer/ + mv Signal-FTS5-Extension/target/release/libsignal_tokenizer.a node_modules/@signalapp/better-sqlite3/tokenizer/ + mv Signal-FTS5-Extension/target/release/signal-tokenizer.h node_modules/@signalapp/better-sqlite3/tokenizer/ npm rebuild \ sharp @signalapp/better-sqlite3 spellchecker websocket \ @@ -465,9 +437,9 @@ package() { install -Dm644 signal.desktop "$pkgdir"/usr/share/applications/$pkgname.desktop # this should be in /usr/lib/signal-desktop. however, it does not simply work and I stopped to care - install -Dm755 "$srcdir"/ringrtc-$_ringrtcver/out/release/libsignaldeswebrtc.so "$pkgdir"/usr/lib/libsignaldeswebrtc.so + install -Dm755 "$builddir"/ringrtc/out/release/libsignaldeswebrtc.so "$pkgdir"/usr/lib/libsignaldeswebrtc.so - install -Dm755 "$srcdir"/$pkgname "$pkgdir"/usr/bin/$pkgname + install -Dm755 "$srcdir"/signal-desktop "$pkgdir"/usr/bin/signal-desktop while read -r size; do install -Dm644 icons/$size.png "$pkgdir"/usr/share/icons/hicolor/$size/apps/$pkgname.png @@ -475,19 +447,19 @@ package() { } sha512sums=" -b8c330ac0ec05b31c27c5e8b3a3d269fbd407fc1aa5b3deec7e27810a674deaf4e7075ac424753ba5ed04b6781710531c56d77038201e3cad325c9776cdd3eda Signal-Desktop-7.30.0.tar.gz -6fb62213d8177ac5abe83ea71a18ea4b1c7b323983c41087166658fe9c47c1fd39e5323ca6acefe3db2a9a9376b6f385b5f2c006154da3ab705741d848b28943 libsignal-0.58.0.tar.gz -6777354b60650c6c3d359714f3aff92a315996f3725ba05c74ed054d3c4ba5506406b30c940853b5ba426ac0271cdb4dd930a759c570f486a70e1f5adc5a2aae ringrtc-2.48.3.tar.gz -fe04fcf13f55b124f03ce9d516b1c53fc4f20c6a016819c62eeaa0500eda92c5a0c0d7dc5d1e360a27691dfd404c254e91bed9fb25d0fc40a27795c1b674a82e webrtc-6613c.tar.zst +30e06721b01e580414c5e57b63350fc42edbe837b0a60a9cd100bc6ab1758fa6fd5744dc3a35d991db62f363eab791c45b43e1d9d5c81af9e67685114ae2e630 Signal-Desktop-7.34.0.tar.gz +26780a0a6a529cee18f5c3b58f0395c6b5b630dbc8d2bbaa345dd7dd319a0e8548575c915dc16de6ac5d421fffdbe898f2dedb1fa3b4eab5d26debdfc1da515b libsignal-0.60.2.tar.gz +e5e5ab27dc3bd37ef577c248d450e70fa11e72bdfab00fef233aad84d3d8aa3434166c03267f6b95b69d593e9da2f37017b5b7a0913f68499f387354742ba50a ringrtc-2.48.7.tar.gz +64eed5c2a6f5a505d014bc4fa80e15b21103df1ea27825eaa1dfecc23c269f198a7e98472f29de7cae4ac7fa4fede6e837c27494b8ec4d03e36b85b029c64831 webrtc-6723a.tar.zst 84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz -be5b4e823543b79175a12314f10c6326d9f0d59f470136962daed4665887006acc05b48b40dc1b67747396d8f6f7d23be298c1e110ccdd35ff9b09d5e6b80bab bettersqlite-use-system-sqlcipher.patch -2e5fadff725f1d62e7134c8929c672ec88cae602b065480f1b799d34160daa0cb1ad0f5511e60676f81464ae8752c3bec7b3d7bc5a432533be004b4d20ac32c2 libsignal-auditable.patch +8d2d2d82c8546c2dd1fef161b61df79918f8c22235a56a46adb375a0beb4acef12c5fe53e67242a4be97f77adc522ff79b47949c352956c742a70d50f4179f7f libsignal-auditable.patch +cee74edb504ee5ae685e8a449ac35fabf949c33bfee5905778f850c3b18e17f9ae9bd501c89a7fd2c9c81a5bb2b0af0c0b3c72e32128603b3923c32d2a493ce9 signal-use-system-sqlcipher.patch 152435231cdcf52a17a9e24aadf95d77511258e818172941ba074a73a90a541f0136feb58868674f2bcb19191a6d12933fe6cd5baf3ee99e508915c72523163b signal-disable-updates.patch d50eb5724502df9ea4d795db8cfc27af767c25168d7db2af512e615be7cc2ca290210a9ae78e1abb153c0198677e858ad3d74926c958099d0319295e7d9e7f1d signal-update-links.patch bfc8acdd13aa48d29c7657311733cc9d33c4899782efbd1ef6d25ad1698be4de7cc67e829324bc0309715d69ae37ea9f782cf54887317e817213e110d73d68e7 signal-show-window-please.patch -b11fdd930943ca327650e4738ed85cd6b5eea779455a5895bccebba98e449bafc6b0f09bcf4545f2b2e16644355664e9768dd6d4d62f87619207c430367f72c5 ringrtc-webrtc-renamed.patch -0888673ba687747beda61cd50efbc25095f4a3d26f1dd58bf003e3a0bf1d302c3f2ebd1deecf630fbf04aedb7b8cd409e9efda4d1e6fda63234c9a9b9755bff4 webrtc-shared-libs.patch -e07ae8544988d402aaf0fbd95ea36a64c94c59566c561132578aa6dcf8ff11a34058530e64dc204e5cadc2482f1401e74b32384a144e5e08017c663d0cf7c2fc webrtc-compiler.patch -88515d8b8cc82355c9f9b0f44fac83b7ff149b13e9fb102fd46036ec5234cfb2385fa5ad58a0520ee604b93dc4ddd6ae18a7005978ef207841645724ef7a9749 webrtc-gcc13.patch +10284e0d86ab88de161ae689871082194f689ce416f3ebada8991d5db707994ea1cb8b4212756dd93ba5a3469964050988220f18afc37e38f3404a6e17ec8caf ringrtc-webrtc-renamed.patch +98a7e4df27c3ed56c5968ebc3ae8e08bfb54362d0c910f9af1d414079a6d5fe0f18aa570ae3c38042f4691af6a130cb3ff689625e26a3987720dd319a5f587b1 webrtc-shared-libs.patch +fe78cdc58c18826fc4227cc8e9377980766229390544578f6a1a6f7322bc3243c066963b589323dbfe4f2bfd37f8859ad84f63cb3783317892e5ae3652270a3a webrtc-compiler.patch +48ab5c733e643eaff08ccbe839086bebbb68d397984ad7c5c5b68df8071f75d2dfe92c3f52d9fbf9b81754934bdfa8a67c69addd476ce4265b978592fb4ff9bd webrtc-gcc13.patch 87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop " diff --git a/backports/signal-desktop/bettersqlite-use-system-sqlcipher.patch b/backports/signal-desktop/bettersqlite-use-system-sqlcipher.patch deleted file mode 100644 index f0dfe0d..0000000 --- a/backports/signal-desktop/bettersqlite-use-system-sqlcipher.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- a/binding.gyp -+++ b/binding.gyp -@@ -7,7 +7,16 @@ - 'targets': [ - { - 'target_name': 'better_sqlite3', -- 'dependencies': ['deps/sqlite3.gyp:sqlite3'], -+ 'include_dirs': [ -+ '/usr/include/sqlcipher', -+ 'tokenizer', -+ ], -+ 'link_settings': { -+ 'libraries': [ -+ '-lsqlcipher', -+ ' int: if 'npm_config_libsignal_debug_level_logs' not in os.environ: features.append('log/release_max_level_info') diff --git a/backports/signal-desktop/ringrtc-webrtc-renamed.patch b/backports/signal-desktop/ringrtc-webrtc-renamed.patch index 228c308..6f8a2b3 100644 --- a/backports/signal-desktop/ringrtc-webrtc-renamed.patch +++ b/backports/signal-desktop/ringrtc-webrtc-renamed.patch @@ -1,5 +1,5 @@ ---- ./src/rust/build.rs.orig -+++ ./src/rust/build.rs +--- ./ringrtc/src/rust/build.rs.orig ++++ ./ringrtc/src/rust/build.rs @@ -79,6 +79,7 @@ if cfg!(feature = "native") { diff --git a/backports/signal-desktop/signal-use-system-sqlcipher.patch b/backports/signal-desktop/signal-use-system-sqlcipher.patch new file mode 100644 index 0000000..22b2e2f --- /dev/null +++ b/backports/signal-desktop/signal-use-system-sqlcipher.patch @@ -0,0 +1,43 @@ +diff --git a/node_modules/@signalapp/better-sqlite3/binding.gyp.orig b/node_modules/@signalapp/better-sqlite3/binding.gyp +index c370c30b309..bf0207e6fec 100644 +--- a/node_modules/@signalapp/better-sqlite3/binding.gyp.orig ++++ b/node_modules/@signalapp/better-sqlite3/binding.gyp +@@ -7,7 +7,16 @@ + 'targets': [ + { + 'target_name': 'better_sqlite3', +- 'dependencies': ['deps/sqlite3.gyp:sqlite3'], ++ 'include_dirs': [ ++ '/usr/include/sqlcipher', ++ 'tokenizer', ++ ], ++ 'link_settings': { ++ 'libraries': [ ++ '-lsqlcipher', ++ ' @@ -8,8 +8,8 @@ #include ---- ./modules/audio_coding/neteq/reorder_optimizer.cc.orig -+++ ./modules/audio_coding/neteq/reorder_optimizer.cc +--- ./webrtc/modules/audio_coding/neteq/reorder_optimizer.cc.orig ++++ ./webrtc/modules/audio_coding/neteq/reorder_optimizer.cc @@ -11,6 +11,7 @@ #include "modules/audio_coding/neteq/reorder_optimizer.h" diff --git a/backports/signal-desktop/webrtc-shared-libs.patch b/backports/signal-desktop/webrtc-shared-libs.patch index 3916fe0..f4bf714 100644 --- a/backports/signal-desktop/webrtc-shared-libs.patch +++ b/backports/signal-desktop/webrtc-shared-libs.patch @@ -1,5 +1,5 @@ ---- ./BUILD.gn.orig -+++ ./BUILD.gn +--- ./webrtc/BUILD.gn.orig ++++ ./webrtc/BUILD.gn @@ -38,7 +38,7 @@ # 'ninja default' and then 'ninja all', the second build should do no work. group("default") { @@ -26,10 +26,10 @@ suppressed_configs += [ "//build/config/compiler:thin_archive" ] defines = [] -diff --git a/third_party/googletest/BUILD.gn.orig b/third_party/googletest/BUILD.gn +diff --git a/webrtc/third_party/googletest/BUILD.gn.orig b/webrtc/third_party/googletest/BUILD.gn index 14089f0..b7dc621 100644 ---- a/third_party/googletest/BUILD.gn.orig -+++ b/third_party/googletest/BUILD.gn +--- a/webrtc/third_party/googletest/BUILD.gn.orig ++++ b/webrtc/third_party/googletest/BUILD.gn @@ -48,7 +48,6 @@ config("gtest_config") { configs = [ @@ -38,10 +38,10 @@ index 14089f0..b7dc621 100644 ] } -diff --git a/third_party/googletest/BUILD.gn.orig b/third_party/googletest/BUILD.gn +diff --git a/webrtc/third_party/googletest/BUILD.gn.orig b/webrtc/third_party/googletest/BUILD.gn index b7dc621..367f929 100644 ---- a/third_party/googletest/BUILD.gn.orig -+++ b/third_party/googletest/BUILD.gn +--- a/webrtc/third_party/googletest/BUILD.gn.orig ++++ b/webrtc/third_party/googletest/BUILD.gn @@ -133,7 +133,6 @@ source_set("gtest") { # googletest only needs `absl`, but this makes gn check happier. @@ -50,10 +50,10 @@ index b7dc621..367f929 100644 if (is_nacl || !build_with_chromium) { defines += [ "GTEST_DISABLE_PRINT_STACK_TRACE" ] sources -= [ -diff --git a/third_party/fuzztest/BUILD.gn.orig b/third_party/fuzztest/BUILD.gn +diff --git a/webrtc/third_party/fuzztest/BUILD.gn.orig b/webrtc/third_party/fuzztest/BUILD.gn index 57ee790..ba1d297 100644 ---- a/third_party/fuzztest/BUILD.gn.orig -+++ b/third_party/fuzztest/BUILD.gn +--- a/webrtc/third_party/fuzztest/BUILD.gn.orig ++++ b/webrtc/third_party/fuzztest/BUILD.gn @@ -309,7 +309,6 @@ source_set("fuzztest_internal") { # For RE2 mutators. It's questionable whether we want to pull this library # into every fuzztest target, but this is the approach used in other From d7b083ff8c481a69e5394c22bbb540597d0ae447 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 19:47:42 -0500 Subject: [PATCH 084/313] backports/libmedc: drop --- backports/libmedc/APKBUILD | 43 ----------- backports/libmedc/cmake-config-dir.patch | 11 --- backports/libmedc/hdf5.patch | 94 ------------------------ 3 files changed, 148 deletions(-) delete mode 100644 backports/libmedc/APKBUILD delete mode 100644 backports/libmedc/cmake-config-dir.patch delete mode 100644 backports/libmedc/hdf5.patch diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD deleted file mode 100644 index 8976805..0000000 --- a/backports/libmedc/APKBUILD +++ /dev/null @@ -1,43 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=libmedc -pkgver=4.1.1 -pkgrel=4 -pkgdesc="Open source library for numerical simulation" -url="https://www.salome-platform.org/" -arch="all" -license="GPL-3.0-or-later" -makedepends="cmake hdf5-dev swig python3-dev samurai" -options="!check" #test suite is nonfunctional with python bindings -subpackages="$pkgname-dev $pkgname-doc $pkgname-python-pyc $pkgname-python:_py" -source=" - https://files.salome-platform.org/Salome/medfile/med-$pkgver.tar.gz - hdf5.patch - cmake-config-dir.patch - " -builddir="$srcdir/med-$pkgver" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=None \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DMEDFILE_BUILD_TESTS=OFF \ - -DMEDFILE_BUILD_PYTHON=ON - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -_py() { - pkgdesc="Python bindings for libmedc" - depends="python3" - amove usr/lib/python3* -} - -sha512sums=" -f211fa82750a7cc935baa3a50a55d16e40117a0f2254b482492ba8396d82781ca84960995da7a16b2b5be0b93ce76368bf4b311bb8af0e5f0243e7051c9c554c med-4.1.1.tar.gz -68d9291e73a68d674081314028c0fce7bbd4a7b78b93b7e5078117ce62f2d07318bc33ec95091ce677148ec3926c1ce653d0760c34e74b29257a7be59210f040 hdf5.patch -8d0f58cd67d205fbacaff0e6da76e2ee5473457b478ede13a551ebe5853c0716c7406b74c3792e1ace33a34d352fccca8dd2940f063a7c060a12529d060a991a cmake-config-dir.patch -" diff --git a/backports/libmedc/cmake-config-dir.patch b/backports/libmedc/cmake-config-dir.patch deleted file mode 100644 index e1f43a4..0000000 --- a/backports/libmedc/cmake-config-dir.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -101,7 +101,7 @@ - IF(WIN32 AND NOT CYGWIN) - SET(INSTALL_CMAKE_CONFIG_DIR cmake) - ELSE() -- SET(INSTALL_CMAKE_CONFIG_DIR share/cmake/medfile-${MED_STR_VERSION}) -+ SET(INSTALL_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/medfile-${MED_STR_VERSION}) - ENDIF() - SET(INSTALL_INCLUDE_DIR include) - diff --git a/backports/libmedc/hdf5.patch b/backports/libmedc/hdf5.patch deleted file mode 100644 index bc4764b..0000000 --- a/backports/libmedc/hdf5.patch +++ /dev/null @@ -1,94 +0,0 @@ -Originally from https://gist.github.com/jedbrown/527ef81ff59a0dccf833da40fdd15a47 -diff -rupN med-4.1.0/config/cmake_files/medMacros.cmake med-4.1.0-new/config/cmake_files/medMacros.cmake ---- med-4.1.0/config/cmake_files/medMacros.cmake 2021-12-03 09:35:30.675827163 +0100 -+++ med-4.1.0-new/config/cmake_files/medMacros.cmake 2021-12-03 09:32:31.894994147 +0100 -@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5) - ## - ## Requires 1.10.x version - ## -- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 10 OR NOT HDF_VERSION_RELEASE_REF GREATER 1) -+ IF (HDF5_VERSION VERSION_LESS 1.10.2) - MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.10.2 are supported.") - ENDIF() - ## -diff -rupN med-4.1.0/src/ci/MEDfileCompatibility.c med-4.1.0-new/src/ci/MEDfileCompatibility.c ---- med-4.1.0/src/ci/MEDfileCompatibility.c 2021-12-03 09:35:30.676827162 +0100 -+++ med-4.1.0-new/src/ci/MEDfileCompatibility.c 2021-12-03 09:33:26.292942149 +0100 -@@ -71,7 +71,7 @@ MEDfileCompatibility(const char* const f - _hversionMMR=10000*_hmajeur+100*_hmineur+_hrelease; - /* ISCRUTE(_hversionMMR); */ - /* ISCRUTE(HDF_VERSION_NUM_REF); */ -- if ( (_hversionMMR >= HDF_VERSION_NUM_REF) && (_hmineur == HDF_VERSION_MINOR_REF) ) *hdfok = MED_TRUE; -+ if (_hversionMMR >= HDF_VERSION_NUM_REF) *hdfok = MED_TRUE; - - /* TODO : Vérifier si la version mineure HDF du fichier est supérieure - à la version mineure de la bibliothèque HDF utilisée : -@@ -113,7 +113,7 @@ MEDfileCompatibility(const char* const f - #if MED_NUM_MAJEUR != 4 - #error "Don't forget to update the test version here when you change the major version of the library !" - #endif --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !" - #error "Cf. _MEDfileCreate ..." - #endif -diff -rupN med-4.1.0/src/hdfi/_MEDfileCreate.c med-4.1.0-new/src/hdfi/_MEDfileCreate.c ---- med-4.1.0/src/hdfi/_MEDfileCreate.c 2021-12-03 09:35:30.677827161 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDfileCreate.c 2021-12-03 09:32:31.894994147 +0100 -@@ -159,7 +159,7 @@ med_idt _MEDfileCreate(const char * cons - * En HDF5-1.10.0p1 cela n'a aucun effet ! - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN med-4.1.0/src/hdfi/_MEDfileOpen.c med-4.1.0-new/src/hdfi/_MEDfileOpen.c ---- med-4.1.0/src/hdfi/_MEDfileOpen.c 2021-12-03 09:35:30.677827161 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDfileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -72,7 +72,7 @@ med_idt _MEDfileOpen(const char * const - - • The creation order tracking property, H5P_CRT_ORDER_TRACKED, has been set in the group creation property list (see H5Pset_link_creation_order). - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - /* L'avantage de bloquer le modèle interne HDF5 -diff -rupN med-4.1.0/src/hdfi/_MEDmemFileOpen.c med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c ---- med-4.1.0/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:35:30.678827160 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -434,7 +434,7 @@ med_idt _MEDmemFileOpen(const char * con - goto ERROR; - } - --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18) ) { -diff -rupN med-4.1.0/src/hdfi/_MEDparFileCreate.c med-4.1.0-new/src/hdfi/_MEDparFileCreate.c ---- med-4.1.0/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:35:30.678827160 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:32:31.894994147 +0100 -@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c - * En HDF5-1.10.0p1 cela n'a aucun effet ! - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN med-4.1.0/src/hdfi/_MEDparFileOpen.c med-4.1.0-new/src/hdfi/_MEDparFileOpen.c ---- med-4.1.0/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:35:30.679827159 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -55,7 +55,7 @@ med_idt _MEDparFileOpen(const char * con - MED_ERR_(_fid,MED_ERR_INIT,MED_ERR_PROPERTY,MED_ERR_PARALLEL_MSG); - goto ERROR; - } --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18 ) ) { From ab9d5e96500626e8960be31cb60ca97b3f977d46 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 30 Nov 2024 19:49:37 -0500 Subject: [PATCH 085/313] backports/py3-numpy-stl: upgrade to 3.2.0 --- backports/py3-numpy-stl/APKBUILD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backports/py3-numpy-stl/APKBUILD b/backports/py3-numpy-stl/APKBUILD index 1c72a2e..1191396 100644 --- a/backports/py3-numpy-stl/APKBUILD +++ b/backports/py3-numpy-stl/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman # Maintainer: pkgname=py3-numpy-stl -pkgver=3.0.1 -pkgrel=4 +pkgver=3.2.0 +pkgrel=0 pkgdesc="Library for working with STLs" url="https://github.com/WoLpH/numpy-stl" # s390x: no py3-utils @@ -10,9 +10,9 @@ arch="noarch !s390x" license="BSD-3-Clause" depends="python3 py3-utils py3-numpy" makedepends="py3-setuptools py3-gpep517" -checkdepends="py3-pytest" +checkdepends="py3-pytest py3-pytest-cov py3-pygments" subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/wolph/numpy-stl/releases/download/v$pkgver/numpy-stl-$pkgver.tar.gz" +source="$pkgname-$pkgver.tar.gz::https://github.com/wolph/numpy-stl/archive/refs/tags/v$pkgver.tar.gz" builddir="$srcdir/numpy-stl-$pkgver" build() { @@ -35,5 +35,5 @@ package() { } sha512sums=" -d01abb8f54738600ce36c8c44e1392957061030e7accbbfa0352aea4a904323a96712099146b311ce9518f243317c25c47cfb30930469602c0ad439de9f43c5f py3-numpy-stl-3.0.1.tar.gz +a08053ed264dbfd629229af3db9c38deed2932b28feced56e2d4c20476f1ba85ddc80881fb82330ea3f4fff9a3f91da20db7447050da5c75f1c04455a67538dc py3-numpy-stl-3.2.0.tar.gz " From a0687332256dce145df204746f6f2b2caebb5228 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 12:35:57 -0500 Subject: [PATCH 086/313] forgejo-ci: add check-backports workflow --- .forgejo/workflows/check-backports.yml | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .forgejo/workflows/check-backports.yml diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml new file mode 100644 index 0000000..2cac95f --- /dev/null +++ b/.forgejo/workflows/check-backports.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-backports: + name: Check backports repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From 7a2cb83701fcd501f41a30b94717fd798bd687d7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 12:41:32 -0500 Subject: [PATCH 087/313] forgejo-ci: add ALL_PACKAGES var to skip maintainer filter --- .forgejo/bin/check_ver.sh | 10 +++++++--- .forgejo/workflows/check-backports.yml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 7a1f534..6403e54 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -7,9 +7,13 @@ repo=${downstream/*\/} curl --silent $downstream/x86_64/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX -owned_by_you=$(awk -v RS= -v ORS="\n\n" '/m:Antoine Martin \(ayakael\) /' APKINDEX | awk -F ':' '{if($1=="o"){print $2}}' | sort | uniq) - -echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages owned by you" +if [ "$ALL_PACKAGES" == "true" ]; then + owned_by_you=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) + echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages" +else + owned_by_you=$(awk -v RS= -v ORS="\n\n" '/m:Antoine Martin \(ayakael\) /' APKINDEX | awk -F ':' '{if($1=="o"){print $2}}' | sort | uniq) + echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages owned by you" +fi rm -f out_of_date not_in_anitya diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index 2cac95f..c84ef2d 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -14,6 +14,7 @@ jobs: downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports FORGEJO_TOKEN: ${{ secrets.forgejo_token }} LABEL_NUMBER: 4 + ALL_PACKAGES: true steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 89c8805846e863b0a2b5134929715866a225baff Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 13:12:13 -0500 Subject: [PATCH 088/313] forgejo-ci: backports use its own label --- .forgejo/workflows/check-backports.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index c84ef2d..b9f76a6 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -13,7 +13,7 @@ jobs: env: downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports FORGEJO_TOKEN: ${{ secrets.forgejo_token }} - LABEL_NUMBER: 4 + LABEL_NUMBER: 1 ALL_PACKAGES: true steps: - name: Environment setup From b8f608772ccffaf514f29edb09fdc758a4c8207f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 13:39:18 -0500 Subject: [PATCH 089/313] forgejo-ci: add clear-repo binary --- .forgejo/bin/clear-repo.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 .forgejo/bin/clear-repo.sh diff --git a/.forgejo/bin/clear-repo.sh b/.forgejo/bin/clear-repo.sh new file mode 100755 index 0000000..14110ea --- /dev/null +++ b/.forgejo/bin/clear-repo.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +TARGET_REPO=$1 +ARCH=$2 + + +curl --silent $TARGET_REPO/$ARCH/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX + +pkgs=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) + +for pkg in $pkgs; do + pkgvers=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') + for pkgver in $pkgvers; do + echo "Deleting $pkg-$pkgver of arch $ARCH from $TARGET_REPO" + curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN -X DELETE $TARGET_REPO/$ARCH/$pkg-$pkgver.apk + done +done From f853f9956df399159908dc460fa04daf4a78c357 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 14:53:38 -0500 Subject: [PATCH 090/313] README: add notice for backports --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 75165d0..571e4cd 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ https://ayakael.net/api/packages/forge/alpine/edge/backports ``` Aports from the official Alpine repositories backported from edge. +(note that this is only kept up-to-date on latest stable release as there is + little point in updating backports on `edge`) #### User ``` From 0a88d5c3a311849da88f6e956a7484716e72ac85 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 1 Dec 2024 14:55:11 -0500 Subject: [PATCH 091/313] README: update notice for backports --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 571e4cd..8a099df 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,11 @@ Affixed to each repository description is the appropriate link for use in #### Backports ``` -https://ayakael.net/api/packages/forge/alpine/edge/backports +https://ayakael.net/api/packages/forge/alpine/v3.21/backports ``` -Aports from the official Alpine repositories backported from edge. -(note that this is only kept up-to-date on latest stable release as there is - little point in updating backports on `edge`) +Aports from the official Alpine repositories backported from edge. This is only +available and kept up-to-date on latest stable release. #### User ``` From 9e7a9c464e62fdcec11b9db373af4c866d842014 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 10 Dec 2024 14:53:25 -0500 Subject: [PATCH 092/313] user/papermc: move from unmaintained, upgrade to 1.21.3 --- unmaintained/papermc/APKBUILD | 56 ------------------- unmaintained/papermc/APKBUILD.orig | 56 ------------------- unmaintained/papermc/APKBUILD.rej | 38 ------------- user/papermc/APKBUILD | 50 +++++++++++++++++ {unmaintained => user}/papermc/papermc.conf | 0 {unmaintained => user}/papermc/papermc.initd | 0 .../papermc/papermc.post-install | 0 .../papermc/papermc.service | 0 {unmaintained => user}/papermc/papermc.sh | 0 9 files changed, 50 insertions(+), 150 deletions(-) delete mode 100644 unmaintained/papermc/APKBUILD delete mode 100644 unmaintained/papermc/APKBUILD.orig delete mode 100644 unmaintained/papermc/APKBUILD.rej create mode 100644 user/papermc/APKBUILD rename {unmaintained => user}/papermc/papermc.conf (100%) rename {unmaintained => user}/papermc/papermc.initd (100%) rename {unmaintained => user}/papermc/papermc.post-install (100%) rename {unmaintained => user}/papermc/papermc.service (100%) rename {unmaintained => user}/papermc/papermc.sh (100%) diff --git a/unmaintained/papermc/APKBUILD b/unmaintained/papermc/APKBUILD deleted file mode 100644 index e400914..0000000 --- a/unmaintained/papermc/APKBUILD +++ /dev/null @@ -1,56 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=papermc -_pkgver=1.18.1 -_build=99 -_license_commit=4a7962c -pkgver="$_pkgver.$_build" -pkgrel=1 -pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" -pkgusers="craftbukkit" -pkggroups="craftbukkit" -arch='noarch' -url="https://papermc.io/" -license='custom' -depends='openjdk17-jre-headless screen sudo bash gawk sed netcat-openbsd tar' -options="!check" -provides="craftbukkit=$_pkgver" -subpackages="$pkgname-openrc" -source="papermc.$pkgver.jar::https://papermc.io/api/v2/projects/paper/versions/$_pkgver/builds/$_build/downloads/paper-$_pkgver-$_build.jar - papermc.initd - papermc.conf - papermc.sh - LICENSE_$pkgver.md::https://raw.githubusercontent.com/PaperMC/Paper/$_license_commit/LICENSE.md -" - -_game="papermc" -_server_root="/var/lib/papermc" - -package() { - install -Dm644 "$srcdir"/$_game.conf "$pkgdir"/etc/conf.d/$_game - install -Dm755 "$srcdir"/$_game.sh "$pkgdir"/usr/bin/$_game - install -Dm755 "$srcdir"/$_game.initd "$pkgdir"/etc/init.d/$_game - install -Dm644 "$srcdir"/$_game.$pkgver.jar "$pkgdir"/$_server_root/$_game/$pkgver.jar - ln -s "$_game"/$pkgver.jar "$pkgdir"/$_server_root/$_game/server.jar - - # Link to craftbukkit plugins var - ln -s "/var/lib/craftbukkit/plugins" "$pkgdir"/$_server_root/plugins - - # Link the log files - mkdir -p "$pkgdir"/var/log/ - install -dm2755 "$pkgdir"/$_server_root/logs - ln -s "$_server_root"/logs "$pkgdir"/var/log/$_game - - # Give the group write permissions and set user or group ID on execution - chmod g+ws "$pkgdir"/$_server_root - - install -D "$srcdir"/LICENSE_$pkgver.md "$pkgdir"/usr/share/licenses/$pkgname/LICENSE -} -sha512sums=" -623d6423ee337671d546469e6bf1821005484192a1ae56d7b77f547f79102df50462e1d0144be13a0de9021c9d931bc974143b1e1526114627ba28688589d76a papermc.1.18.1.99.jar -c5d1bf85ceb74162aaaf2bcd2d06dc2e3dd2e37c39f0cee2be7c8dbff9970a6aff1e48a43e6d1e83e6a0ac610bd89f62b1279bf27b64afa88d9831a36aebbd3e papermc.initd -9b8e267428731ee9255f82a93f1e8674d7e917a0f154bd395cd2280a49aa248a4b8427520b08dbb4b3a74a5471dac0e439eedc8ab94bf2e53bb8d411d2d8a789 papermc.conf -943ba0d4c10173246bdc6497dcedd54da0788f966841c8d3381398711d79f8d5eb07a24ce28f519b6f24f59d99fa9e74bc6bb882059f343df4eeda5de3660ac7 papermc.sh -d4c645a58e1a17a0a1e42856a3cc43097711a05bf3d9f18c77c3bc9874417f223552859042ff00b7d3dda0003f49a9ee568540c2eb24e9f8fbb3c055f3b6e0a5 LICENSE_1.18.1.99.md -" diff --git a/unmaintained/papermc/APKBUILD.orig b/unmaintained/papermc/APKBUILD.orig deleted file mode 100644 index fe78218..0000000 --- a/unmaintained/papermc/APKBUILD.orig +++ /dev/null @@ -1,56 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=papermc -_pkgver=1.18.1 -_build=99 -_license_commit=4a7962c -pkgver="$_pkgver.$_build" -pkgrel=1 -pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" -pkgusers="craftbukkit" -pkggroups="craftbukkit" -arch='noarch' -url="https://papermc.io/" -license='custom' -depends='openjdk17-jre-headless screen sudo bash gawk sed netcat-openbsd tar' -options="!check" -provides="craftbukkit=$_pkgver" -subpackages="$pkgname.openrc" -source="papermc.$pkgver.jar::https://papermc.io/api/v2/projects/paper/versions/$_pkgver/builds/$_build/downloads/paper-$_pkgver-$_build.jar - papermc.initd - papermc.conf - papermc.sh - LICENSE_$pkgver.md::https://raw.githubusercontent.com/PaperMC/Paper/$_license_commit/LICENSE.md -" - -_game="papermc" -_server_root="/var/lib/papermc" - -package() { - install -Dm644 $srcdir.$_game.conf "$pkgdir.etc/conf.d/$_game" - install -Dm755 $srcdir.$_game.sh "$pkgdir.usr/bin/$_game" - install -Dm755 $srcdir.$_game.initd "$pkgdir.etc/init.d/$_game" - install -Dm644 $srcdir.$_game.$pkgver.jar "$pkgdir.$_server_root.$_game.$pkgver.jar" - ln -s "$_game.$pkgver.jar" "$pkgdir._server_root.$_game.server.jar" - - # Link to craftbukkit plugins var - ln -s "/var/lib/craftbukkit/plugins" "$pkgdir.$_server_root.plugins" - - # Link the log files - mkdir -p "$pkgdir.var/log/" - install -dm2755 "$pkgdir.$_server_root.logs" - ln -s "$_server_root.logs" "$pkgdir.var/log/$_game" - - # Give the group write permissions and set user or group ID on execution - chmod g+ws "$pkgdir._server_root" - - install -D $srcdir../LICENSE_$pkgver.md "$pkgdir.usr/share/licenses/$pkgname.LICENSE" -} -sha512sums=" -623d6423ee337671d546469e6bf1821005484192a1ae56d7b77f547f79102df50462e1d0144be13a0de9021c9d931bc974143b1e1526114627ba28688589d76a papermc.1.18.1.99.jar -c5d1bf85ceb74162aaaf2bcd2d06dc2e3dd2e37c39f0cee2be7c8dbff9970a6aff1e48a43e6d1e83e6a0ac610bd89f62b1279bf27b64afa88d9831a36aebbd3e papermc.initd -9b8e267428731ee9255f82a93f1e8674d7e917a0f154bd395cd2280a49aa248a4b8427520b08dbb4b3a74a5471dac0e439eedc8ab94bf2e53bb8d411d2d8a789 papermc.conf -943ba0d4c10173246bdc6497dcedd54da0788f966841c8d3381398711d79f8d5eb07a24ce28f519b6f24f59d99fa9e74bc6bb882059f343df4eeda5de3660ac7 papermc.sh -d4c645a58e1a17a0a1e42856a3cc43097711a05bf3d9f18c77c3bc9874417f223552859042ff00b7d3dda0003f49a9ee568540c2eb24e9f8fbb3c055f3b6e0a5 LICENSE_1.18.1.99.md -" diff --git a/unmaintained/papermc/APKBUILD.rej b/unmaintained/papermc/APKBUILD.rej deleted file mode 100644 index f8c4908..0000000 --- a/unmaintained/papermc/APKBUILD.rej +++ /dev/null @@ -1,38 +0,0 @@ ---- user/papermc/APKBUILD -+++ user/papermc/APKBUILD -@@ -28,24 +28,24 @@ _game="papermc" - _server_root="/var/lib/papermc" - - package() { -- install -Dm644 $srcdir.$_game.conf "$pkgdir.etc/conf.d/$_game" -- install -Dm755 $srcdir.$_game.sh "$pkgdir.usr/bin/$_game" -- install -Dm755 $srcdir.$_game.initd "$pkgdir.etc/init.d/$_game" -- install -Dm644 $srcdir.$_game.$pkgver.jar "$pkgdir.$_server_root.$_game.$pkgver.jar" -- ln -s "$_game.$pkgver.jar" "$pkgdir._server_root.$_game.server.jar" -+ install -Dm644 "$srcdir"/$_game.conf "$pkgdir"/etc/conf.d/$_game -+ install -Dm755 "$srcdir"/$_game.sh "$pkgdir"/usr/bin/$_game -+ install -Dm755 "$srcdir"/$_game.initd "$pkgdir"/etc/init.d/$_game -+ install -Dm644 "$srcdir"/$_game.$pkgver.jar "$pkgdir"/$_server_root/$_game/$pkgver.jar -+ ln -s "$_game"/$pkgver.jar "$pkgdir"/$_server_root/$_game/server.jar - - # Link to craftbukkit plugins var -- ln -s "/var/lib/craftbukkit/plugins" "$pkgdir.$_server_root.plugins" -+ ln -s "/var/lib/craftbukkit/plugins" "$pkgdir"/$_server_root/plugins - - # Link the log files -- mkdir -p "$pkgdir.var/log/" -- install -dm2755 "$pkgdir.$_server_root.logs" -- ln -s "$_server_root.logs" "$pkgdir.var/log/$_game" -+ mkdir -p "$pkgdir"/var/log/ -+ install -dm2755 "$pkgdir"/$_server_root/logs -+ ln -s "$_server_root"/logs "$pkgdir"/var/log/$_game - - # Give the group write permissions and set user or group ID on execution -- chmod g+ws "$pkgdir._server_root" -+ chmod g+ws "$pkgdir"/$_server_root - -- install -D $srcdir../LICENSE_$pkgver.md "$pkgdir.usr/share/licenses/$pkgname.LICENSE" -+ install -D "$srcdir"/LICENSE_$pkgver.md "$pkgdir"/usr/share/licenses/$pkgname/LICENSE - } - sha512sums=" - 623d6423ee337671d546469e6bf1821005484192a1ae56d7b77f547f79102df50462e1d0144be13a0de9021c9d931bc974143b1e1526114627ba28688589d76a papermc.1.18.1.99.jar diff --git a/user/papermc/APKBUILD b/user/papermc/APKBUILD new file mode 100644 index 0000000..23930f7 --- /dev/null +++ b/user/papermc/APKBUILD @@ -0,0 +1,50 @@ +# Maintainer: Antoine Martin (ayakael) +# Contributor: Antoine Martin (ayakael) +pkgname=papermc +pkgver=1.21.3 +_gittag=${pkgver/.0} +pkgrel=0 +pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" +arch='noarch' +url="https://papermc.io/" +license='custom' +depends='openjdk21-jdk screen sudo bash gawk sed netcat-openbsd' +makedepends="gradle zstd" +options="!check" +subpackages="$pkgname-openrc" +source=" + https://ayakael.net/api/packages/mirrors/generic/papermc/$_gittag/papermc-$_gittag.tar.zst + papermc.initd + papermc.conf + papermc.sh +" + +build() { + ./gradlew --parallel createMojmapBundlerJar +} + +check() { + ./gradlew --parallel check +} + +package() { + install -Dm644 "$srcdir"/$pkgname.conf "$pkgdir"/etc/conf.d/$pkgname + install -Dm755 "$srcdir"/$pkgname.sh "$pkgdir"/usr/bin/$pkgname + install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname + install -Dm644 "$builddir"/build/libs/paper*.jar "$pkgdir"/var/lib/$pkgname/$pkgver.jar + ln -s $pkgver.jar "$pkgdir"/var/lib/$pkgname/server.jar + + # Link the log files + mkdir -p "$pkgdir"/var/log/ + install -dm2755 "$pkgdir"/var/lib/$pkgname/logs + ln -s "/var/lib/$pkgname"/logs "$pkgdir"/var/log/$pkgname + + # Give the group write permissions and set user or group ID on execution + chmod g+ws "$pkgdir"/var/lib/$pkgname +} +sha512sums=" +630c0fafd53082bec3992234f7422c4714c30ad0fac240c6dc80091fc7d49b57bc2cb7365366ac015d2a9217c4fd561f0649f738cb0d90ea7a7b6355f9839ff6 papermc-1.21.3.tar.zst +c5d1bf85ceb74162aaaf2bcd2d06dc2e3dd2e37c39f0cee2be7c8dbff9970a6aff1e48a43e6d1e83e6a0ac610bd89f62b1279bf27b64afa88d9831a36aebbd3e papermc.initd +9b8e267428731ee9255f82a93f1e8674d7e917a0f154bd395cd2280a49aa248a4b8427520b08dbb4b3a74a5471dac0e439eedc8ab94bf2e53bb8d411d2d8a789 papermc.conf +943ba0d4c10173246bdc6497dcedd54da0788f966841c8d3381398711d79f8d5eb07a24ce28f519b6f24f59d99fa9e74bc6bb882059f343df4eeda5de3660ac7 papermc.sh +" diff --git a/unmaintained/papermc/papermc.conf b/user/papermc/papermc.conf similarity index 100% rename from unmaintained/papermc/papermc.conf rename to user/papermc/papermc.conf diff --git a/unmaintained/papermc/papermc.initd b/user/papermc/papermc.initd similarity index 100% rename from unmaintained/papermc/papermc.initd rename to user/papermc/papermc.initd diff --git a/unmaintained/papermc/papermc.post-install b/user/papermc/papermc.post-install similarity index 100% rename from unmaintained/papermc/papermc.post-install rename to user/papermc/papermc.post-install diff --git a/unmaintained/papermc/papermc.service b/user/papermc/papermc.service similarity index 100% rename from unmaintained/papermc/papermc.service rename to user/papermc/papermc.service diff --git a/unmaintained/papermc/papermc.sh b/user/papermc/papermc.sh similarity index 100% rename from unmaintained/papermc/papermc.sh rename to user/papermc/papermc.sh From 88d9198feef5cffdc062664fee2fd25fc83642d0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 13 Dec 2024 10:19:17 -0500 Subject: [PATCH 093/313] forgejo: add special case for freetube --- .forgejo/bin/check_ver.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 6403e54..33a09e8 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -22,6 +22,11 @@ for pkg in $owned_by_you; do downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) downstream_version=${downstream_version/-*} + # special case for freetube + if [ "$pkg" = "freetube" ]; then + upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||") + fi + if [ -z "$upstream_version" ]; then echo "$pkg not in anitya" echo "$pkg" >> not_in_anitya From a053fd35f39bf06f4f20b8d7729c515d593daed8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 13 Dec 2024 10:26:58 -0500 Subject: [PATCH 094/313] forgejo: add special case for dotnet9-sdk --- .forgejo/bin/check_ver.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 33a09e8..c4d9df6 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -22,10 +22,11 @@ for pkg in $owned_by_you; do downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) downstream_version=${downstream_version/-*} - # special case for freetube - if [ "$pkg" = "freetube" ]; then - upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||") - fi + # special cases + case $pkg in + freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; + dotnet9-sdk) upstream_version=${upstream_version/-*};; + esac if [ -z "$upstream_version" ]; then echo "$pkg not in anitya" From 9ee55e001b7b8809d0ea0225a8d7f90f137893a8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 13 Dec 2024 10:29:04 -0500 Subject: [PATCH 095/313] forgejo: add special case for dotnet9-stage0 --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index c4d9df6..d2720f3 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -25,7 +25,7 @@ for pkg in $owned_by_you; do # special cases case $pkg in freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; - dotnet9-sdk) upstream_version=${upstream_version/-*};; + dotnet9-sdk|dotnet9-stage0) upstream_version=${upstream_version/-*};; esac if [ -z "$upstream_version" ]; then From 233a0983553e247b3798f98c1f7180bf5f2f57a4 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 13 Dec 2024 11:20:41 -0500 Subject: [PATCH 096/313] backports/py3-rapidjson: drop due to orphan dependency --- backports/py3-rapidjson/APKBUILD | 56 -------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 backports/py3-rapidjson/APKBUILD diff --git a/backports/py3-rapidjson/APKBUILD b/backports/py3-rapidjson/APKBUILD deleted file mode 100644 index 54cd11f..0000000 --- a/backports/py3-rapidjson/APKBUILD +++ /dev/null @@ -1,56 +0,0 @@ -# Contributor: Marian Buschsieweke -# Maintainer: Marian Buschsieweke -pkgname=py3-rapidjson -pkgver=1.12 -pkgrel=1 -pkgdesc="Python3 wrapper around RapidJSON" -url="https://github.com/python-rapidjson/python-rapidjson" -arch="all" -license="MIT" -depends=" - python3 - " -makedepends=" - py3-gpep517 - py3-setuptools - py3-wheel - python3-dev - rapidjson-dev - " -checkdepends=" - py3-pytest - py3-tz - " -source="$pkgname-$pkgver.tar.gz::https://github.com/python-rapidjson/python-rapidjson/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/"python-rapidjson-$pkgver - -prepare() { - default_prepare - - # workaround setup.py complaining about "sources not found" - mkdir -v rapidjson/include -} - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - PYTHONPATH="$(echo "$PWD"/build/lib.linux*)" pytest \ - --ignore benchmarks \ - --deselect tests/test_base_types.py::test_base_values \ - --deselect tests/test_unicode.py::test_unicode_decode_error \ - --deselect tests/test_validator.py::test_additional_and_pattern_properties_valid \ - # -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -15d021491c64db53352830d8f3f62c8b48476fcb001f97c174bcbb9053d973eb135ceb92f14290a58f6ad6c5dfb24d02f6385c8cad70f4a74f5a5726aa0728e7 py3-rapidjson-1.12.tar.gz -" From 56a29dc807f8eac904374c7e42e40f653b1ba8b0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 24 Dec 2024 14:05:52 -0500 Subject: [PATCH 097/313] user/papermc-plugin-vault: new aport --- ...pport-for-abandonned-economy-plugins.patch | Bin 0 -> 2225637 bytes ...22cb0_support-newer-jdk-for-building.patch | 33 ++++++++ ...add-option-to-silence-no-update-logs.patch | 37 +++++++++ .../868_update-bstats.patch | 72 ++++++++++++++++++ user/papermc-plugin-vault/APKBUILD | 42 ++++++++++ 5 files changed, 184 insertions(+) create mode 100644 user/papermc-plugin-vault/1996cfa_finish-removal-native-support-for-abandonned-economy-plugins.patch create mode 100644 user/papermc-plugin-vault/2022cb0_support-newer-jdk-for-building.patch create mode 100644 user/papermc-plugin-vault/823_add-option-to-silence-no-update-logs.patch create mode 100644 user/papermc-plugin-vault/868_update-bstats.patch create mode 100644 user/papermc-plugin-vault/APKBUILD diff --git a/user/papermc-plugin-vault/1996cfa_finish-removal-native-support-for-abandonned-economy-plugins.patch b/user/papermc-plugin-vault/1996cfa_finish-removal-native-support-for-abandonned-economy-plugins.patch new file mode 100644 index 0000000000000000000000000000000000000000..7ea071a3c27a9ed7031047d0ba5b542e1f0498ce GIT binary patch literal 2225637 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 z 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ⅈyOrUC=;b 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

$@d5V zQJ%EAFxMe>%-566#`afx-NdU3?Vg;gNN$xUY;3kRBb)fXi|hlCE`W{qoL+?xd%MS| zU=6yD3mj2T6_D9q2PKCEYKdW8pO?vinfPDIi)6QO4&$*Juv3wWi~x-xKQ zcF&OVice>DQb;@~wY%Tf$vK|1I+%`FN^iTs3kpeY2MBE&`|9n2WpJri_G ztWYG>Jz+0D-%GAEsH}`%1YlmoLx#zzcY8)q`xbfeqpcMJA3)V zf#U}wb?XBTg&F}4?)~p^{C~0#glvHw5N`jXrixHrQJj%S(}4=@Vu=q6&T*h3tld-; zX!XT36PX1g9u9BMJ3#ie23C6He3SAz$4pZ&tsUJDC)g0#0IBrueR!_ASWUjtxkfkvtUXn| zE#6r6?4?XXJf4Egl%~$ZZ;BU?#Q5U*{ojs;f|%^fk=6v=cfXyXhGfj$00t^1E;4WeW3nXT+O(%~ zst`yc16-(CKoxw-4TNjkd)#c*Po-9Jo;e~Lb}zjI5;*cVdFU8etivb+r??u$>cnfC z@GKljV^lMOT%uMSD~j=tkJhQO>iK{>CU1xbFRS zk+BttNzIy7w(l9YraRSiZaL+e zbwI*5i1p-CZ_Bhn`(#I^QhLs4~6#VJaekzXyge2N~b5o%I$#1%#@_`SG;>wKlxsVWz)SZGp` zy#K^qLN)T#gliZ>=`Fly(cxs zO>?Ykz|alr)p~-pe;R6psqT(y-zPtY8lt2Gkgv(tnt%F@emRE{4nQ+M6sXMqU6Fx9 z?te+h{cP(0Sw8+=S;rPd0FAdt%$!P6ON+LCZdtWOeq@&6)V2zi6Kzt*Z!IDhYRuP=>&;#RPM7yu zX|#OGb#9&7)=yBZZoMm0>{cGa5kb%yp@ws$&!urrMpDi0igr7x z6UMPGHLeUt544hL&RIKS4S4ZUVl$j~bZh8(Z~kDGG-(>!y;d}~Oyn+JA5dQJn_3L3 zzc@@7!kJQHmr+^V-%Z^0Hd3|50-Ze3aIpoOmQcpd8Nb~`CMUuyMOaVgD>*niiNYXZ z7#WxH0s^Wk8DW~o`*md7Jc+~*!MN~x3C{am+kL1ks5mCRT?TcObTYwDBZ;^Vy+S$x zk46Kna(Ik2Xorfk$y{=*COM)tw9aA5%(Lr-TjX_UzK~Qnlb@#c0Ebq^;TF|*s3q&* z5!$)XR+}!l{2-+ya`EpB41K?Yr|R_&1{CeIG-Ae#_(x(p*&7Crm6XhMT}N}|@e^U@ z5JOx6;KnQQOAS{C#~T<)#FQeAH@o~}{D@roBY23$XRt-Pt(kdxp9jUQjCvoqOm>!( zNks6%!+ZS((rHc+4I*&eCDJb8NWK~$ctb{kjc@Kl$%ndJsc-K8QIpLtLA|C1jBWJ) zW0Mrg-|bORTL)_crynE||7J!=SJScsI-}3yr;;=yVep~W)Noja6bZ)nzC#d3TcnGP z7|0wUo%(iK^OwuIBvOK!oRhJya0KbiJ;)$p{3mN8xB)g2se`YA$eqaDH=1nI52W=j z=aa{;vy~(zUusHHt*MNPW7PI8_1a(B+i%v7ykAX5@C_khvF#6y+fm0%=4_&-51~qY zb|g$lQiu=$pe&#;kpk(E4@;M^6+VAT7c!jDT-3MQQO7#;?L&E}4toRnh`?Kn+XiPN zXC6Cm09i!OR?bP3qv!({AaGrap!P9a(g)rp@G$Gm+_!v_{@UKR&a^puQJJs!0DAVvg51*2rY4Hg=zTfV_vw*OqC2YbY9(TlRx znK*b&uBW7=CZ?8%TBkmsu;6GwBT|Rp7z&&{dMXqF4i8t_6C%nowAk8PfYIb@vMM)S zx9@iO(MCEx#yvR9OkqQSW(j2~=Tll-8pZ}D@O#_K%(PHEzdx27s&4=lI*wsh;_a#O zWB@?e=Dv5bANvhup7Sm;m73|hB1+EK8%zmt`9?qE)rB5IHNolP=Wr}qU0?+8kl)-ywehda7xc~5a2W%*JiX`^ib%pDpOH(j;h-|!A&HLRd5Q`^KVn%8xd|5_ z)y2IA9B#&&BFIa0`}m=$5MVlqcNv5;4Z;B4DD?Q3chLG*PfC)l8{QTBR@gtP?H;r9 zk_Z_$R*=>*_#AGfrTD^(H*uYDMp$UEQaa}|0E7yzDbJyD0@;el(C|e3;gVHIsI1L$ z!sUEv?mQahUjyEUV**EJ;q+*ORAd;w2B2hREp8)ABEC!OA(w?`m(t5-3DKLd$^lML4N6ChJM=us~+P0w~p{N z(DUPQZ?G3ow8s%S?+5^vw4C1*i!NRR<~i*mecM7Ryo)z@=+0eGqm*oo%w7cHsbN1( ze7fMO$D>bv=)0&L#ETrmyq+d*ZTgxEj3rf>NVgY&$oeb zK%Ubk1KoGZ_T`*_fsco}V^g82`}6cVPV|KqjxmJ&{9TR1`-O{2jJ+?x{-cF6{`T&B zo0wcWBdARX)=@{A>Qa}VSBKdQo#|HKD!7Kx$_N`6-4N$;ePfVmI}2W74ZMgma0kam z^iR|es@C4Dd^ryCR}kP9s!}E{h2PiiOxf!C(v?h=JjmvNB@)+xH#sb8nT&&h&EEpb zh1n?727A5m?Tu=i5I5-Dbtw}kJAb!mj&-NS@|?!3I=C7e5}Ok7HVHS)6|w!|zUv6F zg_yP_=EmB}T5Oj`$4-JaF7sks;0PeZhRP2r_X4i!PsIgF%j`|0zw^TR%0?GU+v>ySsY3 zWega1GIO4j_n0M2iwOc}8Q-hDZ9m-avRJHeoKwumFKY{7^8j3+bRM4+Q;$AcdP9HL=w9~=N$C?5|3xz8aKVEUyyUF z9*m4H{%W{?##fL7?^>PNrV6Udn~ZGf}hu?WHA*(!a_NDwp_n1wr6y~ z!n)a$tz3q^1|ZC{CUh;au9ZF$!P_Tl(J0X3xV*SBGD~KNQc*3aoS5^yOr|IF}M#3?>AYCtB&&_JGi`I zq7p{H2k@4k(099K8s^>>Rqj$Q5A&~n9V^oAtRSd=v^a5p>kg5bw(TgTR%F80-(iP) zbsS!)VAk7uUSy|+#vsQ!`q)LGT+5FeUlQdZ#O)k_py{kw=Q`7Jrh2Wg%O}!eQ2d}! z>;b>RAjD4pIcRwbL0g30X3}#~hDSEVWvims9`~uyPp1?EycFEe3IvqRmtu+W)e<&b zmDIJ%ohi@QbD-&dX8U`83w5(@&`lUTw2Z!BJB%Rz21aTxUy^P>VRr#E>XyBNFS$*3 z+8+uJ=R0|x}E!q!a;t;bTViyRFYV~1$OS1D6 z-?naRtC2&!w-Duv+#_BCya!rpW9^kHH+h?#Hw?Q|vQ;3Kfc+=hexKy^`X9d@V#vn6 z${~rfxhnNNubU)nL*UNVHeDN5AFcO*oq=+fCO{%zQ<5_{F?ACc4Q+R=B0#_nUoLUh zr`z}RZ|A?#@i2EyXla=L?(m^x;gJCDe*P@?2LHIgbilgwh25Xqj4-9gsZzGE6`mcR zS3KD4&J=1~;1ZEQr99#A$~LPy0Oh&+s8T|$m*zg?9efSi(|GJl6ec{g+K1T2>QDY! zlmdnC@)L|yN7|1ION$ffdKBneH57X!QiLW1x?n|ciZ5}B#d~giAq(<0^LAZWI3{$2 zjfLQCc3b>b85xTo|YY-_F}U{}D8|WO34y05)Zg{Nr>0;@_;4A51*- zKwlWxj`@Rf=3mT5Kx^6xO$F`QrlG~vl{>y(-r!-6m~sW|3z(*U7$qR9WW+XGvv|Xa z`wIdbb85N<)mi(Ug zMBIkQS##XaW)IDnjAI5LSL2PW1CS)YMZ&N|HY%Cm5%se8BO|NF)Zty}9~|du@R&$1 z=ksgLk70jHQmCDMem3~bXXp;byF_7+g%bU>RF6e@<7UXJv)@7K5wL=nGWeF5{SXsC z!8glIK1H21ci1=O8y~tt?c*$^J$sdPojG5LW0_RKY3bgMx#J<2Bcy+$7`7Q}ESKCz z+5GBV5tZXI<}ArGgx~tGamQTpwQDFu1#HK*ebq940KPm33-}*j_x=3dP5jR z`OSgho9Y?kX7Y!k=p^zn|E=9rS*~mxqmDo|l_j-G3r}+11-kpM20fV}B!29qx)lam z+uA~^tp2oxBr6I<__KE6GBO;dEg3-iBYXL+eekP~5A9278s~ro13wuJ5rk|l9{Tgy zE$Zn2!!*{V5}G48NU2G_2GZ=pr|kgn8|F*>LDMd&HCGO#St zmD9*8PM6Q&9|xgXq8>y~M?pU$@qnV>sXAVeLHLu(N{rG{cU2|lc$Pod^osdms2G@Q zU8!EvIF~|f3q9f7^+AP{?9ho&QTDvQ3f4u~;8+m1YlM{1t}6yJX5NKz1Ge@T_h-YK zDVq}4+VkMIb1h;m^9FU?*xk;9!XVycfq?B^@_ zevhsT9QGbL`8l-a%x7WYYqZ3GlY4r8bvU>qutI^?17Gag3_A$Dc+9}IxhPWd>OFd$ zb@Ml)fLo!QmbQy`dG|~?Ru_o&pkn99bX$(Y^mZ_MN+xcX@KUZ2>zk0b>=z_93eTZ@ zcBz*L&s{ph^70RIcXpuZW+Ip`U(}=CSn>Pzv|x~UVcuSm3Z)zJr1PUt-1}nh_h1ie zv}<5iCSO3FQ`JZJu~lRBCN9d7a}VWY(n8urEW*EI4|(E0#;5{L;rR^uUG|u*io5rj z*d=kXV;>EE5xurY!DN_bfD)VVjw_OpO_-)^tyjw`i|%`%eGamNZYNB2oRJrd?Kb|h zEW@}2(9u3}X_Y#)m!6)Y-!H8kAVvY8a6)IRDo=uH@Wuio@d!=e&q7hXk)Hd}`-w>y zRj&avQM~!$_|zX;NMw4ng=y8Bc4$ULwZ=b&U-3tX1h@l^-c*UDpeMYOK(N><)vuNP zGp$GtG?blrld2^oryX~{33DI;K$8WB`gpcoY55;e+=5Tj?>0_kT1$L(|y z3omc@&4;Iq=j+M@PIMN@ZZtmR;;Ml)+yvK+0Fd~3$>Yk;E5x(8k3O!QH{%qdAlF}v*&Nm)6{R&YF=_&h(Icr{ zdI9$kpM2)Vs#UYgsNEl#R&?a%`r^d6*1vDXfl)64Ts`{;hUz;(ZT|;`ULF4gdjrWv z+?3qxe&JUzkAf*?!MXm>SpF7z-@Uct{9wpj-w@uvS%lTc@l&pc3VdjhDgA=@_{1~e zmp%%X=lWhDpW&$`OUcr85%eJ#`db)IzE!!`XkAsDNn%dz`Q{nWD5W#61-#fCouZWc zc7c4LCc^sC)`FncNP$MWP%`}C0QIht$g5MtylsEZ`zzSnRAM?Br#8p)O}WfO2Iz8I zv!X^8JI!1=8xQ$M{ouWra4Z-rMnL7R&^8p@=X`qR`E0C1&z&8IxyRPiZAQBDx2GU;Vfa3bzD6d zR?D6_DUs-!`~A{M%LQy19{8x6PnIdT4+v#kCz7<<1GRR!i`vc3x$MC(%LWp*phfJa zA{D~|)*41JsOKtnj$cYkV4dZpd7n+_*8NJqAY55i)`3psQGOgikCJVmYnSwJae=Ji zJUMYwf6FlJz9;#@R)*y_Pvn$M*DtnUl;$Aph)#wI@a3Tz?g*wBeHD=rnZ)V4@k&9_ zU%3==O}MX&Iv?-EepKKXAl-gM@*vCk8W72;n7|F1h&Rh2$zAc+W1@y2UxQ13_O z6_j!kp%5_McmGQT?CPo(Ddbvq2oQ zinI`TOZk)?^byNP`r`1=Qo7|35_SUm@b&mEONx{LpkZN|St{O4Zd-_d{W zWc&5@Lb3iY^#AD5{2lz~Ua4RA#SxIv{y%TV&rAQkHSTxppSw(cbX)x;J3t2Cf5!g1 z-mBm7e=d~&^~Qh!8O#3}|35lceh2@#diYmeOy&Py;J;Pg{|^0g8Rf6*-W2*@(Em}4 z{5$y1Wp%%TGmHH%@c*dG{2lz~jQo$h`(N@=;#csWlXt(=>HQA*b8hfg$RvgT4hcL# z{z~ls4*7E`=SNcUFVRu??~s3gZvGr_`H}qjN!0%a>pxRLzc21*|KvxU<}XRn{}u4> zqc%U|{qSmjwzYnEHGfHi@!$D4KfnKnMfS77^M^(D7XX*}&sNUQZ~S2o{cLdju!sJV zt6$#t;op3tI3PG65kRl3#Nx-l{=efJ6*f0D7qSH!ihps9{`{x^#WTvmX~1d1X!v(L zqrbrX9mgmO<9~3BLPLXmiw*(m>R2;g)&+D2 zvq<^G=&F%4kdq}K-YOnNY1O>y`p}Bube#L_vv~{OVdN$SBCEvbrgufs+WmMLTzLkl zTU@*3>F@=Qg54i&?{l@vY6?1Nsiemf)>0UR0Rfw^zFeM0@cUFn_6q`n=9}ou$2)}v zn=%rM!C+qOq&97$#R>3;b5-l4TK1?3q4B|}*wT0so}HKh{8tg-J@M?xU*DBGbis_= zST#93zmrgA0ac~q9yirRb@R!v+QceE>ALw2T~4ybbVF9~G?lraz8&{He0?zZ9>-DX!^CT&wsRy`yY__C<3dJEy4fK{s%scDP5Ca9tLn1gZyCB zwE)tlJ4eePbQ2;4ETp&v1-6N}(wXVhUVt5fM$6))U<~r(M$yY#D51JuwcWcTF5d87 zFTFC$Q-$E%qlooEX^trd3|`rD>kiiO948BW@v&o7_nGG4JDI~*^7>evP*z&294-pi zJlO*>93M`nB0qzS>tnOeI^5obi{yi%`XRoAoO(#oFx78AuPWL#VkAIR?>uAxqLbBk zePc1QYlS>t%V$b2F_)IHH4hhg`Wo&9b@T~|aJ3tXWb2#WtZ)qS`Bnx??t7j*Dq94JUy%UZyrv+XK%*jB3kc*O?xM#^5L77U2EF(A| zr)=0sh)grsSxb$9lgIJf%>mi40!O(j784pnKXqig<>xcRBR}vF&ibRm+X%fI`XSBsR{l`*-Ua))Lb*uF_;7$m`^vj){l}eYY4^2X2i}>kU+zp;)33Vu z!#*&yrFXWZcQm(hF|aW=pf@ykGB|tSjyg15~(nHhS-yOY3;&sw1&r&U#avW@FH|sBjd5llb1nz2@5T#dDCv2)WU4w*tK%wq_4OmY1V&hdw zORZVG_SG4Urn91&FqZy1g{h9orHNz3ADYxl?B+z=7_7*FhLTURo zp!-R-zjS~cqN+x9oaOSN7I(nJN+Cvm(xG6GWi_H~b||I1Av=rv0HT|t=75o1ZnJ$h zT`5eUiwz!G7~Kjd_b7Yodt5SKf!xw4Q8At zf2^bB+ZylsG)CkN;=`?#!>=l_}><9VntqkMA`wZ(cdY9Sa5KA!}ZBh|7Ics z(>q{;YJ}}^%MI&^T9zRTzSs<_Qv!mz4dLL*YPjW7(Mp+&&D5ehqbr;E9m zR{*1{Nw}!j^hGTSm~Bnrow9i;Z{gV0ak1ZLP?n|=e~B_-HPZL!g69x%cV}7X)F)&m ztR}x>CLS_lq_|X_cEuUP=( z0=83m(*1`v{t_PMm11;RGyu2Z*P||s;Df+TG)J3k?#K~!G*b^{c{NtrP4mDKdfKEd zi-YE?v6eNbOoj^$_=(VuhdKj>)62nS^dX)+RclzNI?>t{yW0VwrJq>s%NDseIqHk{ z_HV=PVnZ>}taJxv&y8CLmFfytL>%2Tm5;ovarL^?RJ8RRKeoOGz@pNJ5trJZUOWg> zyw~YrKbQG%i`CXzHXop~?G_QH`%)jMChXk{`;eny^X)F$oeYGi+?1({_~E>j64%uc zojAhXaZQ88&)G^qk6LK$ajMIUrP%Zw9Nu;#$jM5V?$9N>7Mr0IYx>nL5V6b>OVB z#NV;@K^Q9NDrABs-Y#UREu>!{it|g;7OJg+Rv*IiYd~Ybf)2{Q^{O?Q%?jt5U;573 zW@Dlw=4n}Q?n+ee7C~nHCu);E$HD$qf_eIo)WQt~zS40N2U8LC20M3Rg+`yPXO!}| zbGUnMY*V?#s8X`;B}AFWnlTFbcjfB1#@w#1%(1*XCw)(8hzu!yxsR1{qDw%{KNO=X z+&kwfGvCo8QK29)1$KXjr#)u&?6q~qbAYQ2wWuSz*>WshA092DG>6b%i$3jZe(uoy zBxkuOMd^-8AAinz*^XWwdlnIQFc^A#qKbhcy<3~shUU2hvhgTKwiEHn19m!&do*r3 z&I@GVg76{v-261c?v0@qkE{m@;?OL&(Yh|2V#j^~UEvv0JC`OenEM-PJ?O?JZ0$^J`&?OD$rRP8F_@kI}-hBqc*uz!v%+(tadQzwU; zc<+h_e*ru$D42#pyoiXLWpoaDmm=g6npHGp7^{PFuQ8<;HErTbz%5{w*)7(E{DOGz zsPSW>M2BwywY(m}zka;w_@Aa;17=-`ce0;B5rW?CsK`frzde7Cc;8&vI^?tR_Od8{ zm;F4lm#vG)&_6fY#^d*LDfqCf^9D`UgIVA9P}JBKK(z$H{Go#2{6He6lH zJgZ0C&0NbcLOfAb%VrITv2>&uD2VrCzn6bPjhfesE_fpQ9&y#e^X@F>nS1Zn9{q*z zNsb2~#Yatly&`a63zgRqK`<1iDWCKIkoMM5ab?Z=FiFth?hqUrn$UP~cXubayL*t} z?jGFT-Q6`1+&y^kz}K0Xdq?iv-@ESmdeMLMTIcM|*{60@?RuW7f)fbeoveW)ozv=$ z5*NlDgujDp2DBq@7Ut>KfKpMP*^sKxpVscM_k!9Z?^2$oo}W5@IVM@=YVE9GH#80P zuP)ogKTaj!=+l34Or&kBjobuntgQ5`4SzpgWT^kqH`z^x5}h;z7S#_MoOzZ3K`Mrp zLxQX$9tUkq!f60Q=9%xz~2~ej_D4st|-ye zun3TLU2zF?RH`LXd1Fh)8%&ctvO!O~&Ikp`3(HF$=;sV9ai)avn7gCQrxF1Bp36U? z(Z1#Mu{?9L9Ex9CKnwo(hSWGKR8@E|J%=5*R&%qm<5)Ufg;)8467q0^u(=x2g!R32 zoyV@kGmV%D*En2PEn$w-kq?3?nir~8Zfnpo(7|eu<(4+Ym^)|CKiMCCXlovSNfT$n zVv1(yXu%BwD!8YhZD712-S4Z>W6#8Y~!;b9g)gdphYfd6fKPH>?W{aR}=;t-i=7ihI z(g_-%ByA}8G3E)y9tG+IevZ?ZlWPoxade36Z4@)jPhUfc2p`g@Yl%9EH`vk=M52** z6H^S@73wVM-zEC&9H>-b&*E~BYUeFgI(9h7RVLUk6V#~-YMHys zGR8?I+8wk(-pXC%U(}aak<+}+6MHP%QAqwCur;WRkRMkj%zyn(X!p~{wwFN7W)_ z7m`(Q7jZXR@P55M-n}l0pyrxz{;qP1(+*53+$hCB2*gA{FjC*5w+I!#Q!PPL>5Bo= zahrm0wDJQ31eMfh&OcDYy@;IJ!#bqP#E9akIK@~CCTt&Njo>47eC(Tx{(5|FA3r!{ z+liMD2mJ~|l7!nF1)Q$KPxo01C^^@OKfVN%Wg*^0`$o$3$VXhw2CaH~g z91g{x*d3M=irKjm%`QB)NIDfDw<)HUf5h*zA#{d&0^Maa{4 z$}I|aCqxc@_*b>>bhZa}2K&K9la8G|(CVlpZk}SXQ`ee!#I|)6^^GAPwjUUhT>XuK zvk2>mb^_vO>R$F{QPMzqi!j2SU(yna5yyw;&IM|BXF@|5T z63&U7CRsbLC|IOEJ`2s2$&-O}grAv$JI`}=4-4VoeDcqinb8!7qi<=Vn4%YgcRS^& zhppVTRCa=m$qn08WfGWj15t2u5~pjoPku!90GP$3k4}(}tKp=C4&}+7Fd4GtP>d|;9cW>v&TxAw~Y+l+tKuikDI-AgTR;=kNp@Q&diVVXrNs4}l zj-TUV*RM{1mrgGA^%mQlEt4=W1PIEKdo9z;8?_SKYKfM8Gn+8ubD9_;;~!s(F7wVjO9yJqYd@aTYKbqf3l`4s46O&V zTs!O4^EU){YI|yGE-$lb(N|L_xi;F^Y`G-UX@n|$#N%|fz0c=&j&V&ZH(y@?fZX%7 z6wC+Yihu5vjW{`tXjIx}LZyAINOt|wHv=UgjtMJ5(lXa3i=e5_aKe@z7pVj;_?>V~ zSA_})Jr??zG&M`5tc4i&B?K_8jb>qQiorq~CgN@!pD&@Ik*hpMd1UF-l<|Py+^t0_ zT}lXv+rYAHXF-_t(3GN{_mwlxHDr=! z9=%j>;WEPfct&XM%4k48ufg{7YNk`*xfSUX4~=eDsV$M0g@4#Hgl}jrtcns(pkMFx z_-C{04+%G~@6V^e*)eZ{VsC6SX(C9|;e$~ZBxu49>nI(eQxDpT9j8VHK?cY27`&lZ zq9jrJ-Wdz2G?L?YWhow{pBXkVCm;T~7rCcV~+_v9XoxH}zjYWn7^J zJ&E#l(}CM+$9|7;yNX4XaR9*m#zC7_fwH#gibZwJIthT4UY2 zZE*gy_X@M0=qxsOu|c4O-S4#|fAwIkVF7a}E%zV_(dP!_d$P?!lTS-E#l{Acc`6+e?{Tz^!Mo51D{p~JM-%RoHRLFiV!vc0?$ z=475ULr>iYzSd3+Ly|+^9RLRRWo#`!*xbEE3D*cubmb9Q> zHCb;~MQ@pFBo-P##f8-o7EugCwm|Fbl>AnMJwh0S2S?`&)5|dxcac$;XvF$!CiQ9x8Vo zJ&fVw3|^H+w?AD5@3))9^9zBb9cNv$7B!0oBK)cq)OXQ}+$oB>jztr-TO`ursSU(x zoI05VRwv?2+Kcl1-;klaYWwa6Sphzb^brik3e7;y1YSauxyf3E`!KCnlK`nxR`}CJ zODdOUqvq3fJcAHK^?$0$q# zl%C{^hPEAic!K*UmY#IY;@$#Z(xQYwFT`n#lO(q!En2Hjc*gI0vM%UayiE*vB&rY` zzf>Bajtr~Dt0weSTvW*NQKV<*qKAFR$z zYl8`=9~KWY!%A0n5A0M)c1{Hr+u^-V)27eX;K#k#oSV-EKRuF@o~nWlyz%9u;9Ca6 zk_!n`JyJnC&1k(uh^^e9aMy}%mP}2%@_o#cizk8wx3#VxnX`Av`v}(OUpGX~^jCJY zebd?zoBBO4c{baj8{H~4um@?gKKWUGRRxE$KY zuIAD}jNZ3Uix%O(oP~CPaWhHzK+4ltAW}$!*B9KRZW0+BBjV6^Is8dxjMqQ-%T#dZ zEN|DF)6Q(G8-bVbSapM@Io`k+kRy~Sy8*&?$+0iJ28#oQPsF%_FE|w&y&OKM+^Jem z*cZiE^+6pMB1$D(0|h)QpdWe@=+&D>vttP2EG44BNrS;L^4(RIr`34MA(+#w?#A8y z6GpR#aoab(^$+4vVJ~PbPHVgY zJnn@v&F;8nx^i)eBl{K>VR1`4?JhT=tn>3`c0*+5OI&H|d6U^m1gh^5i;1!#$&uU7 z6l@To`dH66NCGlTV;Hv8T`7nwnBwn@>45pbTeY!rNs!Cd%fyO?=tYJ7%7w60CV7(*>Kggou_?!H_^} z@Q*BNCv&>mK3amUVo?Gtj`($Ran%obv%nm43Z_!j;kHG3N;-FDGW%>4^~B!T^hE+j zY)wX|4@P)&DFf+@Ng9l$1ir3Gie*M<(My!C%*M&zm5+im$ho|}*Co&rLD?X(AkRPVVMeRgg6qceHMQ-pd&%T7?wGE3(M!EWlc0?7;Q1{BGBNg)6SRQ9@-0tw+1EbaK`q8$w z(X1U*h-7R!kcV!Kpc?Cj8s%2hguo!tRJNfens=gv@-e4ODudl&E-R+0Ac9(v8KbGk-b}4s#7Yg-k?OnOTBSZja5p7Tme#d^MAp^LsA!h!~qC#}Hw;`Pq{o(23wlXE{bu>RD~? zchab0#L(-Q6)@BNbJp}4HfaNqaI*`wXBJE!%z>}GPn#FI@+x-zbmT}+I2W%0B$-ci zFQ54Bm2)b6)lCNDR?~2QedSUAz^;Bn^?oPX{bFHCPE1OUN;PinD#(e6OH0y?(}c)M zjERp)%G4_`OfhZjZtY4)$xOT-r=@|Wl^7KtA1$j=U|?o|kaz=z4q;$%Cy52Qz*58m z{{A;(;19g~|0fOc4^aHC2<<-z3wq#5|Aff@I{hyI_pd1DF97$?&oOwF{tM3i>s`MP z(7z&p|CnwAoG$z)3-qry{sIX98ln3;f#?>DE&re3!oLpvE5!HL&HO9G_va@V;Xe-j zKLdV$9sZX__^aUj(g=Tk@(BLp@PE?}e;xUk;QduP{;`;eV5ZKWV)$R25m*RV2zKx? zgZM$0Vm9HZD0KJ3J=Y2=23tXg6CgSJSw?TSFrQ zgr?zFF0q06ZSKVh{0nCA$b8`MpL27Hg8ue!zrE8xcc7P?wq!3Kil@psZ-B?-T7IaA zIGqBiT9p8vSHkFOjE;kKj~B+{8FxKD>d7c$>)05Q;@JASRE^@-!&j2AugF3KKw=Tv z;+biW%v4v)wX*^^rz=B0De0+r(*$g8#Vh3#`_%bkC%4)1UYPnnp*vI&QtMqGU|8nE z^u7s|enJ{;ao6T5Pi+lSR-WzTiqKKtfzC4*gyAQSAL&_gh+i2=8Z_nwwCr$pRLme$ zL<%#uWRL=_ixgR%1(v67mqZUg7@Cc5C0APx*gL;EVaz#Z4gxj~dIoI_ZcrVoY-2ZP zbv{1*wmcM~jb(e_rTGljB!4cClG)#v=WnzTImutN5p9btLcANS)#fZGy=|zuH}9kX z()W<2+ZRw0R_0sQYiVx8@Aex{!cfc5HIxt3h~!>{n$at1W)J>s;mvkvUq&-7zJQ$EG7@OnD0~63yOSm*#UenAS8Zqk{cio^(%|bu`fot! z_5BK;v)_2~!V%9@t>6dt{NsUty?OBCg~k2-iGOj;4Q#By)S5St|H~zae_Uc>ujlM$ zYh(ETy7m{r?bmSseXS69L;iLHnCuR=4=_1@pZ*sO{C{3A_&eGm21YzA|Epp{go?T% zhAPIhJI;ZzshlWkNGQ;{3nH#)8g>Adtis=q4v?BGIXhN&?I_#g(KTK4?beG;*-b3d zOTGkpF0{C9hoqAvp)lTu1i3)rLt~+6A}+bG^lkfX`eTMeM=f*bi^tikPufj1r0@9T z%axe*YKJYC@WO~{(hZr7^A*MjI3;)mYlR`9%G&xU)#pAMle(K<#}>4Z0w9?+oJl!S zQ)8CirSHt*7}-c*#Q!J$E=WY|KM@#spZRqL`j-G2J?Lt65Fg-Z$tWFZBgjZn|1 zq6hqDVNO&5DGU${Apa<=#a17eGFN1bTq7^I-Ju3x3QQ@#YWKl$jBDvN(51)Zx(S2g zpan9iZ0NO_xvgaiDTClBT+N6!tF02{Lr`?BV&tJxDjSB2L=bhqM_0e56=sGvrH&k6 zI~Hn9K@~tZ7c>=a4Q_yfN@SxV3oV3FYF1fEojJjA2rg!k9`E=5T!r2$d_ubJ8ca7n zm$&z=MvAJ^ZJ=f_P;1rJkSmP)wE#f!n4amH7P6(iSg5RDlr$4vuJNvkGZ(+FA^_SkS`9znyLh%{5Rg)CqwGuAm$!k> z?m>1+eW*vLyCVVvAOdW;3`3bO#)Xc9(?AC}A5rqY5YG1!tcf$ya8$)e?Op@ZmZy?d z6c3B>ixg#U3DBxobtL-34iO4>Pe@rWbNAsa#lQv3Z6`*k z0Zh`P%0s|@ijV!s-b{sie&N_|3MF@Qhw}tM6h#s5{X$$*(gCaB0zcU^83B6_kP4%L z@IR8Xw?YS;2EUh)zmpzdHxI^}{}?$txI+Hk(QnEwM8h=}7x(+zUCxLmBYWsb)`RJ7 zSII|GU{8*@rm5NhZPqJ5apEE4sw38J)h8Y_zc6uB+*BEd8JwU*(C5*ewI-u4hBW5k zR-;NeE~RmAbYkoVSEPcr8mJ~uT}X*HZg~y4^mRZ|tKdTI`|6?5VUMY_xyVwO;kWxCQ5W8|q>ESY zr#`B_$R!0t4JpO%1t%)A$IcWW%#^8cJdk^mX3b;gtE)7RaCVWeRnVxakBlUrvdo;4 z!EGy>HcH-wQ^xxk#N(24=QK-v9a#)zF}fs^Neg%nd6HVlip=igFRw?%qA89~SNd&Y zrN6T1=4TjE+MJlzr%o~T3mFPevaI|pezANnqIV&Mg6%wfYsE`?84k_vn}bCeCJCfcP^SM4iz&&=4$Lwvl$Ls?5+vvNd<%8LCttH(`~C!M}iZwX>MC`-2;y`WqZfLf#cFdXk=t0Hu~et>G%?mM;C-Rg~`>SpwM z#mbG~r$_oe^8UrjmdQ3HG`5)+m##(j!ECWf4w{9{dF`c zM&$x7K|w(Dg4xP{+US3pj9(cc|I=g$=viC*VK)BAp8u>k3T_00!JQExCFUpQO7kwV zh#jt{Xv0CS6c*ed(;PPp;5eUBHymxq!GbKo+grZgC4wzyngA{*r@oenKq2f(SD@=~ z_F?~q`{(}I9UE{P? z#4Bkl(M8`t=HB#cJY%3`eR@}&$EI<5!-e{y-aGEV>ymAbZur1F`4xS!1S4(37$JIO zMBKp5(CyF#y+X>i+qSP*2%kgi+&scOB9{h(in9*y5Zre?>#=&X9JdL3sdDWb21;y? zduk^_ssJy?70{X6tYuL@Mf;I)!x;?|lJoIGE*x+M^8(>!JW#!eRBaRViiUqS_8hZ! zoQWmrt*}Rk_A>YG3=>;q&r;^m6-49r(K&*fPYgtYlG3=SM;pi+@RM^@+LqN!l8e%@ z^l8#H-Bt#;SfX571+;gz?6|q%)%tlts?liQ`0KfA2DXfAt3taUz-zO}MV;~4#bXTi zz#Zf&Oa`c=gt^gm8xBF%+{Tr#JSfu52R^!SbukJ~6mqbBKD!EJ-*z9)Fyl3U3sis9 zUuQ7AiJ3H>U_xDOTrH;6y|s(2Y+iV$8ts59mPqX^*8C=uqx7V$4ZuE8e$aZkPb&{tg%cM~iw#PqEKN=35sU|$?1zsfzmX|)O=fcAVURw-JX<-jLQ!<&Mz#ZhUgL6efR>9 zY|4&srV-wVjZ@NhdmXz?k&XK;Qti2$71-1#M&&i=LN?lwG5!KN1uJn3XYigF?M;dg zT0`NQl-xCs5M#3&qVIxX=4Rq1VrGV|899phh52S8%!0{CY%}6@k|VWg@b{R4%B9-h zp@gv>>cT_=5&_o0gm9=pmhgAtR*0>R?-)?5Qr%EHF}yIMl(|R)-5)Nmyn5-H6Se2g ztGP06&~A-kRu?sCj-i80wKh(b{SzC0Si%}4$LDyFM&Iii%t#$LEcV4WgzhQiR~aR$ zUIRbWZ`N5I+$*4;hGg+xl@+YRbC3N;RukNB;I2S_M1hgKzw>axxJHH;9GhSXBYpn2dSY}atr;JS zz)f|FyC==}%aj{v)u>-6uf5n1HKbbE|9NqNYPAX98zxChS6Q^bSuD7=gz}C9NBN+< zFUl4uFRY2l=FL@W-5E|yRzr!snMvk(NBb~A_%qYs-81|{TPjS5tt_T|^E0Agh^>zm zsH>mEPqJ5;i)%nlUyM@h1(nj9G8nh52VX~>xBzw=mDzh4t{B}aV5Ps%9EA-OVr{(E z%}Ct9cF;}f9wSVwb#0J}d4UJV)m`|>guCD5guZ<8B0P^R1>~=O$|P#T=1FCFsz{<# zSL%xN^ce~>_bo7CGq>08eR4rne^DX&3*#Jea`<~913jQ!!22W)%qP@z1*B|57ut^C z&d~mB>-^BMrKXp{INo7btD;cVpmSL$@_E!5{N7{561#5;%ZDTt7be)obbfYd_y(4- z-xTW#K>QN1TLM--GwavXG6MT<_N;2P!n*LS2)$W!JU4isLag*7qh*mexpw&_G-~r8 z(B))s5Q@~~Q7<|q0d#;HHa~^bQB?EuRNWJI!Ma=U*$M`BC|md~5Fe~;3c&ffe<~dK ze?&G&|J8E-7H;}W)tLm9dlz(Noc8zPoYEZHKut5c&oc#wX#CL>Qxe7f=1YFQ=3vV3 ztRY@tK?*|(M(9>3Jh)9~4s0;IHFXei=%AtochL6aGww4X!24{R8C=5MG)aBUzVmVQ ztb^?=%E!AMWti^lqv+y(MKmphguw)H3KUhe z>aL9gI~ILLjI$ZE)NjKZ*YyaXrkf-A`8QN6jG=O4a;P(CM||%3N-Ri#T)Tv9jy%!$ zyJ&sWr&Vjml)*ZT-rnq8c1T=_*pYbCkBgh|z$v)2z{FsvB&);eSq$1m#;sR^3E}2k zeR7EsQK^AwAgj5(U3muvl_9kdWdtG$Jnndf2y2SxFR#Q(x8hTSOQ2N^hY?2Rh33rS)eXUWOSIBh;1E@eFjvB@}2>!s1mGNO{L4OKyc@ z-h*LfG?HA5r`IY#WPhXrr-`FN?*!L5g3F?D&t!m>kmPc^q5^eL5Z9?oFX?BdmR**CUHTRLz{R;*4m+51-xw_xs@O zg9{D0B2e7M=gMUQ@z!T(dNAI2o@~U{7>f|_sr4`+_`cADh5NG$@sPgfvb|7CiyV4^ z$V|8(2*h1!TVZ{KN#W|fVbF;_=dzN8_iDG(1{t*llPMkM>E|g;D`Y{or~8o_V4#Ni z?Vi2PEsoAdA8Bf#LffQmhOFZWb*<)PN5EC>wFA64Gy-UlDnl3rq_NN&ymksmV#M@s zRV>30U?Us68BCy=x1Hq>A7OvB#GxgB3Fk1Q!Iye-&L<|B65s$`DdGA#o2yZDz``{{t*~zP>)OoV zZ5W$T`ffr6mN-&mME_x${_aT3TH*!LTK*F{C z0M&s-E`W=o8556@p%gLF4>yGs|A?6;G2t`3gcY%h3BX`k6lb@NiNmZSt8|7cyfXI$ zY%|iU*QZVHVpI$@g<2?4n2*PV*c*D zABp}HhN`VEioma(N(KJqQl!#-ZbVG7{0 zOb4jU9&&3<$TZh#ES{$MRI-VNLc#n^5S>#Q+!qEp_zM4Lt!q=K74)&@AulWZIv*!@yl(S^_}#L}bfR!h;^nIhnb4}xs;_dN zH2iM$xsRZ5J3ou-s~O@!LD4I66QLTG9J-)$e}F1isOsEIsPcUdCi3dAa_@!Q$@1u> zV}0@a-kI&t^l;I7a5K3Pf_rUOQG4*E`xz>qTfavHEl=E5-RzZN6Z4|h%9Eo}&!t+AHOI~S|86y!osK~^@@DS$Tg`bR1Lvy z{pRXUE)l-t9JJNMYvo#gg9W)g?2K)tZO#<5BzRscl0;4MAuDyg)b9)pUs9=c{N4hM z`X4hFLzH|1dHmyjkf;b@>nApi0yPEDj)UHmZ^+~<+DJ8W?4KvT>D*o+STjjB=8{g@ z=$3|dj9d2DAd6U<4qAoXm9IxgyLiPzeh_6@p)xA$ei@p|{^BRwgR2T9|BRDlIkF7< zd6s5W?zzvmpChOil6v&OlQr(v2yZ;Zx{+`19JlveW}#hX|1_;gce`YHO!zL{H{j(G z!1ZN$&QUewMa9iOWA&nPxQf)EtyvFN3L|!q^_O3pZ?wtAVu{!J zGE#2Bd}NV55sev^eR=)MHf7TatqVd!KtzJWh<}=V5?efA@hCRLopv zMKIdq`VzmxzD9yW5fD(bg2|bIqDB%oLmSb5*T2E4El)rqWI3F$gWy_lJ{G+@K92IuN zv+#Qv1Ece_z+UQCl-jWmah!H@gpBSal8eI(*Bkj141t@F&1W&y*pE2w#pL%{fZXEx zky!fkp}KH{0bFuz2U(o-%|N9k+88~Wm00Nw2n;y%x-h-ga8cXnuhPDQ*o37@PAru@ zX?PHucvNC(vSP03dLEoq^y#=A!l`82C`gLRaPzh4ileCxBk8JPqa`xeNcl_M%fLgG z`OA79nr-SDodo08zPE)MUb9eegE%5zzf!LknBg8*@%V}p?5Eu`_ioCtVEbu%yk}o3 z3ui|IrGE^L2P&4@%}^PEdo~6J5JjJA1vt_>R(XX0)_iZaYtZb;%VkE7 z^$^az^HrLS<#uSme!pb|_a0t+_9+eq%&1P_T{^OnXFyajeS~*n?HmPtQ@OM>BeSsHmn{dlFR0UzNQ`T}kB-{sEf;%Y zgA&NMwT30-_n;FiCg-*yH|z%y5lDGEt`|Ybq;DUugjGwK>05QUJqaUFf>>eY z6cx0z>bb}cBPxs@T0*kI6mw&Qa_RdH#1Z2%LEf4(oZZXSRWliMYamOZSkecx_-wY9 zFiN)7o(*Z=YGEO#X@^f$9@WZf{F#FM=>j%HxWi@o%Rj4%7~Dx}_CJ01gDz)*eg0hL zSrOg*d3uaH99X8WO4!Pj!lB@FB5VEdCaPi!R$7|g(0gzWklEs&B4u9@X>z(b_L_oQ zbC9bU`*aH`(4$ETB`l?t+IgEN4OKp#Ssqv=kkQ-xG& zvYxP7*Y!xdELPD!>!Ez|q~+W5(wQE+BV5_|e2P?Tl&HTi(3kV7x~Ovc%#UsbEmzmh zGm7|0`Rt~CQ83@yC>g#un&;S$1EdFTP12)O>iS+j1D=E<=97#N0h~@0vGCX*O5DAR zX~Z2InWF`x*Z;c`2QydxMT!5awITQ`r`G6?z+8sXs{OJM#xtuOsiv}N32UcSYC&F~ zwF0~bY(A3NEVDE^LE}brbkDemjwP-zTI`A$QGOer&E`M~3Db&mAimBg>1UoC`oTa9u#p;_M*3o}1e;^Pw-_VZ8g@H$+)V4}>miMsvl4 z@DvdIou0!r>2FKEZm+gf83aB<4LWQI2d-IKhmq8us0Kvp7$RI}f7!I0z7Q&|Zlvvz z?l=Y)p{hMtURmABCR?yF091TH?KQm6jiY7=R}%J6-tr*TxXQGB#Mhw+y|=tzZ?`Al z(5bgwij|a#ShT}r0vFh!HnP&fYKe z#LGn(n*l{i;?ZYLv1cLmDQ@>7H)*p7lwSGxr=9I>(V9?@_DVY$o$Oy8~nF@v@ zy~_+N&8rb$@AxrgCmf_Wh*4lwymBkiWa;Mho{a&P~ zpjUOAWAi|7&0PZtmnKSm`e&mz$W;QI!K#24F_LdaZ-I@WEQnE&loD>LnaiZXgzHRI z6*n4uaB(AbWUPXCm@~e0;*Jcm*aNndVyv>ShtG52^65ggp&O%7Mp8aDdA5jVNK--` zRdRAX6nMv)Z~YjR`6|@08AsLcZR@D9(_*yXgwBXS&CTjM6*)iZO;#tY(D!k0Gd5|H zd3_FcNEVrU8dXF!LIrCTclEJ?_}x!``(wxNssjiUQ}bdFj>K{ejkbw${$Mv(Cbr6B z=X8I#IH#z^!nx1MiCzh;xWv)^(XIU^x?sm3U{t>@AC zqUM1_GT{J^0Aq%T4_dhjwRZ#`JR@i^Vnj3Oh=hmmu#5Fah`(eN3B3hY@ypIxf)lF@ zN*uv-qjShFvB6ADVUuzNY+nyM#namt&5z?Z8sT1`)N2kN(G~He5aWD4@(Dh>j5Q8@ zE7jBbDaC+TN)x&w@6PiR|ChJcK&5LC4Q9WzgFUwYeWO$S>qh^*Vh_K8!LQzdzq@Up zqb6m*^s|A^?0hjAm5cTMKHE3QH(jU(`V5&R*zu1FtVZ>#EcwyrYU#{Go)E+%>`J6K zNT+%o8Q<2~IIr%1Jip5F2NQZF0&0iy_|rqaJ@tqC;WOdFv`d9*>4?Up9JRepvu#0K z#Rcw1HA_%J?kkuj=%SXXc<@zu7?W$O6}eOQlH6s_TzaP>8Qr`K3?XM0Ko2o|$5=n6 zD$Getd-@gO1-DqTNHh(qN1oObjR}=pV3418GCs2PyDxlCM-a5901$K1V(lv_aA46M zb)_T4IHpaxKg-9vLv72{UK4&)aSPvOsJchJOQLM|O7(;;)Fdfa5d%2K?#>Hgkx?J2 zeMjrCzwi{;UjNMq>J4je8X}VI&`22e&IQ}A6`$2&OCr6}Y11d4POFnp^hnFW@+N7RX6>Z3r zh8W7^lzuUBh2}1!1+N_EoNzK^JBwKT3%>`03U|Q%Hr7GfT zj9ii=wt}&WfaXb2%Uy&7>=A8X;+3U1PN=#wAeOGIJVi#xrQ5IkLqS3WU78sgWB+;| ze=-(^tc;epX?U|@<4b33oBZr5q_r7I~(@M6zScRIglQOM59tUK2vRhgP=gp zzT3r1lJAjNN%MId6zEtjD^GM2U8e`)KSCTm9lMg_e8N_}%ZOKWC2AVsx0~Zyky>%z4yM&6G z*O&Uu{y)MJYM`)@Rk)heimUvHu18=cO}RTh0v@JhEogda8a0H zOG>|PX&9@b!QNE91=M?&T)gqBO*_%pui>1jB43ylgvk`_@lB}Qk5ddd zXoRkOj$LXm=d|e5(@;c&{pwPp#Y_H2t1)SN+iEY0o_C&DW>qt!=+WO?_;%E3m;Yf3s|Aach&i4VtiO0lYt7 z7w+YQe`1$3uwq`2K_?XA7|s|BYa_e}2bG0=l5FqGB2RKpIrRd^&qDDXIa|cE#*}S8_2^`bY%idaNTVcNuUaaoWMzGnGvN`ynt+m{Zm=xJ^9WS~5t^e9!>~zCR z)*?IDvMqQ%CC>bQ`=_i-#TDV{d#;|r>JFe|6AALfwFe3MVmE0>2cf5ekjoPT>-i2t z&9M2Xr4o~cJE8napiBqmY?&s}m+e>gq#gZ~liW|Ah-n&wOzuA4vRHR^ID6RoY9yKN zG77Bplxx*tPfsR+_)1kxor1A?gHbz0JwseG@7`?bPHiRi5u?2Xy2jj5UI4Z73oWkM z0}Jae5!f!6tf#LKpClgGW;zXC`$Rv-UGq?`emgMIHF{FUn?(8WX4LYUsGu*G^haI5 zeRNJA9o`LY6FHN{vk2IzD-tGE*G#@Mhm_D*IdCL#vmbJ^Wb!l|O?9EcK|}96Lb_V| z4YS1~n&h$oN1pq^+@e1X#>zj`*Smi;7>Y)Yj%L;-f4GHC^4hY$@Y*-|%ZX6tP;*<2 z%1ab>0-kd?2KZk9TuN?Vvd-T;=7JATw1}^KGtQpcf$@xBKy8#OPOmf8T^*jOSqjHl@BqlJV zNeJbeR^En)(`!s+;0~R1QBERjec(QIki20h^m~TV-bg(M;u`9&pahFY8oQjE5 zEjXoh%sl|@^Xd`u7lDEomt@GVHc(oruftd+9_>qtyyZUE5aTAcwvz=)=n{`YCxTPs zt0N=uSZS{6d5iq@IKdN?uy7fEB*Zoif|V=xKI-y8vgsg?}Jb{$5M5>^@M z1@)@9Og*|7P%Xj93ufpU6ukwy$?a7$uM4H$ryU6yiuO?NuS3$_2ub4*A-}wIu8@ef zFb|I-etjliYk6hLs1Y-uOOp5VpnpY!$P6tCvCJKzdM~DVJK8GtHe)f|ma3(zy~xQY zvb^ZW$4Jp>N@wpaa7z$xId{0qVQWSBXwT098K!ZN%R8OfrcKe^^er9YleIY(zf9LA zRpng?*leYMq0V3L{ty1xKS_1}9^3hKEHJV*vUm6kJM5o#{wme@KcW7=+-a%jW@P_g zzkhc*A{4Y`@xWq4wlUIz5w;{@QF`N$eZ+GeQxKBfz)bQLqgQY}(5NPop2-kL>`vY5 za6!asdXRs)-yoQlPn3uct8#{ulew9B_@4H`=D~baq)E5qH(mJF>+>s?AeiK(W8mo6A0^cl90(aRI#2*t$ zwpEu9zO|f!Gmmh~+-<9Rw<$(r)tsP#8kONzR9Drl%qF9W zZIoAs>Qo_sI+&A|t!sin>qS-{<2+X70Y7la?9Z1zFo+zn{WT>FX3_aPx?A@ej)-Uz zB*=s2jHbVML(8Tyb9~~ep{5BA7PBuJEVcj#dlk9J6d>JtJecDVU#G+67)2<_kN3mh zA?eIejZc-R_rHvL(^ zhZM)U_{J~xMBgjh$dI5_f z4D91-ee4TZGzY=H>|aEaGxqQFL;QagFtEt|Dz@bAHtFUPlu4_@xoQ}jos(K>)wG1EXM z-NP8{o!R0s6&00ue$cFwnAfr}JZGJ&6eaEi=dsyzIk})Ff9hl;Ef;NmP)Q zr2k85f+d||U_&Qm2E9L%Tr*O?KQq@dbETAqseg^{hj4l$fq7C#&5v2m_mSgl?8K%W zXmol>=IvQ>dsTYg&7wovkp{#tpBME&Ue~|XN1hyRY@r0dvZ22@!uGJ|ndezo| zDNs?wN~5P0%|{QyadZ@?ClAIVD3oIiGvVqkgz~G2iQk#hTa7*>YUv*&r;jiO#GO_I z=e*J8;IONJ2c<7$G2x6`$JWca99qE34njG`y*b4kvRd!GCgR;F7|-xaiOJl>K$B-F*#<y43`z8;L;H>c}ehA>U?WhoZ zAnwIGH5CIPG~n|Sx+Iu`YokSE!F(Yp-*gDfoJ}sZrZ9mgJYIaq;wNBUz?x77cz>%z zaf_*64|>4^x%x12G*n5?+zD7e_GoUhB1*ysjb9g+rJlWa^eir5Z}ar=_~2KGLx0kQ zIZ1u_MlV{C%&&5obrb)C%t;$Vo@9d!u9{XvcLpqbFUsam2p#1e=%Uy&5lH4AwJgP7 zP@?x19B6_RtlZzoc)25V9*I3Gy{RuhW8SYXbdyg^Jf5=61BzNINqpF}y5Q?tt4rH= zPV`7zT8Pk7uRGXdoO$soro`c(vEdKjym1M4ck{Q)qOCNG1~2@4zhju?;fbfn<p;?~qmJgdw&+P-ho3TIh*|k*95t|+*kNp zK{!uPWSo->&cU>zuB|RduuP)Kyxsb+yyz`)Q^Z6DW?l`L?)j+P4zF7Vj?!hLs@=k2 zBErk`Pf&89^N8D#4?(44>&)z__t^ei=^OHh&rNWd@SCE2v(h2E_~^Npy=q;wuykAU zRXhXW)>?eNdFlde+y((hBFOYPU!LQzrbG{3ao~gfqrhM`sWN%7@J%W$5@&)=0|K87 zywJW(O4bkrc#pc94X7JEMfk+?Hxjleq}SA1@xwRVBo(AjsjmZ=86qeNeDq{`#}|r9 zxD}B>5~ZS3C{I4W*@pa+JbHAn%X;uPvIK16-%Z1R(C~_S&PKm$ngk_H#aTX#=LV%2 z$xrsG7_h;Mekdqyd>5~wAQ7_^PlmP|w3qnO9A_|gvG3`&G2SyhoJJ{3HW*Pi93-cl zOk{HJKTbILJUv|^b`j_R&KVF2Pueo=?xyX!WsXaoL8WozljV-`QCDQyU85)*8=_j1 zcC@)?TB#>xAq|R9$+&(sVb<7%UsT z)`)9?h-;Lqp6Yhrydh-*r8V>!$aIOQtl0nZtBN|Bpr%7x?= z4R#nJw82{P+>BwWPI>PDHjLNVsw}4*2|bB%srjpKhBogEL0nO!7_R4Y2kX|NzObjW z71K$d(sp}vN(Hf`9SD(3M~17fk({~Z@~y!rHp(4wP-4;3*pnRgbMiBqiYgL4{4R_OEhatPk3n_8V#bV`Q# zAL9kX^*0Q-P-LTgrjZ?6JZ3mXnIdU19CMW3cdjRuUJ{G{(nfcf@RqcbDecpYw&vPS zX+J=xq!(h#WmJ5@q>uJ(Q6a$%HTOHfC;ZLP;g2doGT+1xbG>c1P`YHHyo5^XZWHP4 zKu)NJ?qm>o_zPeJMeQ0@Ufbf)?Fa5+G0PsViKg)Ll{HL6gYn*1T7k&L#c?G>5_JUck%fP zJrZ`Q+Wr}+)(ZlS{=bfO68~?Tv7Em9KR06)Nkwc?glCbF3Su;DFbr%%wJ&~9VB|xe z`+HsdNpLt3Y2S<0Tw#UrYp9)!l_&DKvkyN8DHT!<5PvU?WwsgXY)BUMd*w!LjETCWe-8=`xh*KRUwTvY!^zOG3~}R_AZ- zo)4u7BW-j5UmnJL?T_GD$S{h4No+!-qI}LBvjyDVKs)(f@Zc(R6Z`TMhQM%DI)Ry; zR&4}jL_uAu`xYU0Wnm0M7>O`!;o24o=j|vzRRR+fA&j5!0c+HU5XPh*?eCvb`Yhi8 z@?bh)?T72u!qkI>7disX2?y6(+4>KJs1h;59EAsu+yV|quiPa#`;82bBT50WE*eHn zXrqzvw)BCjb$w`QI@40)Gc8H3^+oDMP5GSalLR4Y;_lgTaNm;POyPd8*ZDj1&R({K zW4nd)?x`(Eb9l4}&v4R3r1+-~{McqIB8+A)%Obw&AV+cAEjg_GagHarKP_(E3kx8# z%^z}9nQtajgxHE8} zsN*n}wv4SG(velo%M3mF+Uu9E8QW1xGp8e?T6vm4CB7jP;bvaVcyNAw%Qdw`_@4Nn z!`xmn`91z19mz?Fr2My!k3?)gLZ?gKWbwy&h_i7&V{~zYWi`Bn_TaTq?t2SKo;iV= zQesF=-$DOeq{PT9J_#B*gPM879$LaTG=PtPXukeFDbap8`R;uab%?-9Sj!f zy4WE`5hO1`g4sL3Hw&2T%U$75Hydv~YQBFS7ouiIS4-w>2BNTabG&on8`^X7(!XkW zSkHv$dvFu&i=vnw4EMib4tETs3shdI&5b<~_6k9K43ihYHtoFj(dr|{5oi}+E-1?l zMXC(GfOn~pWRBXfO}GH(3jCRTR2+5ud0Wy;xLr5?lx-zDHie>LNKs4mlN^Eq9rjOj zUM?a**N|YyJ@e;aYA(0?zhbtjs?zb?8FcIobn6AI$M@S6>V&;1^O0RbI-MKMHo8 zoF06d7eNYFDlBfFV*mEzb0zQ7)h+i&3O0x~3=wN}88q)Mo$?U@2BH9kIGeFGDzH)W zQ!FS(9Gj)o#H zgPyC-rM-ec!Frwudv5`zsy{en+t#Q^9miZd3?u?@nGi+sTVVrL5qSFDRDKQ`b+t9^ zmXQ7+b*QR}XQ1n$Ye2SXJ8U72%Eg}{htpr~S%P^2p7)Vd%?~8_Vl}1?mONAscmafYCR7yviMzEBi3~)qYy~gQ^w9kP)LCHM4glm86 zfYn*rc}CkUPAR$pD;;|j*UVvmeZrZn1{YiBBIrpc2gqJ+=`=7RwqCoQy7DesuARjS zB=`yp83OYSCgY;cArJZsZXdmU3Sdw#vIHU?sv8r1s)MH>a zbW6npy(-mS;W)w>3SECSsgGbdk_a^#$fly_S!PXS#jZC0?Vf$_8)o-2nbfd|oUDC{ zdD)1y%J84$Mh(&{LJ*8Fh$PLum=H**aHwG$@DL^kIWJ81%8;m)kj%s50?Ab6u_mS5 z$hZ}rcDSstYdHj~mS|FI0@3@22dSw1JrM$qho6E5q0r1=l8tU69ID?-wzpevMeiEQ zu`r8r^SMe>AJIdvr;Q5P#cY1}62I^B5aaHv45y{wH$KYEmr#*b@h<0|20~i0wqjto zKDfSIrMMeKggX?7!X`U&(W?UXf_SH(g_hJ-*0jHOmBxv{FE)Nprn?DajpeV)VsG<)PQ$B}qDvrM zTFWz_m8N428YBA!sqhYVAMh1>A9JX#QcV)evTy+z9C_#+AZwfFbkqC^yH6KogN?8u zjrgSS=EK2&xZy{p;B)`BP0-HN3?_)?IX^C|pItpr?*Ir172OB(A=BMP127!hj8#}I zyaKC)VQq3h;a^QbYNn=<{y;NO#UCzByYN5N{l9?Gzu@hTqqLuEUO5)dC#NJUuO%m> z8x^2nUHl@zRCh^t_S7g!J_`9uB1K3rT+L=8`4I*~{B^WA$a)ZB1lp8d2^M~-O^*L@ zFF4?@)~~Fdj!w1?#;>FfQ~((OWz*~ZM#gEyKi4S8u`*3F(#ib;+Fg5^rTm)D37915 zH>pQvf763sYzNX&{6P3JiqIYLnm*SXq2>zdwS58~AW2bNpY464xUDWZ*81c``h<~0 z@8%eTMIyOLh+n)nsz!5ar*)4@TQFg)<)*=u#*8OsE87~6bfwp)+yQrX4p&mzV5u#f zrg#-+Ci&Z~98|jkZ4f5mxDUGTQ-*wtx>--QzxC%^Z;TegN!{o}zCM8QE|iiWVADtc zYW`ag6d=U@6$|`|i~k)l|NkNJ)jy^Dj(vYc*Z(T|z{~#;YyUg>!7EVycZ~R7^Wm4A zHQ?nxR`%E24!>7?wORj;wFYh)BjxO z6`B33zyc@vYn^{%umAVTf94`#`_Ib%1aAL&T(2RUza#Wsq1(TT+27U|{2L(m?}PU$ z^LMb+t99>JNdoes{L!Jm+VtN@zyFl@2OQ#0ky?MzZ~Qh!e~J8W%+>EAUttu#N3p*8 z;(wJMi*r9P2*?{vMFU5NAEx58h)4e>RSBW z@$}(W`+!#fV6L?PmiMQl@m1Qdcj`ZVPJccP5{kc*_b-prtB2s%3-T)IcfZ4*iNTJlyClbLBCuZzxVysO#i!G?a#N) z2FN|}-%sV=ZTq*;{&$J5_PF1z5Pvpu4#=wWze)VJb?$eOujY&2)%-sjc@1Pw`Cml- z+nDjY#Mk4&@A}1`5;xfYSBd{VEc`CYylKC*l;119DjB~k3a?7W zuYwPxd-_x5_`U9{D)IX+{U0}V23G#1Sp19m2m1~7n?|4sm4Wy5HvezLKf=I1sLB0C z{qyS||2Og{r}DX1H1v6ufShJ z^sk$|Y6$<*37kK1!UMImAXDi_cxhLDR>&1N9us6{d*K#y;JKNJ58JnkuT)xk?bP*j z8|TArnw@KUgbV@PB7;{!v#35 znbsRd(R1widGGV4unUC`_e&%ciZHeZ9-!tPfiKWQK2QjITdhBO?pnuR9{y5$kMC%z zyMev(`Q^F;_S-t)&w+h?gAMg*^-XQ`os4P!@v#2+NARD^)IYYkLUm6)%^l|#+;vM` z&7TlKrg z9?yC*QSIX+(6?b)RID$4>G6}xE20wCF|@tHV`=}1JcH5u#S(((X1z04EQ5~|D#)JE zW%_$!*mLBQ^`a3j?Oo7=rvRe=YBpplLM5!QK$vr2Dyn-ank&+Euvzm#V6Z|EQUYQ_ z_+aMX2Pp+Res+5BIT$GtsmXrf-l&7XEj-2ow)!B)R7fwNR2 zD7$(z>G5A0H7r;liF)xiIcU=@$Do+ig`9;`WbK&ixyKbDob?GPVW8BzpM}^*eY`=s}-4Jtx#W?PQmU6Mp1t_u84#p~bm+ zD##wcubtcb?kLYOu$(Ibj3zArARco};~dwgqKFc);Og53@%oN5rpDT^%qo)~Rw=oe z!eJlV8KA0Qw-8XBDwe+kSjvsdhzUK-2%1z7V3>x+FT1MN*w=L~Qm#Qo&)QqvMoDp0 zgpw7XRMRPb%y0f21iNgOlSK!}c0@@s6sE_TG3t?Qp^52C-{!vhA*+vUv$bz!W^Pjj z&jgIMXlOXIusDEXLK?ej9s4?_!E8|9H)#MC)ffk3p#qf?ECaaI##Ml&d^Zb(!6x-ASkC8KVMkYwp9y=NR z>h@WWji&V!U;D@L{c>RqHopl@xTog>l4!+jU4IZw3dC~%&Jx4NJ{|hJUJ)2DPwCB8 z#RO=IWAp(UZ2R=3Z^SBaRM-Ajf~)98dPjBCYovp5mtIXLQ@lKDy94dxM1bj2(Q`$14YX=gw_AzboI^&aCnr5~_732A~)W+Uta z>mA`;ckwnTW?R-+RyUiX(8wg{Ou}|K?$Br$7(G2qJR6QQGoQzHr?|Bi0#)wF<~niu z+|c*2rM;xm(C{JYXRr(XayAtgH3YUTHgzZII{(m-D&DuHl;rfDRemG%&sMn)hEi$Lv*b^Cj_Ugsz9p=!&xlbk{U{w|TFJ0{ zus*wM35~LOw){TRM9M(N%R51Z%VMGnanR+?<^7`m$wxt|5u* zCb@~OLgQEmv69xI^65!pb1AhoLkD@}h3JznCzcsYhNV)yh*liKHJtuc%Gh+u`#IyF zZ|Y-AuJ^0nmCq**TpiW-&-`9r3u8ix?3hySeX|gytw?844pL39Vm%Vx0oY|mKLJ^e z8X35Q!co~r2YHT8;K>BMH;I#ex@2_o?^8+1DN*@ISaRmW#ZpVm z;>0LU;c#J`iz)4hq~)2I%Sn!*)&}6a1HB;e8Z4^RK301zH6e-GtF}#Lx;NTnjH|P? z48x3{Y`z1GJNQ5ta<3goP0Zw7ZQ+$)Ew*{I1Kd?SQ&#GkZq$-Is7=qIebSD%4}Mrv zK$hV`e>c>N3#qV?pEzbv6f8bT{?s9dEQyLdl&>|)X;zwNJdhXezgg3u7THeiO|dT< z*vI@V$0fg)m*^D0U(WWnUKORXh`EC^fzFWsXpxJ=vUw`Y6wcWxpWia|DX~0!amHhj z!vIevvMXV^lWOnn0@aEbtOK7AQCN;MK$oeBMlU4vj?$tIOPA&&kZ=#r1ogg(NkiMO zuSw6ijy6Q}=Pdfb44OuIvA(t{nfyux`3HFpg8WDcv-1*eDV$;DQrKT>%A#;yqESyX{WT)yg;MKK#O-)YuEGS5Z~m{UY=2<%>pJsowwS9JmbP<@ed6JEl4sTubFa`sn~3R3?1(1j7CY7H{8R zSyQ;dz{PF@u{xu>(M6&u>WyRp9`VFTf!Q*8WaGutM5NQGbg(5K7s0_7w38U;RA3^( z$&u%-8X*_Q^6wEs_hWc)L)#{6IqE})A-*yV+RAQFnvfu_k5;rJ0N0c|(Vi=yQJ`!ZK z;X8m}SW%b(h}efLk?z6r!r5&atiDZ+Va1^+2h#D}nE(eIs>qpO*kUp>ngly*Eu;6xpaBvZ=blzOb{!N!c_ zHL4NW3!dQ}hGOJpzL2wbI5VgM)8?@p*E(GkLQW5Ew`yUc=b)f!xo~rp^+D*Yj|{pX zC$9js1XpVzIBW3abz0GHFg_;ReosG_?waX%!|M}i(h;tCj<#Y4eFA1xXke8Oy)53? zlDKGqZoSo%llatuN_sM+bI2dcd^U&~w4e zb=(pvid((K7`=3^K1_SjvfX^2vD>r9jH^2@aZX~5Bx6y3ZfwmXV@Y+c4ERXappvoR z@21cWsk?MK?0!N_V^(|~d5e;@kku=E;?7mv8M@bqzoEH8b>DOgp)+0G?|SXvrFysF z3Cx?~rCZ%E=|SXE!n$qzMDA1YEkyO&@ILIBPG=6k|L8b~^_tO5(HEI_>04j*J<4Mv zjt3Ji<4%GEz6Us*!xfHtJ|>f5v=H88-qCUhLz?uCms`?dcMdz3>YL_g#(=9msE7La`hZg@t(k&?5jn=)jUzTRCA>5vz_YnZ&Vs|B(bW#orh~uBT}A2B5zXk zu=%uSVf2~f9#UTUnzMqwW{gkt!1z?}$lVLm_>t2?ski&*@py{O#@BHS+2oDZ#c@tG zu6hSIHTHOPYow|6mJ=j1BUy_B>k2X1L=Ku$7vm^yV%q8HGpb<)49( z;sO9xA;#9)9F48OLntMWGIse8vwooExJ-5w#5H~Rn{TSj1<$%gN>RP3U-OR>T)ggx zAU$sP30J;y^Rn-#N%U(>l{H)bXJjo|EHl!PW*kGYF+@W7lO0vTOE$aAwdYFal|%VG z7KJL94M-3Reh&;GUYkvc?xQM2t>K)gM{We&-W}5v6e7yv7SKw(R36LK){SkNzG%oo zm6Zd+1=E$;Ti%>y$74q3sTS{(?Yg07)g9iBl_12AjIOIe@18&T;_2R(n-hvo5m)Su zKTa}D&UyhkYNl&;Cl4kzXRNJ2Ax&ztBKAR(A{|x+X9_j3VnSFB7=|##bcSGV@#4P* zwKJw^(VO3d7PVVT;|3_3mRhb?h{}!C=QiL)_p0|ZFP2qpbTFHtSvufaGN9XN^sG=1 z7-)dOyE8nha7T7|V0beJ0j_PnQl;jrr@*q2ieHbvG*+sp*6`REYG?InB>6cL-eegy z#1?^9h2U)>bAnb=1K8N#0qkLky0Q>yjWMa{161lymgtf+K3_Rwh9<)k>F`9lwMMx? z6wz;y05O$zE^HX|x?|P@>8VojbQN(js%cshFdFD^ehTErX89ylT*9o>GBX5JHO5T+ zNP9W`b@9>DkUuEC^S~hO+H{sSa9`osxfqhc+z4dy8We-T6VP0 zox3_^kJQLL1Mtspd=u<%SA;ASJVw7xOmbaKaC2TgOik&&(a~=X#py32YdLQeBL>D> zJ$tb+RD~m#8qa@F%j#uE2kiyT^?uHErRgjP1rfZ_y(VAKxCR-O6Z@>RwoG8*`VMf1 zC+PmcUxXJSnZZEKp?_qr^Lk5wMC(w9B>9nU9I@_P!#wer@tC#vQfAjYlkPiwpQ1X5 z;GhWNUDVyQ2=opE^~9HyUao)zrs?qV2CrS<=kp#etcJzRAy8JDcYW>tnfJRx;c%uvQtbR=n4?5cTB8pgQS}A60j= zFvQO2%f&;&9c`iQic{hFYQ=YQZwEXR)fqB;F*~U$;(_!FHN-RwBDI`p4awL}kq4Do zfJwXM6*YxmF~Hd)nNvID|sp0eKJ&$MTte&QnZmdc_aWn$Xb?i*y|C>>Yz;;dz?sh{j^Ep4$aIlOpZzW!~wjthu3;+iSD#>x^eoS=nq)GJ+hD zi|^k*ciydMxn};j>;CovVu!(ds8*ayWGpffY28N1kl=89wY?*{M%mJb=8nq)i)}gy z&KSphB4uRdp;DlQd&Jzp{zJ;Bjg8f`6|we%6{`Z`YzH-Vm=ZI5Z9e}k= z-!z9*)lMS7wnzLu@8Psn4k9+wJh;DN)CU?+4lJgI0e~iP_|+U?HdArEK>uz_JVU*r z$=A5O%fhM5+IIjfmn8-jKUuRjb{&@=Xn{VYs0UcaY15Kl(>rE-uL5Rz0MhFxn}S-nJ2pi%9t`FOu764;X1D$R*06g<{N@ zQFlddV-jQ?=@cd#?Sm7jsj&s!*>?xR$=&!x8Z0;P>RHKK!^A#Jtk6-?{k|iJub=9$ z3y%X+SlP!ZGoaDd_e3XQqu%A*47->eORZs;eUu zHZ>tG9nP^R^CjfIr+)$)3|HHDBqNX^QYS%wO}9AC~sXRFS6RRckkbS zr?6;$sc@oaC%5%;tY?W~8xXY6!ls{1ckHx^7Gd1nnBppR**Kc-J4>;vXs{dy{k6^m z2KN&m=0wV5Ki?uXijW^Ii^rHR_sb{z_gXt$h(1-)T(E|?z8`s=-iws%sWz;AH^*hM zU*}V|+v_)xumT>Jt*%CK2+AHTJ3JR>qDid8Nxf(CJ1vku(l}v_8g@D^iun)ha zEc8jDDYT~~R8~3Gji;B=VpAW`lGUqnz4eg+qqlbjLc2nBzuo-%bV-9s-^?o8=c=t| zcp=)rzGk~IUu@7DHGLoKZO{hClkXt|K2GPY@NdBj=jK{q3e)8bDBIfY(P$L{g4skY z1Ae9h^+~VWyEWl0vU{7`HGTsot-gD0V%r?`)6)+>79TU$EAtw0`Cg;G+T&eDYeDR+~3T-R8TJ4c=*BNS{CYm|+<0M=yDU_8c9Yz-Se*=1 zYJ!dz#^7;~-CIQHF*Uo3hB4_Wc2&hQt!=|3&*GPXwlj9iaWG1o*^Me(79P8G-a zkV!eVrBNo1pioE&XsHoON6KSBfNg3LWZ2mFRG^M<++}fMa5s2bzRuH-Yjaa7%X^o6 zO?xeQ(wb}@`POR;l>LZ%Z_V+mV}JI`qYG{i%Oi1axW2If{9!x=w=I}pnA71%uO3q- z6EPd+VbL`vx7k7Is2;g;iizDd91LAWIJJ90I{%``gGjLFgD6Hp*HFj1|x}ovME6n%oR7vw=uSxu&hpJm7d$)v+^z7bcNbpQVahjGO(jY~+ou zX9pdEN4{0_ZLVlwGMVocuoK1c=Hw)m9~r?Y3@X`Bvg(Jz2)+Xxwv_4&@iR!HS9GM- z?zWh#@pH4f8%HWs$L&U@qHMxZo%ap4w)iiYCDA_xf+5Hq#GDs&U{A!E7o!O=EX9$lNzZNR zpia(hx4|ZB#=u0)tmG>-1Z`2sUz0lNbY544S|I?sHwz3M&GW-b=C#>%%b$Heyzj#E zvZaS~*$|O<*yV3d5>)}on38B0msB__*oz}`VSlL7%SP8*V_r%{`+1KaPWF79TYaVw ziK}%Om{upNx1NcPJDy%)e)_gh3%&HXPB?B4l`EK<`D0QhE!vI1jWP|hwdN|}&I!wU zX3Z=`fG54xwX%pN;iFjL+~v%RFD{NxHMtvV^~}>mN9@AY0X3wgduUB1*_or8VjuSW z$3Ycv+f8c$$+474Re^ylLf)4u|GRUZ$%mFKAdP^kM;g?$jAVm=1ST1J+E#(XK7~~a z>Y^iN|Bz>8(h@RR@O31h9qgkSn>5dhgKQpT_O>Ln?iw(IXe*Af!Z~VJQSJVh3Z7&! z)7||i4Uo`H5+(iTh9*E*`OcW#2FUP}E6nQn)QzSG&62n0$IEIS{{T@*^g3w6?9sE+ zU470L*@L5^@9mH0cQ%Cp*J)SVr>`Q0>O;tMi6)Sm~53m5t_^(nr>ZI|(u~ z*rMvE#K7EbRQoYmD81EN^Q!~8QgI|>OMxbrRs{L+Wx4n+yI5*k+S_tVIzvC*8-RzP zc*S*Up>BlLvIT&^F~Sx%jdM8yXHbi_f-4jdoqRWL(Tv~cR4e{pqbLLXO53C81=r z=%{0+ToVDK zZQpC#Q4m5pDK=*$Wl(ECGCihTF-;%Pt)we-XkuM7R=dxUH+i-t(6AkAr=hqxNN zrkfa~`5gfMBb|K(!_eZa@;X}-V_`gPMEupj#d~mTY9SC+`y>L7w^XauTh76}J;5tY z)KZ~LXLK3e7pmB@TPWgK18CO8;wJ?kwUx$XDBCrOwP|m8Lg7oWKg3Ml%N?7)zt}77 zp!8BY#JSUuztrH@!H*Ye_X=p%@|Wob3vfd|4v^qZ;t!Jdg|FkdMc}}`w=g#?%R*n=T*qS^}2;3&vjqXp4-^z zo-ph_mw*6bqO|gUFHit_Ec(dNLsTk8*7<(x027+BGXNB{v$xBzw>Q?X)30ZPUpE^} zW5d_+Brd1VW|@}_>$qM&zt@`_B*Oyw3JyXr;O)2C&S&~>4z^KL%D2}L9sxSKBk23O zRi$v?9{pYVa7eNU-YXxz5%`)B6Z1FXzK4rGT@R@awz~sCe?+R;dBdK-hnT~fq=En$gp;VJK72N<2+Z0OU{bjwV$Ut22^s<3=8JwA=q)G$4qa47X?aE zj`9=FOG-Dq_59bjQm3KbNl#4d zUqA!0#LVNvoV@Zf6Ks@w#3kxrRxiY;DVSN9EXbVWsisJg5&M~7$2VNSjTr1k?TW#= za2%UMBgG!2!I=>yB4gHezDy&C-?+pO z3H1||oB%`^f)@$qg4OE^8M=R^)1K0zsO9o4IEn&I;@kAHG*3x6?&2GEK})_#^(xi^ zK8l0HQ9jf1+?jcy?;7*-9(5l1?*Iw0I;}7v#3lS)Mm~f6!0+*Sl>MH>YD+y-$YGcs zvnkU^@hp=-BYjDMIzc~M(%NiB_-Fl7M+xAxRQiMz|F*p&@9j2gqgtQTmsjK*-E3(B zL9pNyAw#WgZ3TN}3rJ#tGD-i_h!AFKokQ##J!%PIrUmA%P*j}AKu-!OHNcu7HKmt` zZ>$)lgmecB^J_#%XKx;-MZRY?2y;QLOz@rLw9qIC98hH@#g!B`HIygD%U<%(VBUUi zh~Bf8;2e|2SJuN#txDbuKw?^!Cd+f23B&&4E#`M)q)OFq&NaB?s;)I>dd^o^Gsz=D zWWg?mg0GsBM1E*=Pn_fd=K0M-GAMdzZ#vVtji-Qq}{tDp*KHSq8(l zuaU;2fG$f*yON&LyrkQaFEGDT2JeEI8U?ZeDFk45z5V9U$7=6Yt)#NS<)sN?I@{xj z-J5y)#oMj;#t7=jcq8|VGZB|tpSNOS?6(s zjL9rDkWEa?)gJZjo4EIl$Uco7+oNPX8p#@2} zgCrxe1nllO0r6b5?k?RHMsWA}Al(7H7ZuBJd{V5F%9rB04Jp#DP_|j2Gx&u>a!EV3 zWWsCeuCY0818tiSVt4!WVdcU#BXGvgbXpOVK(PJ%a zg}plDhl{hUK5?q&YPUfHckEC{vpDEy19v@Ak?hXCvE8H7m~vwHz*d({^mbtsV)>0I z1iM2FWxYPjL@Z)-WGRiyC*1F1DMWW=HZFm<)26S7l>(dhmAN`J=fCRBA%L^y9b(65-2X zdPZ^&#SXJy>Nm!D2YM$E0r^;wEl@q^JFp-sP<@nB7#v~wI6okkfdq7pT!N7s`2<#qjN3 zD4bqM?GGp}x8}!(rZxH90qb6=qlVENz7vdv3S zkOxjV&|WWrW!HNkdd#R2NF)~<8>R$NpCfW^>yjptGpdVWo{3cV}9R8 zbgvZ{N3c$E?_YdEm~ksJ?dT%Z~T#DemG3mL{)=`sk?y|7tyYUK!XG&f1F-VqXA4YhrT%o{ya|8Ky#%sw6Hp(2`Q7S zX-)AZUeRnGDivf}+HUq4OBrFz>6vlM-ZhX9rJ1d#adigrs%CB=7vnzM4 zzkFD!Gq^7s&dN*%RBgB*K>bS zwi@#YIqluE2$}ii4QKsZ7n6saxkbo9IW?Lqk$Zv;3WF07z%12m!$zPQyJPV519ww6 zim5m1RVtsf6M%Q=OQIIh2(t%hm9+nn==nBv@v!Err{;@ zMxWsQq6X=FtTFPT^=E-0Uc{kxVNt~orVgE!#Vu1! z+&KRrV7o4LsTItt1%5E(0(Z}-`vm?xw)1V{%xkqF$hW84!{X&HCJ{!RbA7_s7*<%c z-!0((sfB*{U$xMGXrRtA(ys{;z2^$ThL#r(g%SDBbMUnG7YGI95w;-72akwp>?POu zSZ;jXkvz^J@AC)5slT?3cd*)iJ-+PnMbmvFvJ5>#aBN(`)~sdeoS1m~Ltng^27VJ6 zg3-rRxn^>~n`2I08fs`L?Wg|+ZnhNkbAi_kB3H%mKH-OJWW$^FN5H}Ya&ZtTOgzK3 z!C0dCwZr~W^$_B1`~vi6=ov%yY6frXG_p?Ly^1j5P}_=yg#x|3hWGTuI2F$)ViE%H zw-9D?*ojpY-UsI?mHV9@kS+2Q9DG26S;-B7?Y+0*d1U}$J|AI~2M zh^?SMMMb@V4x}E1&(!mak8ZzOCy>0*RQbNU$#pnXdEC;d$!dYkEI$twR^pt&l&Dx7 zrPwaL+7Px%YMmvm*=(P#()2KSTz8Bc(sLqf=4#@y`|#5JVrg=k=-PEo__6%EJt(`s zv0!e}v>8)Eod!pU!3^imjO4f3IiyJ#)?ZldH~82VkYc1FgYy9of{=oM=8Ku)2mid5 zL=1Sc_)WEjW?BmJlSM^Rg-tO@SGH6ORFvzG#K5pX60?!}j$F?q5bj$2^2Vs6%XpQo zoJ52KS5K6KrGQ7P0TB_xO>%xqlYr}$Z%x5@x$@lYc5H|dcOsk>au!k_G@-f)aA1p9 zz*=u$13+{+cOX7RI3Sadqb4{Z=a?FJWhY`lokYmVsJmK`qhP|2^p%~#{8TX1zpP5B z40uw22o>h+6KC#xLnUXfM{-hdf&eWns`(S1OmVR#jItt+p*Ac*FU-2guA-0@F}mod zA~Y4#SBso9yen#{i|zg0Fgv4ViFs>9*x}Fy0${O_-Eku>d@uP&g%U4X)aAj2BS096yD6UO{x@bV1G@dhZEOt;y ztBkDrvctdNgGU^h(r&I<+GYA#Vq&Yq7;kw9e+wuvxjA0y(c26Q;v#X7zQxv$VKVG0K{;Ryzun!|*9{ zU332aV;HUlS9NE*nnTfS#bd9`OU77jgq8N?N58$>$?2W%jC`JVXaH$!%O!d60Z z>b#~{%rKN^LeeOGFg2*G_Oxm^?*Jl|O5KX&NpvbE$?pJ-(WJC|e3hJLTRb>*OO3;M zMEXO^3kOHR*XKfn2?olRn9!mXNdT_~&yZBmGecnvm74m~L{@ zmv{uyT#=$?oRo{G#)xWZB;IXUZ6Iv^`4D*N(Uec_R10($J~;W(aoSTd;jrgF4l28Y+O)2e-TTQc9=Eh)e?9ayDS#3&I>}t-#Cf8iaDH zt*~-W_eap6d%$C~-?!ascRpz^EV6^+K<2VHNSTnB#%uOAV)@pkGfC!%m5vr=tRErI zF_E(eDH_9ul=l&Bo;;`gbUXpLZdlo@=bn)tU$Fhd7*kME1Z(d%;Vg-n5aq!%k6d4P zm5?$R=?hsd`52t0Q+I~l7k$r$jD=6UBOadQJO+%oRSSxPy~Xs&hrr8c*ESPcy2SSB zI(wy<&PjS5s{8Xw?GEiCxCKieLP&K6R2lqcizspgw0cxwJ2Ik^NT&wy%cbY_VD18k z0LpsZCR?)S#banH7LK9N97dDMdM;NO{5({Z~RIS zXg8;%AHlmu55@FBYn8|aK-I%)3WI(gwqrpoRCF_3ELkLF*SBGIAu`{yjzRgBn^@PH zdJhj^TO`qA@tBzlR;R3TDVZp>8-75O4{c&POxbfnpYfJ*(EQ3*F-K$aVzhO30iThm zFt&oK7E#s~D64Fb`nWs*e;z-PdZ1C7YIt87=G)u7f;xA@w}`Bfy!BKR<~!^=9h|Rj zHG)hfj!Il{k-`!_`<++%5k^<3GMg&Xr$pl=zv725($>T$j>^5Ofz1iurGeE$%}us? z08R|fXQaUct|qgwILq0yE=kBov_jn;ez@{`9>QP>ABvnr%T9wEoS2P5qFd zlp-*cmRyl|O6Vs+M5+Wkp5!!zNc^~AHFEaqE*RrRlUj-hqfsyDHcu6P>Han&2}+7_ z%wmOD=s234IB@@9d4ehovI>H68yXbrB#HN?@xrkNUmb!u+={|9T^ev=Efg&R(P8kJ z=gb#odID^Hw5qpUN>!|u_=gZ&G8z{Xlqp%m`$l`^h`HAGq&{O^w}T=jkP2eWRg3&A zr-8|e9+i>})a#d(UHfBW->&bL3bCX(1Q33YsIw{evlQbT#a>w?jwxNzJzFS5eEO14Lg_BCT zxu!VrEI+X1$tkT&yTn8Xb!;$e^QN>Pv4me{_ZnK&8$a9IE6zA0SINoSCsVkNbHfy7xNS@>Wm5>n=RZ5r8Xfn&2jkdThFI%bB)c}j~zvG0YJ zqSLyXN3~6W+h|OGGjnv>G~_E{?+WF5VW^$cqGXA>+3l_4yC^ElnkX zucBl7U$u=il^hlMT(u3{VKqs} zjqMTMYTTQc5YW1z8E4N)qF<#}Lq^mF%FbndEL1DfPil{_%}2PYykw&MYumsYQa zoH4M%z>`Kg!w^<(N(br{fI$^T7od5t^_4D)Dn4PV6$vJ5II8_~-VF>37;g-0@eE5) zG|q7YXR|w}W@jdkZSl8N%xf1HcTQIi&O0~GhYsBFgN)&2niZ=T%t**l78i(7y#qU% zbY$ZY$q+L87j`ZWxEOq@2fb?;9w$86k^}q`xFl~Yr0!+5uwsAX>JM6*%YEdStRyZVhx)*F?u+rrt&3-NIY9ytSFc(H``Ng$w0lJRI10A&%sXCM+emd zYZSX2CsG?vx5u?D;P-k5n7oIn>Y-}Es@}%(!d}{XxCX{JC%$1hpLU36+Auk3Eo^ed znd*$ry!U?egCovb$XLFA)2{$-qPRUiGS2?xo}|MGN4R$=`CMU#xXUYU5yv*84-9QQxdlPwvHh53h-ITrpAsy|up9vZHCmzgl1*suIK6-QAtw?(V_eAwY0<2=4Cg z7VIXwce}U0y4$~}rfO>Hec$WXuV1%{vWyRCp*8ab4e(4AeM(eGDz`h7-O~wg61X^b z5P)&5kL(tQptIXNwo{VRB0qBkRgY?A)X?$cEP`QZLGn^xT^E5SHfyaQwcXV#Gu+^MHOlzz->q@|Q$C$O1?RN`S z@xsD%i>7&pP<)2MyELy<`Hi(xHg{MgnV+x1cc5!Tr<(9U_COk5D7;p)p4|&^VWhEH zkMOf=r3yOw5QI?TKz}K*yO&)tE35Itp?aUU*PSK+lN01;+U%T3wsAAojm=9?uGOu~ zFi4xS16(#u&qvZxympJ8@=e3Aq@tio*iJdf7jHHYkzWH44#{$2oG3}}XIB8cMshiX zQk7!n&iSdH3V4KElGX8h{z0UlYoO6BOD9C3QG^MAJ@I z9rma};SPF8^Fe79ootLJq#@3my!Fv0rmutyJ^|aEQu7;RkI0W_gGR42?&{d%y}uR# zSSMM6NwS3n^A>2H z(Ms)YO1Ha-UpE`~`ylW;|Kg$&8_g)Nk^O7OZR@6w`j**QN|M#yVfDuE4yD5+1YzW{ zu(xB1-{n}LIt?GzbhCnVwtnyr15Ky~p>aUm-&PZUc;?KHQ?^65?O|xhIt-Eaq+F4< zB~p0cO45}1o2b*wEhY38Y8}ujA5h<=Q|{hKW&fI}bWq$uqGC&4S}GUZ6&q}J^fh}& zKQOuz1G*@cigZ-m?T!LfAA#x#wfPR$4T(Mnhl=}gc@9_CThbptWBfiumD~RWpw0mN zkU3_FCM}0wwp)!O0bnatl+Vv$1M_q)7#*PLmXoMsEo;TWmuRbpac#>f zK!i^K@VB2~7;2392aiTjEeVz!BuCemh0{R4yq#rPR>q5WF{baGmc*Z|6FYG!rX`*< zYlMFtZmiJMJqM2Bo2)N+3(X;9-gD&_o{Ge@fVxunO#0I%|eV|W~C5#D)h$5Yd= z#VS3~WhIKS^#PQAPyxKY1%zfR_nPj_&rJ6tpmpA?m>(Ihq_I(~9A%7EERRPn_d<5_ zj+L~JC86N;306nCDXj%pkIGaYv$yo#@nN#6CmUfiTNOTV-~IC6GgP>j9?6m|HzZi` zbar?KB3Sn+n$c-_D#@+J%B+0?;O>Kl01cyN7v5D3%*BZdB`ZhJ6-w1bG_?+P1pN)~ zsb5-Wo5d`m=o$x-G{|;zO3P{PY?cQ*e$?9>N(on#YUL%MU6>b)CB_eD=2g!>J5-PI z_#y2@fj4tpEipD0I`OWU-f|2NE7@unmbX3(DX_)7te>4&Ws`T=Iv-zJ4+tM|k-pu{ z1e4?L!m7iZ8!m3h^6++%yQARmk(|bb*keEEI|$!c)z3M*4`^jGyQfYl@ux z(J@hraqjN`{OsE9_O&Vs2W?j#Y#%L}fTj{O zK4-*Wxr;PPu8j>W>e6_WWbXegHnjCqQ_O zq+>z%a0!w5{Wj9M zMBi+_25_&}!U~lJQL?$6!PW6RGHIU&6XS=Rpm}Qgp|mWL^Wzb8sw#hkF< zj2H#$E>9whF|6J%&wT$Hy*bOiN|A5s#a+KC^cB~pX-7lEPcP(aklXummyV2D5K)V5 zM*4C*BbSQ9HIycz%;@^?uI1qZz*%1rgd&{Z1AyyotaD<4q z{onCLG753D$SN@djY^F~9A%(bO)nfj$^Z$?go9Xr=5PL)D2mM50$c@O!e1+Bs$zbE zs2YrvSf)~L@s5XtL(*&J4yCvR=_b)NN_@m|W-K&DJt4KjyY{@Jp{Tn zuh>llh1ZHjQzcq0)4p@|CSQH=?A}(g^a7&Fo*2|KUB>!{h`<7H!ul0Y6R7MYyH~D| zB%{#|n;^8?3&NO_$j`EzxML3^@GUBEE(Y?!313=_OB8>W((qLm3@kkv6WT*r3h*iW z>fJg&+5mTEyl?`kuaLT9e%|!&JLEQ93LWZS(*wd-IuzaEC5)EZtT{I&k=9HYFL9$k~0r z;c}uVo9Cl?u2rXnZ-;coS#2|Ig@=6{5iHsoU#6JK&_&t{<}?HMT7A)no}LQ5BTIw# z1y!(lKkkN_-caHouf;J6#da@+mty8i@}m+1dRpuwg_mZx>*ZHJ3Ss1>I5Fw>gtoRv zA|Ab_r!90~Cu!T8Ko5Y<=YfFJ=p{Dj(5RNqn)4IjRZPn{xyErW1lz7Jr2Mh;@{wg^ z%i|l*L)w;3|0L!M1fzU|$qKVn`m4T#h$cRz$(28Js2-*ad(?Mll8f4MWTkXJ;y-m(DnEDY5Pb#*Vet4#8}!v5`*pI7RrE zrdPPf&e3it<+P-Llr5rWpZjc$W~;lm^Ht0Pnq!~k7hi-H1*oax{25R>J7VSyTbuHCVVG z-B5DY>RM1JH6KIe{R@6o3E7A7e1{gfj(dP$AjlDOup=7S^p*9*QdB26YbFcWNwLpM z=%m62y7l>bAYGt^bFS=`-WpwYAQEMq)#P9M2D0OrwZ7+jT@DTQKPpBOWH5QUy>gqv zs#_jAWZ-I$2`x+H22#g)n+Y_px)Xj4h~`m@Y%qwb(O!FUSg10@ABj4^dFdU z2-Elw>FWLQNc*MkH6;TN{V02yaI`{E1ys?|nq*-tPt9q4&uMdFS93SNwzI3VfPp@5 zU0p#a`-vTXOhY%cDYdd!*Q02BP2(N%Kr{PQ>q`=5@^JnWhmu>;ph;Ex*O;4tHw4Ue zdLT&ThLh(ohmLN@pkvsyBeM!^XWLy152MtVJYp0iS-8!wt)AKK_{^1Fe!G;9kR)Qj z8iOA2cA-M6?$tTW5>t+N9)u6`xI^zV4c2RuX11xR$9FUG)@QlX*bL<^S}V|3Cd{*p z6D4dLE_RtBlv+@fgBLe@bzQ zz`GJ#2UA818v`ds89^mkXD2&nCq*X*V}0v?0-7LIcsDI&Twab9DJn(~&-iq5Lm;oz z%!fkEbOv@!36SC!5|r>BDIocbj7iU!lzD_zU1*-TNJT|B7OY+OJWz;+rr_l~p_4ylg)XPy0y=MB&Er-kRvV&t!naNp7AEFhsj0UXJurjkKhB&~%_ zmA<_Nyv*hgOH<$3Y<`IA&r@1P%%RowV zjn@#yDv7WlOJe6=glZiFv}cXp>Y4h!MpS3;)m+9~XfiS8)~FnLFt=NPSHF#QqF|XB zJ<3dhnoRKhXV~{e`P@1_*!56`^e@nkddgmSf3LcDPtxT@U7?Z+6r^%Un)>hmvyS}OnIN`y7pM*H-rvYI^VI_AB z!roO`yK+IFDP?+55$l{jWSUqbh*Y2sGy_OLjD|qW|>*>F@EHm{W zYlWI=D4OzB7e$K;E$M(fNw=mj=CRPR^({4K62E|_pES{x^SOoy%b8g|t8Fx`^m$gm zaJjig$w$Uw_NoFhVChMM=u2oAojqo$nXu}v;Jn)x?b3m^fsB#uVz#N0MgX*DWmwGC zPDMvm$czHEyH9e)3Q7W2?R@ zhTxkIF&8lEp39>fvq5ZtiZsEdYSmy{WmS{`Z;H%G{=i+1*CEOamc!)0X2pn!6)iM* z8-Z2Y)hz<^6CirF7GqXoow536%jI^clQC^EsMW1e10CIu3AxOeaI_SPreR*8Pn`v8 zbimVSryb0@Jy}dQe5kuAr|h7_7APgO59Cv8p6uhOS)u8JR54Qkr!WpQejz%zx83%E z^i=;1q@Y9-uhaT$pSe7N&<@(DT`KGjDZlzb(4<@DQdYokwT)W3TzEuK1S*E-n784g z-0zk7O2R2SVx6&F#sir=I1ltf*kHc2P98(_3%l6%YqOFf{cf$1sTL!wUMa zF<1|it-rXNkn#A@N4&!bzwuODDSjzpHY=TK!qIKLE5Ne%A_zJF!m}c z{iqq!%JyxTK*9HOHU6Xb@>*42AO0hx`Jn#_p{(oZbd&T8s_!<>6a{kYjadRJ>d|e1 zScuTPOKBdLb);6(JT)O3T?QcwNeSiyyS)q~&Tch_6M7g;QVA(t}6cuj9|T|MfgDO4_?A|~zqnK9WPYuYsKRLZhG zrCI9bD}Y-wbY?-;^8ZF`F1 zD=kR5uxtjDti!a4Xnhrz-o1Z*QRGB;gsHFI3XNZnfxxUZS zoGFvN?=-WjCq&-4Ez?f$XRb4{&pg zD+a!p=j2P|?8e$jxH`PzlBG|DxjO zg>OVxYD4-9=XkFnzVYE$@xJE?y{gjd*JI|yffirBSDqKcmLnhs|7o@RAbX%_u!cDd zdBDCMv64J^r&%F5Ujk}pk+%1WoYX#YlqtE-h(HLqn%viKpGna>8sAJBO@ynH)hD*2 zM%H^0|7b)oYSc^?hQDJLzcoQ_6P+&;*-qSq{D(iMFUx5J`&CzF^Bk&!^gajpN;!7$ zPLghuy8rnHEcWk@hOFwbFw4>sq4oNaWd86jH=3pU{WVL+GTV4Ay9b4 zgYSeqx=OOS2PQ#3FvIN;IMzoDZEg-VcZgJbcZlZF&ISz;rSvC}I1V;7xyVAL+%9*X zFB5zCzE=Lm59xF#_9t@Opc|MK04=Y(l{7qKx>Jx?}%{68VqY* z5wZ%CvVsqL^&ebtm}ERc8$?Z_=A{0Gt2c3KWbGz1BJS7l#Fe-~W)QXuP19MI{qD0S zWz(ssR)o+?TBK0Mu2f6gej#L z`X5|xJBbn;;mbu4d4urRP@s2mbKX7sc?i`?Xr+_RuLWc1A}^0)34}qoOIJD&u;^u+ zJUrQ3+or{%NNhr;u${@sNnRrRQPYu3_kW6k9eOaZJ&i|RUOffYXZ4R@!v2R ze4I5N4Ow4;=ruzOe60l8m>BA}bPu*Uih^`2wm9k~iNI)#BKPp^r`2Oq%VU=LmhAi` zxS79w0vsx|XQa$xNW+VCwGzSY2~rDYk~XzC5pf}=9C;E^V+O;|rGw5s+`Rr6V9Ro* z(JE9Kk!(DE|0@z|DlYh*`&VXl`5!W?|A~CTAO0Kp3c5QPE9w7ldB3xQr7XHU3U7VG zX&pUsN=i()TIK!6${!F4P^~DDxdMmr<>66gR?bpAix?*;bf zXTbv91!)smERGXto(~Tj7yKW`^przHaVj{(Mlc0$#b?tQ z{0Iae@(w(^(ezo>SJA~tRndLenh06HcBZ>3PzV|ocATUi3RXiCV(IVtPbihb2Kpe# zJE6mbXJ6Q`KaAQKiX~do8)Khf%F~4fQ%&kKqqSWjVb1GwPo^^7&#iLN_{%#7D0o8i zq;b!Y4Bk*O?36{*Sslu*sGq(x*| z)yYFP!7;^kX%o6W;&K<$lgDkZxNNYAoYm|gHH~=MPz)9891o!kaGPcosjfKV!xX`3 z0BuO4ba2nrQwI zLGWRWlBI)zYS&Be@bKO%ekE;dD6m_QIqjWxAa`GA1Tq|o)RjAv{Ov0Dx|L4=U4A+- zwV1~YNHI+xrA!gd1%12ItruWahMAa z12c&dd!RmLLK?&8-8yu0|+*{`=cOw1fjh=!s@hLbHzD8`NP1!bE zqEpefMm{8QwL5^-x9^L{1-gp~gF})HL7Cn;LI}tl7)*m*1r>bTU+y%ASf~L`Gzj@t zIMjAdYFTpOelpK3-M6a4IguJhi@#M&KZYuJtK5fBl)C_8EG z#?$|*%#Be@dH~;aOjx?Sj@>}EV=x5tGj>d$cwuU{}*$UP~cOHew%z~C?M=qY-4M5CNOOxe#4 za;Il1;pB69f$Ui|PMHBi>8)!RA|{=lWVr||8@-V(V6JWF7y9Z|geqX13sf1fZRb}vv->>3SUvN7G_NV<* z!(v2Db+6vaVDZ6kr4IhAr%wPD-W%vzS+7~9As2x{tQPyQ3u9a%uXLLf!_<$tZK#pJ z)LU}D0lsqZZ^C|LbQJx=Vz9w(3Uzj?scc18WQ|v)O;_rO&$a=jWT`pO} z9BTKJb=2ATj&z9_duE=}>Kv2V!E9{6*KaCf@twI4kYC}Qsd`)TD^AT1eiz`d?p4y+ z?)-y?z=IaS_w8fd z6>+(1pqCw=sN2N{a$T{<=IGID3|r(Nc=9*$C6bRh+b~MBj?_#!AlBCR?Ke!XtR1S4 zYijm-{OI)V{`h=`0AU*|L1~Z?mS0(*mN?M{46#a@0I!Y99NX3#>S5cB<_@b3@$3YX zqM|xws^4>ZY2iB}Rq!LXJ&b0lhH0}(b0?maXguQ+PRY_69#vQqd5le%UFG&P$nf&| zKF-40W)4=HeML|Dy}ituWLje{a}K>M>K08v#$2-vP7U z-P&l?UvB8K_ZP+l=p6sP`ybKWG3ZvaK(In~>pxVo|Fi%7RmuMA9|to(5;p&X`0-YK z_Dq-~e9tTx&j`e(Hb)Q!N4C{h7JmHcTv7SOnkI10!5n}fePw+;-H}Sk>gGOYW6e7dFnz(ti(Wc`azHr}x#W%6l#;=$|r z&3D5CyNmlpC_qS0osa*PE@- zw1!GyFQr~VzvH~kds49ZSGFcx?3ok)f()a=QUF&4b|??MHFnSmtsZ=NA$}acV!384r7BtLY;j z7%<5S;07$$Wh0oqMBU>HA-Z|@Ht^9{>)<)$M}M#}SUnMPZ07UQ7zC7H+eyVnGp{Ip zJc_LlC2Y!*=ps}1?hQ+RnYP05l@weCBUCp@`={xj3!JX6&%{u-%2vBRkyjfh_=KZE45?_>VV-7p;5 zgs|Gha*$$$V;2wvi5s!vY$X`dmFG3&f@4@4h>F=<$~VihvifuBD$i9ud8+0++;C(R zh4J?GK&a#~fwM}%?p^8?N$E};KCXVzQf-PT{b_yFP`fLRgffK9DoIVP?@Y3H#?DmN zn{fI@2)!p~+)qeRfoUFeG6@N!5l{@91+0}Jb*yw6D$B?XMDp5cQ1ls)mIr6&PYdPn z*r@>sYi(Qob}S;RWZI6(QDs+L3bUNJm0~*uDmnR^((rokF)eMGqH-8GUWlvz<07(%mx26;V!GFyg_2XZNIGLTGn(?z1*w9)Ze=!e^2N$}Dm< z4=0bb(RDuLR?+!(t!+5H%wf-Z?yC%8&vHkv@#d?ElDOdGxIdg7l#RqD^>q1Jtt~Oh z=}9}(Yhstpv)+Q6$-rNGmS?4c*eX$qOC$&j5mfSf0~}BgLH;pRrvlT`QEES}MIlu( z*@*LvZXhyy>hZF-va(>}akyo6xJ3IyMNQ{C&MVC=7xTBCaQg)Sd&3BB^1U2Vjw1|C zRDNj_wp%L@e`3uaZd_akBIVcT@s_xXuP~E7A0keSe%C@VdwTykOmjQdpxb}I6LcUK z*MyhfYXz&LC7guKxP$q5hqb5y_UMs_;Y#Osm(HB4#WDVVcKe6w?GQYlE+UpF86!ge z9w@_s1tC4}wA7@qZLRoVy01-U%DI5j-#P=9K+5XTXl`BUPk{LnI3q9wvkB7@TMic) zPsF#a!w|X(5FHCI)1l(AvFwVFuu9RjJ#mA*aNuN$mtdIymSm)r;F?+6yaYzIs?)wH z(Y{IRIk#YOF@B$Y35wPofoeVzjvk&de1g&CO0_)C9%91$Gk5Z1$|}uze(UsQ1}CDW zX0Ny1>|SVxG>s&Fr*|y%YJHM`*iG6e5N?b+*PHSX=C~>=Y+i>_#L`ly8+n zd=|CU)F8%85zym2VzNoii}NF6!a>(3fDa=nb8gpX@+aY}GWto2-c?i;H- z#!0K(RY94FLHWr{rK?25QfP{qu z`w#Q^5bYk2^J728Ej`CxN0u_Fc6<*~Kh)Qig=xPqu4T#mwjqr5x>e-$g#~AmPiv9G zs3zsP72(+v80x^Uw5W+2X_rHPs)$Rl>r+wlE(wDyy{kM*zU$UJtee&y)+R258z6l=1XMtBl*4`@)j8be2|EgoNaRv8>DwQcC8_&l?99)L2P z^d8`wN}Lx|v{L_kiD20((pbRfJXrv8iV-uQT@|Xh=J%*8_t{6~&tKeoQeJ6?U3*ix z#K^wVMT|Q2XLZL=?Q*G02YcHZUCxI~7j@d*hLbO2|p)A&%b_VZfg=4>b|d>jjM2%5#Hb3{&K!lG(wuCrVM$ z=a1>H1FPu3A`KJeMF)zA#axxT#jJ)S?ib0Vo55SrO0(XouV=LH6wi&cSF)jnDh&>d zK0;LyF2RSRwz**+G%k6jR~uT8ItPh2bCWEu#JmKS^|N!$9u=#WcG=#g$1`Vj-P(64 z>g3isf<&JU)|zwF+!A&enZ?FB-UP%@@Zo4`eJ~84Ks;KA8G!zdBO3(YHl*ak>gO{g= z9qjKSiL6j?aVF*2JPu_xRkK#A`15`xmT+ie5u9Rhxhzv=nozW;!3$P{E(`FA!`E?~ z=q1NLs}tRFnbfKqhG%#+B&C6}~EsO2}?* zHT4#C^r&#NCBY+w?jO$+d=$c?uXQ(>&V9AVr(|S@&ZCuXLc$59QkX;n>s@TCzwNS^ zrZQOU(OIBCXL=Wv1jVc${J2(&1{X%R%9-3YQ^R;tjaldGM;)A3DY^t8kXctR3?6<- zgNcwzP2%M|`{nx4_TxBZ$D7gxJYe9_`nti24S@!L@Fq|IX!9kih7}n^uNU{Ne>iN9 z0Bs*uTTXWMPy=X>P|vLbH}Gw%AKw<2TcyQ-jgoGje2Jw;`eFVT34H!@ zRZ05>D%G2^tL<-MC7T*O12jeHrVXnmi}_?g`5?pkHx+hfva4svl~6CeQ|P6IAN7P= zGg1>UPsB2&6Z!=S8%%$KVm?OJ6Dn3ptu~Kw)ceEp^()aw(jmg_X^SLw7f``NoYvD5 z`^aZ~OOei0=_4|BDQYYSp&rVOm! zQv`7yN70;MEh6Y?M@jp}&Bboo=5>9*?>L8g-;*X$xo>kdQ$YN<@DZNR zJg?tuJ0JNiVZd94D)8sOd62i4=PQJ+uk21>9wbp1!t{qVa62hVMI(@3 z5Y^%Gb3_se7S_#)l&x%am5!w`0c>S?I#}6cli!$jI~`@<@(UTp-DO&~#T)OKP$SdN zQdZC-sT8qkn^&rqbk_TnwHEB7ay{d*Y`%#8p8EuF*%)bwNYQ7C+Avc@8{jsBAfZJ5 zYQ4o?gcD71R$~C^`j^o2CVYS+Thqph7r&Z6Lk7w7A1&|M?ES9#^E7Koh}&c2dZ95> zO1zlur|zE|nITR_Iu428m})9#?`72r8@M#eP(p>#wfFg}L7SVTAV94-j0RHb>$DHJ zj@N_zjAa;QM{mQ8JS0P%&nwVln3@kFj-RdV3055s{`k}Efem=E2AIDwJ>Y?=Eo`~# zxTk%f)R(%Q`WTU|@~_Qnu?=)Xx?R4@GUk?gk!NuQq(yu8ZesIU;F$0fC?Kph54qL_ zqVj>7Mwv&x%dKNZGXIkZvHS$sJb3y`gwVls8eZRUxpanCQ%jd?qwB?M>HmHYTO!|3 z`4yyDXy(OpgC8c%y56%E6Z$IrN7-o~@gGEp_fS#LAeaal3d6WY92fScfuDjv?wxH|Mz$%w{8+ zitB&=(EuF+w#xj#WgPTh%lNN1+P~h%;ISN>Ipyf2Z{y_nzYl*CtYv59Fb3aUk)7y- z^un3E1i!5bs6c_FzfgJxQZ$0C+>NTmRZk8TmJ3c^bOx~TbRR#y$PGAN;H=}APiMZp zJ@`)W@;1HRJrBx$2yrX_(qDtsPi9Skgg#!f5=EU!E|V&aVT7YHFkvc&kZD(t)?0f( zi72^KG2f`c-dn_=BE&zvDn*s;7B-*SZy21(%W13K5J?Gn!bCrQa-XGlTxjmfv>Q~+ zSEH$=hggPE!BTJONWsQ9!wgk?K=aEy(}9FV*8Ic-q*jL*A!wf7{)^$5fr);@%1Qpj z#S)T%&av3om8agJCF2jFl+vi;j-Xj8@x*xc)NY=nc2=_=@tHG`E*)C8?i%}*NU)eYUvTFIqd(Yjk6CH-&xX0C#A!(W&d3?r#LS0>Pk^ED zhnd&kEJdn9j6bvV1^UB1cDcW8gn3UaZ1;qjX^7y#LMzpZL{X)@1?p?RUvLNk^Xcp1X0}glQ!SL;lv+H>JM|Y<DWpV6hZ6rH09Omoxe%QCp%EQ# z#M+S2q}ODD(^ArZxy+)xtn819@-c#}ciGEk$9M3|(cW3mnRlGF*0|G`Tvo+azv07o zGoHy}x?k<<^A6bsmrY}ax_E$b(`$KO#?!``rtSc;6#AAS-~{rmLe~71McmQy%fv|A zZ=!9>gdJfZufqoJ_OAFRiDGg`Eh=%zXu(>Z`N0kZp*f4~iB0JcbN**Tv|@$ECl(Jr zzNt3xmBa)V46yCTX>~Uhhc=ly{c#3CaUP~N>S?!*pUaNAL=!t)WzIMiDseOZ0G}Uk z+U}~5`ev@`w{IM{7bRnP`lr}%s&StHU=)8l%cMBr(M_|&h5QgLAiP~B0e$faV8(XZ zps3OK5`F<+f_7Al(Z*QQ6r2G+LWnL$ZYHY2tNnbgj%iIGyOD2XLpUu$n*Y-Q4U zbgW;Cmv~gt)VlAFGI?yI9-5+)NKXUE)gXlqBH%N9d1`m2zxqh?XfCQ(sQV{?#Le@- z#gVOnJlC8c6wT_Ul1HxIB9|Y_c#(xTH0!qhDux*@PJE$_*kxQM+bK7nct2;nmexo^ zRR8p!GWoGXRup9!F7-8y`G}%(_c5v9lCF6yj^RKhnDd+71#r10<=HFI(9|cf|4ZJu* zW0?5x`j`jWzj^sz4SzW|{fg69jEf9?r9MFR&CBn~3?)W+-N0)PfJV36hp)Bs`)HxL z3Q*@6rD+@cHe(p4|Na4XDTgcoRoIT`+5TgQ9qJ%cIC^s+3r?@P*1m0KE6PEd)TNVl zx3#q0i}LCq+gCv}%DG0SAhe<@{}M*#i0UvcgS*gbgk<}Wix^iUmB)_J`Jf4L)3YrH zzV7z)t_NN}QwTrZIjCsby|S*{pAMjn5{;@Od}~J4yU&fu<=4SIdu3pB2-g?ol32bS zY-FyxB3Gi7z>df8E^9uciz)6cv*ufAR+a$rFIRqRE zS6t`NBksnU>UJ4o;I{Xndqp>Lo9nWPKU<_USeO=O!-N{B7CK-mU6D|Q~$zmv(h-y>ODy)@xQA!O7nARnEcPb6Nn4n6td`#<_ zJij~S9!kwa}4UJf;q z$YLqj`>?F)6&-*rbjJx8%_XZ-3eV$tMn@Cf;>+oy3^0_ij(UGV#0kwyVN!G8HEnfQ zvwzWURWL1cE0u3NFWa6eT*QNfT67NEXlzG68YG;HP?da0b+&_*QiIN?`5; z1EhIsoBe_HOck-~seQ4-rc!|alY&U{-|gA5(}`zvwSMrAf&^~hA@+WipZXYciMP|P zn`dBJ1Vb?$Mh_S4VU$2%n|2YFNQ)&SdBXGC|VU)A!K8 zRLsRW4$XUcx6yY7rc6cp8Z$k_9jG-6*4MK7t?=W;4XRjlUTN`{>n?VNY%EXIdu21L z=f_)u@UaKey5ip~VUwZWyZQd#enJA-CZiC%7$b1DXOvnAdJ*A{qVy8G1F7IJ?$wpy z_y>LCW`H>;&;DV^ri<;s4tnM&7f`5#L6rWxrwO`OMjBRC%Jy*ODRM#Gl@UVII?2`N zH0-M*#a-c_L0&IJ8CXPC!+j7`MIyH(_}v?VehGqtF^NnQ{(ht@%9Of>OD9A6JFBS~ zxdqf>D~92})bBAWhT@K}9cUF^K4ao;+L!QPP7oR!%W{WM4*w9hRrav-1#={@aGac* zwSOVwf8U+`2W0%KWccRbpzr=K=EPZXQWakr<89q29v7Sn=WoqQooD7F=dVYD7EYNf zw~S(ydo|0ziS9;)ScFbM$?J46Z_H8Uw5KvTwK?VZ>okwMi-&bWyz>$mXVGi$ffdeF z%rm%b5rjW~>G;Jt?Hfb~aj2cPwanh9gSkhtutYpN=`ZmUv)gX?7iu`zIB!&jYskhz zFi4b_RRX??zsO?V8MxAQItxq)5+1vHo*{$|ypg7xi{y!jh(>;#5=mfYImh;5q?t>0 zqMo1F%v(z%gyPQaMg|}=OLdOY`^s+qF?P~ox*MQhd<+%ev9Dvh*ep8k+NLbmYKV$~ z{^3E*sn!FSkJW8l+n?eZ;W&YH;Gj3^sJVilq~^_CK5qK<2@n|;=~2Pi9B#?3;*Pe` z-$*EO61_h+Kqv}usEqS=r;mNv5M46P;`hI2cIdZsBf-aA`~+BAW8_#B@)k_y{`u~( zW+^lN(A7AyGzy!uUU|*MEgd%ZFml#7g~K~!x;<@SJ@tn>Q4j0WGbnzC-TbH-HR~s9q5WN z?P9jpn*J`s@dK86)}eKn)QBeH=Rqgg(;<|t3dT@=|6znXOWg~kN&Hl8i)N|rl?vD=8(OJBF^=&1$m)Gj9giVwkU$ zc>3^A1HO}rmY)k?wB*iyfN8q=ymRhwi-CI1Jh90U^x1}E;6=IJG=SPTp1WsR8INUKGBAfLe*OMn3+7y^l?v zZvsL3`WtnC2bx|{n~twJ%o>Qfz4{BYD8j-a5LqP7!zEK1P(spTI0%SRY@_V51I5-e z=GXTEL@cM5-y(RDLtl-Cye+es$t`dC4rgP>WlJT_(riWz6UT5<>=o8>4=kN}*a#Qm z4CKsC13xIO>U|G(URAJ5AmKy!K^C<_9{J=m25ZW4s?+dnGFXXIjk&6?mX^hfqZv?j zR5ApFa=`tJD;zj{#1u;<$A_2ZlA?bD9Nt&p(-IMhy95S*r#(^=mF)M1sZ{rV8#qy_ z1rf?lBTfa6@?0Ey?OOin6n%RYOeG|gAc>sEiO!04HwrsnRJx4E>A_-yIZDY#rtBbh zC%MKfF~X+t2>V_kb{&LZ_Oz`k%&&;kg|?JRfA)Km0lp)IQ^dTQP!$ekx>d49+QZ=6 zcQ5YI5XKqJ*`6oHP@i-NPsnF9xd%Ki0m{Cs5dLY}+EY&cZb?9`2IGtH&seoAy)(%9 z4ze3s`v-^zVQ2p+VZSk`3}A5an zok|;fPcax%gnmzBpjWqu`Uo~zmFx2`%v5wu3 z>NLD#4LN9+`9r1F%yV?C3^xi-n5{W6T4MW-f_%2Y?<3;KN^5*P6|~@$u*{&Rm6*%* zEX5Kn;l+&4*ZE*pAf5>{x6A!>m${cXL}J#-Pl(jG@5H0@2jaDlWAzSc2lJszM1?L~ zDr#ZFB4`oYh!f_VQfv3AK*c3@QSt+9JDneu1DTNq+P-amUqO^5I}i&}p0}c&N?4A= zUBxwOr8_GWql}5-vxLHFrNfHWYW|gemF)P9Fe+bEf0*jtos=qO)F6dKh4rf~8cSQ+ zxiV2OO>fnXgC!0kNdDY6P{m=x@_Lo_W@%Y=YHKFCnSQl z$(7%br!6tw{Bi_65nn;Z4w)!aa9qO|G;PAe0-NC}sF1T~n77Q4ZNo+yv!Ei>o{#IE z7V&U1o&}cq(O|yvbtSC52u(_XHjWgMKkqqPVMs|M$xbwg10q1fjl{F@bG+GyB~|2j z^G|@Dg|UPQ1Le67FMM+S-3@7(gfEb<0VZ|fy{@(IrUYE39gSg$vntH`*_-nHvlU8K z+gW3=b(|syh1pvq^@}~Q5XxRgCXnAAAa@Ji61uVu(z;Iby4-eoBJV|i)=*#K3;r+4 z-U6(uZF?V9kdl<{lw$p$RFcLbX~~v1UjV(^o#TApgEt3k zirUgz?b?g556=G>N-rL%)xhgJxq&&)(9;>L?O2H|d{$`RZ|)_-G0QnLwHr`1^J8kT z?557!NYHpD&ql9&<@m3fRHGpqzc`V9d9)DN>Cyh>(Ng>u zCo<)oUrOA+Iguj`|KUWU|ILZaMA8)h&7prM--+-;6C7PR|h{~ibP-C`hQJcGN0 zaUIXAo{&%^NSJ&PV594b7+QNHJ(Y7&U07sUNwUaDtSLX{RB*v;$W8 z)h83r-4ke4V)rV+ragG=erNavby?eiK6qj1v^4KiT78~c=iKzEPol}83{wFo7dSj- zvwha14CvHL#l@pDlHz(Bvb=)B((R6#Q?z=c=A*2P>cDh&qQ2OA;9mFiHg{KVf-O4a7SQZg~E2+Vs776kygpBw=oMkL4);QGXf zWXO3dUHgwCfN7D3{Yw))W#7~Z$PoY{%&5){USeRu+dqJ+p~IbxF5vBTW>EGGXI&%8 zgc0R@WZkWNgnCjJkqksKpAL3^Cih}L_XU7zk=xliKl6x3s`!95YE)kOw_lOj5{e*1 zN=3aF-`4j53;@)nRq!CjP?G6yT+mjuCVdL-K_ek5M$ysD+ymMKNUAu=;g zssv>opS-`pW3yc3D3L?I{NB^LL0$9xtxq!^QN`PDa$o92kz~wfCjAY;@ZeJn4+x`n z0{t0|>GPz&(2fjpn5@&8bA%$G7g<&B)qe>qrPqRtM+y->s;|~+ez(aA|B_{-Ev<=B zO;?XCEIdwtFk{%%iMkR)XMk$oRdp=xooQLD4NcL;{DRJg5R`o;0h$d@4fJ}R^vWZxtV;ebSggKk*xG{@{= z&>Cpbo3B*NG`JYCOn8f>rFe!9t99yGXr-xiueKo!(LEELylQQ2MzSC6HbO+x9u1U$ zyy%r6E5y7VJb}V!+>b6hPLsEL&Z+zGekc2*<9;Gm(TD86ts5J8hLID64o9P9oh`f`};Z}v%8>v*X{#rMJ-N-m+H7dQyEwtRT zi%y50c~qJH?O@~KwTwmU9Jkoz@?Go<*@VJb=NsLHhi!PKY) z*REM(P)OA=!~JqU><0oJoUcwyEasx zu2V6!TA`5D^e8nti-K59!6Xtw@!>3~^s2p4Y567)lzoA|uBnG+9y9_jr}IYM@=#28`)AjR!(Q*FC%!heKmskg}>ZqFD>;rrO%+7w+P9LO{4 z{nd4K5hl+;j_`q+%f|(t$*3My*G0(vt)B%2(J8GMSGWv2>Y3?B{|@Dw%dcH}`vlP0 zRfJcVYjQCyX!uLr8s?Ro+HMI#5Qg>BH38?XM6N*N6U>A!FbGWHIv`%0G6RaN`yJ={ z?HT}! zP_RB;R%M>t4NCOyJl^lHaFngn5ib@NjT(4^c#Oga!HGYa-9q)grro~x9LG&VgSIV{ zrwww2$v;N*SHd^&Wjg;K2d915vGZZS}7Z^ZX3!3TM!6 zybq%F{B!7K36A6kEnI)Mr%;?1hPE~)=B9M+)>cvyGBiVzGL*ygleFTrlCopewTcWZ z3{MD9&;$TzDJ; zvBeg#l}ybw8T5rLDJh0X+8c%9isaUFfO*Ese5kyGa*ZUr>!ky~ z#FCeECj2oKIS@&^xxu(y)u04H^O{zD9_>V8tsA+uH2|W*DkiGj1K@?TLIB9_`KU0= zT9QgCF2tToB|i>+G9JJ(XmJUD6}$|#;d1PCacWEJ)SjIHZ}@y1*2KD`38v`697K0~ zQ;5P_LW{OL3xR$HjILz@S^EgwqqwC7mk)(JK_SmIZOe!tHUbg({YodcEn$UD!Gxi} zmjAIjqc#+dT^WD-O+t~>)HLigytW$ztnQMJ8pDQZrYr4ABrnt{^BNSMD{cGQqGdDV zvZ;;P_397$y2nTPQ@qayEz|pjMbsrCovJk z^Rcl7e$s2da65%D#Su3X9sfzRd!e&Cin`9=RSjbg_+a9+O5d1{H0hd+#4zd4!@U|R z*j2?CWEX#I{tD+2_9M~Hf9>z@raDX_LHm2|FZE`;`~-iQ8Bm}%+RoOR&du5?Qh7?Y zmk{;CHFeS_jJ8sGShn--CytUyM78)SRTTu7Q@Rg*kc;46#0P)JiQP#@8>xh(?5?k$ zCue(BrTHsVU?Xta!2L?{zJkZhqUrMTZ&N4adts-92W*L5d3TE4Nlm2h{ebJ_rCX?~ z&BekPQ0(q<#_C|e*OnBeP2MIjhQTN3&KTXdpzuszkAcC?MBHA|?fv91xsvD^Ej!R23T)?XYBJAEg!4>2pC$QC3( zHJVp&&HBEG3%n#{oO+*V%_O)v>ZwsZchO2ky*^@h$ER9s)Nb7|KieB`vdoX22PNP~ z3EdHIFa3pmd&GmBMe#@O+@#6a$$_PltF1|QGW@tdrG3{=@aeBervu7Gw9gmzaK0Pc|1STw4i7rNmr*Bl-QovSY&P zaIt%*m96v}}5zLOt0^`1x@CulWIQK=%0u=uL`3X0){?E$Uxd#JYr<3pv+$%--CUkEw&)5z4Q$XeqNYaiED zr!|G`KWunrai2s;#)zK1@)Y>upj{}Drd+_vK5ac?6d-iJ?<)l(QtTGp6zC5+eh(x^ z)WW$awsB&K%q%XyL@*jdV+Xrv9tm33qPu6;hb&&CD~KfhsYi|Kz#Uz?U_Y1Ais;fU zJQ6p&>D&7)3yh<0V;`@wJxwn$p zOEAFY zs$hZ6AlCXeM*n7zJcoQL3;n#n?^9Xme_9~Y|AhQcQQ!X*iT)k*c}2-z`#BAY8T%jo z{150~^X)n06G7&AF|en{|4*v|8R-8D@}I(#&w-w*HvCf1;q5;#pif)`{|Ax?NDESz z|D}}J?~uY3ga~nRzd;QZ+ss1P0e?vVbLwuf2=+|*zpp{ePP6|V;yL&B$$Rxr`=a*@;y2>>?-@uzd0O#M|o~r{dEQnI6p)A#aZ+_#&f&YuNc`L&oQ3cWPitaeyV)3fc?{q zK0L$tFMHT?oToGB^Rwi?G>LzJi2OlI*54=6=Ymg1&F9MdZ-NdW!G8{(&jp`!`{$bA zlWzY{V-NaU(|<1XvXaym;}C-Xt#t z0V;j@;spWdk3C33;0k^E-)n6`SzAIIW7nq?wuJglgvK^TgtjJxCgxVguZ_%2ObBUd zP0gJM_35q54d_K29gS_A%=JO+Q44(sLWBR~m#>YCt&E+FjsAr|XbmdoOvuQhzbs^zUn-U$BC%WqxVf09yTC zSb%;|K|gH^h^IX?VbICZ#`qGLE3&qdsK7WY=S z)_)l`{@wYf4uSgccYD$S4Q;JKHB0}#zuzx`|Mw-v`VLNJOxDKFul@a5JS_%KaDQKG z{P!^aNeuT7V)}OGe-b77gD9vc|I!}+B>$vE{jVMyI_R4?88};7nmhdog76Oz*2W;x zg`wl0#Gm%u|J4IKV~0PE&7bbx!Ppe!W;b^D(|3bZy#M*#f6LqHyIX_i;-7FB|Nr2C zo{5>Q(I215pYF@i*vSdRWBH>zNZI_K_w~2@|I6#~q$U2Z!ErP&GPWa|J* z;{B(GO7aJBCu6s#l$l0<9^OB_TF#EoW&c{L9MrY?7+_z#&p#-S#IwyfNnk9SCqW8I5K#uP$*jDKLkFX^ zUeb+UFj^jxPAQZ}E${`AT~*)2=1~x1udaZZ3!xpUzETkGhgY!ghHw>rDYfIXo}N0& z63=#fz`o(S*Ks$_JL2=;c=ACG-}9331-wNO;@d2;A$96aJ>o6*Kw0Gdh&fs=%xnh`Ue96!TFZAm$EAU*|yVFR<){ zEhTKe$}MJWz9S(BzCEEAp2k`5XmX z7j>S^JYE6-;Qb9T{;b_%G?y2p;nfJ!T^O8R;+Ez1?3>U7d;X3n^0$5DpKc(tzHO%C zdyNDapIakl#Xg>z-BbZiDO*++s&v;pa(f!CtOpSC`BI^Sj(Vro*X0YEJ2D?lDm1!n z15wtd9=u7WQPe2Lk&hW5Z`N1P4kIx`jYgFhWA0o^e`2zgR8zmnU;aYlcO}nL+rW!` zRJjqi+QFMpBBxQRhao#1gnn1*j^*>3)M_U)KQRcfs8AT;o3MU&Z4vOO6WO?A49i41McD4HV*;fxa&glZo}qoJ(j4dPTf%$`MymtVdndW`81iwDk zKG}BCD^^YelWPAY#YzU=?DTvD577^2OR~<`KSwtcRvS)m#fx3eeT1BY+zp#{Nx$WV zni0&6H1#0lZ{1;gzrUtRQXc&peZnv^!aJY^we zZ75J;oo+CnBw95opFVA$+3?sUD4_tyLJF`D?+*)fx+Voy%e2gSB)J4D9nZXJ7$x5<~vZ(6`S=UZN=1*7Fs9jbu@`98S3LkP@oYNPhfP~azy zZYaG)vyN^!btmm9>1NJh?-hHio$j&esiaBE!l&`qlT85gKnE99tD1Ki*C>5ke*B94*rce^tLo02uq;|FM_1y1UnoiN|z zt0jH;Vl%;*fSgySLHnBVxjASXh zsg{(3%85pol0z|}kA2ASs;|xoIK=zW{XrBNfF^3}0<=6}HqiN^BEdXu%@#f~M_%3* zDeB{v`6e8er|M-Y#cb9-8S~XJ(fTsbM`E746EpgIi}jkZQ;X9~XWl9&{43H3?m)M?sRSIxO&2 zsSn~D3y)F)QjBs&?FkJr#uVJ7y7!TnbQ$X8xAmEwxDOY8!M&!zLR{0b4UGRr`+ftM zqL8Hj_|D&z!Ia0T(tOS!-FG8t!5|dRL(BFpHnX*A;+_=v#ph;hW#VqrA8>g-J6GKe znDC=~r7^n~l8#b!>>o6Dy`|E)KM!wN9cecvv5Z_dQX;dcFs=tv2yB9#e(JV&-Rr!B z4xXk$kDM6y+UQ6btKN5f!NDjq&N6-yvjT;x>Y(eZ%2z$?p*v=}F2S+T;(|ZEw>Vy$ zyyctzh*OUEPK7|QdjQ;y2W)SDRz>FmdX=?z5*4r&>jz~oc5FC;8#(T<7jef}-n6het7Lbv-o?43P;$cvnX%nmGV;WJ01LA4` zi57U;aUuI=vDX{yUBdI9y!YTF2L0nKTjmV+ypBecR`Bf z(kVyHJ5Xrjia9tZG+~PBqYuqLwc>G(R@b4i!9P z(ti(op9itF?@>Ds}}tp*`7k4DVo@?o|>n9IgfEc>xF5 z2H4x!$RsUjy5R>yqiFy zmuXJ5B~mvuYX-?RhM26=a2ADF1uZq7*hGTb#@qC1;xz11IE?0C51GCz5`7o!z!j+d zZhJ96ek!MeiR;cK1vFPRES34xYMAgYlH#-5%Nchf>IdR-Y8Irgg@NYqcin}HqsqFX zZuI1@Y1Ov51iiu4rgco2?DtH*_NAu+Ae(?kU;FgcikiPll2&0ddfVtoP$(Wq z9(zfd?7^$by(!fxbsF<`LG4GscVt-|98#b$($o!Z-(;13lVIC3Mw!4H2WzuTMzK%; z+mL?+eYuQ^OxKt^1BtJFom(=`7%?MKWKg}9`N|9SsH_ccR{8}u6p`-eG#tk@LKIJS zBRzQWT7jp6FhC^^$UN8z0oUL+dh{;CmkefJ7Ph1RvM#{SW+x2A)V{iAjVR0X-HM3{ zqV17%;F!xxnTZNvr5B0aA5aquvZ%OU)3TqZ8akdBf!G2lU_zjghK2ZbZypTfudfGH#zTA`S&VxUb+etX6^ zUbFmP+GaQDD z>s(9^ti_Uwx%f1fAF0(w3i21p544Fx3L&sbh7cH7vIkQq2M~ap2CY~)&+sG?)1z|Z zgR$^BnKYv*)}T*>JW`cf!!3e?F<}vS{-N&9!39<0OFE!PIu??7%~)j8=95$=+ford z$CZ8FDUf3^%y7BNmU9jZYjzcsT8BZ_0k=;-ip0VN!W~|Xv*VrL4t9spq}No8skWF< ztRZAQu4Bu%Jvck3WXc|>#0o4nI%mfKJFb-ErwA=<8^_gd9RTkx(z~p|3(LBm$?6=; zCcCl$?H^ez;P4v`&sb*wy)-dFKQpJ2&;n3 z@_kVhLSv;cbgC^9j;N_s-zO9-#AFRu0BV#>Qi9V*Q7u$B&cj3t?hkJc}79$a6o#?r-C)g$wqqYti=<9zr|HnoXj4q)C^+V zV9Iz__4X{)(iq#lg_Sx?xyrKdUmY?7t-{KUffYuI$aB`t<~om1ncgb~(m`RJyfE(% zA8+1}DRC4v>;-iSLX=`CJ2%?Pmb5owU_p35JD zG`j39Ho<4r5q-a3mwO9-_!PcQf=PU=kQO;sPD9$KX*m~HsBeF&;0`dZ?f zT~Xfa*iPw%Yo&c9fx)p>$z!iD4YLV94X^N3Xy66@FkGxl$> z$l18B8J!|eGK20s#ii249JA<+c#Mc~J6>>%M!%k94*I|u)E z6MMUeQn5wp-BT~K;IZ1K8n&+U-gbxSc{H1jy0~I%$*rKTPSrEV7BJD{9Irn2**eTU~aqP?3PM;RjnfypuVAYZksgy2L9Q}XFGU9s!wfN4MX$(GF@27V zz_fYmN;aKT2xCLqN-}A)JUGkBG&=x;yp^_7bRG2#dcvq>7dtIAw87#wgq^Gg3Vy^6 zkr6I%9*myd%G&Vo4$I5hC5|}(2p{h1nJ=_@FawaL({6Mg`?`QDRNw&~%pS$nBQ<-b0Ik$TF1&h*7p+0(ifcQ%JG37-4%F^#f>!%PK|EjY zn3}ynw z5CYA1QwGg;%Nh{*gQO2h`*H>QLOX7xaf&9IN97!09Zho`rT31CuS*1tV4DPuU?3S+KU23p|sn60#U*{M3Z6ObNh69uwx6=G(Y(v!D`r=q+82(by{0bS}| znl55=~jK%2EKmRMR9@HrTbt;=^36Qb*6#4q9@zQ~t~*|ur_Vu9yUg(UPnd_hE+ z2Szcus-8T`0zqQ1N~(@-W&EuWhtuPh%FioP?YgKFQwqe08{+~qiCv~ynp$g^fShze zcPu9IYxUM~BA3LAv@Ms#D69930D~#p?YdBvHPi9!(;mU3G~uKsn)f^l3?xOFl5Z%G z$*FkDhkAE*RtrS2j!yP-(^F3y-ZjuTh4T0hsV=`?MA1BVdZ@b$#}~;u)-G=T{$kCvI32}#epSyT8$IP%nknQcPu@uND%gyYMhS02o>)A4?{ z@ULm9sf2MLLKMjp6FjJSnL#I2t!Rc^Y%`aTdA>ZAEdW-{Srry)pzA~q0}s@OO6ao3}491EDQ776b5mvG$YRzVSZ61%x>d|I0QsBb6%NMth#-& zN}uBIw0S;TdD6z@h17l)JhDOCB#{{`yaGe3(QG`S#S}j>3m#vj4KAU+hoK?;zO`}JDjc@oi{(@f6^_X*BZ&g;>$1^!On7n5Px7xLjK4sNOl*SqGQ%A9`##|;WfQbJUxU*IMS|&UC_VnB)I}9x z$34WL2VO{EG(aNbf-ou&r^vqmD*e2!kK=TpVbw>ZyBt&j5M>bl%Gs6R0HXvtYp#gJ zXF5Xo=hWi9Ss&(iD9)pE1WD4%n*@9e3YdZI{D<7nH*S5G!4)$2+~0)--&-=^rk@>Y zuHsr|PX1h-foIMWL3!wk{lQw8=r+v&O-~33V{H+7-o-!w<~7-4VkEg|pw}0Y0wR*R zeXjDS~aWWZ#+G#m;g;`J8933Djsz=XA&ir3^J&Q?mNbEFY0E>8~PF9-t0 z$6q!R8aXVL%V?&d+gHPuFz&c1r_b;3)`oxro z^d*r_Z-kX7_yIG9dF8t7D9#R`l}()WbJ`e|RyGtBG|3osrf?JL$`9(jZ0=}n)yVO5 z&rUXOm0Eq)xSWJu6?_&PR z#`(xEVi>`E5ds?_LD(Aa@TcxV zWtYp#!CTriv9HqCA>R+E+iIk0A`kcC&|7iPdzMsYh^pmdX^}8l4eUQDN$rOVD~Tsj zRJsgA2uD0<%1Gv%Ph}WsrjjoA;+g-;iq4FB)fi>O<7BwruiwJJuOj5ZC6nq zeQ$iEuIL}7OqbpWN*6q}9nqCV^EP8#P@ipjB6i_-1sRWT)q07C)gzKy{;Yi zb2e>BhEp#_WDhz2k;$tXAo4abYpQQE z(relRt=uEDw{1yp7h*Tr0Bz|5(|)S*4g^{67xGyMq zKZ+i0hdK3QR#6Gx!rPUG4{V^IC5br!pr)%vKKUQH7aN(JEZ7ud*7` zG9={Z-j@z`F|h=Kh+I>_y&STUL{1lXx8~9$zTq5UNIlP4Wt#~H{K~I9S;SW;%N0}>7 zg2G?e1%x&DTAUyPB{PWp{a4(>|LuJjGShc3H5PF*G`4dxx3&3eSBi`ok?nbh3V3{J z^|Fv@ni%9_dVpu0;AOJ)ZNF zp||*qi*N88H;^7V-tQluf0s&ypmLwDk6co`%A5|mQe{ji9#VAQ7Cp?HkII%>Q|f+6 zgJ%J^_xKT7=)!bWwIA!-<+8_a7fVu}%u>oX++)@1PB2f_J&`cueDu;fVS-5wwODU6 z3UsOxWTAQsoO#-@!5N$D+W<6&_8KbIIk>M*I!!@KI4KY1JA>*xY-^FfYXsC3yDy|c z127AsQ#^4M|Ch&D2$WmT*2?(b4`1o8oIi9&^Oe-!m_!7edH`QVO2JY1#l_*e`-}{> z2a)+**2XBDXw6SU9;nYrg=OwvK2YqmCRatk_#u8O=H;Dm%(}?9n%Kzhd|9#6`Vz0) zU0HsNC^C)bkShxlRn3`au67{C`KS0|M=w@Vn(SnA3trgI?|dLzlf7O`6Nbi$9{~iu z&rnYA{oq{#1_KRyK#i$0WN>g*4fJC3Pdc=+#cl88VCAag4v+R;h83QgXzP*spILLr zxkuOgYXwGy^Lf^u;8{WaF-uM#)T|f_sOH#mn*-<$(k$BeHt;UFc~-;x)*O@35hbj#I-;7 zHk*{(y+yDX7I@2z`RR>Ss{@HUvxRD7`YTQ1{qLTmHe9-28>e2=Lgx1BwNDE((`m%R zGBXBf;K9f96~Uvpr;s@?V1_NQmjGu=BSx$YVFi*6) z0e4k;yIEyzX2jT+?E8dbG5$ord>>Q6aY=jp_!g1VB4rzFEUqEsVN{BGfmj9U1=(&{ z_%Om0(Hd?i(=0T7S%p12jO!9XWEKOkPgme5aM>tf5t109n_T7^Id0i>kxb!E zyj{KOL+D#ZGt!k0c%}A~7qeah_G6hU{feJ;6wYTHYET_DhLksAu#=TPI^`KB7@XyK z2qAaAi&tm!r;YF5?fV!P2lm;A=;sz{YW1Y-zza?;wFF<_QvsJ>R)t^_EV&|3CHQ~ehOn`tp}f9>qp`BNp{1y;gSEcXzx7ph7&qlPvi@zDDALgp4q6yO5y$ zLI^>B`NBX7$6J8gM5l@|F-T>&zcg#oi`9r?5eDweTy+IqbkPS1CS!<9?u{h@Of5;aj4G*P-0NC128-gpYj z)lsq|6?Rh)RXn}A;_`#-*hyfch$J01$A49?s!#1q1zxWFr=C(mwc0k$O;MDs`At*Y zbp&=tKH&8BoYzaQx8B>yKoOpQ(!M;+rvyMyy2h^>!LKkWhjz)#4|#sk0H3wzm9Dy4 z=uL33gK<+>y?1~TnVexJedsnGt+%z{eGl2G(tA34=E-_50PizU-^bpQM!Q193iCCu%bvU3E1CKNl>VlMZVw)?PW z&IThg?R;vSh#M<3x@saHuFu+XR^Qa`xT~;Ktc7qyN4;cN?Dj;F+D5{U-O4N_M<+HY*s}!+S=?mfQ`SH+2U20CNlgKz^OzFVU{Z-+JyC%fDNnTwF7a0@Ka#;^=0 zQAxk_akMwph37gDawFHXq*A6F*R-{Y8;95Na4_V2y?RTV`0W@=MwZuJDKu~A4Y}GV z(@v?Q@y;r1#AL*KPsHt=Y8f4nSohuDCCXG~+ax%&sy0vAXRUw-@ z6~_{kzrv@N5to090xZ|@DXsQ~@&)U=%%6GTpYTa@f7ojHp*c)xB8ZQkmP2Mcg3fHw z-)j=La(N=pqEq`oL`Gs{9bTeXL9bvjlK2WddCNhj46ZckMZDRdRjGdE*VdY5!{(*) zG&DTR1sy_PqDDp2P3sna^yCs=a9bc685AInuEYl&HK!*~}3-7%t^{V`;xNDdQ+1Hd4z(GxMF+ll3th$^KojfIow4n)#PcQ;kQi22Ck>AW zph=bm4?f2Rcij|%)Gg16-pq%zNkU7jU@4H2HD=AIHB^sR0c4PsvuYR)9@NdpIM=Pm z*etyt6g^-xioY~*;)3YCat4)6xK1x+bP0$k9}mleFTG$p{k%KQJh#zFH{h#7mY!P4 z*i&Rah(71lI4jJ9C7}VZO0))K5dD;;B{1l4R+(m7A*>`T;gTfAD!xc~6CQ{c$DSo$ zsGxsRUs(WqM=@poa{WyB(6^i@LmrGeL(3=|YuEjZ+fLKV{nlg3a4EfLwY5i?Cxul{ zo3lqpb8*>JR=Bm}@^OC(BGu(W&5i;9j0+VyL6c9!aB>!kDX?C1AK2`Y_i2*atK=FZ zVgxz-NSjj*5!6w=IOT?HcH}g76qx&pB%5VH#SWz!CKMf5ZZWWxbi7S$oEdU?oYFtR z-YwdT9y9Lge#X;{OdO<7+vW|e<0ceqB*y;(L zQ@lnH-USi~s1p1XuW8?M7FO2BE}IDJxHlH|ovWJjXt2Un@MH#&W5CQO+38PE<0MB0 zf~sFM&yEz-&K4$~Kzu%;Kr2$)TsRgk!nO1#Wo?ECuTG1za&O(xFSANG4JSkP;&Ko8 zAmug;&Pmj3<=c*8KhPS7HLTwqzoJ`X`@yeaROO2#jvYRLNb(3FY1w1CUcrm@*8K{q z(ydRie-Hjd)s{1QMwv>z@^DXn)Q;n)Hc?UGTJDE#WQ@!0_^etmPl^(zM1o{aQeJyh zeC6*R^L%^IyTzmzRCz%=C@xdyvI|R(PBb-fdYs4Oz*%kQ6#*n7Rlv_a_iE#F%ySOp zJ|Nyb^7ar9kI3qHFL?+-UoOqM%>6XaN2rTg6;ZdWwn2^w;zW8xhmTQ_#c(w&%^z}gSONI!=Z1dIf-Z_7lX*bbn5mIuoU0&X2!WeYE%^1QUo@dDK$WL_!G z#l!imz7^qZTEWBShC49$A?2JwWTMAv_MI55br!Jo<(SzPPd0&BIEN>$(y}?+4J$jW zY3!YqLucA*`;c`UxA4i&&rt@9hK15PBFvVYdZEpe`v4jiepuRZK^7dfEsODmGx`^& zH2}-zFF&^`3p|I+Cl8v9GuMwMedn*bMkz-<_^Fs}8llSS9@G{H?S>e?iyUzXp5r1a zP8OD!FnwW!XOsd}-deOcnx0A&%zQoNHr#UG@3-1N~HamaZlWoAvc zs&x_o7%-pRgVXLx34p1}X|hP05j6B~Foan5bLQ~p)84~e-PVj@bHgiZsiLYwmAI#a30V?1cLKfZ=M>y~iZpC4CRv@; zwZ&NbqiuNCZLj`qM~#o1=+*SVI@Q_)0ue&J;Y{_MLEYr9W3d;=JhrcC;n{o4N|?bU~GY_kGmdPcwyrF7+#Hv zHh4u~XiZ>9-;z%L9beQsuKGyMeh>Ae2fPozFW(JQZj;d~bEny^XGp3YXU0j_WC!-( zSa@ zt-d?#@03NpW};4WH#k(XuJ#x6`_A zo}-dV$NmB#mH@9)eZ@YQUGQ5-KdG{YV_r9{3v;;9|0NXNmg zZ8q+=G08|=yxrM1Vo+r%6_(aF&H)8J7R&0Z)PCguJXAh0%$=5qVTh!1V?l1eJQxK` zx{j<<{@n~Ctcw1{7i~qtQ(m) zF?>g;vY{*a9b4^t+M~{QSnUt7v&j#LbN4+`{$ygw-u3*pRS_Z@2iJtS}OQyRJ4AU zkixM>@~~C{n}I?GGuA}=Eo_aRW^5drHXW>eB2CYCWGAp$x#R;ou6HUCk2>R}HYO?S z0)rzvM(3j&UB1>1T>UsI|V-^miiFf*y~GnP*NAdc#e#q4e-SHsXuJ$HsAwY z1Wnh&`+$WhVJbT zR0Ab)o^*trx>!Vjg|4p3V%B|!NlEs#$_5@C=}MXYQQ_s*y+IE|e;{l)42DW|N3pM+ zJ!5ypdJ}bY4M)wjci^x#Lk2i4hH|xleV75kT``xW_tgY;)48gyj*geS^?UA9(-QK#0b(RInw60H&F z`S|e4hRFL{=Wpj9+CVFJBNz~40_DYvKXJiDYz)mnx$d9n?f;H3%}n<6!c{>7`na-> zty_^xq<0WpuCW|g-hr)zQGwhDc{yO9 zf2fEvE%XRgMY_vMNvWW$nE}cSdma-h>5nbWmmK?YO1vydm<=++hK- zb97MdYvD#ac%|=f<8GjZ0XaH==O3a7pgl5nf^p^S?n8EfxcqP0$T_`-&zYmL9eGGm zJ2!7Yj8%@TFE@?yJiX^MK-<6@t*AW?Z}Pqk$9umWccO>b9XVW|FKz;pdK?eK=j>6P zu(wdaaNNhwHyFUqplvvy4~Opd4ZZ1R1Vjpb*F9Xfo1Uv2M`GC99XMtK&$*u#C1yvh zF@?sB0lD~dO{^nk`tro*SL1d(b9kY}9$1Ie+U;{ZoU@mQ8bXcXNduFVT3S*mN|9D2 z3r$WWE6B{1Runq8`18jxCPo0|Ui>MzcBC-3$-2;K)#gKhjjh2MJFBf>i3K|p3*$!{ zv-53n&3Z)(F0nK~N~(h6in0`jwyNrqkcVF`V-lm7V4B5}kfmrtj4Fk^i_VxtK3X4c zUD_HOwwf4)i_lD~3cH^C65I~86X{$lM#2oT_6}TPZo`7|oSq7GJ-s0&#bI#dh&*tH3%UGPN$4-{>Wj9MQHE;WF z-Fh?QhOss`5)^7RuR=_L?w7dAHHfOdkxJ^Uu&*%H)Zt+v7u|v=D^&HJEBLy|D6EJr zp=%^w)25FWQM6z$P*8NKE-JH;b`?=taiw?HoPmWYpP_$D)U>$nVhS2FsxP6lh2Wa& zL8=6E4oDk;FCno|Ra&&dRa_LYLSQYJj4~S1##F5QD6l3>eLM_@A{?z@vW`m;Au`@i zR9Bva!%S3(oyNKEu0Y)>O*-)1sL%|~?66C{&fTW2C&Xq(^V>^atwGCW-<~h9ALMax zXPLQV($?L_pg#~*CE_xRw9`OBg(aoUJGSwb)j$xJNtzAHvrH!yA?$2r=}%){ZBm~hB|1Vo5)_%caEh)mO5mRZ6ef@skXyK>BzL;{E{ z#73P8Tc=p#75BxF5t~yiE;h|nnNgdB-6ERJRND%d+sr3x@=R_AbvomugLY|Wil&Ez z^krI~V#IQ%TQxZ3xGXQEQKgm@(bG~jYpAUy3jw({F`5NT$BMB@ z(dOm|0eSLc$kq8e(<-Isw4Q z%=R2}<8tEU>`)#OX=l~ZTJ_;=`X`?eDp(%sKV5^Ew^(uo9-D-5PRa4Ffz>n>Wf zH9)(1B4b&(K^ZPD6!rZhHyE`X;}zPLN<}Cpq-x z>A7V{^lJNxQ_Cekig76no1;bWG?=xEG)+`4-jrY)H_Rr21kuh8A8G-rL^0j@aS)-4 zD9jT1-_*6bCz}0rY1Sl^BUpp-09`SLuRln*(s|6ym)zkm9R|~da(qH7@@orahe3*$ z2o#QlYC_l#qd!IVXBSY&X1MyDaA#OHBwayeM=}}s_ag&1=Crj{o z34wHOG#}I?1&N20ThKO8^u@@s$)+ZTtm3Psz^9!gEAY-|YU=|UMl_yi7zPPjswc3* z$11gHx!?j(I`teB7z0;2@tkECb-Zb`pab^ggK4)QBo@`9X`EmLv3a6tSO7^(ITm_Lj%^WBgCYO0!sZzcK@%rH|eT+6h zPBoty>IKTW6bSogoM^WYj|>^a!B-5|wxi^Sb?g>mmVtX_M-b9^kV9_2(*en8f4^!x>Qd}Pet z#O#TGQx|>;jK01Y^!fl8zokb1-SozOYoC6B)vowp41AHsKJWySls@Jj%@K=;m zu54^9f<%_VKny@*ih!eY&2ARpsLjIfP(b*if;E5K9SRuc8Gm)&SViN%)HB}kc<8d( zu36LR>GA$O+h3q&SZ6-a?}cf^IjRSU`8mH(mH~@Yi|F;mGzIr00&6#?ex$CZ|Em0M z1(6_(h+qk9UTR)bZ)FPOkI4m!*rNvi!3!9RxPS=srHFT;!>ki{j%)y_9eZu<^})j$ zRmMc6vEqT!veqOb>`C{AMN?TQY^rSM!(ms!0DI&2uc%W53ootc%~-(7$Q0cTvhj5_ z9ByXxIvY43TuJ)ts^+XmjL(q6^3KKy6G{gg?*yE3`M1psS|Pn#ui)JKrF85K*4}vo^_;! z+~C8Jg3Jz(vZS+=?A$Vt4%AvPWtr{VuodVNyMUDUxTedB)0yZKuw3YsT!0DI$BIL> zU3z%lAk7yj0%(cPr^LZ8S_UtDH^>h)t}7MTiK!eED-~ZN4_L~i#>MHi{j*63+t!TK zDxH^5$)Y+p;D|!dboWG=vV*Bqjf9l3p%vP!_w zxK#fnRJ~%5$3>WAT5kvh>Mr2zNEl@fZ;gI6+Uy0+(+@r|04@1~ID4B!oh+o?t4(OY zbv&2}G_ecBei)o5utwNH7;|_8%(WBSVor!2Nb@_OQa(<}(!bE=$jCl6IiXrG5TOv#V4p| zz%J0iMqif!)7rUG;Efh}!bU5Qm@U0k!>^6&)|yc`w%<;3BqlFBWf zCXN;|^;_Uy0P#z>wY&Kij)5t5ig++78bVlcw&*m2AnB*S?&+i`v3=2!5ParI1ddxf zy?3_9181zewv+IHkyv2!ia*t>pUUW{K3O6-T4rPZMd1hpZ|_|@r#U?6#h(KI{qFKs zPi67@=MP9Yj+)H8dE;w6r`g>ch7rDjf#whB&>`EP&j&5*Imvv7e~oyEC6#v4cPqhl<~ldx|B76huIL zK3!f;#ME069!+sk@=yAa8tmCN`)OZkfHkKD;RRj@I_3#hXI@rAYJ=T&A4nwq<(tVE zYwC!9R0It59{tm5Uxw>M--c^QUeBJpf}PZ5WTg(7TYq0i`pn%owO(+QuriK{#P#I9 zQXDDZ$=ci+dRr+V!Bo+S)H<1DV4Gwd?~W?$mMUd^Ge>lJ>o34ls@*IA(_;1;BOLhM zTv>6j$bsrsH>$G(^N=>S4)j7HYVQw8wKi3oVEXa`+7bmB?+nJC_;=k3Z!dom1`pYUeF@s*t6>Iqx*d{;pA#mqP_Wf(?q^aEV(!k|%YWlp3!`zNGhMvqjN z3Oi}e#`j*0gVxB3*{Z~aKxB$8wJL6Pk&>p;c(V%c{IErhs#4B-()1V*rwFMcXY;L>Uy&5c2W!b9(Dp$k1gmeGA^vY%fe4Qwjk{y|Hwl|8>mMQ)Ay+p@g5oe zo*Dk`AO0R6{vICw{!a&)W!}?{W|mYy2zq2v+?*-Zo*muXJoJocxur1BBREunPdP!I z)pD5dltr7}<`nV3Z7>`7KmK2hVXP!*+lllqEy9_CPxvKcayU#OE+ z(~tJrq<*DeHq&-96+bo!_wRe>2K9K`<%aDf+vB>;#AC*U$LCel5>NKQj!aU5TKF>Anjy( z&5gds6OMZaA!AVL*1UD4w7UMKjG@L!B*mDr_?zvieT)@MbPK-d&+`q8cKJXJgO=W` zV{i_Gno^5sv?JT2oYzw;Lt~rNy5^8u`$%=80F($~>pI27d-@4SyKBS*+t;`{Ti`3b*cGVfy zlhb`osZ5hz_Pt}=9%|-Rp$gN5prIK|r@3pC3_)Jh6AOKY0#N8$L9iQw!iZWDc4$@| z#oGsv^iZ@}Jqf(>2($nfGyMqa=KJa9GyM)~YDT<%{hm=@t9^Z(Z(s-eFluV2frov1 zDNXBMV&*tX*DFeK+bl-90kU(D9ecpw&g zk1ik<2af=t7W;Rj-`)C%9dd{)=(kGmd&bAl$(*&{77h^_Lsspt;Uv~9y08)^F{@^w zHQ`#E4H}3#47=2KPTajVw8t!IOEzcvusog{yl@_GCoo!@W9xP)_}3`!s*O8#5jWu; zuP544mo5VW`yTDD-9QF|Ucs$8ShGXF(_LdbV9)Y3P`M;;bMaxqj5-BtsBw$|tdj(8 zgK#`>G4?lf*IdN-uH(KYgRp8NK8kqRC^NNx0YBg~k6na`S~rhT_{`b93Du2J z@N1iEHu)F-2!~sc&iTH|t2)z@1D_1E}Cw?XetsK$9$X_!k|OV8Q< zO}p!iFYF+!(;cjGjK*u|S6SH0Tli;$nNMz*59V##YYfTP#0>8Jj7a-yD!ErbYYzR4 z2;&_(kLNUx$QA+-0$v)1T}9%@!F~>>)^S2-VX>H20th&vMS&b8669;Z9Mhg?Z520M zlo~#zzwUBSsTRT`A}>;&?HxL$@?ukFM|*Qwo3#-k@G?G>Is%N4!I!LM6VIxV*sm@A z(Hb4M^Rgx>@Pdn(7n?g3ry=0Ja^2Q0E;#d=@{;B7NrBk{Wh!ApL3evEi`IhidlCJN za*j$0%04+It%l!%;Mb~T$%oaPl+qFg5?9UBx~)^;0*Ln8Z(qEz$?37kR&2j%50!li z8AuN?KxJd~(kCItes!)a+nN$O1jr^5AmZe$`5*IojN)E|$6gv2O3lnrV<3DEyFr5U z_yqJgIjE5G+bQq;xcO*fV_cZEl@fgj!?I*wirhN zRxmEChwsK-B`Si40Uev4c?{bG@^))%STs1RRPiqlE^qD&uZq|HFTk=cIgo?hlt9c@ zS=m3LULRiS=NuEl_#kQzQ-jFV3%F%d+o)Vl<^`i+1yFhdfSiV?Ktx2Vdn4KK1Mk*` zq#h>4Ly#l>sEgf+H~6#TQE6GLffz7ztl7n{a7@qb0={JN+Q-Z_kRNSY2pabjy~Rti z1H9X7rWzGXx0V~;{ABT(eIv!i&dk@>5Zd(xtGVIoF*?|pRpU^;gYlwV&j+f$cFlc= zdS|9{DVxc2li8UIJXbcVR2}-cB>`jIJ&KTYsgmL01y+uy z{8W`1kk|MLbdMhj%4295fB*8IJC1ov2@0@+k~fVYgsWCZ0ay2=OE+-L5hY*TCMzWP zN&c=4x?+%>Ko=XT~l~vi;n~qc zsEQ2z#-dSfB1Et!y0k6?{RF{w=f?IIkkxp;1}%_&U6SfNx7PQRcye9LcXmXf^ivQ@6fkYdPg_<3&>$QTefW? zAy3)t_i=?ef=;BDZRQOFJ_1j~ku~NO0~&fkQkvI-4oL>hkCrq3PMKhC^n)Udue8o*;m)5Oxmyywe-%S%4amXW&%Cc`zMOzIZF{c z@Z`%!6wgR-=<&%hRgwi&*OTaikJM!j&iaDjWYivInK^Ke+)&=C`_yvE{#Wyx@;7bGE;DhB|(`+*##9ExOycs(zW?cBia1+ke&r&67M;vImq3G45 zL53tFo`*hZ3i;and^&#tZ>FBb=5-jNy!P%wsS{Tp*6Pu+b35pzK*o8K~_M07SAuzu@nQ-<1gV4=pZJNQT}Oh_7oM9a3p~c|8bI( z4{97r!ejv@ml&&EX#K)=D8cs$Ns^qXAtBC?4pH!1p8+saUvoATdk0H73b3JxmCLxizcpZenaEl4+$MxihR( zf<7UfmSsvy3y^(oA7jl=?gICxrYa zgPx4I0j`m=gYhE}(+E4XQqG&(q5IdL5Lpu&q_ZNIq_x7y@R4D*_QMBb8Sk@V$%u{L zrNbjq*2ed*6P-j5!1s(-NOGpFp$8bS2}#6;t7(FOD8Qr;O0vmEhZ}(PD>+dj0;Q67 zaWXNl#AUc5Ow-jt$k5G26fm)^CmIj|POif5vzpl1uMniog-Xe`l+x@ov1-O3im8$j zrPzM#XIb$z==92vt)l)Qg*@ZC%1a1HC1WqAl?50k%rhC$Do77N zo_SskQM9=Hc~h0%%|ZAgXEI8AoCA!K#2D5|suFeDy8)*i8En!Zn(R{rmLD{dPs#*^ zDY0rLBo$Z255N^e6=In0hp}!XE~xQ6y#6vtwFkA5SDr{q&omlGJhB`&k#dXAEEsDm zu8ez-WXpja6g_Vzmq~_{Y?GB{J|ee=FO#vihG&vsjvHe>(pL`by9<}WTh~MNO5gZh z_ZPt7UrDB>D&TWbtTL%}L&?=qzi8q@nZBH*W%h!wfPA(2kCIuw#c?kf0qpE!_Sn=Y zjU*-2zO0hzh~AB&Xup_KDw^IXOS5_mxwtX~y4cdtxjbSboD^q=$KEl|wsLI$G@bCA zIm4x09{$3=nwN;XH@ssrk@AQFA+)Nk@Tt*kJd*!PIfGorgst7mG+vJKtzjN$1wv|V zu%wtRCf$uOu*VJgJ4m*2hJ7#w2-(et$SG0caZIQybF{|lJOR@F4$m+DL~`%P(p z5KuO6{xBk{dU3c`=sCtD)8L=A^eJq7*v>LWumF`j?5^;WI?r_EHXkD!mkHPweT!UD z#)3q3&{WgL!pBs^+Ay3m@VFCBFQ9DqtKw63TV)FkD^fKcS8i@!8o`B4W&K^@z#40* zG!K;j2w*jCQdRp4$YrCgPh@wfO{ywp!%KYhKl#O+6D|MHvqJ2!iIs$s!3q>H_6|*J zPj81a&2new$)8|F(oH(Hk|w3>;mKw%oHU~H$ao~YRy`(F3>6D9)N=U77EL{Y3Dgb9 zkU}T=_MNy@RB)~pFVU2Dk_(smVEY%I}v%6pBV;}BuEbLSLF$SUsiC4fSY zOKgCmH;SZdKTO8zR}9M_Z=pyqL!_iTVs6t)Kuy0VU=DZO(4DXQS#A+WsBq%o_4F`m zX@QlIs2LQ9ONuVzm0>%BHfHv<-gE0eQ7S2wmZqwU zt&U!Ii>6X`ON(SpL+PDki7XQul5Q1PHsc$v9puZ+@e*OhAAbQhU(S4eC(_Gd{a1U{ z3m+Pl!WI?*>EGp>M&n!e7U@*WI^y)zX*V~Qjjxdu^vQA!hLf63;p$o5BG4fw{Y6J1 ziI2z}G0;-cYi8{jOs%#2Ay}=k(TB}Gp%0!gn>SemxI?420Pae>P+u@F7 znfzVN_&6gbCwALvP&rHfw;M6*%eG{jby{720a0lL~vngcEm+&JU-}2R@2q(#iE!&HN0-!dmGk1{k{d@lCC!@{5PthZPu7*OaiZg!rE~j-`!M?KMNc zLdzR*Se6(R=-8l4Nv11hE0TbC-pV2ZX4+?QARZtq_K2O(Z!TjGRk4LU&l8>6BjqA+ z8o(nc52l(bEHccmP?erV@L#<`LlyCslwr^423FcZL|_A<9njWpa@pX zh2nJ)8`kfMpe|fKD4_L|#NH+=N(*zEvg6Ml>b{zb@bU)5G}4}$WZUI)XlwUx&6V!! zDr%cFScL^r7haGtW0Z-v2@Q1^s9%!u3|kZTo}awdgwsHLxZ^^%gPnu`@4NC8fkbtF zo%KrP=}BFeH>$0@JC++2dtRI4`?jp6ZvtLUi|9m%?S0o}Hi=8`JqH>YDclaadHr|Z zhXW$`Nw|x^b4AO+)y~gibFUNN>zr%d31an?c z!ffnJ*QCBo3!0+1ctx4KKArZhs?B^p2g0m!x40pW%2w-=i#uq(8fmOXyRE1EqNj6> zFxUH8!(4Aqu4KsW*al~LIkDBnRA>=Q3l_r?er(;`F4hGMX_8A-=7PL-oXcEj+HMS* zXJlL>rb)Tlja2G37Ok*FS4V1=v55kYMqaW6uVYf>yKFj9EH#)o^f5P13g5k)Yp}9YG>S|F^_7Mx2WHXCAow}v3d-yW1E_!KW|X0E~hVJspE)X zt{$*v(kZ|UNA__Ys+7mydpyq))!bT49!tIlj(%qTG>anyFwe$You_BGzj7)oDq6PB zyV2n*7*1`PP(T94-C#NWE-SLq|FwrsZLN08S+`Ft=ik*j+eO#dfoA?W*=P&3vQ?xD ze3X>$(V0xW#dODWPdBIn1H+QI>NJ@7yozA|wVZ}Na#sD;Zv@j{pDvUN4toH{``9ac zyKjrd_ZjyK&lV~2*kxj|$6v=t!2_~~LS+WAR<#MyF5aB<0BK2j$Slyuzn>=WM4n3F zfSXF?6G=cG5fM&IWEHbtCdGW%lN%j!>e#i6{1!{u{{gfZW zy=k;kn$Z%bi;ZIY@|8s>ZI#zlDnbmLDJsu!sV}6VM-_cf8(U0a{R*xyEJ*Keqd%?^W6js?~K=OP>U4sO+KWvM(;}R}&&_2=pB0|jl7bb6r zG8z<0WS}z|EKn+FMjnPgEh@V%NT6uDUMmFq-i0mD&sJmoCFhEye@o;@UWdGqZ#OvH zb=2xFST>+nIRc8HM;L|T%L+`$q^TBK@v||Z`WD2-rR<_+uYW;<0<~Hb6rap~oj40X zTa_1s9UH}x&A1-F^o|*E)#jq25G=mC?;!;S-;1D*u2t_<+j-#2a&IbWC7euM1POt2 z)vh)af+b)3BZtMQ^Xmvp!DhB&8W;V_E*2&!Gbn$ca+&L^N*a4Jen)a?wcVM^%0>>! z-99exGr?5jQ@#eS*j)Nu0n>K|ISf5l)iujlU3w*5s=}DTIb{bhy>Bc$6G}LN^5Em= z_*0SbE=i}IcIn3i_S~l_Qa3HBQi){!FS1gJP~6od?iOZ%J^5lS3Yn``J1TpCKx&gi za)I{nVgd5xC!44scZSfE|EVGbI`UsEJN}Q=QPMw(f+!vake(^+DfNlXxt=Jnye>>; zw%81Lyx+`+Zx&XiQ(JJ3x&APVdZ)Wd{9AC&#{J~4SZ-mBaVWx4S${*V756^qGpG z5bMLd40FdEl^EEqNr9F{q}NW6yF3lI(`Jl;6DBNgm;n{n%V+D=GjN}hsqC0`H;CLC z`q^shRVn^=j2qV%+E@0^r+yYDb~1X|^V;qrMF-g5J{`kXPA|RNC3&h%T(%(=uuuxG z+AVXCF2{Z8Ub_yyBqMEmADE9(Ai;4Ukv+%;*jSZax0OeAuz(lnl^dZ>A&%wd@+UCVAdi{QwUw2`gJd-u5hN zqcwY=ub|e!TxbC{2h6JxDFfK9T$^D!K^?c&t(Z3fUaxqbV7PezPOz8V30s zTQ2@TYX6-v zm7}2B;7y>PvV7O74e^WMrI+I#$5n+J{AO%q7x&)ew%Ze( zJJzPR=V;_s=MCNS#|tw?OXxQ22cX8X%L32okS;(f0-0;V(W;J0Jqgb}Zik0VykG;? zj(<{HjRYVeQ3Zl$`&EoJPzBRg=dFtJ1OD7ep0|lUSJ(k!;sn3LP4?Jh8)twyF;@ae zaDvMMJz!b~4P+~A9|jX>rT2~#GM#tZTyaEIAoX6)EG3^6q9-yA*bz1AqBOS^?oCYh zgyHO=ob@=YfyqzcqJCw=QnvwH*fD_O%VY;Et@`1Qrl87Nq6|yV9>Or*0Y~~u$Nxhs z7&HPJI|t-9fI!8M8nq@p_Fk=n8?|E7{84CIqJ`oX&zM}eC4i<`zJ(N}n=H}w`r{^| zTM?WRipUcJ09`YCD-P{q>Y5a+V&NJU zth0El4qa1_dJaB0dn@6HTrCr5Ym?ynP-Z2q+UvekKso_(Fnk@9)@`@MR83!VfwwsU z(+c){<1e@AJ#%sIxl>o!tdwYo>|@>W^d2kOi{HwFUYzL1$5I`ezeSKLT4zHJ6C{oW z3TbLdKGaQlic%#=!?#eoUWBV_Fr zS=UxD7!RDg58wR>k(U?fL~{IHWRo@UuuvP;Yodn0@)k%JMAXf94DvF?u9^cD*3}am z&PyQ(trJQjX(K{O0=G(39MoD&f8=aZMPFsrz5=e>Lu%H9!TJEs8wDniZU2%yX)bq2 z_uUY#TS6PZnAB^(l9v^GsPIfdOn@;#F(b}2V@uHC5KL9?C9N^_meGZ*n8yCC5M-cm4rYpelmFP*E9 zG;}*9%C6dqcl*FLekUwkxA)ZH#9>1!=1?_vjESyeGM^|AwwzPn(_zGBmoMNUyRgo# zFBA%uvVUCovMqX8X7+Y6Y%Zn@?7ZF#U^|~#Kf=rsWIVKdS8mU{ZcTvRbK8fn9y;}E zWalcY(XLh?Oyx(`WVj_NX0?yqAw&I_f7@IK{{@ildQIrXGv75MdLvx;hzSbT(4RBV z`m5$n+*FXgw7c)sybbozdW>r5#&jjf%vakz@ZehQ--P2{cb&X}Wu5aZF)%!M!+uz> zAW?{XbvuYNUDLah)cPp&^sWv0$h*kpI`fVHH1Uc8Cic+By;SrOn__k~UYR>9)?M~& zHp3xqfho zXc153r|EE$6LzXeG3}VkUX=YerP~gMTCu7NH}BZR{oBb`-msYmE)L7KN0tmPR^*zy zvs+DvKvspr%7r|^$T7`FQ0`H$T)DNyxA*PuVOnB!R%75jQ#<Nk=6iVYl&y_oDQHx2Z_>tMZX-5V<$WDQr_phqlf!cwhwb za42kHy??^BiPh%2T*1@=R>lT4#nL+XI@cSlKPc1uxLi@6zF?LXJ1{r(3HUDiybRT; zhu;&s0C?md*gXL|KS|QPrc4^WE1cF8r6;L>0q1PR{_fFbx!G0}tuCXd@u!dB9A8ohJJfoo>1|MRehZFO0Ipd)p zR9}q0?@52YPltYBeNFOd^Op3V#OoYi1k1!D(*}q@P{8_BlSS6%A(&*;`~}!G()z@l z&bG(su42;Eb!Dp!<3#H>yq~=-Xvy}uu|a#S{}#a*&k3e0RLbE3%DM5!-}J!ZZXu0H z-l?(9seUfIn`CR%7|6p`EDj9N`1x zD_+%7(LYw`{2%tez*N+awF)htfDkdaw70fy6Vru3`W=w17uIq(%VHTf^Px8eSw}Rz zs+vnY{om+0_BycPOh=RTR=p*4eElqEXIAkG9JJuypg5i}1QkB<}ldsvwpYlh+Kz`+n4qt2vM5ilA0VZ zOfPgm5CozS{v?6`LL^MF??;QN#by7W2}rBtgX9oP=&xwU(PO(Z2WZ95F%uQ!dFlW( zu`g4_aU)v9LaC46Aj6*M+Cx0Xtx4|dRYWamXUg5dKJ{^DydW2FnG)lwqXc9(L%=}q zVhErYM%kM=qahfS^A`L?(o&_96?Vpj9!~SJFV?mmP4|XTr$3h+WcLk%Dxx4@x-|QR zGNO4z-9$2wXuaat7%nwMzN%E1sC*3Ng@-l$X8mtV{W_H3(ub8jLwVJtlYWTAyHZZn zalQ7elXymoOHNb-@__TJ!Idn={TWAA;No6R&j4F1FgYlx{-f6(hP1fZi=u=7aYwF^*Q)v~R_8J>Z zeHrqLzMeLZeMymK6CZ?q0G9pcJ7$ouzi4;Jw=H-LzF&hZ7)PK;t6~~umZL#<08S`=|sG4M`a~eY$|%Ek2byoG`X5Ckc6`IOK7K z5fc{ZrQ@H?pA~x`OW(MGME&uf^kV$A+>e*%4^jL6L)5bTU*U`VmNo_!|C?F--*|13 zqK3>OFVdHBhpZ|^W#|jCidIwNgst47scWn*k=mlKexyvp*4TCJ7P(mo(FYacoM}E! zFRl@%0-P(HZN}qdCWB6o!_~*X&reccH%|0HJZlZRk#Kbg;!VIF&UMFa2(4c)MFMrP zresH|9@;9r96-XTpH>_8fI5YM?&_`jkY1{YSzM6ZN905X{U1QN2x`eav(c6C!ZC4A z{05F%+WD<)GLQt&9?&W3&}4xg9Pnm^|l>6>h3PG=2^?oG+CK1hrjW{41G|k9(|s*5b5@ zO?*p?UTVI@FOhkl3gQUT=u=Vp)!bO(5;7H8TG zZ8$VUPEm8xL$&v}`P#MXWdrUpHu;xOTYd-0Pu zx?9Yq;QMEX+ClkV+jm=7#W-Szk( zoY-f@Cv0>d@>DT^VIcqeZZfa(1bHGd{8b{Zd1a8<4P&f1qkmLDUhyo3W)2Ick37X{ z1W3K?>`mN&S4Gh8r=-SPM7v5BrI}|(k-YW;QSc!9v*2OtUqj|SK8GsyjEGUXhag6? z6SGHO-8cQ=qzKcxJeQKA6fi^P$)|G%_K%0PkQH-h7vqReO-lgKo<8M2r0vU()iKlm|E2oBj7xrek2eJ2 zyrrGJwWs@itp5s)PlGn_YR;ou#%mL`s>6 zrBt7ZfBgkqHi|=~6R>YYrF6Id1@t#-g$w<77`O1XI#MFw4@l0$QpolDG#+`>lN-p< zfa(#?>3Kj2gk?E-^NhttGhqt_k6oddu?Q&%#}86=;|_8r`^jWZci{;1zrnm*Xz!cv zdXojn4qvGNp90%(3Ba)*Szgco9{1t_AEJ2C+H=d#&ZjVh5@s_EswNYEa$n%mKAGqG z^36aSutF?wl^DTBB=#&jphSdOma^1U7)cJRsgv4EBQqEg1X057AnESYDi39$3Vjn2 z{?JYKWUqA3l#SD`HQCqj9MSE`<8sGE4!pAS+1ak#LZnujIJ9Wv@SnlbK})PWIQOf! zE^GJvc03xT?WEZ!)XUNvA9v=lN?E_R>oz!(vuFpRgW&*m0TxQ%OJADMem*1_h2zp+ zR*sYEnUrjc-f%ui&PA2};ffvUSH%|Nk2?R+51s}ZGr+nkx^3GWF0hjaQZ?=4y>(7y z=yRo+BGQE1efUS_yy4O@X|>gB0hCm*g70v`^=|6cEv~U~Ps8No!lVSR{YqOn<*eVY z0eRVZ-2(-|;kA?vjJBRke#s5QnI$#Tv`#DFpWd?AQVqNXpJ>yw|CqDF9hXmcM!A3| zj(mciY5O7<*rAv>gyTrMpw2Rj7S>=e5M9AUoyRGpcqR42uM?+w=3=;wIDA4EZA5Em zK7t+xHfd%>XJ61hF_?cWt3zgM3P%=r_C5FDe)AAMAd(;*!=kx31O?63I5&c_aZ7%;E?@jJa&zB zOfKPobO6F1&Fc}4kNxnyTOJ*;xJ-maxCARYhA>JH@_~bLswg_|2$4f7miw08+VArp z^el3twnM~^W6?F+uU}OER|mk4p_cLg-1kfBZk~!uPdq2nhTF7mmVLkUpn=l^0~LSN zU?4d>JU=2)giyNyF?umj5(YaI@N17P+ZKwZ<)*T5$Wk#l;D&>U7LZf@xEJZ5Ol0;?-Sv0d!x0tYwM#d)FRJ8^lA)L z87txEt~hECMxh9?Lss!{tLh^iJ7mXQv8{@^aP5L(LDRe`z~WvTf%XjdlukNZfa2ED zou+jyz++vQ@W!oWa&Hq`&M=bc9RX~fA27p++a$!WIEYSLzSyM_a$oN@cw!x;QVl{& zzm~?Pc(_G0YJfXHYPAAW>)i+P?I&^tv#~k0j`5yuE+2(mZqNBc5d?*2^q_NBPL(c|h&>%b$afd6|qawtlvxxZiXzr?_`IkD*S%xYYj__V&gi}EZ_ zv7vu8##K_YY!xEuIX}`k8g6lWbEdhuoj;-fmk#GC!t9fE!}yA+-8~@!?b+Su;_-%~ z*0VD4;`ZiEik!BlhmK_OHFq=Jiw_ejtPX%WqdFWy~7D$Q|~WPZrlm5{@09@Z|e42*nsb`!!k{e{V+=NR1!t&dz-ry zlKnneGqU-045*f5<$P#CRJylxg1uzji*a4DUdDcZC}DA+38+B{wK=P=tayrz z&B@Fp%r-E?5&&c=!Owo|Tl)weBunjV_O$Viy(T-Kg<}ezkmSa`Z+{8q*B#q`|2p8K zH+E&9zGC`vFg|nwcmh@elNtSjU3HBZ=e12JxduJY>EV$70s=J-taJ@&QNS`b;kP24 zuIrfLZ+ZgzaxfpcAK|ddBpR|e{eMr1IF6Y@4+7pXm1J3Gfn&yN&wl+zq|yc-Ztkr+ z`wQr)A}o6h3h|Y!l)E)*c{3mtBEpS?JoqDx0Wa4dhiz@ls=eCUqx8lXXB5He4C|?oOW!yuYG>4>k64EMbuukxE7RQ z4A!szaOYe}Hzm0hTMw+V!~=JO_yg#|&*-hv&hGC*ja;3R`3mT=!0#C=PZH35?;g5Z z1@3B{?H;EYr!@JI`~XE5;ZQ^1UXl+m{TGrWkQ)uOm_e2G%BodrK&WU->X@NyFw#44 z$2I`DBCg$Uu!fIeJk`r#*99`b<-q8OX}nj!_7>&upVM9uyg;#p+{T zNZ>(pBCb&v-Bs3V&iL7EiUq%;prchOB^oRB%RYR-LRY!-`ziYBQ`|H+Wdq0%;k|&T9m)i^d{7%p;wZL z&y`kA>IXqCA2a_8um{ewDlfZVVk`uucPkX*TC^xVD^AZdCQzeYk~=pwgest*Ei}XxeuuOuqDdQ32jNF8V!*mF#1W?2`T9l_DwEb zE2co6ef!n`9%P);o=Mr9+WB)7a|AZ<21rK{-4jso62mqqHxPnxSkzRQN@#ntFHIY_ zBRjFA#LciOrO7b&!yt4~GcBhlwri~h=;|4zQ@_;fMmz-Ec^<;NMfvfv@?d}y%Cek{ z5VmgWJ7wl2r=Ghy0Vh_G$Md3vC}#^n^j_g*(n_QPM!_(VtOm|l=s41v>T-lF>{GHOkp2w2y(aG)dJMFyQRkBA z%4RelWYr9@;5- z6UeP?q*yJhWSV6Wgx({sj9MNw;~c@sOy2ZNZbLBzVrl^v|0C_(9{-!tyrHamSI7*t zi9fBZ8fk>ttkl%FyaJCaTSA5oI}JfbAdk0#r;%|zJ+?tU(LB-_TB>w!7YgI|+nykq zVQGbw6Ev4m`IUYIB4~^;L9a#L=_9_Yc944u`MC|>=omk=R(-GHO4&tR0rWZVps57r z$5kF9YW#V)!bKBOMX5!EaI<>R;359R{9*N@I-^r_&mW;EkJx&Ku@63Tsn>YPO8p{CW%%*Zhv*WR263_k)*_F4@ouksa98>>h^K;F=nFJ| z0i}hUR~Z=rbE@>&g+0rv=v^hwL&3;Ql$i+sc+tk@58x+w`;z_pe>b4eI@B)a?Wcn5 zk2BK)CS$KN)A4u40=++UYoyw(fz=uyL5X=B{GdSbmmCF3m)|8o7`wy>{9QwM$?%f? z-4F1or|}h4u@r`%Ct2WATmW*}YnKp`VDlXqJ=EhX1UkoDKl5S-K`*g&WaEHyo@p7n z@eceqXAq$+p~v6HQWqEGor?*iJf_ikQt9?E_Ii~^3X5S|hw)~(mJi?-(kB~@iS`pE zQx~>_BXuo>7%7~8^YJ4Oy}3A^g8e_7y;FClVY4n8bkuP=w*AJoZQD-Awr$(CZQHhu zj*XqY<~mv5Jegzugl9Ze_o%w+LP2~$;h{PEa=xP=r#P=jB%k))2>Wyw8LXW$MMFja zy%FBVC0S7Nk9Fd*ZXsOj27k@*Rp_99a=~ac38p2eDG7oHh=8!L@VW3Wb9-e*ohlqEXk#}&nVo2d zD9q1fgVn=DZPDIDz&#Ly{H5g0ORF}$l7`|Z8D~{x-%eDYYqGxq(h=_ij$`I-5o-a4 zqaVpx%C_eWSJ;likd5d8CwKM;kxSvEkZ;63@G9@@aMFp&ln@d8&aZMHl~!>pZFfrJ0AFF$VDO4KNFt&! z2|qjIbbM8TXW~fIN-5z2Q#AD!9`QT1Vlcs!K0!NrW}9k%(@4TYm|_wPJ~Z_Q)lm+-a|JAf9#INJy$Gy}Zl3K#Yv4+~+*c)YH z-MI@#0;Xy`I#~NN-ibnrx~YLY2dt1e`|qN53Grm+vVSIoV@zl{p0W)zT5w6`Fv0%& z;(Go~=A>#Hs9_esE5-CWCRg|^gjY@Wj_K2CGwC{?JmpPPUTgDwF-5r=FG+D#;(HNp zHVCpHHtno_7LeIn> zP@F)kL)_=^0@}DAkh?wTIlz7n-B+vmxch|O@k(>(_T1vv`RcL?%QRij=ISHjLZWdQ zcjo9ac*3HJG$^x-?$U<2rsjBY*H9#*q-X5z+Z<#Uune^^izC9qvT`b{ZoXUR7+Z&1 z{6o`vt8nS<8J-;!oFk6Bf&*Au%k!b@I+$zH1(k8n&g<5XBJdrr&h2KjM@*xwA;U`3 z=fyp3oTu&&i{2a(HPWMLskb29Ol1)oe`Ci2cI?La+2({7C?T}b>cQ!ZEt00{sN5-f z+FJ`VikA)?jJ&=d9NSJKt<%+$lTwu9Pll~xDDMy5+Rsim&MaW5vB^tYN_QlKV7ZkN zK@XdOfElm?G8H`C&m^}TVK}xNsYjOvB12=gB^@y1TaV!egSNPtY;<*!Gr4-YBkB{h zU%lPB38wtt^0`{5(B2wqGsfM`5XCe$g-y~_Iox!_Di=&pNux80hBg%1Qj&?`ou{d% z*>(Q-2(SW{OlcQ9L2)LkEKSM80WM-V1RE;5ihm#L;6*D3DLTy9tnwPpxG+VfPqhP{ zSlR=+^<#z{Yx*J^WBQFc=)WP|8LCS@AASRlZs~LemYAYBl{3P7LkZ8R&Dje%me^BM zoH?ibBz?>7X0o6^pmGRRh7VYse zAS4rJoJj%MOSyJ{(#pb)+9!l%+&tx6OJ*}IXiBO*sq!=7hvx-%Id#Dr1)R@Nnd0YN zrR|ahwYf8{$aGgyW(SI<8_eH;Jyd=j$qaTO`s+e~C$7~IRart!ft4p?)|ATv`v*|g zgzT)_2a|U1%tFuylJ;QE{E);Pi3OW>x&4`aQ*5=ukz-bQA(j$gs}%E;bV;P89AOK5 zdb6D4OvlzFgd^ozPBpJ5>so1LUi)0UU6Wh#xisdK=c>J(0>Wjc80~b!)?g!RTU(|k zMQY0-z(uVLoXZ)r{ejH;smFuY zc>h#(?#dbLo$s}ldxAF~xC_Ia=7XTYEN6c|gan#jMob*YR#fUc{dCZKW7ehY4Rq8S zE#Ncq81vytB4E30*d}VJdjrDdg5|VCP2ivDU@G1h)Gb4RcQ!Y~#;lvEJ)RjO(;_X5 z`%JDb<^xrLx7DmosHX@Xj`+An(&s;K37xg3>D-+!G-8TZ=)j|`EgozGzQ^{~_#w5; zeejO6!Etq3`Gl){6?PhlwJ*zMZwBh`bj_&T1!NLx>ORDBW4-NSM#m?Q`` zcHqsXl=8o{s@lx!(y|^E+V@)xwT;f*oGV^rN2n>S_Irdf^(XCbU!I|4J)93?+KpsT zwKPP%1h{`VSLvCJ)jvyzlicQQ!{DX)S-K_}$ys32Q<`kh8Y_R{>H~XDS*TsRH)_{j zZJFr?%5+9A!-mGp4%hi7i{7YB3vx!B+<01MUE~F+tz3!v@=d^Ao|xSJBqHhhH{&wa zS9|^Wg#8LR)s)MI@YN@q4-Gkk%+&ICi18Di8aRX271BrY;0u@5WuO17<-G z0cEttB7WFe_z2So6q6L|m=)K2$>W1U80h-a( zL&NhUT>TT1i^d-Ebg$+P%jy|KHtXVs+69;MNIH|3v)jyjNV^cz7QHn*-;{ zyPE;L1M(u%n*;p<4eSH8OAGqZb?TF_J?DL_Ve3f{wcLEwFHO49H4#VL1!8m7FI_wf zaRY8Wn;Gaa;P=k92I}-gX(ln<)Egl_6W~yy#!WA>p-SGJ<6ZNajK%cn_XT+!@vSDC zz*FLOg8=?14&%|7mj&V_^9S~g@jGM~^K-#;-^FD8W{Z|MFTf%07M+{(@lUP^-LoKP zhn9h93ho%GvJcDILIba;%xgp<%>02-EN<2S!`CN@LA`C#Ila31fgv1aO!h~Uh@l1$ z3nsy#A>Y_BX(LVJT6%200dZ>wb`f@73QzCwPCz}cnbIq2tDtkg*%L!lF z*>Gf%`8TM;ccIUkQp%%4Zia<39R53Pz~~U8-_B@@4lFj^VQe%@p#dB zZuL-&A-3J9UOBUYXKhPPyFSO$miV!S=z~i|t3E_VMd^6jp+`vcvM4w>Q&Gzn*%qGL z@w~gsQA05MT@Ido>zwd_{XnkeFV_da6!#0&=R5fV-bvPQJR8@-eR3{_0%-&PfIapV zY4qvWXbDJtS+T4+kyo)X+e*BQLhz|NL*jPHgRYnz9Ly8rWLv3!N#AIZr5+Vrq=NXy*6 zznhzqc>}Afr+@#puv|;Ds6WjT((z8~xT6=1zF!`cWloVbto=JcoK9fb*j@b#>H%Cc zKrBnhIK|_IakU^?M(Omh=Qs1=0}b~$ZL*+X(~ZdW>>u~OhR)rUCCc2%sN9t%fl=~;LC;OVze2;n0QNud7d-n zjGaR^8^?L!b<2^TR+}6io;I$e;@=fhA=+L-im`sO(yIYB_YV2={b)l!iMAI!>hnn8 zTIkzgfjRey0;j@AgDcmT|KTNWc4(k01NW%nnMbB9uYZkCMv0|Y1+dFCKQ?-F;zEG^ z>;zHKhv1z%NR0on@f_GR}(Wq&?JIpt6*y2HCDqk2_PwY{{P_=GaD z=DNr-{@@B-cSCYT-4Ld_Wz_?80ghu~71HEN@(W+j4*5$EFE8f9FCz+Wt-dQPbf=%}8@_XjcO&>SRsH_m>y2PgwE| zedBLH*c(T-Boy%lrz`N*OvD)h&-C68;BY7&8|vrUCFZaycu^WH$}g~A?!wWzo%R6S zxNzK*a(!S<-E9CB^eXnS$?;4jV7ZqC*NNJU(QDE-+Pvk-q*;_kecZgo_L`DdkNlvy8_!t5flq0>$6FqZF5z0_O}4Oj z+&elvupd82Vv18`rwES`u}3V&VwL`Nht?}2-!wM;NXEI6GfARXuS_9Dykg2UygP62 zlB4G91UASD`eFJyqYshS+FSfGE&AiU7Xv47%OR%)8h*id8~h!&&kiAXDUr9DROo7b zcLXw2sA;oX9Nw!-cYg=@lauYDR{y5vx1p+G4b=BjkFGwIbyja9;dg{xtsydpAg5 z5mN555Q+O{;sga#2fcg?aNBj1B%6uK*Wo9VH0QCM5=G?Rxm6a{BeX*}+A+cG(;wf1 zLq3+L+y^L)n+_0V3Et1)#vnamXg2W24DA1L&Gw$b6AdCSak+39zVke6i2lYPpqJ%k zy9KG*f__YhTM-W&_Pa3dBv({!G~}ZXA#@)ths3q2iz)#@7Rxe0o}z5d5|;1_vsfKS zDM@q)4w$rU9Ns-p8&^6$$f|#I<)eZInDTj`%<5zb9Qc`adHNUVlf0ql&#}Wl%%6{p zrQGY$azC(5Av9(xz{&bWT<>|jt`Yl14q!Bd&}anM{76xG6{&>x^KKi60zE^>8mdzt?J zq-MtNXbgis@#Q%g!5i=V993?!bCbk!c7w23<1n4HZN{E{t@l-aB%>~2+xleXvJ zBP$xpz4Xa#(`=IKI62fZNuZ^}HbLMbD-jm)`c+4oF*iz)$qF_hMM5Oz6BVw6e;WOB zr^*%$grecB2dT{$iqW*La`w=_0m;mjddh;l;7pE0d3g|Bm~VsT2tQCVuBF;QdoZlr z?NUI@2n*-lb{`q6?2S@iaNlIA)OCGd6Apt2IzKkH+ zUH7TXf!IF{=uZf{fLYeFM!{#5{ed?n*mxdo!3Z8jK`Fd=%h*R7vrnXR7{sUqxY}_2 zd<|FJVL&AR<*rqDo;AJb(_jnKCzXZ_Vhv-ET4hUAsb~0;V(HEt;y?%Efd%?1c>F5Y zi5{Un!ax>+8`^W|L|}TaS*h?v%+2$EHUdkCg{{Z$pYSGDbRZy>|3xSK*9Ejl6-rM_ z8HL-1A%QpTgOtf?LFSpI%*e7BN={-uxLAEXPh2xyuCVka;YV?qMKbvT1snbw0O{Xq zpsaw1hOA|qCt${x`(s?(xKBe!6Z+mwCCUE$EzY2xA-2%jdDQ(r-SxcreC=~N^p5*W zt|A#sE~4VD7EBew7IvF@stL1tVnoxni;4B{psIB)rUmTAxs%A(WnX*VqXlxCxa(QW zK`i}Q;=bFn6OUDrF*au4#h0nY>_rb~s8xNS3YfZIROnWec{3S4=kg7mCp%=rPLwBk z_s{%$;iQ*@3NK(P3)mBUCH!e-{KjG4QzyN{$d5dF^c?Zb3)tn|E(R|E?b96Eu*s4c!er4Y06CWRR_$*kkEhgSKHi{-#1{`5Bh$If`pQLgif~tN+0}hARP@(jkw^|=IOgrO zTt`;p{ubA$VG`w}i|Twc3T%)SqxmWn@Lo*n`;_aT6eV@ed?>U6oL-OqhR6zV+|*1a z`7wEBa*?LV;A5A3fi5vxOx;+MNlSwWg-uL=yK!?Q3R(x!n71E>Wy&9lGl$JQ+u`p$ zLXOeDwz;x!BS}t!>DV^p$T6_aKL2ccB}dZQ&GQE?%FLq!I;KvYn%OVCqy|=)xvKZD zFuThTHWQBP=pAa3>dEI3V#xjuG$Yx~n-2*Q;Yc8y2c$1pI}{`V9~ju}2nL z`pZHGg=CkaFI}wv%+xWc&iPn&5R}D8^)p`KmMHc=YQ43!bqVTQ6K=SbP%hn}xl=_kW`c*Lw(soh=`BQ|*;Pje+rGz^Kx)TBMq1o3$gW?eF9QjaAY zD{A{J#WQoH+X{@RFfnjCdP2*dzOZD=sWB}jOs7*|~*>{a(DK{m>lo8Fcwh+Wx-Dj6V6v5JIyP7!c12;VPgi;%Xn4*U^4W6jf|X zpFh<-QdLVms*%}NT!QKb3Pu>B64XB0qtFJk^^ZxEV!CW$48%JK*3L>v*KRJpb1JG} zZ>N+CYUhxS&aU_kU{)qBnOa!%)CR~wGdGE;@;9leN(vcJWXr3uYJNxE#}16nHKnWb z!X_w8X{)MnY&nR{M0!EGUP*cCxjiO}6N0r%Z*XTTN=}TIcm&@4i2U-5z?GqM0N1wk zOUX^q@H4}Airg2ko7>jwEEIqy<+Vku{sDu{rt?IB-+=qlHs(32p{yI>E>a;0{Aj{(F;1X)p60*6$RcTt#(mW@Gc zT6$^7DbTitZmA^a4>XR7{N>E@45T7fFys+! z%&?}VQzJh65MkqSZhQH)!j8dJ_Odz{N_J+f){0pY16Nn|JkMbi48;)%D@mdC7xslq zSGxUU;fN$A&dO>~im`}V&}bP;MmUW+$I3qYf7Ea7vGpF4=ycu)>iN(Jvtb4EoB!H{gMI~|$%Zs{8wS`B^^=SV>gq-};Y*_Zv9hgg(3Z-iD# z7oKI(?wU{~QH5t}$#GIqt~x-bHMON#(&i)Y&I)8dlNv3Ntf*P?5vIPAWUR4!jCtW; z%-iZ-vfaoupQU*-c>el>{nP!irOhcMt0NOD#bS>ZIS&uVJA5m=qU1bN4IR5j&e?J1^9PulNG{Z%4N8c(h2h~2hpT}b*xfbClbHn+mw^Un$Tr+X zw<6u6C$D)t|6;md$&PLz)!thhBzCznbGK!wj|}Y%mS_14Iy#?8@AxMed=s}4X^C8z2`nu(D$gQ z+Z!(wSSpy)hJGD_RYDn*BQnYX+U0N^%AnJ#fKyxl?Fi5FQXwqo{uoa29PQO9{FHsW z%ouK=mgs8>)0q)Q-63r>{FL;WAssD9+Q*s^Dmz3~@o@d~+7@`U1U8s^{W;-DHkT&|1w#e?0Jx^|N&GSIpu3y?BaKaFECO{+%MtU3N_Q5wl zZ0T~borR!iV_Y)5BcxhvGQ9{WY$i_(SZzVYa-f%cys-** z4lWXr@qLrXm|KEW#0ROfD?!A+4O+?_&IoR2qEeqj@|v!y-sp{B8k4UpgXy15$>)FA1GD5fEaGn_j5pwAJ2(+Y zZy?QCbw;!ZvhAOuIDW921Tk~JDn^4MYc$61{AM>qY`sl4JcTvf_L_NX-5qc3O|<2? zlxXd}HM#lWUT#09mB3GwS;gre)ndr)k%6tHjG>jm(8>ajpL#U!-u4eW_aqv^9mmZb z)Xm)xb++!(b3khKEU)PnV5^Xn)@U`&v)bbkv>GmGPK7GM;NZ`U{M2{0#c#^F_>e{9MGpJsF|9EydlUIg%qu5j zu(Dx%@Tbdu^Cxqk&-e|{Eu_E@!!7duu3>Y5H!2T83cK|tO3>nu)Au)GNIl zBncrgXoSFL(OGd3%t_zqYi~&UWHSsGs!#X z9ViZSwL?eI|a436=rC_d^a-Q2&8dL*#^v^m$H(4J<4l@lJ z=AB3cJ3a5vlN!C*?g`+iV?Yr_ABSpOpEYLzUr8pRhU{@kLN z;lDPdBt>nT1v+GI9f1b07-z#?@Qqb9KbrSZrQ2U-v`ewE;~{#NThdj_n&(nsjA1!J zjsAn6yuNt7pdV<1O{(;`r-h{BUDJ=ZZ6nX?J3c<2;JIO27)rJ~>CBePg1=l53_u@& z;6b^518!3F-=qp3>topmEI7x&>yX>dSRojag$bJE2?6`?Oy80E%lfh%{iDvwbek5Y zZnW2lWMt!m$cQ4w>9!~fs={6|dF;uzyZ>&iD0#*^t9}EBnkE$7sv8;JVLpcsCu+9) zeIBiG>0hcUsW8f|ijFSqXX9S;P79IKT52D}4#&S@{JXdCK+#_$rPVdda)prH80vQ2 z6Pz!PibywVCHkM$)5z|E>cdoq0UO+?rv4AOr^Hh~@QFuF;hE_c5Nx!x5OzarAALaV z0SB8XiX?C|TXUVDcA6Hk;FL+EVxGrs#&n$&%+fK#L-pcYK8r^}{6bwjn?luJTL~v4 zHM|{{6=BWdqY8w==2(+K7xKGo;--iw`mGU6?P%Y0cGwz~24T=q#jVT|iFvE^{F-pg zykoOQ*>9fLATvuyR4aITlq;A$VclIH`%|}i6ai3P+XQNt12Ff0y||ge)KRV3NbA$L zrq)`N@((|PH%nOC1DA9o=FYl?jw0pDU?bd{1=clkS8_L(KWQ; z7H0IuTX^YYp}Q>mu;rNoZeB!1{zqpg= zJ`eMd;(vLFyNI|DH+JlNU{t^$i`-mLvqD+!J)T}L%qfv00`M;(+hLK^O-GXt6btU# z$yvq$jFp(&tX)(2agAHIgVX37Q$Lya+Y=&0#%-BMX|nd{-|$;b+n&LeXwqr!Nz!lq z<6c*gq-pvI%k5H(4|1hTS~WoPi)^ZL^cO- zXGqukxGD~)1!RXi|EZyhOzWZ-`vEG;|F_Q%)Bi0OB`X`GpK?hStnOVBu#&E8v=9b+ zvkx_sX8Oc0D~7Tl(n#>u)B|0?^*FZfdnkF~{|*QHWiseMj><;K=HKJ2z%*89n*EeWFqdiiDsTZ7;OQaK%MI{2Q!OBxFo z>;CWMir2pZn!o&F$M>xDdWs)IV8o+Hq*5kO2RyGrpWCkN*P1WJU5qmD>6h&MwZiha z=vS|G9d?e$`fJ$zkQlh|pGM=N*Yy!z&suV3zNpvwfdw1Sn|=*wO~viI)odVqQEl4> z$xK_?Kl{E%f8nwhaIk~Zsd>alSGH%$5Xc%^G`Ib{F_tgf;tVxu#OFFQHsNH^JZ8r8 z&44Vh+pQ$&6=?DZQvs*WNeZFZ72VvQv#&$H88@?aG z23i@-TX!SkRbc9V!@0o4^OD@-v=}or&}|ZwFzXX7Pq6Hd$7q7@8DmEo9DvMqLb*Zl zlM#92b%9=_!5}92LZJC;Cp@H8qye*JTB291$Po;9UTIKHQQf?i=%JWiwp7ySYStz3 zLBP%nNM#cpUttrwm)u+UK`~SZA0xne^;wO0W1hv0mI!ofNVS$L{1I8CHJQR&4(J>D`sm%mjInk430jFUb*Em7=c57VXmlfu{%fKalj~t1s>O zp8^g1A0z4iF=jFUSAk|JUC8{O42?t@0Cb`|=r4Y?JXignWO#fzi@9|xdS8Tqz`req z9gb@x8-VjaubNVj^uZ7}%%1QEX<*?ZeUkMa)6de!nXe|(X|H!z3y8k*g@mVlQ*`Nb zSfq<&r9Uiq{Lg+EA%v0KR9jA|)9BoAK9`_2GJUar$brQAyWxjOg`W%(?3U8Qilh27 z3eT90?0URcF-{FJpSXJ;tYt&5zvLO^zL<$C*jx z@)}HS%3^KR2QrLIRj%#wqyTRi97sWWk#Or#`SNOKMh`GoGc zP#Dnt#BqA)%$Ybz7uBkmTYHo>=87{3Ws!`&{4yIt@yRj^lrVFQB$BUI)^b+C-^`3z zut~DqG&$!fvX2ub*~zqxC7Q~0S~i}xf*rOD%K1+0pND7XDhiThjGEBv3Je3YpCjaB zcF@IDn%*IDF3gr?Lkq-V4-8h1A;7#9fg>>Iv~DpTs@yFuf+c#FEg5ZWT9DFa>+|m6 z%eb#Gr?w)ex}JIFFi|`@Vu$vGnjba^!XBsAEwhFQq0M32AfqFJC0}N}BwD0CL1K94 zkieWFdZIZ*c!;ZLx?8~heMQfZCZ3pt8a^T<`2;z*`F%0J0skUs?R|$A$nzQI-Wb<~ z9@x%71t1dwElWkQ-ezUJeYdOZ?i^f$sb8^m_EBD?6Xi&CLn??F{ei-~rJpaUgh3k; z%c4B7*2mx$XN6#oEX*2$D>2V=dm!%G120CGC)Z~Zm#>jU!)P|~@q}2{^xq7bmZ{Ym z{j#SpCZ}6`{u66QlxN4m!v_L_6#t(>?f-A9{8yt?X+r&ojh1+yx5c-O?pA}DAxDwu zVgn&5>%#(x`RJhIfxwlp;~_B8CI{7hL*EsiHCzIgt0?_W61d}O zaZzH9B1VS(XnBV8TpzB}RCA9hawXAbquS9pdko^v9U;zyc4@uStYjbUvwJT&{5x1V zX?wv%qqV&yMB6#phtRrw4#f*kX&s4yxn*#156aLrzScQdzi5Ldi~kxS@}B(51K8H9 zXKj0dLgPK!H`V&cjL=2j2f$DL={Y?5qSWmKZ11htaPPD3x8UA#-g*?jfwp|o>vmG% zG7jc!?$2z#p#3n9#@J2NS+hs)#0-}oxzdoj9tuSQ$i~Ip>g8mP4SoY+93n+g!!}^qnPp`X zhH%>zl5HI*&=&5E)3}l?8M*99U2-U54C4>loIzGhFz$qYZuF)ehuEa4L~w^=ZT7e| z7TucJgEL^(ZuJ>FN9O`+CDf*S)CRyxhZ7R&Lw~4Q4w2xuXs!KJjuaM+nlxz+PADo* zAU5*{i7Z#ewv*Xk>s7c0wU+wIj|i`I|0PeP-6*3@SX#SLMmPtFvW$wvXpQAt#a6Vc zWzoteNOwjubMMJ!K-OQGB9AW%KqTLslE#ID++U*5Ek3UNJ!1u6p7(+K0wH<+b zTOZ~p^}N8kHHU1+X1MzMiZ<8jtRqsdHZU>K2o*zd2&kI(UJA*&+gX`sBxUA*u1l7 z=^O^sI89t^-d*6jb$tXA*w7tD1$T-gKrvJV@Kb3a-Ut(_2+3JXf5ww2Q~ipnX5VO8 zQ$>w<12y)W9gh0i9j?dZs=DFg9}o9+wwHD&t(v?GDyU-IsAOnV?jMK&++3)LVp@D+@GA=kDGI{@eddebpZj^ zQ2HJFatcm3j z7OOkaiOMN_D$5mO<1O-vmk1r_Xi_94dt#irFSQ>Vb7;&Ir%x&(_bMJ!1pdy! znQ~Yqf@0=(A4@lNJ97sT*svS|)_YV`nVE{|wXxR!J_eYRO40+Ws{DgX+ys}FO)9cb zhQ_xM;F@kv8WGdzPZ}bF-;&iVI9#i221sEsTQKifgzP438{Nkg(3!ZHk(((!`%I`1 zYBiAaTg42o7E^n8-;C;!ExoF!g#n|bRW%jXmAY{(C-t$st1;|pmER7)bYMaXj zvP{k79VliOe@%tXf;9dH2i=(X)N+F(N>7}p$Xi-6{e9J_O*|J_T(c3VE4@xyxZW7m z;qKz?YP+}3f!>dl58Vdfb93nL2@|(>r@~fEgXfiYNGz-G&p4X=-`NR}n6)+8WW< z7jQ;cCLb^uYk2Ra)Yk!~fgnZ>#UJnoTuBC`(-if0K6dZ^227wqfvIPH{><85EF=Aq zGf}?Wr@WJKl>(}s_05dhiQJKP6t#M9-I;4xgjUXx>nzyy(WHrp98!c;qk-=h>s9iEgkDx>L&PA)HuBGsQ4EFdDrrsZ<-VxOk4k?CButg9U)ioDJ|wmAIW?_r)6kdch|@l>PT4oSEso*;DD-hRvN$ zisk9%sKHv=V1+@71tCyAB`4YBA-}oIYDa`l5Ek*HCR62M zUON-A+1^_sb#-Rxn&Ul#`|chY^Px7k8>Db0(GkHM3Dyr#*8OKSdk5Rr8MZuh%44Yj#j>wwn4BtzCv_sl0rgJ6sIqgpK&RcOYRO8US*pp8$;xU)P zWi&+U)#{b5a!keAihA6Hi7n~RVh!(xMKtCeq9P9^9^=u$9aI9`?1@5OWK|I>}bj1LU3e;eamLR;e4Vt*9xP34Mh)C4)c+NTHz)c9?Q}Foky@| zUm`6--}8~6*pbvLXdB*ZCWQ~VF2hmGp|@i9WRq&EYZ8?1LG#K{jPz@;=RzXy-nwkt z6JzzKR=4@6Zt5N2RZ{Uwq8nCgCN?_#4hQ#W<&L%Zqv|7z!iV--Zk;qayRU%aSAys#-`7O!H_Oo9XxtdmB9N+3E$sil)>dFhiV z@IV%S2|6t&Yh>BLT|y2ezp-e_1eAe~rob@IDg`X+DZ=`FlG8>?!6v=;gv(DF$poia zw0iC+5iN=t*%xE}c-q8Hr&%ynYU6-0${XqhTU272mKU_4&kX(g`cc_2DCccL9# z#KYC2Ns1|zje|Lsl^7SL6mdp|Zs|0gK%TBcWUFA9CzQy_*CsEq6{nQ%rI>ZIj7q_Z zIn)76%Iq->qe>{{@#f`HO= z*(~!?r(zCC9xF;b7d#{w0Mwe>h=nd&Db9-HyxW#V`QvPh1&eY-Jxo)d5|;XE)woS* zgLD(rIGRw16w2-~3pjlN^P&l}n!F+y0q$FTPwA6?#c_&5f0T8Stlhj%Qd`#QYp&sC~=eaK4rVuCc zCJGoQ03nX73(kOs4nSe^xYh>r*Q1jY_b;#o#T`AHcK)g0<#j^2VBg$d^F)55)_=_( zMc17~{+`9q{51gaO!OQwc@1X(s&VAci8{y%l!3&^r@)K!iTGN{aY_`%j~r;yVX74tiaF z5}m!2#>vU2E#A5;uB3s9&!9L=T$BNsfkEkE8>VNG8SF`^I-u5l_%C{dT8T?-mrTa8 z$v(+Ini9|O&n{RS`Yqm@N?CgMmW%h|)M;T6Y0OqWVtinpbDdNU1?5@*3FDVaK>-yE{^ zREClmkJY^XV1C8-{!-q_e!f!~qkY$hpn?Hb<4LcOxTRG7$4G5BkSDBm(ZmYu2#aM2 z;;LXjFV)g+wSKy3)~sfSerxD$)5XX|R*du2*hd{1lG%nsIzydV4;2uV*GOwQe=hCG zhtWsu$^s$4-wn~n+TlQ=L-;nNtW-v;bW=8F{kMK+dDX@eE+kW42B?dgdk4H?KHS$5 z;N zgwuB{@lM?}hqg8toI!ekQkQ#df}2scfmgN?ViE21_M#V<#nO?p#w54bI-uyd^XVk? zU^gAx$hfEBgWv1oQ~PSnLbFl7P_kH^Z#;>NWh>Av9`oQVNO9u45GXj5UzJz;t)(I? z5~*$IaZiXxHMnqYBc4s-PVW)WFy#mY6Y(gT=?Wuh2eTV#Epm!&n8a=b%jc$|S(CQ% z@czVk6hft)|_bU)^pErLZ8Cav}8#`j+o;488J3Sx#79!o{$G7NOys)z-IKCZ+>!h>KIExDReSIe0xYwRzOSeD{#% zvFowIcTV4-v9eCz2qYQPJ%4_)KN#?3=3rS>ljX1~(BYB?-Y$UkL%eD@p0l@Vf>jR- zJ_vtnx4dNj`8mvaw$LDkd=Q82M<|d|d?4BwfljP88i&vfDnTzAvGh;~3~D~Rg$%Dl z)*9eRq#3@Ir&valqr64!`-x5w;}_>IqL^MdZ>Ac>W%5*Ru&k?a*-O(T^aW{He#2;x zH%*KCU%EFWCZm6g-Q2e#RF@a|xTbfB`jQmab&%+!z>8VXByRO5|nTh74D}D&XHw}%;jXZT>%Xck#OcvTlVRS3k9D{$1 z^Wa(DMk`q|-G!PSS1|L1oRkfYO}6SXVNUDps(78gPBO!s>-y2K-~SM%Eip5bRc~pX z>Eh&-TMCQY_08{2P|bDOZ-fMyJ+aINW)t(bnJ`-F*;gm;ZPcR25=*M476%|VOt1YZ z7vA+M@T`GwHC8DnCziAApsb0%<#Td;{E|vs(w^AwZm!*HGx&K5Rfz_JydTX|<`KWP z#uo>4#5_LZg5?+sw`aHGHdSuGDeb!R;DPMDuC7pZQ<6>MWot-J98=Q5gOOMPUf42^ z?OMmsN4Qwb9>z{%19~^CjVB`JLGb!{r?z#T-2dF5-DGF_D&U1KoVWg3lFm5@kUp#g zq^uF&yJs#x5&E_fmdIv(!R*Topp~jbY^OqFZh66VG<*&B7)*Q&>5z07GymgyDU~dM zzN@}7E2<$X_W@#Lil_L)h>gHk3A%jl@hI}HI7;3O>x zqUUn2s)ZE9Eq$3$CF6!w#SmW~x0|Mj%i1wt?7(Y$f2$h~cN#`s!E&$(Fg;m)o~!uu z&Wn;3i8{9BK&`=hL|I=LCGD*D+a|*%{9!H*2qb-yHrCWMEae8A8jXB3mZlzgQvz_U zrG5p)OX0@n!7I*8I38vNshIK}Nq^iQ!SDi4@Brh9R$Ife(=2ZUcxacfnVN?QUR1UT z{?nDj-w`nkFn-kBE87t{6m}fW=R7%!O7tq_;O2ZW`Fdr^d7}qE1eBL+wUicj?)Xpe{W(nJUHJ8u`ZEQ8lZS}h!=s0uihL#g$}V^%jmq)dDb5iP zL-O}wpbUx#&dVmUm&Y_ymqPkRax1ln6bCkoAwc zuQtVZZ7WMj>oQzXCv2r4yXb@4XxO}$2J;l>u-`HPWNH_Di{lqgmo}4ss%nM4}yn#@eals2QeonY9W&b%*k{3sFo)d#3A+r2T>4968^y4{trW~1k zu*N`{;v*#)9t|N=MUo~#GQ>vfq9R9JWlJ|~coR=1u}IYB!D(5EV^6VTazI)v0OKK( zWH_|0aFETD^>)gd9TRXc$B?Q8aYigC#U|z!oT`?{pPV2^ft-M&-W^Hdz<-B(zbyfEC+{7269Qwgqc=1NPt_!HSHi;GcNR^i^>x z_h_x@&+|*21hvy5JIcrfBkeS#5<|x#av8-4=pRvzMrOE++}Gw$B5wPig5>3->k{!N z$OV2*ZW-gOLqL;eG>!+6IfJ4&NI!cy z#3YIwR#y93ai&HO%e;K+A&%1nfrDl!4RCBLIPkg|M!L>p=1AK7W7@y6A{R{{0ZWfF z&MbuSMWi2U7&QYqD;KDmqSB;Vp|M_`O<+=uIFfhdYUh8@&583|<;diadC*Ofggrxv z@hdNT7AmfcZA##CP=?_qHL8bwbC`xMMY|Vu57}UNfNl};oSw26z?8sYhH4ccm`5<(Yi&HR+5y7N7+4gGT^fgp^Do*x^K(5f}!NSysE4YRolm ztI@8n)^cxT z14Jo4Mhn^`yQb_}mRL=c5H}rHo#ktU9Sur!I;G>+rkrO;bTZQvuSri_Jk6I$7m++| zgtt|9EzTK!3<_d`FFIY8JMV0&;}IR6N+REn+Ok1idZ@U}1vS!|O`f&TrWZ zV;QzCt|PArQQrho-v0Ht70KoXEnTc>j=2?lYR?&I#o75J<9eb^*Ykc#*q%dEf`fjB znEF|O@XzpplIsQFdbRO@;~wHX_x^xPxQV-$XF7zu4k7EQgDp!NDzQ#Gor`C#xaNzI z;j2Uz26nSWDO8t$;YWXrTql=U@WkamK)9%d&a11G>jEc23ksst#~(gtST}1;HZ6sY zZ6P_RaKjFKux|1Xzg_U3#9PnEJ=oNe4zJxCa6Bkao`|3lUSU|UnzQd@0MiIU33jeL zdcMdaN8YzgDg~&tIeq44_(Je{JYGE3V^kB#ds%Mb^i#5mtK^yWoy*)>bjKpHVZN^B@mZ+=DqPOfQS0X0b~bb-CW z{smEI%Gl`fCiANCm*dK_ zY)639zc%rNt>%Sm&+P!F=0T6{r+NKTpX_Jc!_g?E=&vV!f zR30TTOg#vK*RCru{)y(R1{%m3VQptHW+0p-T8AuH3I0)yTtO*zo}Ya8V=6zQ@YVJb zAf>f~s!pr`oisDG|J}$O$2^EFRLLWJrIVBR3B3ebNcJc?g;kmfk5K>nZAJ~6+_I!Z zU_!)SM$)58ZPuS*V+?acq5%(FcaKEhkkbrShi*$Gg(nv+bo~%Pkk7Z5BX=dK<`GKt z=0qTNoc(XDVr)mYFKh!kvbrB>H8Qbj6@~bb4!N&EXo5#pcH-e_>|t8$A>o52WShjx zAc!5hd9yD3?-h&_3ix@{=p$Zz3^6-CeJKYY>RXXG9p*m{51pnc|HdD_yUf9 zrRtFD1|yuJ3v>A*YVcyK4xR!HEVGvEuyi;g6$2A^|AM;i|AwTTycVK$z4=%RNX&5K*s^lQEt&;S<2<0*d9wQ$Ez>1w?Y-;S^a7|lUTrz7b z^e=!q5I+1s@0vjZC{K&NG`nr+`PWlN4ed`|4=29uCAa* z$gw4(2ou@m=(Aw$o?94!e{i86^86dM^A~`7@8OcxU2Wc|&0r)?%z3s|;hGpbIrzSm zbnG)MYn}{@9R)aWP{Q^O+;=-6&Ng{qlNwQ*nvx2A!MW2%il#tJ1kPUvzys+j6WD6Z zDGx>{&Zh8Ba*m8WN;`BE5A`?R({i{okOKVt#sdA_Z_FKhk~Zj(wG^dEUWy}J3bK&w zx!*D%A6JO_m7}Z;VTlf*4u7L4kc5PRiGo9cPkcQ}yd^p89c>P?QsuUd>xSyOW3r%H zrs}%Itj-%OV(R!yT;}#i>*LeZus6AXLydpHQ#+7!UtbjVk#1|3T@2zMN{|g9+K!g^ zK9X*iWOf@UDxV28S*Du-8=3+aRp1T94nr z?ZHLRcOd~cj{oo%;{B*Mvp)iR)T*0eIJJuXkra-TcTm8SIggmdL>GUbApN;M=0kL} zDp|R8Esl8l1vn7e=?Zx&3OiMw-oPJuJ~o%KEce>{=qyCOeuniB+xoK#_orHTKyCUs z-5$AS|IxyF@6nWeV?ne#AX)zb<4F;mZ|`A`_U&tnc|!ieVT}JfKn6Qx#GArOBTT40 z!#fnQH{&bCIri*_nTC@K&6fodqe~0YDAU;Y5HRbVs)H);t~huCin$n)AMiy^D{gMW zF}uUM#pYMuEJHY7ILzxeJRPvA&V_G}<}IV@BZG!D10eZcUYj2K=hMcyu%;5JeHY_8 zVNPbhkNa4fen_>n0U|S+71dX!<=_m_HY%+Xy+ECn*s(u*eS2q~sUxIv`EwKP=v3Ik zx!v0>Jm=3Cn{~9?Z?l@vg{{kMfJX0c>$$vSrp9Eyq=Xg-#&EH?Rp9yLbcdI2e5rd+%#f~L0Ze4ik+@~2p0^LXWlgbFcTpm@${+wk~92hQv?u3d;_{& z-E@E$a4aoS<_5V8!-Y*)rV9-gq!~rM1{ev#T~rw7niUm0KXDw8PMew-Ayu+ZQDeS+9-t!&{XTnVXq8ibSXRjFoN>N-w# zcd~B@^V#I^zC`(Z%iwE9|2yswduPlik2yP5v!^GTKrmjH!V z_O@LvzVr9FOuEwEXVkU^9G$J3Ple*Fr;Lwx%hu7=GvyT-$e0AThz{^EN=F?1m4NvT zETI|QKT`tmp@=b5Q)oQm>UnYA>@(Z|x*~f!mPkJ&;>1J|sQT9BxFN)N-FRKl1t$tV zQq`k{;+la(%REQ+5(H1jhY)K)tX-(XnCJ%LET5K=VjU1Vx_}f_(|T7x8fv6iqg3lj z;sIxgUe=EIDGjl8`w$$xwMUO*6@*c~%5~1uY);Mr+?DR$!wUK7d&h}Q``uRGQG?P_ zVdpjQL8lL7quUHnuG{zA>|fU%8&i9a@3mQG_LX;F$$@veMCd0+iR|#f{r_hXoJ`ED|5rNtzfxtY>MjeSs9$6- zl9|w87$Cq3xFAFDhyuR=jimh0zbW&k6=3sbmFpnI>S)^HaV4Lr|eNl%b1fc^f|wiG~LKn||f6BUs0%OjkTqr(l+7h|+K zRL)zwa@5r+B|#~!um~=Qh6OylW2xXR|JmXhM~tDHAYvGsr8hMK8%Qs-4zDxtmRvPy zqzoXLD@*AR9ODKDdp2!_XM)J19 zymQredpt-XU^mf&i;N%u_xagHTH#Uzaf!-}3kGT_h@1n>6)vI~OYD2>{dNe>RP-D) zsHofn`ciqIsseF_=qae&6LwfLcHA)-sGXy?$T~-^;5AgPQTtAveYa%Wd#*Uw6s{@z zJe@PO0@b1oP})m0g5`yyMTP#Jk%f*qOUN_CyKB~{WF`O3^pb?hUMFR}Z?o|XSl zqGj!ZMh8PXg*06#hHujnYr#g2Tl4?HMAO|S`PXn9ku+Dl1n+C&>a#mWd`qRHOuWQR zJPZ$4rs}7u>yI=#YM^QfqEo*>$k2^&cPrlTj3C7C#k_>+UrS2)1N_I!taCL?Oz`MnBbB zf<+=02MwmSOgOVqfz^2BHdB>`rv(OVM$eKad-2jUPqexk1OpoNlFa&0AVm+FZ4UKD zdy>ZzKV60gwkGy06VyKb;ylJD=zk+K)QYH(g;ha7m%oYLQ9(_O)8l|}R&g9EpH{a1 z3n4oMkDfQNGxcNuG&YN3&fcg+nHMJ~m&$?%?BB)C*u4&X2oCj9%VL zR-Bv#o5v=Wt3H~%Pl!$Lag4+NAd2GZcI~M8H`Jxz+*-_o{OO@rvR&_%3o7{JiGKlP z8oUYg(iRk&(CZnbmNY`4g(5IenYfA%PZM=9YKFwDi3^!e3342(+LHPDY8hw(6VXX- zt}biYx5$_imw6_7nmaYAZKlHQ#~R&7M04ZYgrMblnb-Z}M-c=hTkk%S=}JjK_!LwM zQXRMC!}`@72kmTLMMBhZ03ORoWkgxNcZekNLLY(#$l4Fn7ovF0hLD)mqwk42d2ov{ z!~#|bQNd>2(cN*`7J57#-eOyH%;f{L=BfqR>#X%^5yrxG8KRfntWUWZH}3P)+CFl1 zDMy7fKBI!>Q_mm4?Kq_-6nTBuZ1Xtffy$&5U#(%gn@-HSL5f)KT~GsXjr3ZOIRomt z%i}lHD&Ju&$2EC?_U1s-rj!nAy(}#%Y;9exg{v9M+~U9}Qb+OhNBk*gW`z!5T%0;^ zJoca|M_m_{xh&mWt{AU}$P)K_Z{pRS!q%MjDiTiqo&b>NUGFn)Um*c{>v^hqF}YuoWcFhs%6V0J|}i zMv#uRpHB42qv}FN8&B5&JMzJd+gVG$BK!HKxQXTK!ZEPd(OxF*l~G1m4}#I zRmQn7dhcBYXmu5D@)JMXwRGYq*hpS8>|G>jcj6}|=GPp40lEP^K4N_?Xr8it&)`&% zmMVIhG;!HcnC+L+&y(0l^O1>$XDY0W%(f0aQiQQG>c->jnJkv(OM}tpZanc0($vUo zxObm+Olk93nO0E3%l0lc=Ykp=O(E;NQZt;83(2H}!QhEzOy`A{9Dc*diVRFFhSI~M z`JyiB!&e|n^NM4mxk<}-EAC6yOh%j@V1jua46IJd^GJsLP@swT zQ%@7684XVz=EsZG)@4M=?3tK~QQ{yn+eQUa#3*a5H#EUDqPOHn85K~Gg+TBVGWdy1 zHc;d98W!LQZeeF&cgED}>8b(95(8mJX7px}c#$1L#)SrwdIMJMzg1_*!53XQO~@k! z6h&2hq&BWnG_ZdXnJ5(keEB9NVGeLP!ZH2?rtAR(<}b|dW_h@hES?Yu=Ar*ku&4LL zuyuwygI8>22F_iD`ZBP+BU?~At9J1|ga;)F42yy~CbSKO_fg z?6MELNuL0q%~{Rws2`#OHg*C7zdL6H&0c^oSZEA%avx<_R%%IpOg||TjIpY7HTqaT z|1D12lVG>Bsh|SaGolEh?cxRiGgpPfO=Y(x39V~ap3l>wQtp+$cfaZS-2?H*;$rx? zKAK?yB01N6u#v{iFAOo7z-F1-tQB(Gmue&R&oL>c;8vYx0kLIbr}beZsG@>iZ3j&? z8M&L4Pz$vS0oqAtgx?^S7|9467u~&u9xmw`#^^)CE-TSO@iwrFEk?PJqE+4%myUN3 zRmhgzq9X0VH(P%BN~E`F21_Pph{x}6(|(3~#}Vw1;KPFo8EKrbH063}=42VNqVHw7 z)7Tbq7A$c;DcL_puAk$@#Kvx#~cC znt>!&JHGOE4kuH8tI^t?(=y;psLXR(k|7s*AwT8>H2{Z+hB%>_vOq=xh#>Cd$Yc=S z8w7e2flg+kZ|FK>!G1IDiSmla6^L#$?0BAI%X*$K;unDTy*46oYqQAh>1GYB8w}|S zDw~`(&j4xr#z=`aKO8j(b%*F<_cB6`u2qzG#0jOm)%q{cb8hf=RH>2LV=DsOs*sFf z9}Ry0z}2y83J%!_PyPuV`*UW#GZ5mG<eF-N%93NIB#+vflDewL6WpStz2c#frJCTDYpZs!C(;??kJ(_l-`%gfTyH5!rzn4A z<)4Mzwg8RV(!cZ5d#SQqA1pZhhca&0044JWJ?_$Gx;)BK+B`SlDcYFKKOolyMb*ml z8#)hRK}iUO^Ng$*S~LaPdiXJ8Tj+j#`317jR8p-ipOfdSM^^{)ZbyICX>F5hl_hOZ z)YM)TeEhquI5S`R|dRkk~NIoCW%r-(--$IAHvoLioB8f%ZLDj$uR^Dq{JtGINZlj(f0?sB!pl5Q9bnpJ|!VO4Z7d@ zBh|!IuKR%q@4|2p!aNWnC{^Rr*@2=Ne^w*BK0JBFU}5!QxiVOv_K{w0N$^JygToN< z?6}9pUj(89Fn6cL_z>FK!!JCM2!1GCMwXsN(0uT=s(o5t5?Ld1V^BH&&KYDp3=@|q zlyh;(4xuRJO9=|b&bM6Q0NLlJ%Jj59;lpcR*}i?9nh_pqrCs|6sYQ< zfAX68NRXTn#UZX+*1Yq>2DaK7-}b9Gydj8|3yLQ;?)Li`IW8Ak{rAD{pd=qh^tv~N zv(AsIUDgVuyONQDMsy*Zg>ya5jkI7IgH-%=s4u#I5sArsu%e@Js>Lm8$ZjD{#dMpf z74o+XO2+n;msIK?DAnS7|F=P+EzCe)k`f5$P#Fk_?*Hp?t88mxum9KRKOeYVp8t{S ze*ETmo<8W3)_g%xtmk-rp;=2d4>Ig`(749?;#wDK>wcJ+u8Vt_x$V=GyAA_d@tzy96JJW z>o&LtjzD;$2+@7I&3UC$=rq5z;60m|S^H3R>!uyTQRqx_-ZlCAMI7*bwBK{DiQaR$ z@A5*xi`{=cE_}WAA)E1iIH2+Ubo>6{_wXqf9z*k`CjLT_^*xZY{*gA6^Zo;zm>&sw zq0T_q*fgU~)3k$Np#~pMYEB$c(V?lC_hgn(Ppz|DHB%+6 z*eOJ&rQL>A(um~xan$?e-CUfd!GZh|zNoARqrSYzp8cQ&2 zh*_D-K!_}cI{Y%dQYO=Bg~@)<_Q$Hf)*i?98SFolmeyiR%Tqbe91XULjf3o4q0PYM|= zZ;M7}_L|ziD_iGPRM*bTHMI@PER6hZUQZ|=tu(bw?oU~D_3x8db&c+qSamJ#x0>6x z71&-*z`dsx*w)X;2tH-J#8QJ4KdY;{O)4_H%q!N7%dR!gAbB|{Za8zjP0KVrAIjU6 z!#4^?pUO6toUyz^V0#u+TwWJr7UBDzwpjTrD+o3^XB3`aPI$cGgW6YA`05sAy&k&T zWy9aWRZrdmtDM(A3X7ayPZUqz%G`TZ5Y|5$Z}v>E&VDb^!d})cS-V};EzKOZsfLFX zxeAASDR5H_87gqo4xuP~2!@keJtpQF^%P|rOKLW{eton_r9seYV60+NSXscaB(nyu zR6?`VP-+L7&@)C!Kx%5FMr$i!SX0445LH=Br27|@!mzdkgG2#}k{tH0Ppno#G6L=e zqXdfk@k1P=Qt_;*B5nmfqOXaSY;+0DL&6-b8ZC(jRT| zGM$wLDp~8n0R~y5&N4P|^=5&^VA_}f-rV>i8*oI@s$DJ%4TbauD)cV33}SOD7_o+G zy7`(}fciYO;(nt&aPxRPYG>n9t)~9#BsD4 z6HN9za^ye4ihztGFdPu8s4AHLex5DN>T?LK-IBbo@l)`U|AyvS|J6}qmWau8(~d7*EN#tYEkO_oSnBDt&e@V_Qx(<~J@0F2bqZ=(T~!Xj=k$3Z-Y4@!?QI{!iYtdx(C*+!X1#-W6iW(EtFYW!;2cTK@ds+>}=Cn z@+d{qb@IhoM+2)E^GquXWlXb^&41k0FGcIXy~*5f6eH?q>Z5}F*@vF{8%^f{aB~4t z0~H((%!+eXpcDQ?8pQDy?y6^^B!=Z9V??Ma@9sC}q z{QkIRgq*SkYMkftxGC22N(+|(&PKG;g&4sC4bM84${e+Z$<*1KcOyk}9qfcqo0}WQ zxH@GbYyuye!Sry1jv-7~S+kLYT4(~hy$t?5-tSdtR@s5i;%+96`mVZ9r|X?}_P+g- zeD)M8QkX9bWZC%4MhOQJ&=>GY77!K`adtdQmDJ;WE$#BH$s-b&aAgJ4Siye3#}34> zEJa|2&?&NsNOS0f(ls%(*!#2yCMSgwX>S`P8BH=lGl>4k1$8n zC{oMx|08}dGP)0LR*^%4WtOOMKV_-h(7GZS<5@7D0^?sfQ_uCV$~CIOBxFLgZ*F!} zG5urYU@`mH*e9hm!i<#9)kh>-ejj{Q|F5Dp%JLD8bQ4~!3xI8(s8!w6{Svf zoi5%A7Y?WzQeuj_y6x2Puc~5CPF8S%;0S%}n*!Kc?~gm=jpnHjbq=A|t?W)T{ivCp zs!N|>BVHJde@cXT3N`(dvOsS>ykUcR0Nk#)t$HJ|Rs%oir20w=Pgga=ncQ1)&<2r{ zd`#mGl8jDR?fkAM{*f)gbdc0>>G9%y^jp+hRe_FNPmm`rp7(Fnux02{ONSIw${#-R zUk63vWqCTuTdt7%)|vwE7^5YrGXy(28TZ{ucc*!p$NGY=(yxP3)kWaqudN|t70uD4 zd*=NIG_JGUw+2)nyTyt#7O_v|F6%Nj+{fZKoJC9j(4bt@43XHOTXV*%>Y}f!(w4;y z!AGv>w-9#>E$*r!(?Mv8%~#bJ>TLJ7)OaHHm7gXTY!LYHoE4=S&MGENDI7!wjPT(K zMq@C{Bw`8%`7M!D7kR_?g8a9_xAWpVH!L<&P|v9?>ww~GuRK9{%_ zcC{t$>GnYEEa(r)RMn z54TjZmc@LK&SRA=LVRp_=4&B2G zWRYgwCHwcF-Pqc`a!bI}?0;bLe)Ez@{)$dfMXDU`O}tZcCFe{4ujB&I_T@PzY<8$K z2q~e^m2rI|HWDEvf1)%MB{&-8k1g$ZJFVYc)AQ$eTcw|(q$~pB=?6;hgL+wnkZq4v zIM_n`m>>hD)Pclx`!u8KjShCQo0Sp02BNpvF5q}ukpRDnP;ThIA%kgDWhge~vKZXx zy&--@BDvY)F#1#!bO_6Ta8NY2*=9oqrkq) zw4|Wlgv1-u>4x|qLl+pvNz|&Tj9_MlB73_BFEPLs{=qt847a-9WZ~^i4(taG#hOJj zR=~UE-j>#E3*>sEf2qD}Ye-L+EgkM_lT?|KLbL%zrDX%}XS#cmjU2BtsjF^tQau>j z8w@8PL4;lc3-GX2W0=bAAKy;DT&~pwKU8%6D>lXl9W!7>mX%_j;UGFA!8lRZy)7r@ zl#6{ql}Q{q`a^oNXc+6l!lw!DAEVApYOQBB+{*7yj4aby?yATPgIn_pQ6r}uDYT>f zu#xK|D)!z|Z14wLrrwIuVA}7>KN-MDaD_;|3z61;*S#m5@_V0 zI;qW>GM01J&i^KTKGdxmodZ(-DqUPgDXx*_U#tYlom=wLt4T-$qc_HQ64$DUJQ=rw zp%Yfw;@yKvb2x(@4Z|{~USw=B3#jE;h(ani#7ZTRII#McsRBq8YA3UV|61=BD-D2 zzN8GroU#{|EHtB)J5$i5hA~X_7L9N&FF6obv%L_eV62}vKfVJePLAdh+S8HJKawTP zeD~ZmGC+*^tX}VLL7O|J^!RAo(#gVcsHDs0xM??g3w==K35x;aeFBTOr@E}vi5AD; zDot+B_Q@IA6&|(>So-D)(EakdG7CbT!fssI1c$@XWCr=ks6?(HtsfYSL&Y&&xmGiw zH%`(l)p#RIr?|p%11J$&!Ow#5MZ(?RhE0z=T5pUZeWUmE%F?} zx{b1>IW)}*E7go>ZcR63ze);MCEXnPqWq-?`=5cH$fDb5R7ORh$IoYZG3HL0EVAgP zCO8)>eh5x!&2=%Mfrb(ZINpzB$A1bNo?{^qb<16~N4tGK>r~udJKWyiq@^!ax!Md~ z%%7I*4ZT=8S+$V!rl4y*I|?@x8bGu6}aXEfMWwY$erNSH;pwqPJL2aX)1*h7K(dU~CB`tl`hFLRF*?a$)SU zG>t-;EX9b0@hQ#$dzTfobj)h=)+P&kw4EwwvOk(X8$WyPPa2Y{Fs3y~zhMc#5Eq4xR(RbT)_KN^QU*^) z;#%rRo@{-bqc=B|mVa;!W6GUKCfgn!wNFrBd*sZU8}+xn>9l>MfwtwQ?`Y^v?3eV6 zU<0*U#fBPtl*k8U8sXEvGSE56#b84r-nS7jJddn&{f+B)(3gj_n@bH5NBfLi z#GjYGJXjOufX>-Y67is{GNw~!xn0-l2$<&@eMU6Or7g(H)UM}5;O78yK!GDdfGc+N zgv$ltOb%Y4!4^njj{h{hJg%MweZ{^uL$&I7EReN1^ z#y(`cX~kRgnFD2h1Ew0sDnOw2q*w!&F_QoNiSJWz3V!eSswJg>u0V#CCk72y zpx_xLRs*dhic*$IHs_fLW5x(>M#Z84t}U@};?9|EosackxVR(BbZWw!fuGm*Kr=P) zL9QPJ{(vmn^(SIdJqsq7ZT^-!Q|upiO(6*W*hoBr!}PAaC+=Ef>hzu<{vRC;nTj^3 z&v{eQtZ~DepSfKYcX9-DzIcm0^lT~rin7-DzVAwqBS*|JW9}j8_&zi@(x+`FEh8*G zSwfamD1-)gSwi?2Yi;UZySAZ(wLQwnFWvdEoH(`ylvcqdM9ShLU^X;vKzIf#VoEf0 zM9{|1JIj!r|H!AqNM3JTv9Mxe!ztVLC8R5KI(J!|s&=MtrvYJ2|Nb+Ohd06z1xo2< z35)kNetK_Xl+1`QO3Peq7jqezs47RYz~kSB#YC~^`Ni})JSF)!vVy^a`j2J&^y$W= zk2`1X1w&>~+dnA1*|i1ta6TGbS*sf=F}*sHMFzJ&;(FBeZ!9q`h@9%L8GMZ^xr!Z2HMH zYO%|yrD+}1@dDZ8){n>9>Y&asx=#=E#yOTIdwK-a=H0K4fg5zyJy7xmj2FpOlYiz` zI#*gh2oiRiS*2_0-&BB;&4D_1MrZ1jNE$Nz-~+<;k)H8U+l#F)f6F)b0|uB(-a}l7 zDXiY{-VJrS%?;Z(^>~x3-%yh7>@3~r0yN%5c~y`dRQ6zm+%Eu_s-L}|9=PMQPI}lv zHfgw-Gvrj+&C&E!7DmXNb-Hd`bIK1Rz$l8ZDgfPiR)XEph6{jP^uSznnJe|dI$df` z4L1Y1{)TZ~!rh}>3EX|=tZ~t@ZU(J153h0B;vj2XQlv?_WAkbSKrDM&E|`I*65C*G zv?`G91YB=V>_3g4mWNGs7Bu`R#5^+xYTjxr&r&(gKH96! zk_icIT)^5Wz1HDuAbYN)*#7D1mGW6dnqir0m?vngmsuO7M1}QsBWA@gb^E@}vzel5 zhbp!Q%H-P2~ER!{|sh=G{X za;+}I*3|B-*({jodfoP%an{kyyaojPAonFIx5g(9-OQ~=eaWpLXON7@eQt?t^=@;<*scW8R*M0%UX%ynFTApJ+d=F)?k+1h# zE=@zQez+n??nT!n8&3+FQ3Rj{1#Ha=WU0G_bT;#<8Y?Rt-W!rHXSq{oygqOEoGGWk zKW4e>oVOh4D=dtw2+bOuFJ23(v2f_l`@~%C;3y-qK{PDd18p zk@&$VwK2o`ObI8@nD^v)p3g$0ya8C=B7g@As9~EEQJ_y__qc8Z!*3>_FM0Pgojks| z3P&K(S2$k3?ZEXnF1mu2pV@B)TOVPLEP=tH&+X6y?~V+?P1Xb0ju3$Zq*wp@37;r; zvmDtl-5$1%2=AmlcTF(RU%f7u7v@r3oC=FQI z;Db=kzS_oAUzUG4FNh(gh4PmP+DqP{#%i5M4((paLl%4`aW{1IP83(6-C+L0&BYlg z9Tz^Nnh!0)Yxx-QMiKb3zco`LEa!r*Hqd~+l465X&01yt9#bKeRjiGQFRHUkY)3ZO z!qH!C2(2*k$S^f4oa(%x$G%$mxi@Zyt~yChhAe6!>`tr-v6*VL6*#Q;z+FuH(Pk(B zzq{9d8Jrx>Of7&vwT0q@cK31!?9Ax{btFjIN$#ud=XL>wgXb`1ogMhdg4g5)HJpM7 zBd*xui%*qg*ot-lkCgz$AG;xTK|px|jocX0=FaRk;DbcM-`8=2y}4p~yt3m@p#V3S z0jZ&mK5zrI!{<)<@??*nw_)*)I%}A7$2hJgk^wn@{_|*s8LdT@CtM&f;16yU_LIII z@`cqK_T}b*KQP?mZ$|dj@{OYs=oY*N`RHajN!@v2DHzNC55noSXh;@kh(kp4in~A#w!< z&~(J<^XA{|YBj5X0%5Hmtu9Y?{l8V%0Aj82L&OS7Uv2O~bIw6?h`}@A&?Vf^C9Oac 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 z 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%0DBP>u~ld=j=JNHIIj_A1zjsl&rC! z1B(2(;!9F#r!TvE;aDbK>COf+*7GQ$4_5h91`pU-<;;}p9jL(O{UVxV zttrH?0q)XKik|MJGZcVE4S-MgL;{ZMnxs_;(j&}Y0_XDT;jC83eGj#*Xe*P9FNW{>kO*GmfFF7fvC);FOeA|F zNMpwptW%rD$ywn7H2Bhn%)VRU0?xYadQZC%=u(gYj9K>{UFx!IF`ExKJS=R{IFT>s zK$lYNllX^^B{;!e!5?b$m8v{#iC&PWM@*N!wfJ${oHlAnQK9Hul9LH&wNP&c3xKia zAt8^yHSnMl@R=ayG3Iemb(pzvq5Ydpp3NdKAhC+#09)2HLddu37;x~v%a;xMG59mogE*)pIg=uX=R z>)No}RdBo5Vfcpu*3j5irj0umBaE+tI=0gvJ%{d)zdv!&bqp4qA?f@R&5Ja{vdL*wt?QRmaGMg?2z9l#CT(bi4}E~_94(2Fl3zTVSF`T zU?;CMlgkTLaw}1ye^^Wj@SyorRRYFp=hAWhg_=E!ZBg|W+jh5dI@RVlP-7LY)r&{Y&pY4{od)zB{Gq9vT_kX|8M%bb^CBN+@z~ zl$*&U7H1I0?%=_Xt(%AF-bVzt>%E3QUOew&hRLLS_siWeIBW_jar?pO7Rg*n6H`Eg zBWQm)TV(o9(kaP}FlpWTSyMX-BTa0mT9a4<@i%#>p<0iY%F;ZzLS1I1?HkX;hU|lB zl$s>&glw8zC9?s7pufni7-)-oYId?Fn*sU;;S|w=dy&vH;d_zVt2d!Qc}^3Yk?~)9 z=goP<&_yTr;vp7fwJ=}vjZW`;S?;)4VqpzGbyZlY3kWw#jo@G-qa(bH{u!I%kojXH zO54Y{$Ng6dijv)Nhua9Y{mPn#>OX*V4DNi`pb8@~Bj!e!A>6g>7##@x*~gT3)e4B= zQ}*qY6oHlOkEtZSnX%NU;+ql(Vv0e+J?`M+mkX5)N_Jb*hqC z6o&2@C6r4+&)QJ__ZO$_d;OWOEb`tAjw|8)-a~}^7>27pewfzN>qw1YKy-_)T(Jjy z0W%9e3Vwu5{7}v8g1KFOAJ^wV@z-Zg^t1;|M)^m)gHM-Cq)2X6dO%gR(BT)sBLb z5K#4ShFNP zTasr-i@T?n9#erZ4?!MjHreY^|J_}1W3C*-EE^Y;@^zSsPwc9)U``glH%q@&e*m9G zTpddMXS{mEe@#J9WMGr6wvn*z`vTo>@0ouWQ26F)c#anv+Rfmi=UuRCqKL}b`Gtr{ zo9|Ej?Vv4(H^-k#EF3!3&Cg+ft1?9SUE$|?YH0HbW1Wo&-CTkO`5$Rz{a#D5&32nNb~{kiw;IVm0hvJiZJBr zP7d@3k+I&zV2n8fiMY4px0mc zo)I_TiV;Hi{!r#QF3|*cGHK~Q`m3S9TnX+idu7}mZ@N^2{xsXFr5U_#KOE}4N%71a zoS1>pv_t2n)khXsLsm@gOHkSy(TXG)(HmY-kVa(sCh7%~nXhP`oOlCqGJum{c-5iu zw#e2QNm6Ck6>zPrqCHD}(P*T0OB;UAkjQtN){}`)F4XQ-)VGjDZ-P{KX z7x?^R59ft@a1i|ukU`7n-nc{?=#hP?j`}PuC{*me$>oLgThzDJFq;`^oXSNCvmFL? z6(Ff@x^~jqGmRgYztoQc5A>X!oYIt@NF>E3D*nkmyd{SBF)!leEc-+*3My!6B7eFj zj|nBYlHd+&*+QZ3+W6A$DH@S@t%$8aG}HS7fAEK(1UTM=Ch%N6z$$m%4sn#lj+;A+ zB_PeHz*;>1P=(z{YjyZdk?`a|n$mrRXr0{Msy z1b3*rwFw2fci!W##1x;}Z;}xji@$h>a^m@xl!OMs6wl}rHJ>4^_K%yTbBcsrH0yUtL>tm@%7Dslf&1}kiAg;CV z_$Eqhmo_6Fqf}?(dQ7fUx_0os2C#DYkkjnHBiA+<&bN$%yfTL;B0a@L#)(z1b)@D@ zJ4&YE6-=QF=LLe5BFPypM$)N1sHV_|BqF0dq7Bh0MkIextWgt)(y$2G13hb;0_U^S zK6RmuND+TxsY8i{#kzybu{XqW7uo4rXdJNLqKG>$XCbn(qz=cPmz7z6xvLt%n<<8Z zm8K-6agG7`%?z|5W)N zv}9JE+@>J&+u%et8!a76VW25Gk_VVjO1P#p!{Hj%<@y-LXpeTgMHtfE#% zUsLCOP8EfielKRr!4o?QowixOdu@6xDDTLC$QtTF^^50&Jv}%cK0jZ-^yQLZBus5j z*2j~eh?GbokSUtH$>6XN->RWDe7}cQkx$F`^CU21P|c6+MXp|h6ONs6OcksY>^=b~rsO6i zGvC^eD>S_vn4jzc@vO12qz;&a#x3;c$hthKZD&l#0r z?^cQFzLX1eTQ-HXnGVYCI1Wy40UCwhXJ}T*zXjQ2@_^H(^{gP-+;7HagGa%?H;u3H ze!c#sE$vrwhBf)YsCLBe|P|BtJ4 zh?1=f)@>Po*|vSkwr$(CZQHi3Q?_l})+xK{<$bL?ZYNuNWM}8fu_9u|{5n@j7d_#v z_4lE`A@xThFxpY2w^|G&dbjI*Ba_=kBI~fOT|H#$3dYWJq@CkR&s9CXGlGfg3QqH` zsiT2G9KlNX(!2!9vKe@MWcw1;Fj29YhAj;Z*L&nXi*Pi)$+oB!_3ix~bVT7k&YQEC z-h*W<96&{LMx0gkx93AIp8046O?~piZlQTp^hGbT^(yll7(_X`WpJ?fH3A`cPa~X$ zSXUO|#f&ISd0$!al=(fnCJHP$rDerI{x-nG>*}f%?z5tsgC5{L>&=r^1g3D9=$aC< zeNPWQM;H1$P1zyF@jwmpA90ePt!NXID8pH&xw#NlX(a6&Hg6vVe0z)kaW*p-$%>Uw z#!J@k_?Rfd-*r9#S*bQNU zEV9|A*cBv&2c`X^uYwFhvNZW5_;x|6T?%(G#w!YxWE^-NZCiVn<3YF0^I4Et*`AjY zU5VQQ6DRD*lfU9eNoI|?JuqGqYEY8C4XH#apYJ6y@-IPnpC^3-?K)xM)k-*#%v{-Z+{<^2@7 z(j!b8CjL|HWm${`)Pe<1EYuaUkY>YT{_Pk6E-pE7K}4iwoeXo@LHZ)NNA`L_p_wAV zLJ~nHjsR#w=6#64%@KvfW;LRBt~94y5x#AMBGjv2Y_GbiJ98Sms3*x{^dDnO+TRha z9in5*O8~;<(k*oi&^;Iu zF<(wF6yQJ$sbyUBP)2AnC;RLq!SB#sR3`nuaRtRp>wx>B$|JU(uOJVxf~}~0CgQ+; zYRMrJS*z{f6(TnwyJf_?kl%E|98pE<-9=tPHe29J32}zMLjI#mv@hoQ3V2DLTTENo zvLMu}V^AVkX|Q9%we60!O7v}LOfex&5b^vFIzVx-(|kD?i(Jd9zqTSezTj$=-DScV>xiq>j(T?nmkhn0A z8-DDZv5xE8==&!3u5zRHN5rf>;K_s9K-Ye%q0IJfp%YfC`CZKPf!z+|^<2^)Y?FfU z#wNa}8yG=>5d_j4-Sr|aN^A6ecQenscJ8AuuSFhDCsF^Ga|%XMUvmZ`jox&;trnxl z=oMk=$gJgS6rS7Ml1&_SiSRICL*ER1zPCU1{b(%`5u@Wtz##^a@XfYa|C)i#?NHFd zpjo!qazBXYG9)UZe~`i9--zQ`1l=<9on3wJ_O4Tkk-+)Rpm&Ei?VaZ5Rk=3tZy|^( z4Igtz)hw1%YZpY$>#MKqxZLfYL)3WK7di&;P9}NF$PfvZRe@B|3`C{A zb~Imb5{IsAk9bqMf#J3eTYi>{MyWc|)_?7tssr7P*ilG9)yI>}qYrBs6@{Wg!)RA* z4XdR`+E4|?4~$?8__pVV#x)`1W;?CafL1IAM$F$<#_O(U!WnaF+e?nRAQ4nrXSafe z>r2jU2XH-o9I=TzN7X zp=(jxz0p(U-&&C=aGnH*=$|JtdqYra&oIrev0zcme?Sz62t>3%qRJunUHIzQ4^X}4 z#tRRKPNI4a#(;}Yc_vG3OTM*o1PbT`amB29#`)}9mC0rOPwx4kpFV@`UnPlsIdzj0 z4fyH!YI6Q3g%?1Yh{?N?L~Wa{@o+$2r2$H0;<&#m>j`sBW@mPAXjV%#8#=9eFQIq? zb?7B5)!&w5lH@?bvy+`<*{^#~ufmz^4cN*}lP&TMCNXMYG!&VH8TF$qVCrj3deC+^ zeB?2#$GD|mDF5UkEc-YyI@d^&(NHiWisZ&(ry;U`LSpy9P-;##b!396Pa%E=kWukQ zj}-K{kJrpi&b1RS^ok!<&B;|YSqjM9(v^XL4zN}8cw$3@C))`7E*uz}N;QzE>#_f# zv`&%zPaV|zm&v0uhv1ICgVx9d#c@|L$3i|I!;@6pN_zz6EX86D`c#n&&TPB$$WmrV zB?lo1uwq?Gw3SZxf#^8dP3a&1wGsZ0s6$HKu%T=2v&2&z;GrdlJQO3=dJF&bP?O@r zYlw}UK?>(>iG={>3P_DrK&l$9S<79ap$U5W39N1P3z_I)~{EOKl5hgSWe@C2Uhg*evETQYiQgGWj9Rd9(gy!+Ja{9u& zj`@MuXE9x8r zu;t9wxNmCmd?M93e|L#EfyEw+SNY+!Au=IKdhcvYtoZRKi+p-`4#$P%5^i+ZxiKat zxJ`qbLmX!=5%hi;S%JT8o7>(*N<2HX;6PGA*PmwU8o1W*wR(5(^fe|#*NGJYs`79z zr+YjJZFMfyzp}CjQ;&XwiGV0xAJTI-cdxEU%|ORNCp#n9?LgqDS12|{xBk0xfDZ@p z6~vUdpgTIgF+#Me{REkEY7^X^-f<0`$Q&x#dAn>SJ3&K~)@)<9Io<{K#V z0uJ){BCY%OW$yJC9NwTwBJ?=D`sO0zUhp0|bK}+xy?IBUm>b#~G{>Zo$Jl z5cCMbl&Wl7F-R=b_=uAd)}}h2QL1;Rokfn^ay1?a?5onVA@=?nn+~(HvuiD~A@jDO zNK*BvE}dWnp*xr|5RT);J6aI6JZ1Re!PGesiFm+%=Lh|vIj#lrS zBxRyDIBk8NVUJ%6O+HB{8(VViI8b$!u-mUT%Ja<&hW44yg zk^z^kF4lQ8f$kWBcK8B~3%PK0`!3<4zUL9xfgFZQHlGAs1#`1a3YOrmN{4InQJju5 zojk$n2xG36e6(gGR46JQO)h0HzCJanr_*eL`{+)md#H5TgA1DesrgTL7n3roMEtcC z4KA>~m@n4nk8xOCzTym4wqtHisxZ}w=xO}qL?nhgv@)zAhXA(lH#)t)@Ik}0a==+; zd?DjZURBo=n8TLS*ZW4VDDRtbrhNq;Sl;${LoP++k)r?zssSon=N$jjF6D9#_qF5-$5d=r zL<&0F6hKjy9Z;oZr*$=VIOPe;!4vG9S?CsDdUi^M8K5t5(wJOl0wy!7AG`8g)D>zP z9W2-GIu0GJ%}3iaEbHhsSNLgkv{#gU3~>z=1j{YM3Fm}^gGC{5w5e21(B0l-{sObnpZ+>YOB<)ic#h z$HFr>{rQwG08(~m5E+d<9FtZrUab2yDvHxi5Nyx)jChn-UD!@bOYs-Q-_sZcdHeh+ z&r4Z(5AoQ=^TPo{VRS@dv+2^ZM93nT@~gAHZ0b}*CHS4u7Cu9~bez+*_pfyYby*3z zG-`neWUb_JtIdwsnFYTZZgD?4UOeI*#|g}ei6^=9BG6;ecQgM~Mpv{JDb~P!B4~$+ z)OU$>Z&TR(!Xw61~LQ4?+c39b9qpX@w!M6#w3Jd^&THSq6Ztol#qkG*g4=;#m%O zspD>bj>w@@KBo9w6puxIRJ4%cOq}Zxr2I+)brzyh8ev!fYiezUtx*+ppnUc}12~&ME%ls4h^Ep^$az z*0>WgC%xnT%lb(E?lF5Un@r5Bh&pBer>62+si3NUYxfB~48K7irSt10YRCn@+p@L_c%F zhq0oYa%((9nRzr*OgA=LO=77iXzpJ?C0Haw2>WBBO)Ter?jHX?Ya*flqS-u(zyz$K zx>t3z`<>6;TGiad!6q->7n6toRi0@!!qj$3V7sxtS(AigowYb!BRS=kw)M2`^NQDB zS6x!^SORQkdr4l2-Q1KqlD@HXFUWKjevfdPAOCCm^M0%kDVeqT)R{AVW~$9{)YleI zKrx5x*JE3~jDFh7S~>F{opxqAo4h%g#+S~@YE9E&ukL1OcP2x2V)=8cVDK}3)I)Br z*wAf@B&v-G{Y`BqnWxh9P2>BS@)K>FspZ7!t1O3pwYK5&4e(r_UjJR8 zs>EsjYu#;+pQ)XFLT($I9U@isObiM)t)oVIMc&2O2JOYql>vBPCJXDA%j7eYu3sCG zED@q$gOR%Hs&;WumYcE}AF&=-HkI;gH^o98a?~ zRhB=XrD^g4|BsF$O0;2_?e;3Ad)-$@%TVr}w))n4$Gq8Ct`f3?z6~GX)SQ`W)g;qk zeB?F22dVJ5pRjAqqdL`SbX7vtXkck(-7njkHma0OoKcUhY-@FLR?o4gumtcYFHdvz z@DvY&P30jeWVC=yzC8P@X4*D}s;Zh%a}7oXuyEUH9Lr;frRsq2jaGct{4Bm*Q|Mh= zn15ObS}tYnQ*SI$(wIKt$@Hd z#jj4}w`i)F&h+Mx-jv~I?g_Nz*2DIa-VAov^t12pPv)qpVai>|Z@uRz+kH*Kq)Js3 zFl$=|FXg2_K4;h1jWVoDC6jsDQcwK|=hW0_rg-Y@3h@O|v1gY^SW9Js0d9_xCas=b z(@{sknyTa%JiwUjgob7Je<8Txh1u?C&0?~xhX9%O z7%f+>r^Abns!FsIR}Z)U*i%oQ0pAUqfxsNcnAG|WoeclN1V3Fn+DV)BA023M1o3lK zL~H9E?1?Oe58+Fh8=W=Oh4JizN%MgGpFgj^=LUJGYm&Wrw8=FQlpV58*_w5VJtM@m z9K-?a0K12@cAmYw{AfL}`J02QN0vZNK;mj$b978BA0q1bQ~>hhbac&lsIjslIWJQb z=MH(>h^I08LQc74iv#FNnT@M`q5C?&%<=QiYA@B9B;U`!Q)3TiNp{SGaLHG*&K?~9 zeu8dAbRuWxP?ggppIAln1n*eh7lC@4UR8mbtJHsr_7cfh>tnI!s%Z>18nCI_aj>ns zIREgooR6Zkz_q&qRll<78g)1gID4I%WiLO5$acv$sK-A+kE2V-v8I5|UNm_(af59hC3p@B7Vdux?0y&Gcl6Ej}8wMnyi zmsceE4{fKUHn0a*9736uN%vnWE{HA$XR`@wBwWd5YXGU(Xa=#n;zH z&h)X*txCSOMkQ=qb|yX)SkN>Gw>t7{EkXDVLAF8NR?cm|wR2Qu0HX0|Z<1R4)r7b4 z3T8aDS0F4`kxE>p0k0osv#Ysk8;qF2z+|0=zy}PDCyYwMvFZMn&tb~ufuejFb3y?F-Llw%>fum0${iFXF&MR?4Z25RfO4S`o z*3?G{udisQ%2cY-t19XF1O(M!Y*P-Sf2G5To{TlM;y~!$kw>#w?Sujw!@q@QCR(md z%XQlx02!u|(ib?xm2GmcZVHWZW}VSTq1vGQ_W4f=aBdCI5PMJ*!{$_t9Mnv|tWPTW z0c9B-dXZc%V=+_6x^{-7Ej93}emBvcZt&ELbGLUXqn+5&2v~-*&|W6W zat1ytV3wz44fW(Anfd^&_doN)w%-7bX=1FH{HR%jxLRY3#l7hbNZ;(?4dYIgh z7emD!jr?Nv0CvotQlBZ8pEJK zKv;B(-T=u(%`*Zo%#V?ux>-FH1S_j2Ui4VN71+Afo=BhXF#6{@1*J!ow(}od9Ih4Dtr{!{PMRfXaYLpJBQC9ELvOtx z(TAN1$jaq489cVxvo3TvvhIdMcYvHYqh_Bs=+1j|1bOZlIR6->dh4dkzJE%?yHwyZ zCS)i0t99~<5solWghu?oy$!haGi`At&U5gTGxbp=chX|Pbk@%rozTiMR?V<Q6eHdCLP9 zwx=jzpJ5wLKeu-)4%6f1zs>w9n^iQj-7@$gre&cuWnEwep)%aKjkZv~yJnn``M1Ci z7hbHJy;z?}MU#xQ%#rslHz@Fu!d_lD3qeyt*U#5Z9=mI5o0*Pw7<20h<*n}EUToFm z><9(Coe9A0oBd+@?^Ihc2zUc-m_I@M^ge6flX=?z3=9mq8NDI=M~4U{zEyy>;L6H6 zED>PR%5#ibas_T$F@8GIpX}8qsBWVug57>bO83wO!$BU1%|fInI8DX6l;gHLz+VXabr7C;)) z*@$eC`Ndg)w_m=2=~iE=<^k~v-&=*=uGvzAz1X9HW*HyAGPu4zd8G|LDFX8#@!Pxy}q+y?g!M@V#f*=x_ViL(FcOJ)6KqmK3IOhzIIvERh zPWeNXZAoDBtS@qIucdYQg7uqGfhFXa#Q9cocSTQ3Rw z3)lzlBKEAY$$^`q*I0$85F=<4+r+B?9o;&;{gb!-*d;!!{v%z9gzhQ2cPe@b%p1qW z07A^znm~V8RjvzTA2qeEtNd$6ykZn|kXju0u`GJ)`JDIwstztpG~zz7!# zHsm9Lz$ZfK3)^`a!s1*!ANwNQEr(P()GXR+BffkGjJwQYXaw2si{yDOv6aa*^i=!Z z$H+V%2b*|NMk(v`s;6UG`u+g>zgsx42g!-~$N%W27c5)%tHTk?KK*p_hV^8{5HyL% z@>Ulg6vVMYY>yDH?r9?YFrYL8^GBD$7!1C8F}^D=u>ay7hPVg{Y52mQNhz;M{b+OxQ|0 zNBHy2jk08W`+J-_+dKMmx4ylP_jw{8;NnZc+(om>WDL$Nd>WZmMrS<4kYAjVYSVXc zq{zhNX@efXnhF^X%Ib0&hg^Vd+D#X);10q46$)OF9UEi?mKKJj2kSMW6`6+7Y|5ru zMtUoly^cyl#)k74*iibz^s#>S6!)*LHLbGy?_LH=u-dJ*`7jh;Dh!04E4^TTCg$nW zg&Jjc0LcK|57JJOQHv$>)T9^U$EmMTY6qn#`#c16N!fe`(~Yl!?>C`@4$SdIg5)(<9iywn92-=NKB&gzOVO zww5GdA{M<`8HjtW>yyGZv9_{NpC+l&?)j^D)5`HHt8JU`?oNuWQ!B~3!E(j|qFqmT z2=8PQD&J))zVV=?m=W24)|m2=UmGDqSNolN)J%=_M7 zf_wf>VI;{F(!!il9`o)rh6m=ffsEf9N{HYj_^x_-5Plvd9LwjCl9+v0%pUpsBGXOG zJwJYwNfUHLwE1ApT;UKruQuH1|LGv-#4UTe?arWB*;bRpV9L@rf-ox-_aTf>mH?EH(>Kxba4_iYo<~2cuPiyXuGPJmnQ6=~ z^9O7@hrZ;J1~m23KUVD8񧱭W2YF9jfTYIwI7MtBNvWOTz8Q*MBva)POjDPS( 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%0AYm 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⩔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

~*O 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≺uwJpth`>k?0VzJTV2Z0StrhUHkp-WsIP82 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

sbkfY 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⁢I+U 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%0D2blorCNs~LExA=a(`FW4Sdcu_llO= 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

fJ7bbwbQc!lr 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

joy3nvp5KEsin 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

i~7aM{d(9U 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≻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 Y@gOD9=7LZiu$ZS5jz= +Date: Mon, 27 Jun 2022 12:02:49 +0200 +Subject: [PATCH] Support newer JDKs for building + +Apparently the ancient version of lombok used +by a dependency is not compatible with newer +versions of java. As Vault proper did not make +use of lombok, it can be safely removed without +declaring an alternative. + +This commit allows Vault to build under Java 17. +--- + pom.xml | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/pom.xml b/pom.xml +index 5b8a6dfd..17c189fd 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -324,6 +324,12 @@ Vault currently supports the following: Permissions 3, PEX, GroupManager, bPerms + craftconomy3 + 3.2.2-SNAPSHOT + true ++ ++ ++ org.projectlombok ++ lombok ++ ++ + + + net.crystalyx.bukkit.simplyperms diff --git a/user/papermc-plugin-vault/823_add-option-to-silence-no-update-logs.patch b/user/papermc-plugin-vault/823_add-option-to-silence-no-update-logs.patch new file mode 100644 index 0000000..7cb7ba1 --- /dev/null +++ b/user/papermc-plugin-vault/823_add-option-to-silence-no-update-logs.patch @@ -0,0 +1,37 @@ +From 52df9d3287e8d593d0e4d999c6d5daaebe947ca1 Mon Sep 17 00:00:00 2001 +From: Ricardo Boss +Date: Tue, 28 Jun 2022 18:50:18 +0200 +Subject: [PATCH] Add option to silence "no update" logs (#823) + +* Added "silent-no-update" config option + +Added switch to turn off messages if no update is available. + +* Set default value for "silent-no-update" + +* Removed any "no update available" option and message +--- + src/net/milkbowl/vault/Vault.java | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/net/milkbowl/vault/Vault.java b/src/net/milkbowl/vault/Vault.java +index ef8b5578..fd2a9787 100644 +--- a/src/net/milkbowl/vault/Vault.java ++++ b/src/net/milkbowl/vault/Vault.java +@@ -171,8 +171,6 @@ public void run() { + log.warning("Update at: https://dev.bukkit.org/projects/vault"); + } else if (currentVersion > newVersion) { + log.info("Stable Version: " + newVersionTitle + " | Current Version: " + currentVersionTitle); +- } else { +- log.info("No new version available"); + } + } catch (Exception e) { + // ignore exceptions +@@ -182,7 +180,6 @@ public void run() { + }, 0, 432000); + + } +- + }); + + // Load up the Plugin metrics diff --git a/user/papermc-plugin-vault/868_update-bstats.patch b/user/papermc-plugin-vault/868_update-bstats.patch new file mode 100644 index 0000000..2ce8023 --- /dev/null +++ b/user/papermc-plugin-vault/868_update-bstats.patch @@ -0,0 +1,72 @@ +From 3f20655f0b1b9c7a0f69eb241c5bedd8e748b5c9 Mon Sep 17 00:00:00 2001 +From: Leonardo Di Gianfelice Stornelli + +Date: Tue, 28 Jun 2022 00:34:40 +0200 +Subject: [PATCH] Update bStats (#868) + +--- + pom.xml | 2 +- + src/net/milkbowl/vault/Vault.java | 9 +++++---- + 2 files changed, 6 insertions(+), 5 deletions(-) + +diff --git a/pom.xml b/pom.xml +index 17c189fd..ccd8cde4 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -85,7 +85,7 @@ Vault currently supports the following: Permissions 3, PEX, GroupManager, bPerms + + org.bstats + bstats-bukkit +- 1.5 ++ 3.0.0 + + + com.gmail.bleedobsidian.miconomy +diff --git a/src/net/milkbowl/vault/Vault.java b/src/net/milkbowl/vault/Vault.java +index 30f6f17f..ef8b5578 100644 +--- a/src/net/milkbowl/vault/Vault.java ++++ b/src/net/milkbowl/vault/Vault.java +@@ -78,6 +78,7 @@ + import net.milkbowl.vault.permission.plugins.Permission_KPerms; + + import org.bstats.bukkit.Metrics; ++import org.bstats.charts.SimplePie; + import org.bukkit.Bukkit; + import org.bukkit.OfflinePlayer; + import org.bukkit.command.Command; +@@ -185,7 +186,7 @@ public void run() { + }); + + // Load up the Plugin metrics +- Metrics metrics = new Metrics(this); ++ Metrics metrics = new Metrics(this, 887); + findCustomData(metrics); + + log.info(String.format("Enabled Version %s", getDescription().getVersion())); +@@ -581,7 +582,7 @@ private void findCustomData(Metrics metrics) { + econ = rspEcon.getProvider(); + } + final String econName = econ != null ? econ.getName() : "No Economy"; +- metrics.addCustomChart(new Metrics.SimplePie("economy", new Callable() { ++ metrics.addCustomChart(new SimplePie("economy", new Callable() { + @Override + public String call() { + return econName; +@@ -590,7 +591,7 @@ public String call() { + + // Create our Permission Graph and Add our permission Plotters + final String permName = Bukkit.getServer().getServicesManager().getRegistration(Permission.class).getProvider().getName(); +- metrics.addCustomChart(new Metrics.SimplePie("permission", new Callable() { ++ metrics.addCustomChart(new SimplePie("permission", new Callable() { + @Override + public String call() { + return permName; +@@ -604,7 +605,7 @@ public String call() { + chat = rspChat.getProvider(); + } + final String chatName = chat != null ? chat.getName() : "No Chat"; +- metrics.addCustomChart(new Metrics.SimplePie("chat", new Callable() { ++ metrics.addCustomChart(new SimplePie("chat", new Callable() { + @Override + public String call() { + return chatName; diff --git a/user/papermc-plugin-vault/APKBUILD b/user/papermc-plugin-vault/APKBUILD new file mode 100644 index 0000000..dbb0be1 --- /dev/null +++ b/user/papermc-plugin-vault/APKBUILD @@ -0,0 +1,42 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=papermc-plugin-vault +pkgver=1.7.3 +pkgrel=0 +pkgdesc="Vault of common APIs for Bukkit Plugins" +arch='noarch' +url="https://github.com/MilkBowl/Vault" +license="MIT" +depends="papermc>=1.8.8" +makedepends=" + openjdk21-jdk + maven +" +source=" + vault-$pkgver.tar.gz::https://github.com/MilkBowl/Vault/archive/refs/tags/1.7.3.tar.gz + 2022cb0_support-newer-jdk-for-building.patch + 868_update-bstats.patch + 823_add-option-to-silence-no-update-logs.patch + 1996cfa_finish-removal-native-support-for-abandonned-economy-plugins.patch + " +builddir="$srcdir"/Vault-$pkgver + +build() { + mvn compile + mvn package +} + +check() { + mvn test +} + +package() { + install -Dm644 "$builddir"/target/Vault-$pkgver.jar "$pkgdir/var/lib/papermc/plugins/Vault.jar" +} +sha512sums=" +3d154945e63b7824f0a0e0900fe6db7dc77c97f1967c29760d27a3322ca0b95d76965d8574c24b7cc0e86e822f9b5e3f860cb7167796351c9a921ddf5ef3d36b vault-1.7.3.tar.gz +8b7197b25acf06e545f10dd7dc5447aab6a73d3455bf89b01a4b466331eefa77c86152a47818348cfb901a0d65cff115b75ae37e0f8bb702c35cf13a3942a484 2022cb0_support-newer-jdk-for-building.patch +9124d0feef633f405c3aea6081d4b749df9828d99d0c93d09ba52adb680a781288523d2dfc71be566b8cafd58ac97f152258174ab02294c6e97020a033ee0faa 868_update-bstats.patch +b76b385ff62a955430db8d4d60592983e7475e1e63cd6a9e8c0be0a035662ec4472c6f9c8f09125745c198074695b3e04fe6ad96cbafa5faaba72bcf1bfee896 823_add-option-to-silence-no-update-logs.patch +ea5e36649e65ca690fd8a075bb5f251a8b449ab780a546007e242ec465c58c8c5ae346efac5f1b52e3287f4f400c658f745d130d1e361ecca3436dcf5cb46fb5 1996cfa_finish-removal-native-support-for-abandonned-economy-plugins.patch +" From 382b03e3f2463b759d214ffc3765c87813183bb5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 24 Dec 2024 14:24:37 -0500 Subject: [PATCH 098/313] user/papermc-plugin-luckperms: move from unmaintained, upgrade to 5.4.151, add build function --- .../craftbukkit-plugin-luckperms/APKBUILD | 23 ------------- user/papermc-plugin-luckperms/APKBUILD | 34 +++++++++++++++++++ 2 files changed, 34 insertions(+), 23 deletions(-) delete mode 100644 unmaintained/craftbukkit-plugin-luckperms/APKBUILD create mode 100644 user/papermc-plugin-luckperms/APKBUILD diff --git a/unmaintained/craftbukkit-plugin-luckperms/APKBUILD b/unmaintained/craftbukkit-plugin-luckperms/APKBUILD deleted file mode 100644 index 1ef75e9..0000000 --- a/unmaintained/craftbukkit-plugin-luckperms/APKBUILD +++ /dev/null @@ -1,23 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=craftbukkit-plugin-luckperms -_pkgver=5.3.89 -_buildver=1389 -pkgver=$_pkgver.$_buildver -pkgrel=1 -pkgdesc="An advanced permissions plugin for Bukkit/Spigot, BungeeCord and Sponge." -options=!check -arch='noarch' -url="https://github.com/lucko/LuckPerms" -license="MIT" -depends="craftbukkit>=1.8.8 craftbukkit<=1.18.1" -source="https://ci.lucko.me/job/LuckPerms/$_buildver/artifact/bukkit/loader/build/libs/LuckPerms-Bukkit-$_pkgver.jar" - -package() { - install -Dm644 "$srcdir"/LuckPerms-Bukkit-$_pkgver.jar "$pkgdir/var/lib/craftbukkit/plugins/LuckPerms.jar" - chown craftbukkit:craftbukkit "$pkgdir"/var/lib/craftbukkit/plugins/LuckPerms.jar -} -sha512sums=" -7e146616cdf7f667c483bbe2112439c85f32427e9aa3714f0b0e869abf0cde6aacc7341d8d9e6a72ddcf8f35af840f4ba678c4690222912113f497cafce11154 LuckPerms-Bukkit-5.3.89.jar -" diff --git a/user/papermc-plugin-luckperms/APKBUILD b/user/papermc-plugin-luckperms/APKBUILD new file mode 100644 index 0000000..4de9ddb --- /dev/null +++ b/user/papermc-plugin-luckperms/APKBUILD @@ -0,0 +1,34 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=papermc-plugin-luckperms +pkgver=5.4.151 +_gittag=0fef481d480737528491fc0b3b8487eb1612f955 +pkgrel=0 +pkgdesc="An advanced permissions plugin for Bukkit/Spigot, BungeeCord and Sponge." +arch='noarch' +url="https://github.com/lucko/LuckPerms" +license="MIT" +depends="papermc>=1.8.8" +makedepends="openjdk21-jdk" +source="$pkgname-$_gittag.tar.gz::https://github.com/LuckPerms/LuckPerms/archive/$_gittag.tar.gz" +builddir="$srcdir"/LuckPerms-$_gittag + +prepare() { + default_prepare + sed -i "s|project.ext.patchVersion = determinePatchVersion()|project.ext.patchVersion = '${pkgver##*.}'|" build.gradle +} + +build() { + ./gradlew build +} + +check() { + ./gradlew test +} + +package() { + install -Dm644 "$builddir"/bukkit/loader/build/libs/LuckPerms-Bukkit-*.jar "$pkgdir/var/lib/papermc/plugins/LuckPerms.jar" +} +sha512sums=" +e016d2a161472974cc75151e1a6cb3495881d4db7e0aa75d81a1c54fd16d191fe721b1f9fadeaac0bef7ec4a7c47329a2cf367cf3a7577b284077ec173db0579 papermc-plugin-luckperms-0fef481d480737528491fc0b3b8487eb1612f955.tar.gz +" From d31452f43a8b7b301e6284cd27e2afaf0445610b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 24 Dec 2024 14:39:28 -0500 Subject: [PATCH 099/313] user/papermc-plugin-worldguard: move from unmaintained, upgrade to 7.0.13_beta1, add build function --- .../craftbukkit-plugin-worldguard/APKBUILD | 22 -------------- user/papermc-plugin-worldguard/APKBUILD | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) delete mode 100644 unmaintained/craftbukkit-plugin-worldguard/APKBUILD create mode 100644 user/papermc-plugin-worldguard/APKBUILD diff --git a/unmaintained/craftbukkit-plugin-worldguard/APKBUILD b/unmaintained/craftbukkit-plugin-worldguard/APKBUILD deleted file mode 100644 index 478480b..0000000 --- a/unmaintained/craftbukkit-plugin-worldguard/APKBUILD +++ /dev/null @@ -1,22 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=craftbukkit-plugin-worldedit -pkgver=7.0.6 -_pkgver=$pkgver -pkgrel=3 -pkgdesc="WorldGuard lets you and players guard areas of land against griefers and undesirables" -options=!check -arch='noarch' -url="https://dev.bukkit.org/projects/worldguard" -license="GPL-3.0" -depends="craftbukkit>=1.17.0 craftbukkit<=1.18.1" -source="https://media.forgecdn.net/files/3461/546/worldguard-bukkit-7.0.6-dist.jar" - -package() { - install -Dm644 "$srcdir"/worldguard-bukkit-$_pkgver-dist.jar "$pkgdir/var/lib/craftbukkit/plugins/WorldGuard.jar" - chown craftbukkit:craftbukkit $pkgdir/var/lib/craftbukkit/plugins/WorldGuard.jar -} -sha512sums=" -f2f857ffbbe7896b8986d5944564d7ab01e51d86476e05c66067a57d83dcb2ee60019ab9d75b16d551e9cfe102d29a602de41f316da57d7743d2595d6a11d839 worldguard-bukkit-7.0.6-dist.jar -" diff --git a/user/papermc-plugin-worldguard/APKBUILD b/user/papermc-plugin-worldguard/APKBUILD new file mode 100644 index 0000000..4fb9957 --- /dev/null +++ b/user/papermc-plugin-worldguard/APKBUILD @@ -0,0 +1,29 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=papermc-plugin-worldguard +pkgver=7.0.13_beta1 +_gittag=2f13ae0444409376feb6c7674591142fe854e12e +pkgrel=0 +pkgdesc="WorldGuard lets you and players guard areas of land against griefers and undesirables" +arch='noarch' +url="https://github.com/EngineHub/WorldGuard" +license="GPL-3.0" +depends="papermc>=1.17.0" +makedepends="openjdk21-jdk" +source="$pkgname-$_gittag.tar.gz::https://github.com/EngineHub/WorldGuard/archive/$_gittag.tar.gz" +builddir="$srcdir"/WorldGuard-$_gittag + +build() { + ./gradlew build +} + +check() { + ./gradlew test +} + +package() { + install -Dm644 "$builddir"/worldguard-bukkit/build/libs/worldguard-bukkit-*dist.jar "$pkgdir/var/lib/papermc/plugins/WorldGuard.jar" +} +sha512sums=" +755646330c17df22b1d4eb6f38fc8ea712eff86a0165f2dba6dc1bcd420d2d112547adf60a35f268f45730b8444e540d7d08a02a50df0238bf16c9ff7dc799ff papermc-plugin-worldguard-2f13ae0444409376feb6c7674591142fe854e12e.tar.gz +" From 5d3ff7043caeb66eaa4e240e011de313cba49aaf Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 24 Dec 2024 14:32:59 -0500 Subject: [PATCH 100/313] user/papermc-plugin-worldedit: move from unmaintained, upgrade to 7.3.9, add build function --- .../craftbukkit-plugin-worldedit/APKBUILD | 22 -------------- user/papermc-plugin-worldedit/APKBUILD | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) delete mode 100644 unmaintained/craftbukkit-plugin-worldedit/APKBUILD create mode 100644 user/papermc-plugin-worldedit/APKBUILD diff --git a/unmaintained/craftbukkit-plugin-worldedit/APKBUILD b/unmaintained/craftbukkit-plugin-worldedit/APKBUILD deleted file mode 100644 index 6ee40e2..0000000 --- a/unmaintained/craftbukkit-plugin-worldedit/APKBUILD +++ /dev/null @@ -1,22 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=craftbukkit-plugin-worldedit -pkgver=7.2.8 -_pkgver=$pkgver -pkgrel=1 -pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" -options=!check -arch='noarch' -url="https://dev.bukkit.org/projects/worldedit" -license="GPL-3.0" -depends="craftbukkit>=1.13.2 craftbukkit<=1.18.1" -source="https://media.forgecdn.net/files/3559/523/worldedit-bukkit-7.2.8.jar" - -package() { - install -Dm644 "$srcdir"/worldedit-bukkit-$_pkgver.jar "$pkgdir/var/lib/craftbukkit/plugins/WorldEdit.jar" - chown craftbukkit:craftbukkit $pkgdir/var/lib/craftbukkit/plugins/WorldEdit.jar -} -sha512sums=" -b57eacf7a2d90461f996f71cf55aa2e328d7b75c724291f11bcd1ab0f7e64e980db7ae3a2a56fffdf2bc31bfbcf68dda89b7c6f2ffa32ee430b8016020d796e3 worldedit-bukkit-7.2.8.jar -" diff --git a/user/papermc-plugin-worldedit/APKBUILD b/user/papermc-plugin-worldedit/APKBUILD new file mode 100644 index 0000000..5634b03 --- /dev/null +++ b/user/papermc-plugin-worldedit/APKBUILD @@ -0,0 +1,29 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=papermc-plugin-worldedit +pkgver=7.3.9 +_pkgver=$pkgver +pkgrel=0 +pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" +arch='noarch !aarch64' +url="https://github.com/EngineHub/WorldEdit" +license="GPL-3.0" +depends="papermc>=1.13.2" +makedepends="openjdk21-jdk" +source="$pkgname-$pkgver.tar.gz::https://github.com/EngineHub/WorldEdit/archive/refs/tags/$pkgver.tar.gz" +builddir="$srcdir"/WorldEdit-$pkgver + +build() { + ./gradlew build --parallel +} + +check() { + ./gradlew test +} + +package() { + install -Dm644 "$builddir"/worldedit-bukkit/build/libs/worldedit-bukkit-$pkgver.jar "$pkgdir/var/lib/papermc/plugins/WorldEdit.jar" +} +sha512sums=" +35eb83dfcd192884a86f9bec3cbe586af6141b8c10461937b2ef112bfb4d64f5f7c6e950108a7893dc5b1054f1d0206f74ec6b4702481c0da69bf89627dbfb06 papermc-plugin-worldedit-7.3.9.tar.gz +" From 0a990a5021a33e8b3fa797d67a60bf80a35c0cc7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 26 Dec 2024 01:26:01 -0500 Subject: [PATCH 101/313] user/papermc-plugin-essentialsx: move from unmaintained, upgrade to 2.21.0_pre151, add build function --- .../craftbukkit-plugin-essentialsx/APKBUILD | 108 ------------------ user/papermc-plugin-essentialsx/APKBUILD | 79 +++++++++++++ 2 files changed, 79 insertions(+), 108 deletions(-) delete mode 100644 unmaintained/craftbukkit-plugin-essentialsx/APKBUILD create mode 100644 user/papermc-plugin-essentialsx/APKBUILD diff --git a/unmaintained/craftbukkit-plugin-essentialsx/APKBUILD b/unmaintained/craftbukkit-plugin-essentialsx/APKBUILD deleted file mode 100644 index 9848a42..0000000 --- a/unmaintained/craftbukkit-plugin-essentialsx/APKBUILD +++ /dev/null @@ -1,108 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=craftbukkit-plugin-essentialx -_pkgver=2.19.2 -_buildver=release -_buildcommit=0 -pkgrel=2 -pkgdesc="EssentialsX is the essential plugin suite for Minecraft servers, with over 130 commands for servers of all size and scale." -options=!check -arch='noarch' -url="https://essentialsx.net/" -license="GPL-3.0" -depends="craftbukkit>=1.8.8 craftbukkit<=1.18.1" - -if _buildver=release; then - pkgver=$_pkgver - _url=https://github.com/EssentialsX/Essentials/releases/download/$pkgver - _filename="$pkgver.jar" -else - pkgver=$_pkgver.$_buildver - _url=https://ci.ender.zone/job/EssentialsX/lastSuccessfulBuild/artifact/jars - _filename="$_pkgver-dev+$_buildver-$_buildcommit.jar" -fi - -source=" - $_url/EssentialsX-$_filename - $_url/EssentialsXChat-$_filename - $_url/EssentialsXSpawn-$_filename - $_url/EssentialsXAntiBuild-$_filename - $_url/EssentialsXDiscord-$_filename - $_url/EssentialsXGeoIP-$_filename - $_url/EssentialsXProtect-$_filename - $_url/EssentialsXXMPP-$_filename -" - -subpackages="$pkgname-core $pkgname-chat $pkgname-spawn $pkgname-antibuild $pkgname-discord $pkgname-geo $pkgname-protect $pkgname-xmpp" - - -package() { - mkdir -p "$pkgdir" -} - -core() { - pkgdesc="Core functionality: teleports, private messages, homes, warps and more" - install -Dm644 "$srcdir"/EssentialsX-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/Essentials.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/Essentials.jar -} - -chat() { - pkgdesc="Chat formatting, local chat" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXChat-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsChat.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsChat.jar -} - -spawn() { - pkgdesc="Spawnpoint control, per-player spawns" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXSpawn-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsSpawn.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsSpawn.jar -} - -antibuild() { - pkgdesc="Simple permissions-based building control" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXAntiBuild-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsAntiBuild.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsAntiBuild.jar -} - -discord() { - pkgdesc="Lightweight chat, messaging and command integration with Discord" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXDiscord-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsDiscord.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsDiscord.jar -} - -geo() { - pkgdesc="Geographical player lookup (formerly EssentialsX GeoIP)" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXGeoIP-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsGeo.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsGeo.jar -} - -protect() { - pkgdesc="Configurable world protection and control" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXProtect-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsProtect.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsProtect.jar -} - -xmpp() { - pkgdesc="Lightweight chat, messaging and server log integration with Jabber/XMPP services" - depends="$pkgname-core" - install -Dm644 "$srcdir"/EssentialsXXMPP-*.jar "$subpkgdir/var/lib/craftbukkit/plugins/EssentialsXMPP.jar" - chown craftbukkit:craftbukkit "$subpkgdir"/var/lib/craftbukkit/plugins/EssentialsXMPP.jar -} - -sha512sums=" -c91c0905c11482d93b1565f8b9dce7b6f939567b4cb2756b112ee408bdcca1fece04742f9b7b0876d5b2e84cebdbc555d35cf783e9e86ab12fafb9dc02bc6008 EssentialsX-2.19.2.jar -e2df6f242db38689579501b34763ad7d4b5e8ddd87b7b57956c6b5cc667f1b34af6b1289d668a64761da63f8ae8507eb9687ca490cc715a3eff6338770963240 EssentialsXChat-2.19.2.jar -24e41168428f20bd6506282b9920718c43f7e5227bf35e174522e49859e294048a1d979ae42044bdbdba45c8a1109f4db6ffd0e24d5f3e909d0f9a3ac31e21d3 EssentialsXSpawn-2.19.2.jar -326ec004241b526965cb67ae0f0245dfa960da2fdb4b59d867eb08e5196fceb468f9314cb838c8a0bc513cc55f43cf58023d11b18ed98e472be7089838538f97 EssentialsXAntiBuild-2.19.2.jar -211c575adde17c3f2f901144e5c31beb2918df7e6e15f8ebe16805d3b53214a4756b87ec84466790ebf1dacb41e1aea97b6a9ba8ed39e85092293a821044d579 EssentialsXDiscord-2.19.2.jar -7845e7666f983d3e793528a7085ced7c9f1bf881740bcc68b6a54fea74e31c3c0c2a52e26fc20330ba7d4a190dad0a1b27195fed0e1417a48494c5fa2ac60d92 EssentialsXGeoIP-2.19.2.jar -e74ed72a15b5e6cd3c5f61d032a26c151865e3197638c9059237dc2d1144b0cb15668545532fc532ac8ec247bdf9b9ee6843b8f4af7506aef86d155dd5672c5f EssentialsXProtect-2.19.2.jar -8d35009499557700f49c27ca3132e866f511a200791dbcfd2f595396977058cc2fc9349d0b4eaa0eb67b27331e91e6209df6ed57a766c06fd3b3325718462478 EssentialsXXMPP-2.19.2.jar -" diff --git a/user/papermc-plugin-essentialsx/APKBUILD b/user/papermc-plugin-essentialsx/APKBUILD new file mode 100644 index 0000000..a815212 --- /dev/null +++ b/user/papermc-plugin-essentialsx/APKBUILD @@ -0,0 +1,79 @@ +# Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) +pkgname=papermc-plugin-essentialsx +pkgver=2.21.0_pre151 +_gittag=f2af9528b0f99f2ff121dda2607e51d391a2a8bf +pkgrel=0 +pkgdesc="EssentialsX is the essential plugin suite for Minecraft servers, with over 130 commands for servers of all size and scale." +arch='noarch' +url="https://essentialsx.net/" +license="GPL-3.0" +depends=" + papermc>=1.8.8 + papermc-plugin-luckperms + papermc-plugin-vault +" +makedepends="openjdk21-jdk" +source="$pkgname-$_gittag.tar.gz::https://github.com/EssentialsX/Essentials/archive/$_gittag.tar.gz" +builddir="$srcdir"/Essentials-$_gittag + +subpackages="$pkgname-chat $pkgname-spawn $pkgname-antibuild $pkgname-discord $pkgname-geo $pkgname-protect $pkgname-xmpp" + +build() { + ./gradlew build +} + +check() { + ./gradlew test +} + +package() { + install -Dm644 "$builddir"/jars/EssentialsX-*.jar "$pkgdir/var/lib/papermc/plugins/Essentials.jar" +} + +chat() { + pkgdesc="Chat formatting, local chat" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXChat-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsChat.jar" +} + +spawn() { + pkgdesc="Spawnpoint control, per-player spawns" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXSpawn-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsSpawn.jar" +} + +antibuild() { + pkgdesc="Simple permissions-based building control" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXAntiBuild-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsAntiBuild.jar" +} + +discord() { + pkgdesc="Lightweight chat, messaging and command integration with Discord" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXDiscord-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsDiscord.jar" + install -Dm644 "$builddir"/jars/EssentialsXDiscordLink-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsDiscordLink.jar" +} + +geo() { + pkgdesc="Geographical player lookup (formerly EssentialsX GeoIP)" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXGeoIP-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsGeo.jar" +} + +protect() { + pkgdesc="Configurable world protection and control" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXProtect-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsProtect.jar" +} + +xmpp() { + pkgdesc="Lightweight chat, messaging and server log integration with Jabber/XMPP services" + depends="$pkgname" + install -Dm644 "$builddir"/jars/EssentialsXXMPP-*.jar "$subpkgdir/var/lib/papermc/plugins/EssentialsXMPP.jar" +} + +sha512sums=" +5fabf6b2091f7182ff23ca02e2f93ff22527668d55bbf60977ad414881c201bdc4608fe3618ca0d1312beb8fe8768f36cd792099817a0205f791ab2f9b212e04 papermc-plugin-essentialsx-f2af9528b0f99f2ff121dda2607e51d391a2a8bf.tar.gz +" From 648e4d3b84a465932c18ccab91e00ec49019c198 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 27 Dec 2024 22:07:17 -0500 Subject: [PATCH 102/313] forgejo-ci: make repository update never fail --- .forgejo/bin/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh index 8c732ec..d9e327f 100755 --- a/.forgejo/bin/build.sh +++ b/.forgejo/bin/build.sh @@ -108,7 +108,7 @@ set_repositories_for() { [ "$repo" = "$target_repo" ] && break done doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" - doas apk update + doas apk update || true } apply_offset_limit() { From aa7f92dd6ee10154a656ec8840a7b0156a886695 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 29 Dec 2024 14:27:41 -0500 Subject: [PATCH 103/313] README: update description to not mention LFS --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8a099df..255b3ee 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,14 @@ Upstream: https://ayakael.net/forge/ayaports This repository contains aports that are not yet merged in the official Alpine Linux repository or don’t adhere to Alpine polices. Packages are automatically -built using CI. Once built, they are deployed to a git-lfs repository, making +built using CI. Once built, they are deployed to a Forgejo repository, making them available to apk. Branches are matched to Alpine releases. ## Repositories -You can browse all the repositories at https://codeberg.org/ayakael/ayaports +You can browse all the repositories at https://ayakael.net/forge/ayaports Affixed to each repository description is the appropriate link for use in `/etc/apk/repositories`. From fafce64d027ca48ab7423b1b98f931733266cf16 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 4 Jan 2025 20:42:40 -0500 Subject: [PATCH 104/313] user/pinenote-dbus-service: new aport --- user/pinenote-dbus-service/APKBUILD | 34 +++++++++++++++++++++++ user/pinenote-dbus-service/pinenote.initd | 10 +++++++ 2 files changed, 44 insertions(+) create mode 100644 user/pinenote-dbus-service/APKBUILD create mode 100644 user/pinenote-dbus-service/pinenote.initd diff --git a/user/pinenote-dbus-service/APKBUILD b/user/pinenote-dbus-service/APKBUILD new file mode 100644 index 0000000..0312e65 --- /dev/null +++ b/user/pinenote-dbus-service/APKBUILD @@ -0,0 +1,34 @@ +# Maintainer: Petr Hodina +pkgname=pinenote-dbus-service +pkgver=0.2.2_pre5 +_gittag=0.2.2-dev5 +pkgrel=0 +pkgdesc="Dbus daemon for controlling driver aspects on Pine64 Pinenote" +url="https://github.com/m-weigand/pinenote_dbus_service" +arch="aarch64" +license="MIT" +makedepends="cargo" +depends="dbus-dev" +source=" + pinenote-dbus-service-$_gittag.tar.gz::https://github.com/m-weigand/pinenote_dbus_service/archive/refs/tags/v$_gittag.tar.gz + pinenote.initd +" + +builddir="$srcdir/pinenote_dbus_service-$_gittag" + +build() { + cargo build --release --locked +} + +package() { + cargo install --path . --root="$pkgdir/usr" + install -Dm644 dbus_security_configuration/pinenote.conf -t "$pkgdir"/usr/share/dbus-1/system.d/ + install -Dm755 "$srcdir"/pinenote.initd $pkgdir/etc/init.d/pinenote + rm "$pkgdir"/usr/.crates.toml + rm "$pkgdir"/usr/.crates2.json +} + +sha512sums=" +10cf05f9e1e8affec97b532611a9bffb86928cabe4eb9bd321b66e8dba340e6a7916fa0c8286f81300bfa655d5596bba09f0316abcafa6c55128823c78acb807 pinenote-dbus-service-0.2.2-dev5.tar.gz +362c20218610e7a5349eef40d54463a05906e258157e590ad1635591a548ddc60050142cfab41a0423797182e5ae392a7fe6476fc71b9c01cece384351e6f148 pinenote.initd +" diff --git a/user/pinenote-dbus-service/pinenote.initd b/user/pinenote-dbus-service/pinenote.initd new file mode 100644 index 0000000..0301c53 --- /dev/null +++ b/user/pinenote-dbus-service/pinenote.initd @@ -0,0 +1,10 @@ +#!/sbin/openrc-run + +description="Launch DBus service for driver aspects" +command="/usr/bin/pinenote_dbus_service" +command_background=yes +pidfile="/run/${RC_SVCNAME}.pid" + +depend() { + need dbus +} From 8c9065c3af0f30a1953b6d8a70b8c2647af4d940 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 7 Jan 2025 11:01:44 -0500 Subject: [PATCH 105/313] user/papermc-plugin-worldedit: fix packaging --- user/papermc-plugin-worldedit/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/papermc-plugin-worldedit/APKBUILD b/user/papermc-plugin-worldedit/APKBUILD index 5634b03..96e0215 100644 --- a/user/papermc-plugin-worldedit/APKBUILD +++ b/user/papermc-plugin-worldedit/APKBUILD @@ -3,7 +3,7 @@ pkgname=papermc-plugin-worldedit pkgver=7.3.9 _pkgver=$pkgver -pkgrel=0 +pkgrel=1 pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" arch='noarch !aarch64' url="https://github.com/EngineHub/WorldEdit" @@ -22,7 +22,7 @@ check() { } package() { - install -Dm644 "$builddir"/worldedit-bukkit/build/libs/worldedit-bukkit-$pkgver.jar "$pkgdir/var/lib/papermc/plugins/WorldEdit.jar" + install -Dm644 "$builddir"/worldedit-bukkit/build/libs/worldedit-bukkit-$pkgver-dist.jar "$pkgdir/var/lib/papermc/plugins/WorldEdit.jar" } sha512sums=" 35eb83dfcd192884a86f9bec3cbe586af6141b8c10461937b2ef112bfb4d64f5f7c6e950108a7893dc5b1054f1d0206f74ec6b4702481c0da69bf89627dbfb06 papermc-plugin-worldedit-7.3.9.tar.gz From c2b6767bfae64bcb9d6a2eed5094f520b7d7f9f0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 8 Jan 2025 18:42:10 -0500 Subject: [PATCH 106/313] forgejo-ci: add postmarketOS repo when building aport under pmos --- .forgejo/bin/build.sh | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh index d9e327f..ad5e30c 100755 --- a/.forgejo/bin/build.sh +++ b/.forgejo/bin/build.sh @@ -7,7 +7,7 @@ set -eu -o pipefail readonly APORTSDIR=$CI_PROJECT_DIR -readonly REPOS="backports user" +readonly REPOS="backports user pmos" readonly ALPINE_REPOS="main community testing" readonly ARCH=$(apk --print-arch) # gitlab variables @@ -16,6 +16,8 @@ readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME : "${REPODEST:=$HOME/packages}" : "${MIRROR:=https://ayakael.net/api/packages/forge/alpine}" : "${ALPINE_MIRROR:=http://dl-cdn.alpinelinux.org/alpine}" +: "${PMOS_MIRROR:=http://mirror.postmarketos.org/postmarketos}" +: "${PMOS_KEY:=https://git.syndicate-lang.org/synit/pmbootstrap/raw/commit/8efee86388408c0d8de45c64fe383580ffd91700/pmb/data/keys/build.postmarketos.org.rsa.pub}" : "${MAX_ARTIFACT_SIZE:=300000000}" #300M : "${CI_DEBUG_BUILD:=}" @@ -137,6 +139,22 @@ setup_system() { git config --global init.defaultBranch master } +setup_pmos() { + local release + + case $BASEBRANCH in + v3.21) release="v24.12";; + v3.20) release="v24.6";; + v3.19) release="v23.12";; + edge) release=master;; + *) die "Branch \"$BASEBRANCH\" not supported!" + esac + + doas wget "$PMOS_KEY" -P /etc/apk/keys + doas sh -c "echo $PMOS_MIRROR/$release >> /etc/apk/repositories" + doas apk update || true +} + sysinfo() { printf ">>> Host system information (arch: %s, release: %s) <<<\n" "$ARCH" "$(get_release)" printf "- Number of Cores: %s\n" "$(nproc)" @@ -144,6 +162,7 @@ sysinfo() { printf "- Free space: %s\n" "$(df -hP / | awk '/\/$/ {print $4}')" } + copy_artifacts() { cd "$APORTSDIR" @@ -204,6 +223,7 @@ build_limit=$CI_ALPINE_BUILD_LIMIT for repo in $(changed_repos); do set_repositories_for "$repo" + [ "$repo" == "pmos" ] && setup_pmos built_aports=0 changed_aports_in_repo=$(changed_aports "$repo") changed_aports_in_repo_count=$(echo "$changed_aports_in_repo" | wc -l) From 5d7449a835f5d26c634f6a861431042675630a48 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 8 Jan 2025 22:39:59 -0500 Subject: [PATCH 107/313] pmos/linux-pine64-pinenote: new aport --- pmos/linux-pine64-pinenote/APKBUILD | 59 + .../config-pine64-pinenote.aarch64 | 7536 +++++++++++++++++ 2 files changed, 7595 insertions(+) create mode 100644 pmos/linux-pine64-pinenote/APKBUILD create mode 100644 pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 diff --git a/pmos/linux-pine64-pinenote/APKBUILD b/pmos/linux-pine64-pinenote/APKBUILD new file mode 100644 index 0000000..9d00d99 --- /dev/null +++ b/pmos/linux-pine64-pinenote/APKBUILD @@ -0,0 +1,59 @@ +# Reference: +# Kernel config based on: arch/arm64/configs/(CHANGEME!) + +pkgname=linux-pine64-pinenote +pkgver=6.12.0_rc2 +pkgrel=0 +pkgdesc="Pine64 PineNote kernel fork" +arch="aarch64" +_carch="arm64" +_flavor="pine64-pinenote" +url="https://kernel.org" +license="GPL-2.0-only" +options="!strip !check !tracedeps pmb:cross-native" +makedepends=" + bash + bc + bison + devicepkg-dev + findutils + flex + openssl-dev + perl +" + +# Source +_repository="linux" +_commit="5392aa8e38082b431f3330c873b288f72ae98f90" +_config="config-$_flavor.$arch" +source=" + $pkgname-$_commit.tar.gz::https://github.com/m-weigand/linux/archive/$_commit.tar.gz + $_config +" +builddir="$srcdir/$_repository-$_commit" + +prepare() { + default_prepare + REPLACE_GCCH=0 \ + . downstreamkernel_prepare +} + +build() { + unset LDFLAGS + make ARCH="$_carch" CC="${CC:-gcc}" \ + KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS" +} + +package() { + downstreamkernel_package "$builddir" "$pkgdir" "$_carch" "$_flavor" + + make modules_install dtbs_install \ + ARCH="$_carch" \ + INSTALL_MOD_PATH="$pkgdir" \ + INSTALL_DTBS_PATH="$pkgdir/boot/dtbs" +} + +sha512sums=" +34f410639b0046a192f18518db2c12593bf2acb27fd76560801d9010558f55b71cb1c3208b9755f1991f361c70cb80265bb587b7028945da85763de25e73704e linux-pine64-pinenote-5392aa8e38082b431f3330c873b288f72ae98f90.tar.gz +d460b63f8b7d32849a3ae426e0258a2b66b251c654f42c69a65b8ec77f24c6f9d0277f0c66879218dfa9aaa58c019592c17b34f5a8518bd67a62a1fbbddb9f9f config-pine64-pinenote.aarch64 +" diff --git a/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 b/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 new file mode 100644 index 0000000..8078456 --- /dev/null +++ b/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 @@ -0,0 +1,7536 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.12.0-rc2 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="aarch64-alpine-linux-musl-gcc (Alpine 14.2.0) 14.2.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=140200 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=24200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=24200 +CONFIG_LLD_VERSION=0 +CONFIG_RUSTC_VERSION=0 +CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y +CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_BUILD_SALT="" +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="pinenote" +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +# CONFIG_WATCH_QUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_INJECTION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_GENERIC_IRQ_STAT_SNAPSHOT=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +CONFIG_GENERIC_IRQ_DEBUGFS=y +# end of IRQ subsystem + +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_BPF_UNPRIV_DEFAULT_OFF=y +# CONFIG_BPF_PRELOAD is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_RT is not set +# CONFIG_PREEMPT_DYNAMIC is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_SCHED_AVG_IRQ=y +CONFIG_SCHED_HW_PRESSURE=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_PSI=y +CONFIG_PSI_DEFAULT_DISABLED=y +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_NEED_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_IKCONFIG=m +CONFIG_IKCONFIG_PROC=y +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=0 +# CONFIG_PRINTK_INDEX is not set +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC10_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y +CONFIG_GCC_NO_STRINGOP_OVERFLOW=y +CONFIG_CC_NO_STRINGOP_OVERFLOW=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_SLAB_OBJ_EXT=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_MEMCG=y +# CONFIG_MEMCG_V1 is not set +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_GROUP_SCHED_WEIGHT=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_MM_CID=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +# CONFIG_CPUSETS_V1 is not set +# CONFIG_PROC_PID_CPUSET is not set +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +CONFIG_RD_ZSTD=y +# CONFIG_BOOT_CONFIG is not set +CONFIG_INITRAMFS_PRESERVE_MTIME=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_EXPERT=y +# CONFIG_UID16 is not set +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +# CONFIG_SYSFS_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +# CONFIG_BASE_SMALL is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KCMP=y +CONFIG_RSEQ=y +# CONFIG_DEBUG_RSEQ is not set +CONFIG_CACHESTAT_SYSCALL=y +# CONFIG_PC104 is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set +CONFIG_KALLSYMS_ALL=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_HAVE_PERF_EVENTS=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +# CONFIG_PROFILING is not set +CONFIG_TRACEPOINTS=y + +# +# Kexec and crash features +# +CONFIG_CRASH_RESERVE=y +CONFIG_VMCORE_INFO=y +CONFIG_KEXEC_CORE=y +CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y +# CONFIG_KEXEC_SIG is not set +CONFIG_CRASH_DUMP=y +# end of Kexec and crash features +# end of General setup + +CONFIG_ARM64=y +CONFIG_RUSTC_SUPPORTS_ARM64=y +CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_ARM64_CONT_PTE_SHIFT=4 +CONFIG_ARM64_CONT_PMD_SHIFT=4 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_SMP=y +CONFIG_KERNEL_MODE_NEON=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=5 +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y + +# +# Platform selection +# +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_AIROHA is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_APPLE is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_BITMAIN is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_SPARX5 is not set +# CONFIG_ARCH_K3 is not set +# CONFIG_ARCH_LG1K is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_KEEMBAY is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_NXP is not set +# CONFIG_ARCH_MA35 is not set +# CONFIG_ARCH_NPCM is not set +# CONFIG_ARCH_PENSANDO is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_RENESAS is not set +CONFIG_ARCH_ROCKCHIP=y +# CONFIG_ARCH_SEATTLE is not set +# CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_SYNQUACER is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_THUNDER is not set +# CONFIG_ARCH_THUNDER2 is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_VISCONTI is not set +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZYNQMP is not set +# end of Platform selection + +# +# Kernel Features +# + +# +# ARM errata workarounds via the alternatives framework +# +CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y +# CONFIG_ARM64_ERRATUM_826319 is not set +# CONFIG_ARM64_ERRATUM_827319 is not set +# CONFIG_ARM64_ERRATUM_824069 is not set +# CONFIG_ARM64_ERRATUM_819472 is not set +# CONFIG_ARM64_ERRATUM_832075 is not set +CONFIG_ARM64_ERRATUM_1742098=y +# CONFIG_ARM64_ERRATUM_845719 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_ERRATUM_1024718=y +# CONFIG_ARM64_ERRATUM_1418040 is not set +CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y +# CONFIG_ARM64_ERRATUM_1165522 is not set +# CONFIG_ARM64_ERRATUM_1319367 is not set +CONFIG_ARM64_ERRATUM_1530923=y +# CONFIG_ARM64_ERRATUM_2441007 is not set +# CONFIG_ARM64_ERRATUM_1286807 is not set +# CONFIG_ARM64_ERRATUM_1463225 is not set +# CONFIG_ARM64_ERRATUM_1542419 is not set +# CONFIG_ARM64_ERRATUM_1508412 is not set +# CONFIG_ARM64_ERRATUM_2051678 is not set +CONFIG_ARM64_ERRATUM_2077057=y +CONFIG_ARM64_ERRATUM_2658417=y +# CONFIG_ARM64_ERRATUM_2054223 is not set +# CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set +CONFIG_ARM64_ERRATUM_2645198=y +CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y +CONFIG_ARM64_ERRATUM_2966298=y +CONFIG_ARM64_ERRATUM_3117295=y +CONFIG_ARM64_ERRATUM_3194386=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +CONFIG_ROCKCHIP_ERRATUM_3588001=y +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +# end of ARM errata workarounds via the alternatives framework + +CONFIG_ARM64_4K_PAGES=y +# CONFIG_ARM64_16K_PAGES is not set +# CONFIG_ARM64_64K_PAGES is not set +# CONFIG_ARM64_VA_BITS_39 is not set +# CONFIG_ARM64_VA_BITS_48 is not set +CONFIG_ARM64_VA_BITS_52=y +# CONFIG_ARM64_FORCE_52BIT is not set +CONFIG_ARM64_VA_BITS=52 +CONFIG_ARM64_PA_BITS_52=y +CONFIG_ARM64_PA_BITS=52 +CONFIG_ARM64_LPA2=y +# CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_SCHED_MC=y +# CONFIG_SCHED_CLUSTER is not set +# CONFIG_SCHED_SMT is not set +CONFIG_NR_CPUS=4 +CONFIG_HOTPLUG_CPU=y +# CONFIG_NUMA is not set +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 +CONFIG_SCHED_HRTICK=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_CC_HAVE_SHADOW_CALL_STACK=y +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +CONFIG_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SELECTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y +CONFIG_TRANS_TABLE=y +# CONFIG_XEN is not set +CONFIG_ARCH_FORCE_MAX_ORDER=10 +# CONFIG_UNMAP_KERNEL_AT_EL0 is not set +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +# CONFIG_ARM64_SW_TTBR0_PAN is not set +# CONFIG_ARM64_TAGGED_ADDR_ABI is not set +CONFIG_COMPAT=y +CONFIG_KUSER_HELPERS=y +# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set +CONFIG_ARMV8_DEPRECATED=y +# CONFIG_SWP_EMULATION is not set +CONFIG_CP15_BARRIER_EMULATION=y +# CONFIG_SETEND_EMULATION is not set + +# +# ARMv8.1 architectural features +# +# CONFIG_ARM64_HW_AFDBM is not set +CONFIG_ARM64_PAN=y +CONFIG_AS_HAS_LSE_ATOMICS=y +CONFIG_ARM64_LSE_ATOMICS=y +CONFIG_ARM64_USE_LSE_ATOMICS=y +# end of ARMv8.1 architectural features + +# +# ARMv8.2 architectural features +# +CONFIG_AS_HAS_ARMV8_2=y +CONFIG_AS_HAS_SHA3=y +# CONFIG_ARM64_PMEM is not set +CONFIG_ARM64_RAS_EXTN=y +CONFIG_ARM64_CNP=y +# end of ARMv8.2 architectural features + +# +# ARMv8.3 architectural features +# +# CONFIG_ARM64_PTR_AUTH is not set +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y +CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y +CONFIG_AS_HAS_ARMV8_3=y +CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y +CONFIG_AS_HAS_LDAPR=y +# end of ARMv8.3 architectural features + +# +# ARMv8.4 architectural features +# +# CONFIG_ARM64_AMU_EXTN is not set +CONFIG_AS_HAS_ARMV8_4=y +CONFIG_ARM64_TLB_RANGE=y +# end of ARMv8.4 architectural features + +# +# ARMv8.5 architectural features +# +CONFIG_AS_HAS_ARMV8_5=y +# CONFIG_ARM64_BTI is not set +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y +# CONFIG_ARM64_E0PD is not set +CONFIG_ARM64_AS_HAS_MTE=y +# end of ARMv8.5 architectural features + +# +# ARMv8.7 architectural features +# +# CONFIG_ARM64_EPAN is not set +# end of ARMv8.7 architectural features + +# +# ARMv8.9 architectural features +# +CONFIG_ARM64_POE=y +CONFIG_ARCH_PKEY_BITS=3 +# end of ARMv8.9 architectural features + +# CONFIG_ARM64_SVE is not set +# CONFIG_ARM64_PSEUDO_NMI is not set +CONFIG_RELOCATABLE=y +# CONFIG_RANDOMIZE_BASE is not set +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +# end of Kernel Features + +# +# Boot options +# +CONFIG_CMDLINE="" +CONFIG_EFI_STUB=y +CONFIG_EFI=y +# CONFIG_COMPRESSED_INSTALL is not set +CONFIG_DMI=y +# end of Boot options + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +# CONFIG_PM_USERSPACE_AUTOSLEEP is not set +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_PM_SLEEP_DEBUG=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_CPU_PM=y +CONFIG_ENERGY_MODEL=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +# end of Power management options + +# +# CPU Power Management +# + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +# CONFIG_CPU_IDLE_GOV_LADDER is not set +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_IDLE_GOV_TEO=y +CONFIG_DT_IDLE_STATES=y +CONFIG_DT_IDLE_GENPD=y + +# +# ARM CPU Idle Drivers +# +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +# end of ARM CPU Idle Drivers +# end of CPU Idle + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_ARM_SCMI_CPUFREQ=y +# end of CPU Frequency scaling +# end of CPU Power Management + +CONFIG_ARCH_SUPPORTS_ACPI=y +# CONFIG_ACPI is not set +# CONFIG_VIRTUALIZATION is not set +CONFIG_CPU_MITIGATIONS=y + +# +# General architecture-dependent options +# +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +# CONFIG_KPROBES is not set +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_LAZY_TLB_REFCOUNT=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +# CONFIG_STACKPROTECTOR is not set +CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y +# CONFIG_SHADOW_CALL_STACK is not set +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_WANTS_EXECMEM_LATE=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_HAVE_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SHIFT=12 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_ARCH_SUPPORTS_RT=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_COMPILER_H=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_RELR=y +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y +CONFIG_ARCH_HAS_HW_PTE_YOUNG=y +CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT_4B=y +CONFIG_FUNCTION_ALIGNMENT_8B=y +CONFIG_FUNCTION_ALIGNMENT=8 +CONFIG_CC_HAS_MIN_FUNCTION_ALIGNMENT=y +CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_MODULES=y +# CONFIG_MODULE_DEBUG is not set +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set +CONFIG_MODVERSIONS=y +CONFIG_ASM_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_CGROUP_PUNT_BIO=y +CONFIG_BLK_DEV_BSG_COMMON=m +CONFIG_BLK_ICQ=y +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set +CONFIG_BLK_DEV_WRITE_MOUNTED=y +# CONFIG_BLK_DEV_ZONED is not set +CONFIG_BLK_DEV_THROTTLING=y +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set +# CONFIG_BLK_DEBUG_FS is not set +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y + +# +# IO Schedulers +# +# CONFIG_MQ_IOSCHED_DEADLINE is not set +# CONFIG_MQ_IOSCHED_KYBER is not set +CONFIG_IOSCHED_BFQ=y +CONFIG_BFQ_GROUP_IOSCHED=y +# CONFIG_BFQ_CGROUP_DEBUG is not set +# end of IO Schedulers + +CONFIG_PADATA=y +CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y +CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y +CONFIG_ARCH_INLINE_SPIN_LOCK=y +CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y +CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y +CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y +CONFIG_ARCH_INLINE_SPIN_UNLOCK=y +CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y +CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y +CONFIG_ARCH_INLINE_READ_LOCK=y +CONFIG_ARCH_INLINE_READ_LOCK_BH=y +CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y +CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y +CONFIG_ARCH_INLINE_READ_UNLOCK=y +CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y +CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y +CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y +CONFIG_ARCH_INLINE_WRITE_LOCK=y +CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y +CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y +CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y +CONFIG_ARCH_INLINE_WRITE_UNLOCK=y +CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y +CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y +CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y +CONFIG_INLINE_SPIN_TRYLOCK=y +CONFIG_INLINE_SPIN_TRYLOCK_BH=y +CONFIG_INLINE_SPIN_LOCK=y +CONFIG_INLINE_SPIN_LOCK_BH=y +CONFIG_INLINE_SPIN_LOCK_IRQ=y +CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y +CONFIG_INLINE_SPIN_UNLOCK_BH=y +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y +CONFIG_INLINE_READ_LOCK=y +CONFIG_INLINE_READ_LOCK_BH=y +CONFIG_INLINE_READ_LOCK_IRQ=y +CONFIG_INLINE_READ_LOCK_IRQSAVE=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_BH=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y +CONFIG_INLINE_WRITE_LOCK=y +CONFIG_INLINE_WRITE_LOCK_BH=y +CONFIG_INLINE_WRITE_LOCK_IRQ=y +CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_BH=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_STATE=y +CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y +CONFIG_ARCH_HAVE_ELF_PROT=y +CONFIG_ARCH_USE_GNU_PROPERTY=y +CONFIG_ELFCORE=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_COREDUMP is not set +# end of Executable file formats + +# +# Memory Management options +# +# CONFIG_SWAP is not set + +# +# Slab allocator options +# +CONFIG_SLUB=y +# CONFIG_SLUB_TINY is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_BUCKETS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of Slab allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_GUP_FAST=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_SPLIT_PTE_PTLOCKS=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_SPLIT_PMD_PTLOCKS=y +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PCP_BATCH_SCALE_MAX=5 +CONFIG_PHYS_ADDR_T_64BIT=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +CONFIG_ARCH_WANTS_THP_SWAP=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_PGTABLE_HAS_HUGE_LEAVES=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_CMA_SYSFS=y +CONFIG_CMA_AREAS=8 +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_HAS_PKEYS=y +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_MEMFD_CREATE=y +CONFIG_SECRETMEM=y +# CONFIG_ANON_VMA_NAME is not set +CONFIG_HAVE_ARCH_USERFAULTFD_WP=y +CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y +CONFIG_USERFAULTFD=y +CONFIG_PTE_MARKER_UFFD_WP=y +# CONFIG_LRU_GEN is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y +CONFIG_EXECMEM=y + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_XGRESS=y +CONFIG_SKB_EXTENSIONS=y +CONFIG_NET_DEVMEM=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_AF_UNIX_OOB=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=m +CONFIG_XFRM_USER=m +# CONFIG_XFRM_INTERFACE is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_ESP=m +# CONFIG_NET_KEY is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=m +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=m +# CONFIG_NET_FOU is not set +# CONFIG_INET_AH is not set +CONFIG_INET_ESP=m +# CONFIG_INET_ESP_OFFLOAD is not set +# CONFIG_INET_ESPINTCP is not set +# CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_AO is not set +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_IPV6_ILA is not set +# CONFIG_IPV6_VTI is not set +# CONFIG_IPV6_SIT is not set +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6_SEG6_LWTUNNEL is not set +# CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set +# CONFIG_IPV6_IOAM6_LWTUNNEL is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_EGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_BPF_LINK=y +# CONFIG_NETFILTER_NETLINK_HOOK is not set +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +CONFIG_NF_CONNTRACK=m +# CONFIG_NF_LOG_SYSLOG is not set +CONFIG_NETFILTER_CONNCOUNT=m +# CONFIG_NF_CONNTRACK_MARK is not set +# CONFIG_NF_CONNTRACK_ZONES is not set +# CONFIG_NF_CONNTRACK_PROCFS is not set +# CONFIG_NF_CONNTRACK_EVENTS is not set +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CONNTRACK_LABELS is not set +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +# CONFIG_NF_CONNTRACK_AMANDA is not set +# CONFIG_NF_CONNTRACK_FTP is not set +# CONFIG_NF_CONNTRACK_H323 is not set +# CONFIG_NF_CONNTRACK_IRC is not set +# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +# CONFIG_NF_CONNTRACK_PPTP is not set +# CONFIG_NF_CONNTRACK_SANE is not set +# CONFIG_NF_CONNTRACK_SIP is not set +# CONFIG_NF_CONNTRACK_TFTP is not set +# CONFIG_NF_CT_NETLINK is not set +CONFIG_NF_NAT=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NF_TABLES=m +# CONFIG_NF_TABLES_INET is not set +# CONFIG_NF_TABLES_NETDEV is not set +# CONFIG_NFT_NUMGEN is not set +CONFIG_NFT_CT=m +CONFIG_NFT_CONNLIMIT=m +# CONFIG_NFT_LOG is not set +# CONFIG_NFT_LIMIT is not set +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +# CONFIG_NFT_TUNNEL is not set +# CONFIG_NFT_QUOTA is not set +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +# CONFIG_NFT_XFRM is not set +# CONFIG_NFT_SOCKET is not set +# CONFIG_NFT_OSF is not set +# CONFIG_NFT_TPROXY is not set +# CONFIG_NFT_SYNPROXY is not set +# CONFIG_NF_FLOW_TABLE is not set +CONFIG_NETFILTER_XTABLES=y +# CONFIG_NETFILTER_XTABLES_COMPAT is not set + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +# CONFIG_NETFILTER_XT_CONNMARK is not set + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_CT is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +# CONFIG_NETFILTER_XT_TARGET_HL is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LED is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +CONFIG_NETFILTER_XT_MATCH_IPVS=m +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATE is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# end of Core Netfilter Configuration + +# CONFIG_IP_SET is not set +CONFIG_IP_VS=m +# CONFIG_IP_VS_IPV6 is not set +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +# CONFIG_IP_VS_PROTO_ESP is not set +# CONFIG_IP_VS_PROTO_AH is not set +# CONFIG_IP_VS_PROTO_SCTP is not set + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +# CONFIG_IP_VS_WRR is not set +# CONFIG_IP_VS_LC is not set +# CONFIG_IP_VS_WLC is not set +# CONFIG_IP_VS_FO is not set +# CONFIG_IP_VS_OVF is not set +# CONFIG_IP_VS_LBLC is not set +# CONFIG_IP_VS_LBLCR is not set +# CONFIG_IP_VS_DH is not set +# CONFIG_IP_VS_SH is not set +# CONFIG_IP_VS_MH is not set +# CONFIG_IP_VS_SED is not set +# CONFIG_IP_VS_NQ is not set +# CONFIG_IP_VS_TWOS is not set + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +CONFIG_IP_VS_NFCT=y + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_IP_NF_IPTABLES_LEGACY=m +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_TPROXY_IPV4 is not set +# CONFIG_NF_TABLES_IPV4 is not set +# CONFIG_NF_TABLES_ARP is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_IPV4 is not set +# CONFIG_NF_REJECT_IPV4 is not set +CONFIG_IP_NF_IPTABLES=m +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +CONFIG_IP_NF_FILTER=m +# CONFIG_IP_NF_TARGET_REJECT is not set +# CONFIG_IP_NF_TARGET_SYNPROXY is not set +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_TTL is not set +# CONFIG_IP_NF_RAW is not set +# CONFIG_IP_NF_ARPFILTER is not set +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV6 is not set +# CONFIG_NF_TPROXY_IPV6 is not set +# CONFIG_NF_TABLES_IPV6 is not set +# CONFIG_NF_DUP_IPV6 is not set +# CONFIG_NF_REJECT_IPV6 is not set +# CONFIG_NF_LOG_IPV6 is not set +CONFIG_IP6_NF_IPTABLES=m +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_HL is not set +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_SRH is not set +# CONFIG_IP6_NF_FILTER is not set +# CONFIG_IP6_NF_TARGET_REJECT is not set +# CONFIG_IP6_NF_TARGET_SYNPROXY is not set +# CONFIG_IP6_NF_MANGLE is not set +# CONFIG_IP6_NF_RAW is not set +# CONFIG_IP6_NF_NAT is not set +# CONFIG_IP6_NF_TARGET_NPT is not set +# end of IPv6: Netfilter Configuration + +CONFIG_NF_DEFRAG_IPV6=m +# CONFIG_NF_TABLES_BRIDGE is not set +# CONFIG_NF_CONNTRACK_BRIDGE is not set +# CONFIG_BRIDGE_NF_EBTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BRIDGE_MRP is not set +# CONFIG_BRIDGE_CFM is not set +# CONFIG_NET_DSA is not set +CONFIG_VLAN_8021Q=m +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set +CONFIG_LLC=m +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_6LOWPAN is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +# CONFIG_NET_SCH_HTB is not set +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_CBS is not set +# CONFIG_NET_SCH_ETF is not set +# CONFIG_NET_SCH_TAPRIO is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_SKBPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set +# CONFIG_NET_SCH_CAKE is not set +# CONFIG_NET_SCH_FQ is not set +# CONFIG_NET_SCH_HHF is not set +# CONFIG_NET_SCH_PIE is not set +# CONFIG_NET_SCH_PLUG is not set +# CONFIG_NET_SCH_ETS is not set +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_ROUTE4 is not set +# CONFIG_NET_CLS_FW is not set +# CONFIG_NET_CLS_U32 is not set +# CONFIG_NET_CLS_FLOW is not set +CONFIG_NET_CLS_CGROUP=m +# CONFIG_NET_CLS_BPF is not set +# CONFIG_NET_CLS_FLOWER is not set +# CONFIG_NET_CLS_MATCHALL is not set +# CONFIG_NET_EMATCH is not set +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +# CONFIG_DNS_RESOLVER is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +CONFIG_NETLINK_DIAG=y +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +CONFIG_NET_L3_MASTER_DEV=y +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_MAX_SKB_FRAGS=17 +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_STREAM_PARSER is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +CONFIG_BT=m +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +# CONFIG_BT_BNEP is not set +CONFIG_BT_HIDP=m +CONFIG_BT_LE=y +CONFIG_BT_LE_L2CAP_ECRED=y +CONFIG_BT_LEDS=y +# CONFIG_BT_MSFTEXT is not set +# CONFIG_BT_AOSPEXT is not set +CONFIG_BT_DEBUGFS=y +# CONFIG_BT_SELFTEST is not set + +# +# Bluetooth device drivers +# +CONFIG_BT_BCM=m +# CONFIG_BT_HCIBTUSB is not set +# CONFIG_BT_HCIBTSDIO is not set +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y +CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_NOKIA is not set +# CONFIG_BT_HCIUART_BCSP is not set +# CONFIG_BT_HCIUART_ATH3K is not set +# CONFIG_BT_HCIUART_LL is not set +# CONFIG_BT_HCIUART_3WIRE is not set +# CONFIG_BT_HCIUART_INTEL is not set +CONFIG_BT_HCIUART_BCM=y +# CONFIG_BT_HCIUART_RTL is not set +# CONFIG_BT_HCIUART_QCA is not set +# CONFIG_BT_HCIUART_AG6XX is not set +# CONFIG_BT_HCIUART_MRVL is not set +# CONFIG_BT_HCIUART_AML is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBCM4377 is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIVHCI is not set +# CONFIG_BT_MRVL is not set +# CONFIG_BT_MTKSDIO is not set +# CONFIG_BT_MTKUART is not set +# CONFIG_BT_NXPUART is not set +# CONFIG_BT_INTEL_PCIE is not set +# end of Bluetooth device drivers + +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set +CONFIG_WIRELESS=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_CFG80211=m +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +CONFIG_CFG80211_CERTIFICATION_ONUS=y +# CONFIG_CFG80211_REQUIRE_SIGNED_REGDB is not set +# CONFIG_CFG80211_REG_CELLULAR_HINTS is not set +# CONFIG_CFG80211_REG_RELAX_NO_IR is not set +CONFIG_CFG80211_DEFAULT_PS=y +CONFIG_CFG80211_DEBUGFS=y +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=m +# CONFIG_MAC80211_RC_MINSTREL is not set +CONFIG_MAC80211_RC_DEFAULT="" + +# +# Some wireless drivers require a rate control algorithm +# +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_RFKILL=m +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +# CONFIG_RFKILL_GPIO is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_PAGE_POOL=y +# CONFIG_PAGE_POOL_STATS is not set +# CONFIG_FAILOVER is not set +# CONFIG_ETHTOOL_NETLINK is not set + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_SYSCALL=y +# CONFIG_PCIEPORTBUS is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_IOV is not set +# CONFIG_PCI_NPEM is not set +# CONFIG_PCI_PRI is not set +# CONFIG_PCI_PASID is not set +CONFIG_PCI_LABEL=y +# CONFIG_PCI_DYNAMIC_OF_NODES is not set +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +# CONFIG_HOTPLUG_PCI is not set + +# +# PCI controller drivers +# +# CONFIG_PCIE_ALTERA is not set +# CONFIG_PCI_HOST_THUNDER_PEM is not set +# CONFIG_PCI_HOST_THUNDER_ECAM is not set +# CONFIG_PCI_FTPCI100 is not set +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCIE_ROCKCHIP_HOST is not set +# CONFIG_PCI_XGENE is not set +# CONFIG_PCIE_XILINX is not set + +# +# Cadence-based PCIe controllers +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# end of Cadence-based PCIe controllers + +# +# DesignWare-based PCIe controllers +# +CONFIG_PCIE_DW=y +CONFIG_PCIE_DW_HOST=y +# CONFIG_PCIE_AL is not set +# CONFIG_PCI_MESON is not set +# CONFIG_PCI_HISI is not set +# CONFIG_PCIE_KIRIN is not set +# CONFIG_PCIE_DW_PLAT_HOST is not set +CONFIG_PCIE_ROCKCHIP_DW=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +# end of DesignWare-based PCIe controllers + +# +# Mobiveil-based PCIe controllers +# +# end of Mobiveil-based PCIe controllers + +# +# PLDA-based PCIe controllers +# +# CONFIG_PCIE_MICROCHIP_HOST is not set +# end of PLDA-based PCIe controllers +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_CXL_BUS is not set +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_DEBUG=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +CONFIG_FW_LOADER_COMPRESS=y +CONFIG_FW_LOADER_COMPRESS_XZ=y +CONFIG_FW_LOADER_COMPRESS_ZSTD=y +# CONFIG_FW_CACHE is not set +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +# CONFIG_ALLOW_DEV_COREDUMP is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_DEVICES=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=m +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MOXTET is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# +# Cache Drivers +# +# end of Cache Drivers + +# CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +CONFIG_ARM_SCMI_PROTOCOL=y +# CONFIG_ARM_SCMI_RAW_MODE_SUPPORT is not set +# CONFIG_ARM_SCMI_DEBUG_COUNTERS is not set + +# +# SCMI Transport Drivers +# +CONFIG_ARM_SCMI_HAVE_TRANSPORT=y +CONFIG_ARM_SCMI_HAVE_SHMEM=y +# CONFIG_ARM_SCMI_TRANSPORT_MAILBOX is not set +CONFIG_ARM_SCMI_TRANSPORT_SMC=y +# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set +# end of SCMI Transport Drivers + +# +# ARM SCMI NXP i.MX Vendor Protocols +# +# CONFIG_IMX_SCMI_BBM_EXT is not set +# CONFIG_IMX_SCMI_MISC_EXT is not set +# end of ARM SCMI NXP i.MX Vendor Protocols + +# CONFIG_ARM_SCMI_POWER_CONTROL is not set +# end of ARM System Control and Management Interface Protocol + +# CONFIG_ARM_SCPI_PROTOCOL is not set +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_DMIID=y +CONFIG_DMI_SYSFS=y +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_ROCKCHIP_SIP=y +# CONFIG_SYSFB_SIMPLEFB is not set +# CONFIG_ARM_FFA_TRANSPORT is not set +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_PARAMS_FROM_FDT=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_GENERIC_STUB=y +# CONFIG_EFI_ZBOOT is not set +CONFIG_EFI_ARMSTUB_DTB_LOADER=y +CONFIG_EFI_BOOTLOADER_CONTROL=y +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_RESET_ATTACK_MITIGATION is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_PSCI_CHECKER is not set + +# +# Qualcomm firmware drivers +# +# end of Qualcomm firmware drivers + +CONFIG_HAVE_ARM_SMCCC=y +CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y +# CONFIG_ARM_SMCCC_SOC_ID is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_RESERVED_MEM=y +CONFIG_OF_RESOLVE=y +CONFIG_OF_OVERLAY=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_CDROM=m +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +# CONFIG_ZRAM is not set +CONFIG_ZRAM_DEF_COMP="unset-value" +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_UBLK is not set + +# +# NVME Support +# +# CONFIG_BLK_DEV_NVME is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_PHANTOM is not set +# CONFIG_RPMB is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_HISI_HIKEY_USB is not set +# CONFIG_OPEN_DICE is not set +# CONFIG_VCPU_STALL_DETECTOR is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set +# CONFIG_GP_PCI1XXXX is not set +# CONFIG_KEBA_CP500 is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=m +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=m +CONFIG_CHR_DEV_SG=m +CONFIG_BLK_DEV_BSG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_ATA=m +CONFIG_SATA_HOST=y +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=m +CONFIG_SATA_MOBILE_LPM_POLICY=3 +CONFIG_SATA_AHCI_PLATFORM=m +CONFIG_AHCI_DWC=m +# CONFIG_AHCI_CEVA is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_SX4 is not set +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_ATA_PIIX is not set +# CONFIG_SATA_DWC is not set +# CONFIG_SATA_MV is not set +# CONFIG_SATA_NV is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SIL is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set + +# +# PATA SFF controllers with BMDMA +# +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# PIO-only SFF controllers +# +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OF_PLATFORM is not set +# CONFIG_PATA_RZ1000 is not set + +# +# Generic fallback / legacy drivers +# +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_LEGACY is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_MD_BITMAP_FILE=y +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +# CONFIG_DM_SNAPSHOT is not set +CONFIG_DM_THIN_PROVISIONING=m +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +# CONFIG_DM_VERITY is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_DM_VDO is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +CONFIG_DUMMY=m +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +CONFIG_MACVLAN=m +# CONFIG_MACVTAP is not set +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=m +# CONFIG_IPVTAP is not set +CONFIG_VXLAN=m +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_PFCP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=m +# CONFIG_NLMON is not set +# CONFIG_NETKIT is not set +# CONFIG_ARCNET is not set +CONFIG_ETHERNET=y +CONFIG_NET_VENDOR_3COM=y +# CONFIG_VORTEX is not set +# CONFIG_TYPHOON is not set +CONFIG_NET_VENDOR_ADAPTEC=y +# CONFIG_ADAPTEC_STARFIRE is not set +CONFIG_NET_VENDOR_AGERE=y +# CONFIG_ET131X is not set +CONFIG_NET_VENDOR_ALACRITECH=y +# CONFIG_SLICOSS is not set +CONFIG_NET_VENDOR_ALTEON=y +# CONFIG_ACENIC is not set +# CONFIG_ALTERA_TSE is not set +CONFIG_NET_VENDOR_AMAZON=y +# CONFIG_ENA_ETHERNET is not set +CONFIG_NET_VENDOR_AMD=y +# CONFIG_AMD8111_ETH is not set +# CONFIG_PCNET32 is not set +# CONFIG_AMD_XGBE is not set +# CONFIG_PDS_CORE is not set +CONFIG_NET_VENDOR_AQUANTIA=y +# CONFIG_AQTION is not set +CONFIG_NET_VENDOR_ARC=y +# CONFIG_EMAC_ROCKCHIP is not set +CONFIG_NET_VENDOR_ASIX=y +# CONFIG_SPI_AX88796C is not set +CONFIG_NET_VENDOR_ATHEROS=y +# CONFIG_ATL2 is not set +# CONFIG_ATL1 is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set +# CONFIG_ALX is not set +CONFIG_NET_VENDOR_BROADCOM=y +# CONFIG_B44 is not set +# CONFIG_BCMGENET is not set +# CONFIG_BNX2 is not set +# CONFIG_CNIC is not set +# CONFIG_TIGON3 is not set +# CONFIG_BNX2X is not set +# CONFIG_SYSTEMPORT is not set +# CONFIG_BNXT is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +CONFIG_NET_VENDOR_CAVIUM=y +# CONFIG_THUNDER_NIC_PF is not set +# CONFIG_THUNDER_NIC_VF is not set +# CONFIG_THUNDER_NIC_BGX is not set +# CONFIG_THUNDER_NIC_RGX is not set +# CONFIG_CAVIUM_PTP is not set +# CONFIG_LIQUIDIO is not set +# CONFIG_LIQUIDIO_VF is not set +CONFIG_NET_VENDOR_CHELSIO=y +# CONFIG_CHELSIO_T1 is not set +# CONFIG_CHELSIO_T3 is not set +# CONFIG_CHELSIO_T4 is not set +# CONFIG_CHELSIO_T4VF is not set +CONFIG_NET_VENDOR_CISCO=y +# CONFIG_ENIC is not set +CONFIG_NET_VENDOR_CORTINA=y +# CONFIG_GEMINI_ETHERNET is not set +CONFIG_NET_VENDOR_DAVICOM=y +# CONFIG_DM9051 is not set +# CONFIG_DNET is not set +CONFIG_NET_VENDOR_DEC=y +# CONFIG_NET_TULIP is not set +CONFIG_NET_VENDOR_DLINK=y +# CONFIG_DL2K is not set +# CONFIG_SUNDANCE is not set +CONFIG_NET_VENDOR_EMULEX=y +# CONFIG_BE2NET is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set +CONFIG_NET_VENDOR_EZCHIP=y +# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set +CONFIG_NET_VENDOR_GOOGLE=y +# CONFIG_GVE is not set +CONFIG_NET_VENDOR_HISILICON=y +# CONFIG_HIX5HD2_GMAC is not set +# CONFIG_HISI_FEMAC is not set +# CONFIG_HIP04_ETH is not set +# CONFIG_HNS_DSAF is not set +# CONFIG_HNS_ENET is not set +# CONFIG_HNS3 is not set +CONFIG_NET_VENDOR_HUAWEI=y +# CONFIG_HINIC is not set +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_INTEL=y +# CONFIG_E100 is not set +# CONFIG_E1000 is not set +# CONFIG_E1000E is not set +# CONFIG_IGB is not set +# CONFIG_IGBVF is not set +# CONFIG_IXGBE is not set +# CONFIG_IXGBEVF is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_ICE is not set +# CONFIG_FM10K is not set +# CONFIG_IGC is not set +# CONFIG_IDPF is not set +# CONFIG_JME is not set +CONFIG_NET_VENDOR_ADI=y +CONFIG_NET_VENDOR_LITEX=y +# CONFIG_LITEX_LITEETH is not set +CONFIG_NET_VENDOR_MARVELL=y +# CONFIG_MVMDIO is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_OCTEONTX2_AF is not set +# CONFIG_OCTEONTX2_PF is not set +# CONFIG_OCTEON_EP is not set +# CONFIG_OCTEON_EP_VF is not set +CONFIG_NET_VENDOR_MELLANOX=y +# CONFIG_MLX4_EN is not set +# CONFIG_MLX5_CORE is not set +# CONFIG_MLXSW_CORE is not set +# CONFIG_MLXFW is not set +CONFIG_NET_VENDOR_META=y +CONFIG_NET_VENDOR_MICREL=y +# CONFIG_KS8842 is not set +# CONFIG_KS8851 is not set +# CONFIG_KS8851_MLL is not set +# CONFIG_KSZ884X_PCI is not set +CONFIG_NET_VENDOR_MICROCHIP=y +# CONFIG_ENC28J60 is not set +# CONFIG_ENCX24J600 is not set +# CONFIG_LAN743X is not set +# CONFIG_LAN865X is not set +# CONFIG_VCAP is not set +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y +CONFIG_NET_VENDOR_MYRI=y +# CONFIG_MYRI10GE is not set +# CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +CONFIG_NET_VENDOR_NATSEMI=y +# CONFIG_NATSEMI is not set +# CONFIG_NS83820 is not set +CONFIG_NET_VENDOR_NETERION=y +# CONFIG_S2IO is not set +CONFIG_NET_VENDOR_NETRONOME=y +# CONFIG_NFP is not set +CONFIG_NET_VENDOR_8390=y +# CONFIG_NE2K_PCI is not set +CONFIG_NET_VENDOR_NVIDIA=y +# CONFIG_FORCEDETH is not set +CONFIG_NET_VENDOR_OKI=y +# CONFIG_ETHOC is not set +# CONFIG_OA_TC6 is not set +CONFIG_NET_VENDOR_PACKET_ENGINES=y +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_IONIC is not set +CONFIG_NET_VENDOR_QLOGIC=y +# CONFIG_QLA3XXX is not set +# CONFIG_QLCNIC is not set +# CONFIG_NETXEN_NIC is not set +# CONFIG_QED is not set +CONFIG_NET_VENDOR_BROCADE=y +# CONFIG_BNA is not set +CONFIG_NET_VENDOR_QUALCOMM=y +# CONFIG_QCA7000_SPI is not set +# CONFIG_QCA7000_UART is not set +# CONFIG_QCOM_EMAC is not set +# CONFIG_RMNET is not set +CONFIG_NET_VENDOR_RDC=y +# CONFIG_R6040 is not set +CONFIG_NET_VENDOR_REALTEK=y +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_R8169 is not set +# CONFIG_RTASE is not set +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_NET_VENDOR_SAMSUNG=y +# CONFIG_SXGBE_ETH is not set +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SILAN=y +# CONFIG_SC92031 is not set +CONFIG_NET_VENDOR_SIS=y +# CONFIG_SIS900 is not set +# CONFIG_SIS190 is not set +CONFIG_NET_VENDOR_SOLARFLARE=y +# CONFIG_SFC is not set +# CONFIG_SFC_FALCON is not set +# CONFIG_SFC_SIENA is not set +CONFIG_NET_VENDOR_SMSC=y +# CONFIG_SMC91X is not set +# CONFIG_EPIC100 is not set +# CONFIG_SMSC911X is not set +# CONFIG_SMSC9420 is not set +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=y +# CONFIG_STMMAC_SELFTESTS is not set +CONFIG_STMMAC_PLATFORM=y +# CONFIG_DWMAC_DWC_QOS_ETH is not set +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_ROCKCHIP=y +# CONFIG_DWMAC_INTEL_PLAT is not set +# CONFIG_STMMAC_PCI is not set +CONFIG_NET_VENDOR_SUN=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NIU is not set +CONFIG_NET_VENDOR_SYNOPSYS=y +# CONFIG_DWC_XLGMAC is not set +CONFIG_NET_VENDOR_TEHUTI=y +# CONFIG_TEHUTI is not set +# CONFIG_TEHUTI_TN40 is not set +CONFIG_NET_VENDOR_TI=y +# CONFIG_TI_CPSW_PHY_SEL is not set +# CONFIG_TLAN is not set +CONFIG_NET_VENDOR_VERTEXCOM=y +# CONFIG_MSE102X is not set +CONFIG_NET_VENDOR_VIA=y +# CONFIG_VIA_RHINE is not set +# CONFIG_VIA_VELOCITY is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +CONFIG_NET_VENDOR_WIZNET=y +# CONFIG_WIZNET_W5100 is not set +# CONFIG_WIZNET_W5300 is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_XILINX_LL_TEMAC is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PHYLINK=y +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +# CONFIG_LED_TRIGGER_PHY is not set +CONFIG_PHYLIB_LEDS=y +CONFIG_FIXED_PHY=y +# CONFIG_SFP is not set + +# +# MII PHY device drivers +# +# CONFIG_AIR_EN8811H_PHY is not set +# CONFIG_AMD_PHY is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_ADIN1100_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +# CONFIG_AX88796B_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MARVELL_88Q2XXX_PHY is not set +# CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MAXLINEAR_GPHY is not set +# CONFIG_MEDIATEK_GE_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_T1S_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +CONFIG_MOTORCOMM_PHY=y +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NXP_CBTX_PHY is not set +# CONFIG_NXP_C45_TJA11XX_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_NCN26000_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_QCA83XX_PHY is not set +# CONFIG_QCA808X_PHY is not set +# CONFIG_QCA807X_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_RENESAS_PHY is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_DP83TD510_PHY is not set +# CONFIG_DP83TG720_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +# CONFIG_PSE_CONTROLLER is not set +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +CONFIG_FWNODE_MDIO=y +CONFIG_OF_MDIO=y +CONFIG_MDIO_DEVRES=y +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_HISI_FEMAC is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_OCTEON is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set +# CONFIG_MDIO_THUNDER is not set + +# +# MDIO Multiplexers +# +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set + +# +# PCS device drivers +# +CONFIG_PCS_XPCS=y +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_HSO is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m +CONFIG_WLAN=y +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_ATH is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +CONFIG_BRCMUTIL=m +# CONFIG_BRCMSMAC is not set +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_SDIO=y +# CONFIG_BRCMFMAC_USB is not set +# CONFIG_BRCMFMAC_PCIE is not set +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +CONFIG_WLAN_VENDOR_PURELIFI=y +# CONFIG_PLFXLC is not set +# CONFIG_WLAN_VENDOR_RALINK is not set +# CONFIG_WLAN_VENDOR_REALTEK is not set +# CONFIG_WLAN_VENDOR_RSI is not set +CONFIG_WLAN_VENDOR_SILABS=y +# CONFIG_WFX is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +# CONFIG_WLAN_VENDOR_ZYDAS is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_VIRT_WIFI is not set +# CONFIG_WAN is not set + +# +# Wireless WAN +# +# CONFIG_WWAN is not set +# end of Wireless WAN + +# CONFIG_VMXNET3 is not set +# CONFIG_NETDEVSIM is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=y +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ADC=m +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_KEYBOARD_GPIO_POLLED is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_PINEPHONE is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_OMAP4 is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ADC is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +CONFIG_TOUCHSCREEN_CYTTSP5=m +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MSG2638 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set +# CONFIG_TOUCHSCREEN_IMAGIS is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_UINPUT=m +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +# CONFIG_INPUT_PWM_VIBRA is not set +CONFIG_INPUT_RK805_PWRKEY=y +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_IQS7222 is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_INPUT_WS8100_PEN=m +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LEGACY_TIOCSTI=y +# CONFIG_LDISC_AUTOLOAD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_16550A_VARIANTS=y +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_PCILIB=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_PCI1XXXX is not set +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_8250_PERICOM=y +CONFIG_SERIAL_OF_PLATFORM=y + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +# CONFIG_HVC_DCC is not set +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +# CONFIG_TTY_PRINTK is not set +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_APPLICOM is not set +CONFIG_DEVMEM=y +CONFIG_DEVPORT=y +# CONFIG_TCG_TPM is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +# end of Character devices + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_MUX is not set +# CONFIG_I2C_HELPER_AUTO is not set +# CONFIG_I2C_SMBUS is not set + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set +# end of I2C Algorithms + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_CORE is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_HISI is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_RK3X=y +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_THUNDERX is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_VIRTIO is not set +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +# CONFIG_SPI_MEM is not set + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +CONFIG_SPI_BITBANG=y +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_CH341 is not set +# CONFIG_SPI_DESIGNWARE is not set +CONFIG_SPI_GPIO=y +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_MICROCHIP_CORE is not set +# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PCI1XXXX is not set +# CONFIG_SPI_PL022 is not set +CONFIG_SPI_ROCKCHIP=y +# CONFIG_SPI_ROCKCHIP_SFC is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_THUNDERX is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +# CONFIG_SPI_MUX is not set + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +# CONFIG_PPS_CLIENT_LDISC is not set +# CONFIG_PPS_CLIENT_GPIO is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PTP_1588_CLOCK_KVM=y +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set +# CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_FC3W is not set +# CONFIG_PTP_1588_CLOCK_MOCK is not set +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_PINMUX=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_AW9523 is not set +# CONFIG_PINCTRL_CY8C95X0 is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set +# CONFIG_PINCTRL_OCELOT is not set +# CONFIG_PINCTRL_RK805 is not set +CONFIG_PINCTRL_ROCKCHIP=y +# CONFIG_PINCTRL_SCMI is not set +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_SX150X is not set +# CONFIG_PINCTRL_IMX_SCMI is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_EXAR is not set +# CONFIG_GPIO_FTGPIO010 is not set +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_HISI is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_PL061 is not set +CONFIG_GPIO_ROCKCHIP=y +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XGENE is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_FXL6408 is not set +# CONFIG_GPIO_DS4520 is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +# CONFIG_GPIO_BT8XX is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +# CONFIG_GPIO_RDC321X is not set +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# +# Virtual GPIO drivers +# +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_SIM is not set +# end of Virtual GPIO drivers + +# +# GPIO Debugging utilities +# +# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set +# CONFIG_GPIO_VIRTUSER is not set +# end of GPIO Debugging utilities + +# CONFIG_W1 is not set +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_GPIO is not set +# CONFIG_POWER_RESET_GPIO_RESTART is not set +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_REGULATOR is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_XGENE is not set +# CONFIG_POWER_RESET_SYSCON is not set +# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set +# CONFIG_SYSCON_REBOOT_MODE is not set +# CONFIG_NVMEM_REBOOT_MODE is not set +# CONFIG_POWER_SEQUENCING is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_IP5XXX_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_BATTERY_MAX1720X is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_MAX77976 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_BQ256XX is not set +CONFIG_CHARGER_RK817=y +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_RT9467 is not set +# CONFIG_CHARGER_RT9471 is not set +# CONFIG_CHARGER_UCS1002 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set +# CONFIG_FUEL_GAUGE_MM8013 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_ARM_SCMI is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CHIPCAP2 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DRIVETEMP is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HS3001 is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWERZ is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2991 is not set +# CONFIG_SENSORS_LTC2992 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_LTC4282 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX127 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_MAX31827 is not set +# CONFIG_SENSORS_MAX6620 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT6775_I2C is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_KRAKEN3 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_PT5161L is not set +# CONFIG_SENSORS_PWM_FAN is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SBRMI is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_SPD5118 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_NETLINK=y +CONFIG_THERMAL_STATISTICS=y +# CONFIG_THERMAL_DEBUGFS is not set +# CONFIG_THERMAL_CORE_TESTING is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG is not set +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_CPU_FREQ_THERMAL=y +# CONFIG_DEVFREQ_THERMAL is not set +CONFIG_THERMAL_EMULATION=y +# CONFIG_THERMAL_MMIO is not set +CONFIG_ROCKCHIP_THERMAL=y +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +CONFIG_WATCHDOG_SYSFS=y +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_XILINX_WINDOW_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_ARM_SBSA_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +CONFIG_DW_WATCHDOG=y +# CONFIG_MAX63XX_WATCHDOG is not set +# CONFIG_ARM_SMC_WATCHDOG is not set +# CONFIG_ALIM7101_WDT is not set +# CONFIG_I6300ESB_WDT is not set +# CONFIG_HP_WATCHDOG is not set +# CONFIG_MEN_A21_WDT is not set + +# +# PCI-based Watchdog Cards +# +# CONFIG_PCIPCWATCHDOG is not set +# CONFIG_WDTPCI is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_ADP5585 is not set +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS42L43_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_MAX5970 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_88PM886_PMIC is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77541 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77714 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_OCELOT is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_NTXEC is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set +# CONFIG_MFD_RC5T583 is not set +CONFIG_MFD_RK8XX=y +CONFIG_MFD_RK8XX_I2C=y +# CONFIG_MFD_RK8XX_SPI is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS6594_I2C is not set +# CONFIG_MFD_TPS6594_SPI is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set +# CONFIG_MFD_ROHM_BD96801 is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_KHADAS_MCU is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_MFD_CS40L50_I2C is not set +# CONFIG_MFD_CS40L50_SPI is not set +# CONFIG_RAVE_SP_CORE is not set +# CONFIG_MFD_INTEL_M10_BMC_SPI is not set +# CONFIG_MFD_RSMU_I2C is not set +# CONFIG_MFD_RSMU_SPI is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_NETLINK_EVENTS is not set +# CONFIG_REGULATOR_88PG86X is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_ARM_SCMI is not set +# CONFIG_REGULATOR_AW37503 is not set +# CONFIG_REGULATOR_DA9121 is not set +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_FAN53555=y +# CONFIG_REGULATOR_FAN53880 is not set +# CONFIG_REGULATOR_GPIO is not set +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77503 is not set +# CONFIG_REGULATOR_MAX77857 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MAX20086 is not set +# CONFIG_REGULATOR_MAX20411 is not set +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MP5416 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MP886X is not set +# CONFIG_REGULATOR_MPQ7920 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_PCA9450 is not set +# CONFIG_REGULATOR_PF8X00 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_RAA215300 is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +CONFIG_REGULATOR_RK808=y +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT4803 is not set +# CONFIG_REGULATOR_RT5190A is not set +# CONFIG_REGULATOR_RT5739 is not set +# CONFIG_REGULATOR_RT5759 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6190 is not set +# CONFIG_REGULATOR_RT6245 is not set +# CONFIG_REGULATOR_RTQ2134 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_RTQ6752 is not set +# CONFIG_REGULATOR_RTQ2208 is not set +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set +# CONFIG_REGULATOR_SY8827N is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS6286X is not set +# CONFIG_REGULATOR_TPS6287X is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +CONFIG_REGULATOR_TPS65185=m +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_REGULATOR_VCTRL is not set +# CONFIG_RC_CORE is not set + +# +# CEC support +# +# CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + +CONFIG_MEDIA_SUPPORT=m +# CONFIG_MEDIA_SUPPORT_FILTER is not set +# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set + +# +# Media device types +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +# end of Media device types + +# +# Media core support +# +CONFIG_VIDEO_DEV=m +CONFIG_MEDIA_CONTROLLER=y +CONFIG_DVB_CORE=m +# end of Media core support + +# +# Video4Linux options +# +CONFIG_VIDEO_V4L2_I2C=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_V4L2_JPEG_HELPER=m +CONFIG_V4L2_H264=m +CONFIG_V4L2_VP9=m +CONFIG_V4L2_MEM2MEM_DEV=m +# CONFIG_V4L2_FLASH_LED_CLASS is not set +CONFIG_V4L2_FWNODE=m +CONFIG_V4L2_ASYNC=m +# end of Video4Linux options + +# +# Media controller options +# +# CONFIG_MEDIA_CONTROLLER_DVB is not set +# end of Media controller options + +# +# Digital TV options +# +# CONFIG_DVB_MMAP is not set +# CONFIG_DVB_NET is not set +CONFIG_DVB_MAX_ADAPTERS=16 +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set +# end of Digital TV options + +# +# Media drivers +# + +# +# Media drivers +# +# CONFIG_MEDIA_USB_SUPPORT is not set +# CONFIG_MEDIA_PCI_SUPPORT is not set +# CONFIG_RADIO_ADAPTERS is not set +CONFIG_MEDIA_PLATFORM_DRIVERS=y +# CONFIG_V4L_PLATFORM_DRIVERS is not set +# CONFIG_SDR_PLATFORM_DRIVERS is not set +# CONFIG_DVB_PLATFORM_DRIVERS is not set +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set + +# +# Allegro DVT media platform drivers +# + +# +# Amlogic media platform drivers +# + +# +# Amphion drivers +# + +# +# Aspeed media platform drivers +# + +# +# Atmel media platform drivers +# + +# +# Cadence media platform drivers +# +# CONFIG_VIDEO_CADENCE_CSI2RX is not set +# CONFIG_VIDEO_CADENCE_CSI2TX is not set + +# +# Chips&Media media platform drivers +# + +# +# Intel media platform drivers +# + +# +# Marvell media platform drivers +# + +# +# Mediatek media platform drivers +# + +# +# Microchip Technology, Inc. media platform drivers +# + +# +# Nuvoton media platform drivers +# + +# +# NVidia media platform drivers +# + +# +# NXP media platform drivers +# + +# +# Qualcomm media platform drivers +# + +# +# Raspberry Pi media platform drivers +# + +# +# Renesas media platform drivers +# + +# +# Rockchip media platform drivers +# +CONFIG_VIDEO_ROCKCHIP_RGA=m + +# +# Samsung media platform drivers +# + +# +# STMicroelectronics media platform drivers +# + +# +# Sunxi media platform drivers +# + +# +# Texas Instruments drivers +# + +# +# Verisilicon media platform drivers +# +CONFIG_VIDEO_HANTRO=m +# CONFIG_VIDEO_HANTRO_HEVC_RFC is not set +CONFIG_VIDEO_HANTRO_ROCKCHIP=y + +# +# VIA media platform drivers +# + +# +# Xilinx media platform drivers +# + +# +# MMC/SDIO DVB adapters +# +# CONFIG_SMS_SDIO_DRV is not set +# CONFIG_V4L_TEST_DRIVERS is not set +# CONFIG_DVB_TEST_DRIVERS is not set +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +# end of Media drivers + +# +# Media ancillary drivers +# +CONFIG_MEDIA_ATTACH=y +CONFIG_VIDEO_CAMERA_SENSOR=y +# CONFIG_VIDEO_ALVIUM_CSI2 is not set +# CONFIG_VIDEO_AR0521 is not set +# CONFIG_VIDEO_GC0308 is not set +# CONFIG_VIDEO_GC05A2 is not set +# CONFIG_VIDEO_GC08A3 is not set +# CONFIG_VIDEO_GC2145 is not set +# CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_HI846 is not set +# CONFIG_VIDEO_HI847 is not set +# CONFIG_VIDEO_IMX208 is not set +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX283 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX296 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX334 is not set +# CONFIG_VIDEO_IMX335 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX415 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9M114 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T112 is not set +# CONFIG_VIDEO_MT9V011 is not set +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_OG01A1B is not set +# CONFIG_VIDEO_OV01A10 is not set +# CONFIG_VIDEO_OV02A10 is not set +# CONFIG_VIDEO_OV08D10 is not set +# CONFIG_VIDEO_OV08X40 is not set +# CONFIG_VIDEO_OV13858 is not set +# CONFIG_VIDEO_OV13B10 is not set +# CONFIG_VIDEO_OV2640 is not set +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV4689 is not set +# CONFIG_VIDEO_OV5640 is not set +# CONFIG_VIDEO_OV5645 is not set +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set +# CONFIG_VIDEO_OV5693 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV64A40 is not set +# CONFIG_VIDEO_OV6650 is not set +# CONFIG_VIDEO_OV7251 is not set +# CONFIG_VIDEO_OV7640 is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_OV772X is not set +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8858 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9282 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_RDACM20 is not set +# CONFIG_VIDEO_RDACM21 is not set +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_VGXY61 is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_ET8EK8 is not set + +# +# Camera ISPs +# +# CONFIG_VIDEO_THP7312 is not set +# end of Camera ISPs + +# +# Lens drivers +# +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_DW9719 is not set +# CONFIG_VIDEO_DW9768 is not set +# CONFIG_VIDEO_DW9807_VCM is not set +# end of Lens drivers + +# +# Flash devices +# +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# end of Flash devices + +# +# Audio decoders, processors and mixers +# +# CONFIG_VIDEO_CS3308 is not set +# CONFIG_VIDEO_CS5345 is not set +# CONFIG_VIDEO_CS53L32A is not set +# CONFIG_VIDEO_MSP3400 is not set +# CONFIG_VIDEO_SONY_BTF_MPX is not set +# CONFIG_VIDEO_TDA1997X is not set +# CONFIG_VIDEO_TDA7432 is not set +# CONFIG_VIDEO_TDA9840 is not set +# CONFIG_VIDEO_TEA6415C is not set +# CONFIG_VIDEO_TEA6420 is not set +# CONFIG_VIDEO_TLV320AIC23B is not set +# CONFIG_VIDEO_TVAUDIO is not set +# CONFIG_VIDEO_UDA1342 is not set +# CONFIG_VIDEO_VP27SMPX is not set +# CONFIG_VIDEO_WM8739 is not set +# CONFIG_VIDEO_WM8775 is not set +# end of Audio decoders, processors and mixers + +# +# RDS decoders +# +# CONFIG_VIDEO_SAA6588 is not set +# end of RDS decoders + +# +# Video decoders +# +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7183 is not set +# CONFIG_VIDEO_ADV748X is not set +# CONFIG_VIDEO_ADV7604 is not set +# CONFIG_VIDEO_ADV7842 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_ISL7998X is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_ML86V7667 is not set +# CONFIG_VIDEO_SAA7110 is not set +# CONFIG_VIDEO_SAA711X is not set +# CONFIG_VIDEO_TC358743 is not set +# CONFIG_VIDEO_TC358746 is not set +# CONFIG_VIDEO_TVP514X is not set +# CONFIG_VIDEO_TVP5150 is not set +# CONFIG_VIDEO_TVP7002 is not set +# CONFIG_VIDEO_TW2804 is not set +# CONFIG_VIDEO_TW9900 is not set +# CONFIG_VIDEO_TW9903 is not set +# CONFIG_VIDEO_TW9906 is not set +# CONFIG_VIDEO_TW9910 is not set +# CONFIG_VIDEO_VPX3220 is not set + +# +# Video and audio decoders +# +# CONFIG_VIDEO_SAA717X is not set +# CONFIG_VIDEO_CX25840 is not set +# end of Video decoders + +# +# Video encoders +# +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV7393 is not set +# CONFIG_VIDEO_ADV7511 is not set +# CONFIG_VIDEO_AK881X is not set +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_THS8200 is not set +# end of Video encoders + +# +# Video improvement chips +# +# CONFIG_VIDEO_UPD64031A is not set +# CONFIG_VIDEO_UPD64083 is not set +# end of Video improvement chips + +# +# Audio/Video compression chips +# +# CONFIG_VIDEO_SAA6752HS is not set +# end of Audio/Video compression chips + +# +# SDR tuner chips +# +# CONFIG_SDR_MAX2175 is not set +# end of SDR tuner chips + +# +# Miscellaneous helper chips +# +# CONFIG_VIDEO_I2C is not set +# CONFIG_VIDEO_M52790 is not set +# CONFIG_VIDEO_ST_MIPID02 is not set +# CONFIG_VIDEO_THS7303 is not set +# end of Miscellaneous helper chips + +# +# Video serializers and deserializers +# +# CONFIG_VIDEO_DS90UB913 is not set +# CONFIG_VIDEO_DS90UB953 is not set +# CONFIG_VIDEO_DS90UB960 is not set +# CONFIG_VIDEO_MAX96714 is not set +# CONFIG_VIDEO_MAX96717 is not set +# end of Video serializers and deserializers + +# +# Media SPI Adapters +# +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_VIDEO_GS1662 is not set +# end of Media SPI Adapters + +CONFIG_MEDIA_TUNER=m + +# +# Customize TV tuners +# +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# end of Customize TV tuners + +# +# Customise DVB Frontends +# + +# +# Multistandard (satellite) frontends +# +# CONFIG_DVB_MXL5XX is not set +# CONFIG_DVB_STB0899 is not set +# CONFIG_DVB_STB6100 is not set +# CONFIG_DVB_STV090x is not set +# CONFIG_DVB_STV0910 is not set +# CONFIG_DVB_STV6110x is not set +# CONFIG_DVB_STV6111 is not set + +# +# Multistandard (cable + terrestrial) frontends +# +# CONFIG_DVB_DRXK is not set +# CONFIG_DVB_MN88472 is not set +# CONFIG_DVB_MN88473 is not set +# CONFIG_DVB_SI2165 is not set +# CONFIG_DVB_TDA18271C2DD is not set + +# +# DVB-S (satellite) frontends +# +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24116 is not set +# CONFIG_DVB_CX24117 is not set +# CONFIG_DVB_CX24120 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_DS3000 is not set +# CONFIG_DVB_MB86A16 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_SI21XX is not set +# CONFIG_DVB_STB6000 is not set +# CONFIG_DVB_STV0288 is not set +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_STV0900 is not set +# CONFIG_DVB_STV6110 is not set +# CONFIG_DVB_TDA10071 is not set +# CONFIG_DVB_TDA10086 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_TDA8261 is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TS2020 is not set +# CONFIG_DVB_TUA6100 is not set +# CONFIG_DVB_TUNER_CX24113 is not set +# CONFIG_DVB_TUNER_ITD1000 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_ZL10036 is not set +# CONFIG_DVB_ZL10039 is not set + +# +# DVB-T (terrestrial) frontends +# +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_CXD2820R is not set +# CONFIG_DVB_CXD2841ER is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set +# CONFIG_DVB_DIB9000 is not set +# CONFIG_DVB_DRXD is not set +# CONFIG_DVB_EC100 is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_S5H1432 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_STV0367 is not set +# CONFIG_DVB_TDA10048 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_ZD1301_DEMOD is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DVB_CXD2880 is not set + +# +# DVB-C (cable) frontends +# +# CONFIG_DVB_STV0297 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_VES1820 is not set + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +# CONFIG_DVB_AU8522_DTV is not set +# CONFIG_DVB_AU8522_V4L is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LG2160 is not set +# CONFIG_DVB_LGDT3305 is not set +# CONFIG_DVB_LGDT330X is not set +# CONFIG_DVB_MXL692 is not set +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_S5H1409 is not set +# CONFIG_DVB_S5H1411 is not set + +# +# ISDB-T (terrestrial) frontends +# +# CONFIG_DVB_DIB8000 is not set +# CONFIG_DVB_MB86A20S is not set +# CONFIG_DVB_S921 is not set + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +# CONFIG_DVB_MN88443X is not set +# CONFIG_DVB_TC90522 is not set + +# +# Digital terrestrial only tuners/PLL +# +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set + +# +# SEC control devices for DVB-S +# +# CONFIG_DVB_A8293 is not set +# CONFIG_DVB_AF9033 is not set +# CONFIG_DVB_ASCOT2E is not set +# CONFIG_DVB_ATBM8830 is not set +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_HORUS3A is not set +# CONFIG_DVB_ISL6405 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_ISL6423 is not set +# CONFIG_DVB_IX2505V is not set +# CONFIG_DVB_LGS8GL5 is not set +# CONFIG_DVB_LGS8GXX is not set +# CONFIG_DVB_LNBH25 is not set +# CONFIG_DVB_LNBH29 is not set +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_LNBP22 is not set +# CONFIG_DVB_M88RS2000 is not set +# CONFIG_DVB_TDA665x is not set +# CONFIG_DVB_DRX39XYJ is not set + +# +# Common Interface (EN50221) controller drivers +# +# CONFIG_DVB_CXD2099 is not set +# CONFIG_DVB_SP2 is not set +# end of Customise DVB Frontends + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set +# end of Media ancillary drivers + +# +# Graphics support +# +CONFIG_VIDEO=y +# CONFIG_AUXDISPLAY is not set +CONFIG_DRM=m +CONFIG_DRM_MIPI_DSI=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=m +# CONFIG_DRM_PANIC is not set +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_DISPLAY_HELPER=m +CONFIG_DRM_BRIDGE_CONNECTOR=y +# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set +# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y +CONFIG_DRM_EPD_HELPER=m +CONFIG_DRM_TTM=m +CONFIG_DRM_TTM_HELPER=m +CONFIG_DRM_GEM_DMA_HELPER=m +CONFIG_DRM_GEM_SHMEM_HELPER=m +CONFIG_DRM_SCHED=m + +# +# I2C encoder or helper chips +# +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# end of I2C encoder or helper chips + +# +# ARM devices +# +# CONFIG_DRM_HDLCD is not set +# CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_KOMEDA is not set +# end of ARM devices + +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_AMDGPU is not set +# CONFIG_DRM_NOUVEAU is not set +# CONFIG_DRM_XE is not set +CONFIG_DRM_VGEM=m +# CONFIG_DRM_VKMS is not set +CONFIG_DRM_ROCKCHIP=m +CONFIG_ROCKCHIP_VOP=y +CONFIG_ROCKCHIP_VOP2=y +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +# CONFIG_ROCKCHIP_CDN_DP is not set +CONFIG_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_DW_MIPI_DSI=y +CONFIG_ROCKCHIP_INNO_HDMI=y +CONFIG_ROCKCHIP_LVDS=y +# CONFIG_ROCKCHIP_RGB is not set +# CONFIG_ROCKCHIP_RK3066_HDMI is not set +CONFIG_DRM_ROCKCHIP_EBC=m +# CONFIG_DRM_VMWGFX is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_AST is not set +# CONFIG_DRM_MGAG200 is not set +# CONFIG_DRM_QXL is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set +# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set +# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set +# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set +# CONFIG_DRM_PANEL_EBBG_FT8719 is not set +# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set +# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_LVDS is not set +# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set +# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set +# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set +# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set +# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_JDI_R63452 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set +# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_LG_SW43408 is not set +# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set +# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set +# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set +# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set +# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set +# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set +# CONFIG_DRM_PANEL_EDP is not set +CONFIG_DRM_PANEL_SIMPLE=m +# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set +# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +# CONFIG_DRM_DISPLAY_CONNECTOR is not set +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_LVDS_CODEC is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NWL_MIPI_DSI is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set +# CONFIG_DRM_SAMSUNG_DSIM is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set +# CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set +# CONFIG_DRM_TOSHIBA_TC358764 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TI_DLPC3433 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +# CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set +CONFIG_DRM_DW_HDMI=m +# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set +# CONFIG_DRM_DW_HDMI_I2S_AUDIO is not set +# CONFIG_DRM_DW_HDMI_GP_AUDIO is not set +# CONFIG_DRM_DW_HDMI_CEC is not set +CONFIG_DRM_DW_MIPI_DSI=m +# end of Display Interface Bridges + +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_HISI_HIBMC is not set +# CONFIG_DRM_HISI_KIRIN is not set +# CONFIG_DRM_LOGICVC is not set +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_CIRRUS_QEMU is not set +# CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_PANEL_MIPI_DBI is not set +# CONFIG_DRM_SIMPLEDRM is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9163 is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_LIMA is not set +CONFIG_DRM_PANFROST=m +# CONFIG_DRM_PANTHOR is not set +# CONFIG_DRM_TIDSS is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set +# CONFIG_DRM_POWERVR is not set +# CONFIG_DRM_WERROR is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m + +# +# Frame buffer Devices +# +CONFIG_FB=y +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_EFI is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SSD1307 is not set +# CONFIG_FB_SM712 is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB_DEVICE=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYSMEM_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DMAMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_KTD2801 is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set +# CONFIG_BACKLIGHT_PWM is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3509 is not set +CONFIG_BACKLIGHT_LM3630A=y +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_MP3309C is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# CONFIG_BACKLIGHT_LED is not set +# end of Backlight & LCD device support + +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y +# end of Console display driver support + +# CONFIG_LOGO is not set +# end of Graphics support + +# CONFIG_DRM_ACCEL is not set +CONFIG_SOUND=m +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_DMAENGINE_PCM=m +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +# CONFIG_SND_OSSEMUL is not set +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=m +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_CTL_FAST_LOOKUP=y +CONFIG_SND_DEBUG=y +CONFIG_SND_DEBUG_VERBOSE=y +# CONFIG_SND_PCM_XRUN_DEBUG is not set +# CONFIG_SND_CTL_INPUT_VALIDATION is not set +# CONFIG_SND_CTL_DEBUG is not set +# CONFIG_SND_JACK_INJECTION_DEBUG is not set +# CONFIG_SND_UTIMER is not set +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_DRIVERS is not set +CONFIG_SND_PCI=y +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_CTXFI is not set +# CONFIG_SND_DARLA20 is not set +# CONFIG_SND_GINA20 is not set +# CONFIG_SND_LAYLA20 is not set +# CONFIG_SND_DARLA24 is not set +# CONFIG_SND_GINA24 is not set +# CONFIG_SND_LAYLA24 is not set +# CONFIG_SND_MONA is not set +# CONFIG_SND_MIA is not set +# CONFIG_SND_ECHO3G is not set +# CONFIG_SND_INDIGO is not set +# CONFIG_SND_INDIGOIO is not set +# CONFIG_SND_INDIGODJ is not set +# CONFIG_SND_INDIGOIOX is not set +# CONFIG_SND_INDIGODJX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_LOLA is not set +# CONFIG_SND_LX6464ES is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_RIPTIDE is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_SE6X is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_YMFPCI is not set + +# +# HD-Audio +# +# CONFIG_SND_HDA_INTEL is not set +# end of HD-Audio + +CONFIG_SND_HDA_PREALLOC_SIZE=64 +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_SOC=m +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +# CONFIG_SND_SOC_ADI is not set +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_AMD_ACP_CONFIG is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_AUDMIX is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_FSL_XCVR is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_SOC_CHV3_I2S is not set +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set +CONFIG_SND_SOC_ROCKCHIP=m +# CONFIG_SND_SOC_ROCKCHIP_I2S is not set +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=m +CONFIG_SND_SOC_ROCKCHIP_PDM=m +# CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set +# CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set +# CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set +# CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set +# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +CONFIG_SND_SOC_I2C_AND_SPI=m + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +# CONFIG_SND_SOC_AK4375 is not set +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4619 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set +# CONFIG_SND_SOC_AW8738 is not set +# CONFIG_SND_SOC_AW88395 is not set +# CONFIG_SND_SOC_AW88261 is not set +# CONFIG_SND_SOC_AW87390 is not set +# CONFIG_SND_SOC_AW88399 is not set +# CONFIG_SND_SOC_BD28623 is not set +CONFIG_SND_SOC_BT_SCO=m +# CONFIG_SND_SOC_CHV3_CODEC is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set +# CONFIG_SND_SOC_CS35L41_SPI is not set +# CONFIG_SND_SOC_CS35L41_I2C is not set +# CONFIG_SND_SOC_CS35L45_SPI is not set +# CONFIG_SND_SOC_CS35L45_I2C is not set +# CONFIG_SND_SOC_CS35L56_I2C is not set +# CONFIG_SND_SOC_CS35L56_SPI is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS42L83 is not set +# CONFIG_SND_SOC_CS4234 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CS530X_I2C is not set +# CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set +CONFIG_SND_SOC_DMIC=m +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +# CONFIG_SND_SOC_ES8311 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8326 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_HDA is not set +# CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IDT821034 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_MAX98088 is not set +# CONFIG_SND_SOC_MAX98090 is not set +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98520 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98388 is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX98396 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_PCM6240 is not set +# CONFIG_SND_SOC_PEB2466 is not set +# CONFIG_SND_SOC_RK3308 is not set +# CONFIG_SND_SOC_RK3328 is not set +CONFIG_SND_SOC_RK817=m +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set +# CONFIG_SND_SOC_RT5659 is not set +# CONFIG_SND_SOC_RT9120 is not set +# CONFIG_SND_SOC_RTQ9128 is not set +# CONFIG_SND_SOC_SGTL5000 is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m +# CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SMA1303 is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SRC4XXX_I2C is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2518 is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM3515 is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +# CONFIG_SND_SOC_TAS2780 is not set +# CONFIG_SND_SOC_TAS2781_I2C is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS5805M is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TFA989X is not set +# CONFIG_SND_SOC_TLV320ADC3XXX is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +# CONFIG_SND_SOC_TS3A227E is not set +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731_I2C is not set +# CONFIG_SND_SOC_WM8731_SPI is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8940 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8961 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6357 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_NAU8315 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8821 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# end of CODEC drivers + +CONFIG_SND_SIMPLE_CARD_UTILS=m +CONFIG_SND_SIMPLE_CARD=m +# CONFIG_SND_AUDIO_GRAPH_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set +# CONFIG_SND_TEST_COMPONENT is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_ACCUTOUCH is not set +# CONFIG_HID_ACRUX is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_ASUS is not set +# CONFIG_HID_AUREAL is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_BETOP_FF is not set +# CONFIG_HID_BIGBEN_FF is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_CORSAIR is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set +# CONFIG_HID_PRODIKEYS is not set +# CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CP2112 is not set +# CONFIG_HID_CREATIVE_SB0540 is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELAN is not set +# CONFIG_HID_ELECOM is not set +# CONFIG_HID_ELO is not set +# CONFIG_HID_EVISION is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_FT260 is not set +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_GOODIX_SPI is not set +# CONFIG_HID_GOOGLE_STADIA_FF is not set +# CONFIG_HID_VIVALDI is not set +# CONFIG_HID_GT683R is not set +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_ICADE is not set +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LED is not set +# CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set +# CONFIG_HID_LOGITECH is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set +# CONFIG_HID_REDRAGON is not set +CONFIG_HID_MICROSOFT=y +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NINTENDO is not set +# CONFIG_HID_NTI is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_NVIDIA_SHIELD is not set +# CONFIG_HID_ORTEK is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PENMOUNT is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PLAYSTATION is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_RETRODE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEAM is not set +# CONFIG_HID_STEELSERIES is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_HID_RMI is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_TIVO is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set +# CONFIG_HID_THINGM is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_WIIMOTE is not set +# CONFIG_HID_WINWING is not set +# CONFIG_HID_XINMO is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set +# CONFIG_HID_ALPS is not set +# CONFIG_HID_MCP2200 is not set +# CONFIG_HID_MCP2221 is not set +# end of Special HID drivers + +# +# HID-BPF support +# +# CONFIG_HID_BPF is not set +# end of HID-BPF support + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +CONFIG_USB_HIDDEV=y +# end of USB HID support + +CONFIG_I2C_HID=y +CONFIG_I2C_HID_OF=m +# CONFIG_I2C_HID_OF_ELAN is not set +CONFIG_I2C_HID_OF_GOODIX=m +CONFIG_I2C_HID_CORE=m +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_LED_TRIG=y +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_USB_CONN_GPIO is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +# CONFIG_USB_PCI_AMD is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +CONFIG_USB_DYNAMIC_MINORS=y +CONFIG_USB_OTG=y +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_OTG_FSM=m +CONFIG_USB_LEDS_TRIGGER_USBPORT=y +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 +# CONFIG_USB_MON is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=y +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=y +# CONFIG_USB_XHCI_PCI_RENESAS is not set +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=y +# CONFIG_USB_EHCI_FSL is not set +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PCI=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set + +# +# USB dual-mode controller drivers +# +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_MUSB_HDRC is not set +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_HOST is not set +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_DUAL_ROLE=y + +# +# Platform Glue Driver Support +# +CONFIG_USB_DWC3_HAPS=y +CONFIG_USB_DWC3_OF_SIMPLE=y +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_ONBOARD_DEV is not set + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +# CONFIG_U_SERIAL_CONSOLE is not set + +# +# USB Peripheral Controller +# +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_AMD5536UDC is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_NET2280 is not set +# CONFIG_USB_GOKU is not set +# CONFIG_USB_EG20T is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_MAX3420_UDC is not set +# CONFIG_USB_DUMMY_HCD is not set +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=m +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_U_ETHER=m +CONFIG_USB_U_AUDIO=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_NCM=m +CONFIG_USB_F_ECM=m +CONFIG_USB_F_EEM=m +CONFIG_USB_F_SUBSET=m +CONFIG_USB_F_MASS_STORAGE=m +CONFIG_USB_F_FS=m +CONFIG_USB_F_UAC1=m +CONFIG_USB_F_UAC2=m +CONFIG_USB_F_HID=m +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +# CONFIG_USB_CONFIGFS_OBEX is not set +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_ECM_SUBSET=y +# CONFIG_USB_CONFIGFS_RNDIS is not set +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +# CONFIG_USB_CONFIGFS_F_FS is not set +CONFIG_USB_CONFIGFS_F_UAC1=y +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +CONFIG_USB_CONFIGFS_F_UAC2=y +# CONFIG_USB_CONFIGFS_F_MIDI is not set +# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +CONFIG_USB_CONFIGFS_F_HID=y +# CONFIG_USB_CONFIGFS_F_UVC is not set +# CONFIG_USB_CONFIGFS_F_PRINTER is not set + +# +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +CONFIG_USB_GADGETFS=y +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_FUNCTIONFS_ETH=y +# CONFIG_USB_FUNCTIONFS_RNDIS is not set +CONFIG_USB_FUNCTIONFS_GENERIC=y +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_USB_CDC_COMPOSITE=m +# CONFIG_USB_G_ACM_MS is not set +CONFIG_USB_G_MULTI=m +# CONFIG_USB_G_MULTI_RNDIS is not set +CONFIG_USB_G_MULTI_CDC=y +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_DBGP is not set +# CONFIG_USB_G_WEBCAM is not set +# CONFIG_USB_RAW_GADGET is not set +# end of USB Gadget precomposed configurations + +CONFIG_TYPEC=y +# CONFIG_TYPEC_TCPM is not set +# CONFIG_TYPEC_UCSI is not set +# CONFIG_TYPEC_TPS6598X is not set +# CONFIG_TYPEC_ANX7411 is not set +# CONFIG_TYPEC_RT1719 is not set +# CONFIG_TYPEC_HD3SS3220 is not set +# CONFIG_TYPEC_STUSB160X is not set +CONFIG_TYPEC_WUSB3801=m + +# +# USB Type-C Multiplexer/DeMultiplexer Switch support +# +# CONFIG_TYPEC_MUX_FSA4480 is not set +# CONFIG_TYPEC_MUX_GPIO_SBU is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_MUX_IT5205 is not set +# CONFIG_TYPEC_MUX_NB7VPQ904M is not set +# CONFIG_TYPEC_MUX_PTN36502 is not set +# CONFIG_TYPEC_MUX_WCD939X_USBSS is not set +# end of USB Type-C Multiplexer/DeMultiplexer Switch support + +# +# USB Type-C Alternate Mode drivers +# +# CONFIG_TYPEC_DP_ALTMODE is not set +# end of USB Type-C Alternate Mode drivers + +CONFIG_USB_ROLE_SWITCH=y +CONFIG_MMC=y +CONFIG_PWRSEQ_EMMC=y +CONFIG_PWRSEQ_SIMPLE=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_ARMMMCI is not set +CONFIG_MMC_SDHCI=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +# CONFIG_MMC_SDHCI_OF_AT91 is not set +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +# CONFIG_MMC_SDHCI_CADENCE is not set +# CONFIG_MMC_SDHCI_F_SDH30 is not set +# CONFIG_MMC_SDHCI_MILBEAUT is not set +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_CB710 is not set +# CONFIG_MMC_VIA_SDMMC is not set +CONFIG_MMC_DW=y +CONFIG_MMC_DW_PLTFM=y +# CONFIG_MMC_DW_BLUEFIELD is not set +# CONFIG_MMC_DW_EXYNOS is not set +# CONFIG_MMC_DW_HI3798CV200 is not set +# CONFIG_MMC_DW_HI3798MV200 is not set +# CONFIG_MMC_DW_K3 is not set +# CONFIG_MMC_DW_PCI is not set +CONFIG_MMC_DW_ROCKCHIP=y +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_CQHCI=y +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_TOSHIBA_PCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=y +CONFIG_LEDS_CLASS_MULTICOLOR=y +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_AW200XX is not set +# CONFIG_LEDS_AW2013 is not set +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_CR0014114 is not set +# CONFIG_LEDS_EL15203000 is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +# CONFIG_LEDS_LP55XX_COMMON is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_PCA995X is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2606MVV is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_IS31FL319X is not set +# CONFIG_LEDS_IS31FL32XX is not set + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +# CONFIG_LEDS_SYSCON is not set +# CONFIG_LEDS_MLXREG is not set +# CONFIG_LEDS_USER is not set +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_LM3697 is not set + +# +# Flash and Torch LED drivers +# +# CONFIG_LEDS_AAT1290 is not set +# CONFIG_LEDS_AS3645A is not set +# CONFIG_LEDS_KTD2692 is not set +# CONFIG_LEDS_LM3601X is not set +# CONFIG_LEDS_RT4505 is not set +# CONFIG_LEDS_RT8515 is not set +# CONFIG_LEDS_SGM3140 is not set +# CONFIG_LEDS_SY7802 is not set + +# +# RGB LED drivers +# +# CONFIG_LEDS_GROUP_MULTICOLOR is not set +# CONFIG_LEDS_KTD202X is not set +# CONFIG_LEDS_NCP5623 is not set +# CONFIG_LEDS_PWM_MULTICOLOR is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +# CONFIG_LEDS_TRIGGER_DISK is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=y +CONFIG_LEDS_TRIGGER_GPIO=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=y +CONFIG_LEDS_TRIGGER_CAMERA=y +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEDS_TRIGGER_NETDEV=y +CONFIG_LEDS_TRIGGER_PATTERN=y +CONFIG_LEDS_TRIGGER_TTY=y +# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set + +# +# Simple LED drivers +# +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX31335 is not set +# CONFIG_RTC_DRV_NCT3018Y is not set +CONFIG_RTC_DRV_RK808=y +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8111 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD2405AL is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_EFI is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_CADENCE is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_R7301 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_GOLDFISH is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_AMBA_PL08X is not set +# CONFIG_BCM_SBA_RAID is not set +# CONFIG_DW_AXI_DMAC is not set +# CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_MV_XOR_V2 is not set +CONFIG_PL330_DMA=y +# CONFIG_PLX_DMA is not set +# CONFIG_XILINX_DMA is not set +# CONFIG_XILINX_XDMA is not set +# CONFIG_XILINX_ZYNQMP_DMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_AMD_QDMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set +# CONFIG_DW_DMAC_PCI is not set +# CONFIG_DW_EDMA is not set +# CONFIG_SF_PDMA is not set + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +# CONFIG_UDMABUF is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set +# end of DMABUF options + +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VDPA is not set +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +CONFIG_STAGING=y +# CONFIG_RTLLIB is not set +# CONFIG_RTL8723BS is not set +# CONFIG_R8712U is not set +# CONFIG_RTS5208 is not set +# CONFIG_VT6655 is not set +# CONFIG_VT6656 is not set + +# +# IIO staging drivers +# + +# +# Accelerometers +# +# CONFIG_ADIS16203 is not set +# CONFIG_ADIS16240 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7816 is not set +# end of Analog to digital converters + +# +# Analog digital bi-direction converters +# +# CONFIG_ADT7316 is not set +# end of Analog digital bi-direction converters + +# +# Direct Digital Synthesis +# +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set +# end of Direct Digital Synthesis + +# +# Network Analyzer, Impedance Converters +# +# CONFIG_AD5933 is not set +# end of Network Analyzer, Impedance Converters +# end of IIO staging drivers + +# CONFIG_FB_SM750 is not set +CONFIG_STAGING_MEDIA=y +# CONFIG_DVB_AV7110 is not set +# CONFIG_VIDEO_MAX96712 is not set +CONFIG_VIDEO_ROCKCHIP_VDEC=m + +# +# StarFive media platform drivers +# +# CONFIG_STAGING_MEDIA_DEPRECATED is not set +# CONFIG_LTE_GDM724X is not set +# CONFIG_FB_TFT is not set +# CONFIG_XIL_AXIS_FIFO is not set +# CONFIG_FIELDBUS_DEV is not set +# CONFIG_VME_BUS is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_CZNIC_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_ARM64_PLATFORM_DEVICES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Clock driver for ARM Reference designs +# +# CONFIG_CLK_ICST is not set +# CONFIG_CLK_SP810 is not set +# end of Clock driver for ARM Reference designs + +# CONFIG_LMK04832 is not set +# CONFIG_COMMON_CLK_MAX9485 is not set +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_SCMI=y +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_AXI_CLKGEN is not set +# CONFIG_COMMON_CLK_XGENE is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_COMMON_CLK_RS9_PCIE is not set +# CONFIG_COMMON_CLK_SI521XX is not set +# CONFIG_COMMON_CLK_VC3 is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_VC7 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +CONFIG_COMMON_CLK_ROCKCHIP=y +# CONFIG_CLK_PX30 is not set +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +CONFIG_CLK_RK3568=y +CONFIG_CLK_RK3576=y +CONFIG_CLK_RK3588=y +# CONFIG_XILINX_VCU is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_CLKSRC_MMIO=y +CONFIG_ROCKCHIP_TIMER=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +# end of Clock Source drivers + +CONFIG_MAILBOX=y +# CONFIG_ARM_MHU is not set +# CONFIG_ARM_MHU_V2 is not set +# CONFIG_ARM_MHU_V3 is not set +# CONFIG_PLATFORM_MHU is not set +# CONFIG_PL320_MBOX is not set +CONFIG_ROCKCHIP_MBOX=y +# CONFIG_ALTERA_MBOX is not set +# CONFIG_MAILBOX_TEST is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +# CONFIG_IOMMU_IO_PGTABLE_DART is not set +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y +CONFIG_OF_IOMMU=y +CONFIG_IOMMU_DMA=y +# CONFIG_IOMMUFD is not set +CONFIG_ROCKCHIP_IOMMU=y +# CONFIG_ARM_SMMU is not set +# CONFIG_ARM_SMMU_V3 is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_QUICC_ENGINE is not set +# CONFIG_FSL_RCPM is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# CONFIG_LITEX_SOC_CONTROLLER is not set +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +CONFIG_ROCKCHIP_GRF=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_SUSPEND_MODE=y +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# +# PM Domains +# + +# +# Amlogic PM Domains +# +# end of Amlogic PM Domains + +CONFIG_ARM_SCMI_PERF_DOMAIN=y +CONFIG_ARM_SCMI_POWER_DOMAIN=y + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +# end of Qualcomm PM Domains + +CONFIG_ROCKCHIP_PM_DOMAINS=y +# end of PM Domains + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +# CONFIG_DEVFREQ_GOV_PASSIVE is not set + +# +# DEVFREQ Drivers +# +CONFIG_ARM_RK3399_DMC_DEVFREQ=y +CONFIG_PM_DEVFREQ_EVENT=y +CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_FSA9480 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_LC824206XA is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +# CONFIG_EXTCON_USB_GPIO is not set +# CONFIG_EXTCON_USBC_TUSB320 is not set +# CONFIG_MEMORY is not set +CONFIG_IIO=m +CONFIG_IIO_BUFFER=y +# CONFIG_IIO_BUFFER_CB is not set +# CONFIG_IIO_BUFFER_DMA is not set +# CONFIG_IIO_BUFFER_DMAENGINE is not set +# CONFIG_IIO_BUFFER_HW_CONSUMER is not set +CONFIG_IIO_KFIFO_BUF=m +CONFIG_IIO_TRIGGERED_BUFFER=m +CONFIG_IIO_CONFIGFS=m +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +# CONFIG_IIO_SW_DEVICE is not set +CONFIG_IIO_SW_TRIGGER=m +CONFIG_IIO_TRIGGERED_EVENT=m + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADXL313_I2C is not set +# CONFIG_ADXL313_SPI is not set +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL355_I2C is not set +# CONFIG_ADXL355_SPI is not set +# CONFIG_ADXL367_SPI is not set +# CONFIG_ADXL367_I2C is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_ADXL380_SPI is not set +# CONFIG_ADXL380_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_BMI088_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m +CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m +# CONFIG_IIO_KX022A_SPI is not set +# CONFIG_IIO_KX022A_I2C is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MSA311 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD4000 is not set +# CONFIG_AD4130 is not set +# CONFIG_AD4695 is not set +# CONFIG_AD7091R5 is not set +# CONFIG_AD7091R8 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7173 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7280 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7380 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7944 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_AD9467 is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2309 is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX11205 is not set +# CONFIG_MAX11410 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX34408 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3564 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +# CONFIG_PAC1921 is not set +# CONFIG_PAC1934 is not set +CONFIG_ROCKCHIP_SARADC=m +# CONFIG_RICHTEK_RTQ6056 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS1119 is not set +# CONFIG_TI_ADS7924 is not set +# CONFIG_TI_ADS1100 is not set +# CONFIG_TI_ADS1298 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_LMP92064 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set +# CONFIG_VF610_ADC is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog to digital and digital to analog converters +# +# CONFIG_AD74115 is not set +# CONFIG_AD74413R is not set +# end of Analog to digital and digital to analog converters + +# +# Analog Front Ends +# +# CONFIG_IIO_RESCALE is not set +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# CONFIG_ADA4250 is not set +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7746 is not set +# end of Capacitance to digital converters + +# +# Chemical Sensors +# +# CONFIG_AOSONG_AGS02MA is not set +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_BME680 is not set +# CONFIG_CCS811 is not set +# CONFIG_ENS160 is not set +# CONFIG_IAQCORE is not set +# CONFIG_PMS7003 is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SCD4X is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSIRION_SGP40 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set +# CONFIG_SENSEAIR_SUNRISE_CO2 is not set +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +# +# Hid Sensor IIO Common +# +# end of Hid Sensor IIO Common + +# +# IIO SCMI Sensors +# +# CONFIG_IIO_SCMI is not set +# end of IIO SCMI Sensors + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +CONFIG_IIO_ST_SENSORS_I2C=m +CONFIG_IIO_ST_SENSORS_SPI=m +CONFIG_IIO_ST_SENSORS_CORE=m + +# +# Digital to analog converters +# +# CONFIG_AD3552R is not set +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_AD9739A is not set +# CONFIG_LTC2688 is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5766 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7293 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +# CONFIG_LTC2664 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5522 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4728 is not set +# CONFIG_MCP4821 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +# CONFIG_VF610_DAC is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# end of IIO dummy driver + +# +# Filters +# +# CONFIG_ADMV8818 is not set +# end of Filters + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# CONFIG_ADF4377 is not set +# CONFIG_ADMFM2000 is not set +# CONFIG_ADMV1013 is not set +# CONFIG_ADMV1014 is not set +# CONFIG_ADMV4420 is not set +# CONFIG_ADRF6780 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +# CONFIG_FXAS21002C is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_ENS210 is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HDC3020 is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_BMI323_I2C is not set +# CONFIG_BMI323_SPI is not set +# CONFIG_BOSCH_BNO055_SERIAL is not set +# CONFIG_BOSCH_BNO055_I2C is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# CONFIG_IIO_ST_LSM9DS0 is not set +# end of Inertial measurement units + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9306 is not set +# CONFIG_APDS9960 is not set +# CONFIG_AS73211 is not set +# CONFIG_BH1745 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_ISL76682 is not set +# CONFIG_JSA1212 is not set +# CONFIG_ROHM_BU27008 is not set +# CONFIG_ROHM_BU27034 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR390 is not set +# CONFIG_LTR501 is not set +# CONFIG_LTRF216A is not set +# CONFIG_LV0104CS is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_NOA1305 is not set +# CONFIG_OPT3001 is not set +# CONFIG_OPT4001 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL2591 is not set +# CONFIG_TSL2772 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VEML6030 is not set +# CONFIG_VEML6040 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VEML6075 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AF8133J is not set +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +# CONFIG_MMC35240 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_TI_TMAG5273 is not set +# CONFIG_YAMAHA_YAS530 is not set +# end of Magnetometer sensors + +# +# Multiplexers +# +# CONFIG_IIO_MUX is not set +# end of Multiplexers + +# +# Inclinometer sensors +# +# end of Inclinometer sensors + +# +# Triggers - standalone +# +# CONFIG_IIO_HRTIMER_TRIGGER is not set +# CONFIG_IIO_INTERRUPT_TRIGGER is not set +# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set +# CONFIG_IIO_SYSFS_TRIGGER is not set +# end of Triggers - standalone + +# +# Linear and angular position sensors +# +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +# CONFIG_AD5110 is not set +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# CONFIG_X9250 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_ROHM_BM1390 is not set +# CONFIG_BMP280 is not set +# CONFIG_DLHL60D is not set +# CONFIG_DPS310 is not set +# CONFIG_HP03 is not set +# CONFIG_HSC030PA is not set +# CONFIG_ICP10100 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MPRLS0025PA is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_SDP500 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +# CONFIG_HX9023S is not set +# CONFIG_IRSD200 is not set +# CONFIG_ISL29501 is not set +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_MB1232 is not set +# CONFIG_PING is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9324 is not set +# CONFIG_SX9360 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VL53L0X_I2C is not set +# CONFIG_AW96103 is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_LTC2983 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_MLX90635 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_MAX30208 is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX31865 is not set +# CONFIG_MCP9600 is not set +# end of Temperature sensors + +# CONFIG_NTB is not set +CONFIG_PWM=y +# CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_ATMEL_TCB is not set +# CONFIG_PWM_CLK is not set +# CONFIG_PWM_DWC is not set +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_GPIO is not set +# CONFIG_PWM_PCA9685 is not set +CONFIG_PWM_ROCKCHIP=y +# CONFIG_PWM_XILINX is not set + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +CONFIG_IRQ_MSI_LIB=y +# CONFIG_AL_FIC is not set +# CONFIG_LAN966X_OIC is not set +# CONFIG_XILINX_INTC is not set +CONFIG_PARTITION_PERCPU=y +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_ARCH_HAS_RESET_CONTROLLER=y +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_GPIO is not set +CONFIG_RESET_SCMI=y +# CONFIG_RESET_SIMPLE is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_TI_TPS380X is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PHY_MIPI_DPHY=y +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_DPHY_RX is not set +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_LAN966X_SERDES is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# CONFIG_PHY_ROCKCHIP_DP is not set +# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set +# CONFIG_PHY_ROCKCHIP_EMMC is not set +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y +CONFIG_PHY_ROCKCHIP_PCIE=y +# CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX is not set +# CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set +# CONFIG_PHY_ROCKCHIP_TYPEC is not set +# CONFIG_PHY_ROCKCHIP_USB is not set +# CONFIG_PHY_ROCKCHIP_USBDP is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# CONFIG_ARM_CCI_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_ARM_CMN is not set +# CONFIG_ARM_NI is not set +CONFIG_ARM_PMU=y +# CONFIG_ARM_SMMU_V3_PMU is not set +CONFIG_ARM_PMUV3=y +# CONFIG_ARM_DSU_PMU is not set +# CONFIG_ARM_SPE_PMU is not set +# CONFIG_HISI_PCIE_PMU is not set +# CONFIG_HNS3_PMU is not set +# CONFIG_DWC_PCIE_PMU is not set +# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set +# end of Performance monitor support + +# CONFIG_RAS is not set +# CONFIG_USB4 is not set + +# +# Android +# +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDERFS=y +CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" +# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y +CONFIG_NVMEM_LAYOUTS=y + +# +# Layout Types +# +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set +# end of Layout Types + +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_ROCKCHIP_EFUSE is not set +# CONFIG_NVMEM_ROCKCHIP_OTP is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# CONFIG_HISI_PTT is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# CONFIG_CDX_BUS is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +CONFIG_FS_STACK=y +CONFIG_BUFFER_HEAD=y +CONFIG_LEGACY_DIRECT_IO=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_XFS_FS=y +# CONFIG_XFS_SUPPORT_V4 is not set +CONFIG_XFS_SUPPORT_ASCII_CI=y +# CONFIG_XFS_QUOTA is not set +CONFIG_XFS_POSIX_ACL=y +# CONFIG_XFS_RT is not set +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_FS_REF_VERIFY is not set +# CONFIG_NILFS2_FS is not set +CONFIG_F2FS_FS=y +CONFIG_F2FS_STAT_FS=y +CONFIG_F2FS_FS_XATTR=y +CONFIG_F2FS_FS_POSIX_ACL=y +CONFIG_F2FS_FS_SECURITY=y +# CONFIG_F2FS_CHECK_FS is not set +# CONFIG_F2FS_FAULT_INJECTION is not set +# CONFIG_F2FS_FS_COMPRESSION is not set +CONFIG_F2FS_IOSTAT=y +# CONFIG_F2FS_UNFAIR_RWSEM is not set +# CONFIG_BCACHEFS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +# CONFIG_DNOTIFY is not set +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +CONFIG_QUOTA=y +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +# CONFIG_QUOTA_DEBUG is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +# CONFIG_CUSE is not set +# CONFIG_VIRTIO_FS is not set +CONFIG_FUSE_PASSTHROUGH=y +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +# CONFIG_OVERLAY_FS_DEBUG is not set + +# +# Caches +# +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=m +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +CONFIG_NTFS3_FS=m +# CONFIG_NTFS3_64BIT_CLUSTER is not set +# CONFIG_NTFS3_LZX_XPRESS is not set +# CONFIG_NTFS3_FS_POSIX_ACL is not set +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +CONFIG_TMPFS_INODE64=y +# CONFIG_TMPFS_QUOTA is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=y +CONFIG_EFIVAR_FS=y +# end of Pseudo filesystems + +# CONFIG_MISC_FILESYSTEMS is not set +# CONFIG_NETWORK_FILESYSTEMS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set +CONFIG_UNICODE=y +# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_PROC_MEM_ALWAYS_FORCE=y +# CONFIG_PROC_MEM_FORCE_PTRACE is not set +# CONFIG_PROC_MEM_NO_FORCE is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_HARDENED_USERCOPY is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +# CONFIG_INIT_STACK_NONE is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +CONFIG_INIT_STACK_ALL_ZERO=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y +# CONFIG_ZERO_CALL_USED_REGS is not set +# end of Memory initialization + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set +# end of Kernel hardening options +# end of Security options + +CONFIG_XOR_BLOCKS=m +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SIG2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=m +# CONFIG_CRYPTO_TEST is not set +# end of Crypto core or helper + +# +# Public-key cryptography +# +# CONFIG_CRYPTO_RSA is not set +# CONFIG_CRYPTO_DH is not set +CONFIG_CRYPTO_ECC=y +CONFIG_CRYPTO_ECDH=y +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# end of Public-key cryptography + +# +# Block ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers + +# +# Length-preserving ciphers and modes +# +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CTR=y +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_XTS=y +# end of Length-preserving ciphers and modes + +# +# AEAD (authenticated encryption with associated data) ciphers +# +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_GENIV=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=m +CONFIG_CRYPTO_ESSIV=m +# end of AEAD (authenticated encryption with associated data) ciphers + +# +# Hashes, digests, and MACs +# +CONFIG_CRYPTO_BLAKE2B=m +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_GHASH=y +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_RMD160 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=y +# CONFIG_CRYPTO_SM3_GENERIC is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +CONFIG_CRYPTO_XXHASH=m +# end of Hashes, digests, and MACs + +# +# CRCs (cyclic redundancy checks) +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=y +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_ZSTD is not set +# end of Compression + +# +# Random number generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 +CONFIG_CRYPTO_JITTERENTROPY_OSR=1 +# end of Random number generation + +# +# Userspace interface +# +CONFIG_CRYPTO_USER_API=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +# CONFIG_CRYPTO_USER_API_RNG is not set +# CONFIG_CRYPTO_USER_API_AEAD is not set +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set +# end of Userspace interface + +# CONFIG_CRYPTO_NHPOLY1305_NEON is not set +CONFIG_CRYPTO_CHACHA20_NEON=m + +# +# Accelerated Cryptographic Algorithms for CPU (arm64) +# +# CONFIG_CRYPTO_GHASH_ARM64_CE is not set +CONFIG_CRYPTO_POLY1305_NEON=m +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA256_ARM64=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +# CONFIG_CRYPTO_SHA3_ARM64 is not set +# CONFIG_CRYPTO_SM3_NEON is not set +# CONFIG_CRYPTO_SM3_ARM64_CE is not set +# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set +# CONFIG_CRYPTO_AES_ARM64 is not set +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set +# CONFIG_CRYPTO_AES_ARM64_BS is not set +# CONFIG_CRYPTO_SM4_ARM64_CE is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set +# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set +# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set +# end of Accelerated Cryptographic Algorithms for CPU (arm64) + +# CONFIG_CRYPTO_HW is not set +# CONFIG_ASYMMETRIC_KEY_TYPE is not set + +# +# Certificates for signature checking +# +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=m +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_LINEAR_RANGES=y +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +# CONFIG_INDIRECT_PIO is not set +# CONFIG_TRACE_MMIO_ACCESS is not set + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=m +CONFIG_CRYPTO_LIB_GF128MUL=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +# CONFIG_CRC_CCITT is not set +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC64 is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +CONFIG_XXHASH=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_LZO_COMPRESS=m +CONFIG_LZO_DECOMPRESS=m +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=m +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_ARM64=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_RISCV=y +# CONFIG_XZ_DEC_MICROLZMA is not set +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS_HELPERS=y +CONFIG_NEED_SG_DMA_FLAGS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y +CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y +CONFIG_SWIOTLB=y +# CONFIG_SWIOTLB_DYNAMIC is not set +CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y +CONFIG_DMA_NEED_SYNC=y +# CONFIG_DMA_RESTRICTED_POOL is not set +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_COHERENT_POOL=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=16 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +# CONFIG_IRQ_POLL is not set +CONFIG_LIBFDT=y +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_VDSO_GETRANDOM=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set +# end of Library routines + +CONFIG_GENERIC_IOREMAP=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + +# +# Compile-time checks and compiler options +# +CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_ULEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +CONFIG_DEBUG_INFO_DWARF5=y +CONFIG_DEBUG_INFO_REDUCED=y +CONFIG_DEBUG_INFO_COMPRESSED_NONE=y +# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set +# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set +CONFIG_DEBUG_INFO_SPLIT=y +# CONFIG_GDB_SCRIPTS is not set +CONFIG_FRAME_WARN=2048 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_FRAME_POINTER=y +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +# CONFIG_MAGIC_SYSRQ_SERIAL is not set +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +CONFIG_HAVE_KCSAN_COMPILER=y +# CONFIG_KCSAN is not set +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +# CONFIG_MEM_ALLOC_PROFILING is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_KASAN_SW_TAGS=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +CONFIG_PANIC_TIMEOUT=1 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR_INTR_STORM=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +# CONFIG_HARDLOCKUP_DETECTOR is not set +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_WQ_WATCHDOG=y +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_DEBUG=y +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_MAPLE_TREE is not set +# end of Debug kernel data structures + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set +CONFIG_RCU_TRACE=y +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +CONFIG_CPU_HOTPLUG_STATE_CONTROL=y +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +CONFIG_FUNCTION_GRAPH_RETVAL=y +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS=y +CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y +# CONFIG_FUNCTION_PROFILER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_OSNOISE_TRACER is not set +# CONFIG_TIMERLAT_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_UPROBE_EVENTS is not set +CONFIG_FTRACE_MCOUNT_RECORD=y +CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_USER_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_RECORD_RECURSION is not set +# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_RV is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +# CONFIG_STRICT_DEVMEM is not set + +# +# arm64 Debugging +# +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_DEBUG_EFI is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_CORESIGHT is not set +# end of arm64 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking +# end of Kernel hacking From c82ac68ca4f8bc4309f303e5007844fdbf3a2592 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 8 Jan 2025 23:01:42 -0500 Subject: [PATCH 108/313] pmos/pinenote-dbus-service: move from user --- {user => pmos}/pinenote-dbus-service/APKBUILD | 2 +- {user => pmos}/pinenote-dbus-service/pinenote.initd | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {user => pmos}/pinenote-dbus-service/APKBUILD (99%) rename {user => pmos}/pinenote-dbus-service/pinenote.initd (100%) diff --git a/user/pinenote-dbus-service/APKBUILD b/pmos/pinenote-dbus-service/APKBUILD similarity index 99% rename from user/pinenote-dbus-service/APKBUILD rename to pmos/pinenote-dbus-service/APKBUILD index 0312e65..0136557 100644 --- a/user/pinenote-dbus-service/APKBUILD +++ b/pmos/pinenote-dbus-service/APKBUILD @@ -2,7 +2,7 @@ pkgname=pinenote-dbus-service pkgver=0.2.2_pre5 _gittag=0.2.2-dev5 -pkgrel=0 +pkgrel=1 pkgdesc="Dbus daemon for controlling driver aspects on Pine64 Pinenote" url="https://github.com/m-weigand/pinenote_dbus_service" arch="aarch64" diff --git a/user/pinenote-dbus-service/pinenote.initd b/pmos/pinenote-dbus-service/pinenote.initd similarity index 100% rename from user/pinenote-dbus-service/pinenote.initd rename to pmos/pinenote-dbus-service/pinenote.initd From c6d37636b60f161af16ccdb130d9a7773b6bbcdc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 8 Jan 2025 22:59:15 -0500 Subject: [PATCH 109/313] pmos/linux-pine64-pinenote: upgrade to 6.12.0 --- pmos/linux-pine64-pinenote/APKBUILD | 8 +- .../config-pine64-pinenote.aarch64 | 170 +++++++++++++++--- 2 files changed, 154 insertions(+), 24 deletions(-) diff --git a/pmos/linux-pine64-pinenote/APKBUILD b/pmos/linux-pine64-pinenote/APKBUILD index 9d00d99..84f8643 100644 --- a/pmos/linux-pine64-pinenote/APKBUILD +++ b/pmos/linux-pine64-pinenote/APKBUILD @@ -2,7 +2,7 @@ # Kernel config based on: arch/arm64/configs/(CHANGEME!) pkgname=linux-pine64-pinenote -pkgver=6.12.0_rc2 +pkgver=6.12.0 pkgrel=0 pkgdesc="Pine64 PineNote kernel fork" arch="aarch64" @@ -24,7 +24,7 @@ makedepends=" # Source _repository="linux" -_commit="5392aa8e38082b431f3330c873b288f72ae98f90" +_commit="9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac" _config="config-$_flavor.$arch" source=" $pkgname-$_commit.tar.gz::https://github.com/m-weigand/linux/archive/$_commit.tar.gz @@ -54,6 +54,6 @@ package() { } sha512sums=" -34f410639b0046a192f18518db2c12593bf2acb27fd76560801d9010558f55b71cb1c3208b9755f1991f361c70cb80265bb587b7028945da85763de25e73704e linux-pine64-pinenote-5392aa8e38082b431f3330c873b288f72ae98f90.tar.gz -d460b63f8b7d32849a3ae426e0258a2b66b251c654f42c69a65b8ec77f24c6f9d0277f0c66879218dfa9aaa58c019592c17b34f5a8518bd67a62a1fbbddb9f9f config-pine64-pinenote.aarch64 +d3c2510f9f835a0570fbb812cec2f9e12e402878c1f9f214364ae1918bc4c00f69a1fc5e005cf6b85c0690e6fd5f6ce9e61efd88145a83725ed12b6b8c07b97e linux-pine64-pinenote-9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac.tar.gz +99294bd6c53b1cf3832addbc80ea23b9089bb03463e2a9ebe93ab5feb1b2ff9ee38f158032705429230765bae2df23bb3401ec14902134c80d9dd6e58e188be5 config-pine64-pinenote.aarch64 " diff --git a/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 b/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 index 8078456..8e3fb39 100644 --- a/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 +++ b/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 6.12.0-rc2 Kernel Configuration +# Linux/arm64 6.12.0 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-alpine-linux-musl-gcc (Alpine 14.2.0) 14.2.0" CONFIG_CC_IS_GCC=y @@ -12,6 +12,7 @@ CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24200 CONFIG_LLD_VERSION=0 CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y @@ -438,6 +439,7 @@ CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_DEFAULT_CRASH_DUMP=y CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y CONFIG_TRANS_TABLE=y # CONFIG_XEN is not set @@ -810,6 +812,7 @@ CONFIG_BFQ_GROUP_IOSCHED=y # end of IO Schedulers CONFIG_PADATA=y +CONFIG_ASN1=m CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y @@ -1005,6 +1008,7 @@ CONFIG_XFRM_USER=m CONFIG_XFRM_ESP=m # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set +CONFIG_NET_HANDSHAKE=y CONFIG_INET=y # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set @@ -1388,7 +1392,7 @@ CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set -# CONFIG_DNS_RESOLVER is not set +CONFIG_DNS_RESOLVER=m # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set @@ -1427,7 +1431,9 @@ CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=y CONFIG_BT_RFCOMM_TTY=y -# CONFIG_BT_BNEP is not set +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_LE=y CONFIG_BT_LE_L2CAP_ECRED=y @@ -3722,6 +3728,7 @@ CONFIG_VIDEO_HANTRO_ROCKCHIP=y # CONFIG_SMS_SDIO_DRV is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set +CONFIG_UVC_COMMON=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m @@ -4522,6 +4529,10 @@ CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_DMAENGINE_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_UMP=m +CONFIG_SND_UMP_LEGACY_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set @@ -4540,6 +4551,7 @@ CONFIG_SND_DEBUG_VERBOSE=y # CONFIG_SND_CTL_DEBUG is not set # CONFIG_SND_JACK_INJECTION_DEBUG is not set # CONFIG_SND_UTIMER is not set +CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set CONFIG_SND_PCI=y @@ -4616,16 +4628,20 @@ CONFIG_SND_PCI=y CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_UA101 is not set -# CONFIG_SND_USB_CAIAQ is not set -# CONFIG_SND_USB_6FIRE is not set -# CONFIG_SND_USB_HIFACE is not set +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_AUDIO_MIDI_V2=y +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +CONFIG_SND_USB_UA101=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m # CONFIG_SND_BCD2000 is not set -# CONFIG_SND_USB_POD is not set -# CONFIG_SND_USB_PODHD is not set -# CONFIG_SND_USB_TONEPORT is not set -# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_USB_LINE6=m +CONFIG_SND_USB_POD=m +CONFIG_SND_USB_PODHD=m +CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=m CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set @@ -5134,7 +5150,60 @@ CONFIG_USB_DWC3_OF_SIMPLE=y # # USB port drivers # -# CONFIG_USB_SERIAL is not set +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_SIMPLE is not set +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +CONFIG_USB_SERIAL_CP210X=m +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_F8153X is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MXUPORT is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_QCAUX is not set +# CONFIG_USB_SERIAL_QUALCOMM is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_UPD78F0730 is not set +# CONFIG_USB_SERIAL_XR is not set +# CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers @@ -5210,6 +5279,7 @@ CONFIG_USB_U_SERIAL=m CONFIG_USB_U_ETHER=m CONFIG_USB_U_AUDIO=m CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m CONFIG_USB_F_NCM=m CONFIG_USB_F_ECM=m CONFIG_USB_F_EEM=m @@ -5218,11 +5288,14 @@ CONFIG_USB_F_MASS_STORAGE=m CONFIG_USB_F_FS=m CONFIG_USB_F_UAC1=m CONFIG_USB_F_UAC2=m +CONFIG_USB_F_UVC=m +CONFIG_USB_F_MIDI=m +CONFIG_USB_F_MIDI2=m CONFIG_USB_F_HID=m CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_ACM=y -# CONFIG_USB_CONFIGFS_OBEX is not set +CONFIG_USB_CONFIGFS_OBEX=y CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_ECM=y CONFIG_USB_CONFIGFS_ECM_SUBSET=y @@ -5230,14 +5303,14 @@ CONFIG_USB_CONFIGFS_ECM_SUBSET=y CONFIG_USB_CONFIGFS_EEM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y # CONFIG_USB_CONFIGFS_F_LB_SS is not set -# CONFIG_USB_CONFIGFS_F_FS is not set +CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_UAC1=y # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set CONFIG_USB_CONFIGFS_F_UAC2=y -# CONFIG_USB_CONFIGFS_F_MIDI is not set -# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +CONFIG_USB_CONFIGFS_F_MIDI=y +CONFIG_USB_CONFIGFS_F_MIDI2=y CONFIG_USB_CONFIGFS_F_HID=y -# CONFIG_USB_CONFIGFS_F_UVC is not set +CONFIG_USB_CONFIGFS_F_UVC=y # CONFIG_USB_CONFIGFS_F_PRINTER is not set # @@ -6515,7 +6588,6 @@ CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y CONFIG_IRQ_MSI_LIB=y # CONFIG_AL_FIC is not set # CONFIG_LAN966X_OIC is not set @@ -6727,6 +6799,15 @@ CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # # Caches # +CONFIG_NETFS_SUPPORT=m +CONFIG_NETFS_STATS=y +# CONFIG_NETFS_DEBUG is not set +CONFIG_FSCACHE=y +CONFIG_FSCACHE_STATS=y +CONFIG_CACHEFILES=m +# CONFIG_CACHEFILES_DEBUG is not set +# CONFIG_CACHEFILES_ERROR_INJECTION is not set +# CONFIG_CACHEFILES_ONDEMAND is not set # end of Caches # @@ -6783,7 +6864,54 @@ CONFIG_EFIVAR_FS=y # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set -# CONFIG_NETWORK_FILESYSTEMS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=m +CONFIG_NFS_V2=m +CONFIG_NFS_V3=m +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=m +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_PNFS_FILE_LAYOUT=m +CONFIG_PNFS_BLOCK=m +CONFIG_PNFS_FLEXFILE_LAYOUT=m +CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" +# CONFIG_NFS_V4_1_MIGRATION is not set +CONFIG_NFS_FSCACHE=y +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFS_DISABLE_UDP_SUPPORT=y +CONFIG_NFS_V4_2_READ_PLUS=y +# CONFIG_NFSD is not set +CONFIG_GRACE_PERIOD=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_NFS_V4_2_SSC_HELPER=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SUNRPC_DEBUG is not set +# CONFIG_CEPH_FS is not set +CONFIG_CIFS=m +CONFIG_CIFS_STATS2=y +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +# CONFIG_CIFS_POSIX is not set +CONFIG_CIFS_DEBUG=y +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set +# CONFIG_CIFS_DFS_UPCALL is not set +# CONFIG_CIFS_SWN_UPCALL is not set +CONFIG_CIFS_FSCACHE=y +# CONFIG_CIFS_COMPRESSION is not set +# CONFIG_SMB_SERVER is not set +CONFIG_SMBFS=m +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y @@ -6835,6 +6963,7 @@ CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y +CONFIG_NLS_UCS2_UTILS=m # CONFIG_DLM is not set CONFIG_UNICODE=y # CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set @@ -7226,6 +7355,7 @@ CONFIG_GLOB=y CONFIG_NLATTR=y # CONFIG_IRQ_POLL is not set CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=m CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y From d08c1392bc90a7fc2ac391ed88e8a98406ec50ce Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 8 Jan 2025 22:46:54 -0500 Subject: [PATCH 110/313] pmos/device-pine64-pinenote: new aport --- .../50-touchscreen.conf | 11 +++ .../81-libinput-pinenote.rules | 9 +++ .../82-ebc-rockchip.rules | 2 + pmos/device-pine64-pinenote/APKBUILD | 81 +++++++++++++++++++ pmos/device-pine64-pinenote/blacklist.conf | 3 + pmos/device-pine64-pinenote/deviceinfo | 37 +++++++++ .../local-overrides.quirks | 5 ++ pmos/device-pine64-pinenote/modules-initfs | 5 ++ pmos/device-pine64-pinenote/panfrost.conf | 2 + pmos/device-pine64-pinenote/phoc.ini | 6 ++ pmos/device-pine64-pinenote/rockchip_ebc.conf | 1 + 11 files changed, 162 insertions(+) create mode 100644 pmos/device-pine64-pinenote/50-touchscreen.conf create mode 100644 pmos/device-pine64-pinenote/81-libinput-pinenote.rules create mode 100644 pmos/device-pine64-pinenote/82-ebc-rockchip.rules create mode 100644 pmos/device-pine64-pinenote/APKBUILD create mode 100644 pmos/device-pine64-pinenote/blacklist.conf create mode 100644 pmos/device-pine64-pinenote/deviceinfo create mode 100644 pmos/device-pine64-pinenote/local-overrides.quirks create mode 100644 pmos/device-pine64-pinenote/modules-initfs create mode 100644 pmos/device-pine64-pinenote/panfrost.conf create mode 100644 pmos/device-pine64-pinenote/phoc.ini create mode 100644 pmos/device-pine64-pinenote/rockchip_ebc.conf diff --git a/pmos/device-pine64-pinenote/50-touchscreen.conf b/pmos/device-pine64-pinenote/50-touchscreen.conf new file mode 100644 index 0000000..f2d643b --- /dev/null +++ b/pmos/device-pine64-pinenote/50-touchscreen.conf @@ -0,0 +1,11 @@ +Section "InputClass" + Identifier "evdev touchscreen" + MatchProduct "tt21000" + MatchIsTouchscreen "on" + Driver "evdev" +EndSection +Section "InputClass" + Identifier "RotateTouch" + MatchProduct "w9013" + Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1" +EndSection diff --git a/pmos/device-pine64-pinenote/81-libinput-pinenote.rules b/pmos/device-pine64-pinenote/81-libinput-pinenote.rules new file mode 100644 index 0000000..700c71c --- /dev/null +++ b/pmos/device-pine64-pinenote/81-libinput-pinenote.rules @@ -0,0 +1,9 @@ +ACTION=="remove", GOTO="libinput_device_group_end" +KERNEL!="event[0-9]*", GOTO="libinput_device_group_end" + +ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch" +ATTRS{phys}=="?*", ATTRS{name}=="w9013 2D1F:0095 Stylus", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch" + +ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_CALIBRATION_MATRIX}="-1 0 1 0 -1 1" + +LABEL="libinput_device_group_end" diff --git a/pmos/device-pine64-pinenote/82-ebc-rockchip.rules b/pmos/device-pine64-pinenote/82-ebc-rockchip.rules new file mode 100644 index 0000000..56c673d --- /dev/null +++ b/pmos/device-pine64-pinenote/82-ebc-rockchip.rules @@ -0,0 +1,2 @@ +SUBSYSTEM=="module", KERNEL=="rockchip_ebc", RUN+="/bin/chgrp video /sys/module/%k/parameters/dclk_select /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/split_area_limit /sys/module/%k/parameters/default_waveform", RUN+="/bin/chmod g+w /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/default_waveform /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/split_area_limit" +DRIVER=="rockchip-ebc", RUN+="/bin/chgrp video /sys/%p/power/control", RUN+="/bin/chmod g+w /sys/%p/power/control" diff --git a/pmos/device-pine64-pinenote/APKBUILD b/pmos/device-pine64-pinenote/APKBUILD new file mode 100644 index 0000000..5e0ad0b --- /dev/null +++ b/pmos/device-pine64-pinenote/APKBUILD @@ -0,0 +1,81 @@ +# Maintainer: Petr Hodina +pkgname=device-pine64-pinenote +pkgdesc="Pine64 PineNote" +pkgver=2 +pkgrel=8 +url="https://postmarketos.org" +license="MIT" +arch="aarch64" +options="!check !archcheck" +depends=" + u-boot-pine64-pinenote + linux-pine64-pinenote + postmarketos-base +" +makedepends="devicepkg-dev" +source=" + deviceinfo + modules-initfs + phoc.ini + local-overrides.quirks + 50-touchscreen.conf + 81-libinput-pinenote.rules + 82-ebc-rockchip.rules + blacklist.conf + panfrost.conf + rockchip_ebc.conf +" +subpackages=" + $pkgname-nonfree-firmware:nonfree_firmware + $pkgname-phosh +" + +build() { + devicepkg_build $startdir $pkgname +} + +package() { + devicepkg_package $startdir $pkgname + + install -Dm644 "$srcdir"/local-overrides.quirks \ + -t "$pkgdir"/etc/libinput/ + install -Dm644 "$srcdir"/50-touchscreen.conf \ + -t "$pkgdir"/etc/X11/xorg.conf.d + install -Dm644 "$srcdir"/81-libinput-pinenote.rules \ + -t "$pkgdir"/usr/lib/udev/rules.d + install -Dm644 "$srcdir"/82-ebc-rockchip.rules \ + "$pkgdir"/usr/lib/udev/rules.d + install -Dm644 "$srcdir"/blacklist.conf \ + -t "$pkgdir"/etc/modprobe.d + install -Dm644 "$srcdir"/panfrost.conf \ + "$pkgdir"/etc/modprobe.d + install -Dm644 "$srcdir"/rockchip_ebc.conf \ + "$pkgdir"/etc/modprobe.d +} + +phosh() { + install_if="$pkgname=$pkgver-r$pkgrel phosh" + depends="postmarketos-theme" + + install -Dm644 "$srcdir"/phoc.ini \ + -t "$subpkgdir"/etc/phosh +} + +nonfree_firmware() { + pkgdesc="WiFi, Bluetooth and display firmware" + depends="firmware-pine64-pinenote linux-firmware" + mkdir "$subpkgdir" +} + +sha512sums=" +5829b9b52206a7520066e4bb3c08c2535d98002a3940664a0239344f5e7522fe7b6a9cb0c0074f9846c7e42c40746f2991f6aeeefeba8efa9140c16630b2893e deviceinfo +473accb3497244742dd9fd15f8a02957a13e08fa4d4393fec185ecbb27f1f17726e4b5ece22da861151f9d358d3266206c647def8aa75adb672b6f1f1904c66f modules-initfs +4bf5158fbd53274a7429e825bb66225001f2403a4851e2d6803323b77d9095738ee3e5340ac85baf3e86bb4f47d38af8cbd78d8a5055c59a62f5b06e722e19cb phoc.ini +1123720962c9c8fec3c50302ca6a3dd56e2907dc9eea361a7b8eb4201b042476633d41a0ee4f6ab61d9c60eeccc894f83491ba9fa309a9bce2f1db0b0341d79d local-overrides.quirks +ac433eebbc35a48561837495997aee4e55510b979bc0d8e3bafb761bc1be5b4bdeed2f456369dcbc582688aefd07c63966b0d72b6ffa99e84cfd868e677f02c8 50-touchscreen.conf +2bc51f200baefc37abfaaad368a911244999e906bdca4b728ac233f49a8fb3ae7206ee3c95cdb20d7dceae2a31d25a57f4e1da4fd67057fd64724b8232e42aed 81-libinput-pinenote.rules +19e922eec89dba419798c4e1dc9b39c040db33986d0969a39a8220c642fa081763f15ff2418115d5a748af4054a1be0784927d1712ea79942c2b237ebab47728 82-ebc-rockchip.rules +aed87c0f0ef9ed8ac0b4c96591cf712d8f34c7b3bfc58aaa738c7baf6d095c8cdd2914c47c7f0caccb90cdb3a540abaa077ec8cd30198fcdfced8d964f0c1072 blacklist.conf +6ba6638754e00908243de2f73ed6898dac03638a200dcf7b7cd9684757355ee1eb0ac874af0f971ad2e054c1a8c471867bdaea4d9aaf7eea6d3cf81ac7dd73a2 panfrost.conf +8f01d9662c064cd6dd9eb0fe6ca36b7cf4304d1860f094c2c9c9f22ffdcfc2fde1040b5eeed016cb77a91d5b73382046e51a0b7a58334fcd7486befbf9fed7f0 rockchip_ebc.conf +" diff --git a/pmos/device-pine64-pinenote/blacklist.conf b/pmos/device-pine64-pinenote/blacklist.conf new file mode 100644 index 0000000..58a1553 --- /dev/null +++ b/pmos/device-pine64-pinenote/blacklist.conf @@ -0,0 +1,3 @@ +# rockchip-rga will crash the kernel on unload at the moment +blacklist rockchip-rga +blacklist ws8100_pen diff --git a/pmos/device-pine64-pinenote/deviceinfo b/pmos/device-pine64-pinenote/deviceinfo new file mode 100644 index 0000000..22b6d1c --- /dev/null +++ b/pmos/device-pine64-pinenote/deviceinfo @@ -0,0 +1,37 @@ +# Reference: +# Please use double quotes only. You can source this file in shell +# scripts. + +deviceinfo_format_version="0" +deviceinfo_name="Pine64 PineNote" +deviceinfo_manufacturer="Pine64" +deviceinfo_codename="pine64-pinenote" +deviceinfo_year="2021" +deviceinfo_dtb="rockchip/rk3566-pinenote-v1.2" +deviceinfo_arch="aarch64" +deviceinfo_gpu_accelerated="true" + +# Device related +deviceinfo_chassis="tablet" +deviceinfo_keyboard="false" +deviceinfo_external_storage="false" +deviceinfo_screen_width="1404" +deviceinfo_screen_height="1872" +deviceinfo_getty="ttyS2;1500000" + +# initfs + +# Bootloader related +deviceinfo_flash_method="rkdeveloptool" +deviceinfo_flash_sparse="true" + +deviceinfo_boot_part_start="65536" + +deviceinfo_sd_embed_firmware="u-boot/pine64-pinenote/u-boot-rockchip.bin:1" +deviceinfo_sd_embed_firmware_step_size="32768" + +deviceinfo_flash_rk_partition_kernel="boot" +deviceinfo_flash_rk_partition_rootfs="os1" + +deviceinfo_generate_extlinux_config="true" +deviceinfo_kernel_cmdline="drm.debug=0x0 vt.color=0xf earlycon console=tty0 console=ttyS2,1500000n8 PMOS_FORCE_PARTITION_RESIZE" diff --git a/pmos/device-pine64-pinenote/local-overrides.quirks b/pmos/device-pine64-pinenote/local-overrides.quirks new file mode 100644 index 0000000..030ca8b --- /dev/null +++ b/pmos/device-pine64-pinenote/local-overrides.quirks @@ -0,0 +1,5 @@ +[PineNote] +MatchName=cyttsp5 +AttrPalmPressureThreshold=28 +AttrThumbPressureThreshold=27 +AttrSizeHint=210x157 diff --git a/pmos/device-pine64-pinenote/modules-initfs b/pmos/device-pine64-pinenote/modules-initfs new file mode 100644 index 0000000..1b49e53 --- /dev/null +++ b/pmos/device-pine64-pinenote/modules-initfs @@ -0,0 +1,5 @@ +tps65185-regulator +rockchip_ebc +drm_kms_helper +drm_shmem_helper +pvi_waveform diff --git a/pmos/device-pine64-pinenote/panfrost.conf b/pmos/device-pine64-pinenote/panfrost.conf new file mode 100644 index 0000000..31a1750 --- /dev/null +++ b/pmos/device-pine64-pinenote/panfrost.conf @@ -0,0 +1,2 @@ +softdep panfrost pre: rockchip_ebc +# blacklist rockchip_ebc diff --git a/pmos/device-pine64-pinenote/phoc.ini b/pmos/device-pine64-pinenote/phoc.ini new file mode 100644 index 0000000..90d53d8 --- /dev/null +++ b/pmos/device-pine64-pinenote/phoc.ini @@ -0,0 +1,6 @@ +# /etc/phosh/phoc.ini +# Overwrites values set in /usr/share/phosh/phoc.ini + +# e-ink is an "Unknown" display type for now in mainline +[output:Unknown-1] +scale = 2.0 diff --git a/pmos/device-pine64-pinenote/rockchip_ebc.conf b/pmos/device-pine64-pinenote/rockchip_ebc.conf new file mode 100644 index 0000000..f3904c2 --- /dev/null +++ b/pmos/device-pine64-pinenote/rockchip_ebc.conf @@ -0,0 +1 @@ +options rockchip_ebc direct_mode=0 auto_refresh=1 refresh_threshold=60 split_area_limit=0 panel_reflection=1 prepare_prev_before_a2=0 dclk_select=0 From b03043f08cd4080bee763ec091aad5197b524071 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 11 Jan 2025 11:28:36 -0500 Subject: [PATCH 111/313] pmos/device-pine64-pinenote: fix blacklist --- pmos/device-pine64-pinenote/APKBUILD | 10 +++------- pmos/device-pine64-pinenote/blacklist.conf | 3 --- pmos/device-pine64-pinenote/rockchip_ebc.conf | 4 ++++ 3 files changed, 7 insertions(+), 10 deletions(-) delete mode 100644 pmos/device-pine64-pinenote/blacklist.conf diff --git a/pmos/device-pine64-pinenote/APKBUILD b/pmos/device-pine64-pinenote/APKBUILD index 5e0ad0b..1cf2b3c 100644 --- a/pmos/device-pine64-pinenote/APKBUILD +++ b/pmos/device-pine64-pinenote/APKBUILD @@ -2,7 +2,7 @@ pkgname=device-pine64-pinenote pkgdesc="Pine64 PineNote" pkgver=2 -pkgrel=8 +pkgrel=9 url="https://postmarketos.org" license="MIT" arch="aarch64" @@ -21,7 +21,6 @@ source=" 50-touchscreen.conf 81-libinput-pinenote.rules 82-ebc-rockchip.rules - blacklist.conf panfrost.conf rockchip_ebc.conf " @@ -45,10 +44,8 @@ package() { -t "$pkgdir"/usr/lib/udev/rules.d install -Dm644 "$srcdir"/82-ebc-rockchip.rules \ "$pkgdir"/usr/lib/udev/rules.d - install -Dm644 "$srcdir"/blacklist.conf \ - -t "$pkgdir"/etc/modprobe.d install -Dm644 "$srcdir"/panfrost.conf \ - "$pkgdir"/etc/modprobe.d + -t "$pkgdir"/etc/modprobe.d install -Dm644 "$srcdir"/rockchip_ebc.conf \ "$pkgdir"/etc/modprobe.d } @@ -75,7 +72,6 @@ sha512sums=" ac433eebbc35a48561837495997aee4e55510b979bc0d8e3bafb761bc1be5b4bdeed2f456369dcbc582688aefd07c63966b0d72b6ffa99e84cfd868e677f02c8 50-touchscreen.conf 2bc51f200baefc37abfaaad368a911244999e906bdca4b728ac233f49a8fb3ae7206ee3c95cdb20d7dceae2a31d25a57f4e1da4fd67057fd64724b8232e42aed 81-libinput-pinenote.rules 19e922eec89dba419798c4e1dc9b39c040db33986d0969a39a8220c642fa081763f15ff2418115d5a748af4054a1be0784927d1712ea79942c2b237ebab47728 82-ebc-rockchip.rules -aed87c0f0ef9ed8ac0b4c96591cf712d8f34c7b3bfc58aaa738c7baf6d095c8cdd2914c47c7f0caccb90cdb3a540abaa077ec8cd30198fcdfced8d964f0c1072 blacklist.conf 6ba6638754e00908243de2f73ed6898dac03638a200dcf7b7cd9684757355ee1eb0ac874af0f971ad2e054c1a8c471867bdaea4d9aaf7eea6d3cf81ac7dd73a2 panfrost.conf -8f01d9662c064cd6dd9eb0fe6ca36b7cf4304d1860f094c2c9c9f22ffdcfc2fde1040b5eeed016cb77a91d5b73382046e51a0b7a58334fcd7486befbf9fed7f0 rockchip_ebc.conf +b52d2e7f0c62d7c313b6db9aeb706cdb2596b6aa637aeddb862abf1e256103377fb6267e38cd4285e25d32112acf8d03bbf32ecff7be3dfbb9176209ea7ae283 rockchip_ebc.conf " diff --git a/pmos/device-pine64-pinenote/blacklist.conf b/pmos/device-pine64-pinenote/blacklist.conf deleted file mode 100644 index 58a1553..0000000 --- a/pmos/device-pine64-pinenote/blacklist.conf +++ /dev/null @@ -1,3 +0,0 @@ -# rockchip-rga will crash the kernel on unload at the moment -blacklist rockchip-rga -blacklist ws8100_pen diff --git a/pmos/device-pine64-pinenote/rockchip_ebc.conf b/pmos/device-pine64-pinenote/rockchip_ebc.conf index f3904c2..e457ac9 100644 --- a/pmos/device-pine64-pinenote/rockchip_ebc.conf +++ b/pmos/device-pine64-pinenote/rockchip_ebc.conf @@ -1 +1,5 @@ +# rockchip-rga will crash the kernel on unload at the moment +blacklist rockchip-rga +blacklist ws8100_pen + options rockchip_ebc direct_mode=0 auto_refresh=1 refresh_threshold=60 split_area_limit=0 panel_reflection=1 prepare_prev_before_a2=0 dclk_select=0 From 6b56f7cb5104b04d6b789df7bf009ba4eee39d97 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 14 Feb 2025 19:45:05 -0500 Subject: [PATCH 112/313] user/openterface-qt: new aport --- .../51-openterface-permissions.rules | 1 + user/openterface-qt/APKBUILD | 42 +++++++++++++++++++ .../openterface-qt.post-install | 3 ++ user/openterface-qt/openterfaceQT.desktop | 8 ++++ 4 files changed, 54 insertions(+) create mode 100644 user/openterface-qt/51-openterface-permissions.rules create mode 100644 user/openterface-qt/APKBUILD create mode 100755 user/openterface-qt/openterface-qt.post-install create mode 100644 user/openterface-qt/openterfaceQT.desktop diff --git a/user/openterface-qt/51-openterface-permissions.rules b/user/openterface-qt/51-openterface-permissions.rules new file mode 100644 index 0000000..e8f2971 --- /dev/null +++ b/user/openterface-qt/51-openterface-permissions.rules @@ -0,0 +1 @@ +KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev" diff --git a/user/openterface-qt/APKBUILD b/user/openterface-qt/APKBUILD new file mode 100644 index 0000000..b0bb703 --- /dev/null +++ b/user/openterface-qt/APKBUILD @@ -0,0 +1,42 @@ +# Maintainer: Antoine Martin (ayakael) +pkgname=openterface-qt +pkgver=0.1.0 +pkgrel=0 +pkgdesc="Openterface Mini-KVM Host Application" +arch='all' +url="https://openterface.com/" +license='AGPL-3.0-only' +depends='qt6-qtmultimedia-ffmpeg hicolor-icon-theme' +makedepends='qt6-qtbase-dev qt6-qtmultimedia-dev qt6-qtserialport-dev qt6-qtsvg-dev qt6-qtmultimedia-dev libusb-dev' +install="$pkgname.post-install" +builddir="$srcdir"/Openterface_QT-$pkgver +source=" + $pkgname-$pkgver.tar.gz::https://github.com/TechxArtisanStudio/Openterface_QT/archive/v$pkgver.tar.gz + openterfaceQT.desktop + 51-openterface-permissions.rules + " + +prepare() { + default_prepare + mkdir build && cd build + qmake6 .. +} + +build() { + cd build + make +} + +package() { + install -Dm755 "$builddir"/build/openterfaceQT "$pkgdir"/usr/bin/openterfaceQT + install -Dm644 "$srcdir"/51-openterface-permissions.rules "$pkgdir"/etc/udev/rules.d/51-openterface-permissions.rules + install -Dm644 "$srcdir"/openterfaceQT.desktop "$pkgdir"/usr/share/applications/openterfaceQT.desktop + install -Dm644 "$builddir"/images/icon_32.png "$pkgdir"/usr/share/icons/hicolor/32x32/apps/openterfaceQT.png + install -Dm644 "$builddir"/images/icon_64.png "$pkgdir"/usr/share/icons/hicolor/64x64/apps/openterfaceQT.png + install -Dm644 "$builddir"/images/icon_128.png "$pkgdir"/usr/share/icons/hicolor/128x128/apps/openterfaceQT.png +} +sha512sums=" +2aff3b5b92d5d12d1d748726e2565f5d410611b242b4fac04289b6b057eb1d39b7c2c9bcf613b3b9636a74f17c3fb69ff52177ee889f4d34de7b5b5388e75964 openterface-qt-0.1.0.tar.gz +e39cfa04cbcb59e8ba54110a28eff41854f73fa7c4baeeed5433907c79781946f12bd3a731763caa1d591e664eab0650bdbd2a844954baa12bb96a76a17c6e4f openterfaceQT.desktop +aed752c03acfb5e7d3dc206fd342c1eed6b56353801e54b925e5d3a3e673bf604e0e94424e5e8fddb31c21d3acfbda351f1ea6e8ddc8057f7354ec86a4c74a5e 51-openterface-permissions.rules +" diff --git a/user/openterface-qt/openterface-qt.post-install b/user/openterface-qt/openterface-qt.post-install new file mode 100755 index 0000000..09d267b --- /dev/null +++ b/user/openterface-qt/openterface-qt.post-install @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Setup the dialout permission for Serial port." +echo "Run: sudo usermod -a -G video,plugdev \$USER" diff --git a/user/openterface-qt/openterfaceQT.desktop b/user/openterface-qt/openterfaceQT.desktop new file mode 100644 index 0000000..907976c --- /dev/null +++ b/user/openterface-qt/openterfaceQT.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=OpenterfaceQT +Exec=/usr/bin/openterfaceQT +Icon=openterfaceQT +Comment=OpenterfaceQT Application +Categories=Utility; From 928ff35f6b4978121e1a3aac2f5f96c90712b5fb Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 18 Feb 2025 12:59:44 -0500 Subject: [PATCH 113/313] forgejo: use ISSUE_TOKEN instead of FORGEJO_TOKEN --- .forgejo/bin/create_issue.sh | 16 ++++++++-------- .forgejo/workflows/check-backports.yml | 2 +- .forgejo/workflows/check-community.yml | 2 +- .forgejo/workflows/check-testing.yml | 2 +- .forgejo/workflows/check-user.yml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index d162758..6369371 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -1,7 +1,7 @@ #!/bin/bash # expects: -# env variable FORGEJO_TOKEN +# env variable ISSUE_TOKEN # file out_of_date IFS=' @@ -20,7 +20,7 @@ does_it_exist() { result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" + -H "Authorization: token $ISSUE_TOKEN" )" if [ "$result" == "[]" ]; then @@ -40,7 +40,7 @@ is_it_old() { result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" + -H "authorization: token $ISSUE_TOKEN" )" result_title="$(echo $result | jq -r '.[].title' )" @@ -64,7 +64,7 @@ update_title() { result=$(curl --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" \ + -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ \"title\": \"$repo/$name: upgrade to $upstream_version\" @@ -83,7 +83,7 @@ create_issue() { result=$(curl --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" \ + -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ \"title\": \"$repo/$name: upgrade to $upstream_version\", @@ -131,7 +131,7 @@ if [ -f not_in_anitya ]; then result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" + -H "authorization: token $ISSUE_TOKEN" )" if [ "$result" == "[]" ]; then @@ -139,7 +139,7 @@ if [ -f not_in_anitya ]; then result=$(curl --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" \ + -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ \"title\": \"Add missing $repo packages to anitya\", @@ -155,7 +155,7 @@ if [ -f not_in_anitya ]; then result=$(curl --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \ -H 'accept: application/json' \ - -H "authorization: Basic $FORGEJO_TOKEN" \ + -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\" diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index b9f76a6..a25ad4e 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -12,7 +12,7 @@ jobs: image: alpine:latest env: downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports - FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 1 ALL_PACKAGES: true steps: diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 9385687..b083219 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -12,7 +12,7 @@ jobs: image: alpine:latest env: downstream: https://dl-cdn.alpinelinux.org/alpine/edge/community - FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 4 steps: - name: Environment setup diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index 2b8f7ed..1c3abe9 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -12,7 +12,7 @@ jobs: image: alpine:latest env: downstream: https://dl-cdn.alpinelinux.org/alpine/edge/testing - FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 4 steps: - name: Environment setup diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml index 09b0f3c..502933e 100644 --- a/.forgejo/workflows/check-user.yml +++ b/.forgejo/workflows/check-user.yml @@ -12,7 +12,7 @@ jobs: image: alpine:latest env: downstream: https://ayakael.net/api/packages/forge/alpine/edge/user - FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 4 steps: - name: Environment setup From 3e86f4927c9c18d992c3a773116882a6e3a83850 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 8 May 2025 21:14:23 -0400 Subject: [PATCH 114/313] ci: upgrade container as first action --- .forgejo/workflows/build-aarch64.yaml | 1 + .forgejo/workflows/build-x86_64.yaml | 1 + .forgejo/workflows/lint.yaml | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index 59f90c9..0b6d800 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -15,6 +15,7 @@ jobs: steps: - name: Environment setup run: | + doas apk upgrade -a doas apk add nodejs git patch curl cd /etc/apk/keys doas curl -JO https://ayakael.net/api/packages/forge/alpine/key diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 298a213..90c516e 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -15,6 +15,7 @@ jobs: steps: - name: Environment setup run: | + doas apk upgrade -a doas apk add nodejs git patch curl cd /etc/apk/keys doas curl -JO https://ayakael.net/api/packages/forge/alpine/key diff --git a/.forgejo/workflows/lint.yaml b/.forgejo/workflows/lint.yaml index 3614deb..3b8241f 100644 --- a/.forgejo/workflows/lint.yaml +++ b/.forgejo/workflows/lint.yaml @@ -14,7 +14,9 @@ jobs: CI_MERGE_REQUEST_PROJECT_URL: ${{ github.server_url }}/${{ github.repository }} CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} steps: - - run: doas apk add nodejs git + - run: | + doas apk upgrade -a + doas apk add nodejs git - uses: actions/checkout@v4 with: fetch-depth: 500 From a7d9756c6404408afccc01946ed4fce779571978 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 8 May 2025 21:17:14 -0400 Subject: [PATCH 115/313] ci: fix lint --- .forgejo/workflows/lint.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/lint.yaml b/.forgejo/workflows/lint.yaml index 3b8241f..743cefc 100644 --- a/.forgejo/workflows/lint.yaml +++ b/.forgejo/workflows/lint.yaml @@ -15,8 +15,8 @@ jobs: CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} steps: - run: | - doas apk upgrade -a - doas apk add nodejs git + doas apk upgrade -a + doas apk add nodejs git - uses: actions/checkout@v4 with: fetch-depth: 500 From 99107ff63a125a70045fc26c8bcc3230877f586d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 11 May 2025 10:59:10 -0400 Subject: [PATCH 116/313] ci: update create_issue to support forgejo 11 --- .forgejo/bin/create_issue.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 6369371..995e519 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -15,10 +15,10 @@ does_it_exist() { repo=$4 query="$repo/$name: upgrade to $upstream_version" - query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" result="$(curl --silent -X 'GET' \ - "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "Authorization: token $ISSUE_TOKEN" )" @@ -35,10 +35,10 @@ is_it_old() { repo=$4 query="$repo/$name: upgrade to" - query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" result="$(curl --silent -X 'GET' \ - "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" )" @@ -126,10 +126,10 @@ fi if [ -f not_in_anitya ]; then query="Add missing $repo packages to anitya" - query="$(echo $query | sed 's| |%20|g')" + query="%22$(echo $query | sed 's| |%20|g')%22" result="$(curl --silent -X 'GET' \ - "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" )" From ab7d3dce4ab64569f1bc6ff61f30b0bb7aa40894 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 11 May 2025 17:16:58 -0400 Subject: [PATCH 117/313] ci: add special exception for electron --- .forgejo/bin/check_ver.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index d2720f3..c230a94 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -26,6 +26,16 @@ for pkg in $owned_by_you; do case $pkg in freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; dotnet9-sdk|dotnet9-stage0) upstream_version=${upstream_version/-*};; + electron) + upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=electron&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) + latest_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=electron&distribution=Alpine" | jq -r '.items.[].stable_version' ) + # append version number to signal that this is not latest major version + if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then + echo "$pkg${latest_version/.*} major version available" + echo "$pkg${latest_version/.*} $downstream_version $latest_version $repo" >> out_of_date + pkg=electron${upstream_version/.*} + fi + ;; esac if [ -z "$upstream_version" ]; then From dd132b86fac01b69348c172f4acffc0aa5b9e9aa Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 15 May 2025 14:55:25 -0400 Subject: [PATCH 118/313] ci: abstract electron special code --- .forgejo/bin/check_ver.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index c230a94..015965f 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -27,13 +27,13 @@ for pkg in $owned_by_you; do freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; dotnet9-sdk|dotnet9-stage0) upstream_version=${upstream_version/-*};; electron) - upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=electron&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) - latest_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=electron&distribution=Alpine" | jq -r '.items.[].stable_version' ) + upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) + latest_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) # append version number to signal that this is not latest major version if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then echo "$pkg${latest_version/.*} major version available" echo "$pkg${latest_version/.*} $downstream_version $latest_version $repo" >> out_of_date - pkg=electron${upstream_version/.*} + pkg=$pkg${upstream_version/.*} fi ;; esac From eb38d0963f18711e496c43674e9aa127d12d524f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 10:05:57 -0400 Subject: [PATCH 119/313] ci: set specific label for user packages --- .forgejo/workflows/check-user.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml index 502933e..ba6ed80 100644 --- a/.forgejo/workflows/check-user.yml +++ b/.forgejo/workflows/check-user.yml @@ -13,7 +13,7 @@ jobs: env: downstream: https://ayakael.net/api/packages/forge/alpine/edge/user ISSUE_TOKEN: ${{ secrets.issue_token }} - LABEL_NUMBER: 4 + LABEL_NUMBER: 12 steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 0bb36c34c9df4bf7a445fff3993fca1f6eca5749 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 11:50:42 -0400 Subject: [PATCH 120/313] ci: add special case for dotnet*sdk and dotnet*stage0 --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 015965f..acf9910 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -25,7 +25,7 @@ for pkg in $owned_by_you; do # special cases case $pkg in freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; - dotnet9-sdk|dotnet9-stage0) upstream_version=${upstream_version/-*};; + dotnet*sdk|dotnet*stage0) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | sed 's|-.*||' | head -n1);; electron) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) latest_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) From 6306486b826b57e7e836b7098535c15f1afed4cc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 12:14:00 -0400 Subject: [PATCH 121/313] ci: add special case for arm-trusted-firmware --- .forgejo/bin/check_ver.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index acf9910..36da7ef 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -36,6 +36,7 @@ for pkg in $owned_by_you; do pkg=$pkg${upstream_version/.*} fi ;; + arm-trusted-firmware) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; esac if [ -z "$upstream_version" ]; then From a7e99375b3d7b9cb4511daf7674141e34cb62c74 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 12:14:35 -0400 Subject: [PATCH 122/313] ci: add check for main repo --- .forgejo/workflows/check-main.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .forgejo/workflows/check-main.yml diff --git a/.forgejo/workflows/check-main.yml b/.forgejo/workflows/check-main.yml new file mode 100644 index 0000000..c9561f0 --- /dev/null +++ b/.forgejo/workflows/check-main.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-main: + name: Check main repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/edge/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From edf630c6dc84475d090f70c074f27f0716a42b57 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:02:39 -0400 Subject: [PATCH 123/313] ci: add ability to track minor and/or fix releases only --- .forgejo/bin/check_ver.sh | 63 +++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 36da7ef..bc6fc24 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -1,10 +1,36 @@ #!/bin/bash # expects the following env variables: -# downstream: downstream repo +# downstream: downstream repo +# +# env variables to track minor or bug-fix updates +# minor_only: array of packages that should only track minor releases (seperate by space) +# default: none +# all packages: all +# fix_only: array of packages that should only track bug fix releases (seperated by space) +# default: none +# all packages: all +# +# If either minor_only or fix_only is set, only packages with semantic versioning schemes +# will be tracked. +# +# If a package is both minor_only and fix_only, the minor releases will be tracked +# +# optional env variables +# ALL_PACKAGES: when true, ignore is package is owned by me +# repo=${downstream/*\/} +is_semantic() { + local downstream_version_dot=${1//[^.]} + if [[ ${#downstream_version_dot} -eq 2 ]]; then + return 0 + fi + return 1 +} + +echo "Checking $downstream for out of date packages" curl --silent $downstream/x86_64/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX if [ "$ALL_PACKAGES" == "true" ]; then @@ -18,17 +44,16 @@ fi rm -f out_of_date not_in_anitya for pkg in $owned_by_you; do - upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version') downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) downstream_version=${downstream_version/-*} - # special cases + # special cases where package is not semantic case $pkg in - freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; - dotnet*sdk|dotnet*stage0) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | sed 's|-.*||' | head -n1);; + freetube) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; + dotnet*sdk|dotnet*stage0) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | sed 's|-.*||' | head -n1);; electron) - upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) - latest_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) + latest_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) # append version number to signal that this is not latest major version if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then echo "$pkg${latest_version/.*} major version available" @@ -36,12 +61,32 @@ for pkg in $owned_by_you; do pkg=$pkg${upstream_version/.*} fi ;; - arm-trusted-firmware) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; + arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; + *) + # continues when package version scheme is not semantic, but minor_only or fix_only is set + if [ -n ${minor_only+x} ] || [ -n ${fix_only+x} ]; then + if ! is_semantic $downstream_version; then + echo "$pkg is not semantic, and fix_only or minor_only is set" + continue + fi + fi + + if [ "${minor_only}" == "all" ] || [[ "${minor_only}" == *$pkg* ]]; then + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*.*}.*\").string" | head -n1) + elif [ "${fix_only}" == "all" ] || [[ "${fix_only}" == *$pkg* ]]; then + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1) + else + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) + fi + ;; esac if [ -z "$upstream_version" ]; then echo "$pkg not in anitya" - echo "$pkg" >> not_in_anitya + # do not track not_in_anitya if either minor_only or fix_only is set + if [ -z ${minor_only+x} ] && [ -z ${fix_only+x} ]; then + echo "$pkg" >> not_in_anitya + fi elif [ "$downstream_version" != "$(printf '%s\n' $upstream_version $downstream_version | sort -V | head -n 1)" ]; then echo "$pkg higher downstream" continue From 4e133161c75719454468f735542ce899ada47b7a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:03:12 -0400 Subject: [PATCH 124/313] ci: add in brackets release when not edge --- .forgejo/bin/check_ver.sh | 6 ++++-- .forgejo/bin/create_issue.sh | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index bc6fc24..58f6194 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -21,6 +21,8 @@ # repo=${downstream/*\/} +release=${downstream/\/$repo/} +release=${release/*\/} is_semantic() { local downstream_version_dot=${1//[^.]} @@ -91,7 +93,7 @@ for pkg in $owned_by_you; do echo "$pkg higher downstream" continue elif [ "$upstream_version" != "$downstream_version" ]; then - echo "$pkg upstream version $upstream_version does not match downstream version $downstream_version" - echo "$pkg $downstream_version $upstream_version $repo" >> out_of_date + echo "$pkg upstream version $upstream_version does not match downstream version $downstream_version in $release" + echo "$pkg $downstream_version $upstream_version $repo $release" >> out_of_date fi done diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 995e519..17ba339 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -13,8 +13,10 @@ does_it_exist() { downstream_version=$2 upstream_version=$3 repo=$4 + release=$5 query="$repo/$name: upgrade to $upstream_version" + if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" result="$(curl --silent -X 'GET' \ @@ -33,8 +35,10 @@ is_it_old() { downstream_version=$2 upstream_version=$3 repo=$4 + release=$5 query="$repo/$name: upgrade to" + if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" result="$(curl --silent -X 'GET' \ @@ -59,7 +63,8 @@ update_title() { downstream_version=$2 upstream_version=$3 repo=$4 - id=$5 + release=$5 + id=$6 result=$(curl --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ @@ -79,6 +84,7 @@ create_issue() { downstream_version=$2 upstream_version=$3 repo=$4 + release=$5 result=$(curl --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ @@ -105,22 +111,23 @@ if [ -f out_of_date ]; then downstream_version="$(echo $pkg | awk '{print $2}')" upstream_version="$(echo $pkg | awk '{print $3}')" repo="$(echo $pkg | awk '{print $4}')" + release="$(echo $pkg | awk '{print $5}')" - if does_it_exist $name $downstream_version $upstream_version $repo; then + if does_it_exist $name $downstream_version $upstream_version $repo $release; then echo "Issue for $repo/$name already exists" continue fi - id=$(is_it_old $name $downstream_version $upstream_version $repo) + id=$(is_it_old $name $downstream_version $upstream_version $repo $release) if [ "$id" != "0" ] && [ -n "$id" ]; then echo "Issue for $repo/$name needs updating" - update_title $name $downstream_version $upstream_version $repo $id + update_title $name $downstream_version $upstream_version $repo $release $id continue fi echo "Creating issue for $repo/$name" - create_issue $name $downstream_version $upstream_version $repo + create_issue $name $downstream_version $upstream_version $repo $release done fi From 2c9d1bc657ca820746ef2967e54e2a7ffc3b19b6 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:04:25 -0400 Subject: [PATCH 125/313] ci: check v3.21 release of community --- .forgejo/workflows/check-community.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index b083219..ff30c6a 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -5,8 +5,8 @@ on: - cron: '0 5 * * *' jobs: - check-community: - name: Check community repo + check-community-edge: + name: Check community(edge) repo runs-on: x86_64 container: image: alpine:latest @@ -25,3 +25,24 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-community-v3.21: + name: Check community(v3.21) repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.21/community + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From d20ee3e612949aa1d1609946f83b7f56288c376d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:09:29 -0400 Subject: [PATCH 126/313] ci: fix semantic context checker --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 58f6194..c1c93c5 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -66,7 +66,7 @@ for pkg in $owned_by_you; do arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set - if [ -n ${minor_only+x} ] || [ -n ${fix_only+x} ]; then + if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then if ! is_semantic $downstream_version; then echo "$pkg is not semantic, and fix_only or minor_only is set" continue From c7fa4babd2dd226d7a7f85fd6f9bbd60aaef9443 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:13:22 -0400 Subject: [PATCH 127/313] ci: fix bracket chracters in query when creating issue --- .forgejo/bin/create_issue.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 17ba339..6ea3ded 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -17,7 +17,7 @@ does_it_exist() { query="$repo/$name: upgrade to $upstream_version" if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|[|%5B|' | sed 's|]|%5D|')%22" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ @@ -39,7 +39,7 @@ is_it_old() { query="$repo/$name: upgrade to" if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )%22" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|[|%5B|' | sed 's|]|%5D|')%22" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ From 3c3b7fe1ae7c950c8e5d127d84f893c8935ed3b0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:16:01 -0400 Subject: [PATCH 128/313] ci: fix unterminated s in sed command --- .forgejo/bin/create_issue.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 6ea3ded..ee73250 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -17,7 +17,7 @@ does_it_exist() { query="$repo/$name: upgrade to $upstream_version" if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|[|%5B|' | sed 's|]|%5D|')%22" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ @@ -39,7 +39,7 @@ is_it_old() { query="$repo/$name: upgrade to" if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|[|%5B|' | sed 's|]|%5D|')%22" + query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ From 61153cb9899109ee8b6ef50e8f659e698c5214bc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:21:27 -0400 Subject: [PATCH 129/313] ci: attempt bracket release title --- .forgejo/bin/create_issue.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index ee73250..0ae2580 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -16,7 +16,7 @@ does_it_exist() { release=$5 query="$repo/$name: upgrade to $upstream_version" - if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi + if [ "$release" != "edge" ]; then query="[$release] $query"; fi query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" result="$(curl --silent -X 'GET' \ @@ -38,7 +38,7 @@ is_it_old() { release=$5 query="$repo/$name: upgrade to" - if [[ "$release" != "edge" ]]; then query="[$release] $query"; fi + if [ "$release" != "edge" ]; then query="[$release] $query"; fi query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" result="$(curl --silent -X 'GET' \ From d7538d14bb8ecd6f88645cdc886f117c7c46876e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:23:15 -0400 Subject: [PATCH 130/313] ci: track community v3.22 instead of v3.21 --- .forgejo/workflows/check-community.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index ff30c6a..1730960 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -25,13 +25,13 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh - check-community-v3.21: - name: Check community(v3.21) repo + check-community-v3.22: + name: Check community(v3.22) repo runs-on: x86_64 container: image: alpine:latest env: - downstream: https://dl-cdn.alpinelinux.org/alpine/v3.21/community + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all From 63dd181c593219d9becde96fb2d85bb7ebdd8947 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:25:13 -0400 Subject: [PATCH 131/313] ci: introduce release in title when not edge --- .forgejo/bin/create_issue.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 0ae2580..c8e5daa 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -86,13 +86,16 @@ create_issue() { repo=$4 release=$5 + title="$repo/$name: upgrade to $upstream_version" + if [ "$release" != "edge" ]; then title="[$release] $title"; fi + result=$(curl --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ - \"title\": \"$repo/$name: upgrade to $upstream_version\", + \"title\": \"$title\", \"labels\": [ $LABEL_NUMBER ] From 2d19224dcb36ff6e716333eacccf503458ae4c80 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:26:55 -0400 Subject: [PATCH 132/313] ci: drop v from $release --- .forgejo/bin/check_ver.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index c1c93c5..6f160f4 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -23,6 +23,7 @@ repo=${downstream/*\/} release=${downstream/\/$repo/} release=${release/*\/} +release=${release/v} is_semantic() { local downstream_version_dot=${1//[^.]} From 474e2ea62d5c54fcf51d6e20984bfdaace753f1b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:44:23 -0400 Subject: [PATCH 133/313] ci: add ability to skip packages --- .forgejo/bin/check_ver.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 6f160f4..e931cb6 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -18,6 +18,7 @@ # # optional env variables # ALL_PACKAGES: when true, ignore is package is owned by me +# skip_package: array of packages to skip # repo=${downstream/*\/} @@ -50,6 +51,12 @@ for pkg in $owned_by_you; do downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) downstream_version=${downstream_version/-*} + # skip package if in $skip_package array + if [[ "$skip_package" == *$pkg* ]]; then + echo "$pkg skipped" + continue + fi + # special cases where package is not semantic case $pkg in freetube) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; From 7caaeeee04473c901cafea2109793064b0bff574 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:45:10 -0400 Subject: [PATCH 134/313] ci: skip dotnet9-stage0 and dotnet8-stage0 in v3.22 community check --- .forgejo/workflows/check-community.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 1730960..7b8b5a3 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -35,6 +35,7 @@ jobs: ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all + skip_package: dotnet9-stage0 dotnet8-stage0 steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 8763a65fdb54407370c18f1e7e01926c91f816b0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:50:49 -0400 Subject: [PATCH 135/313] ci: check main v3.22 --- .forgejo/workflows/check-main.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/check-main.yml b/.forgejo/workflows/check-main.yml index c9561f0..5c3a1eb 100644 --- a/.forgejo/workflows/check-main.yml +++ b/.forgejo/workflows/check-main.yml @@ -5,8 +5,8 @@ on: - cron: '0 5 * * *' jobs: - check-main: - name: Check main repo + check-main-edge: + name: Check main(edge) repo runs-on: x86_64 container: image: alpine:latest @@ -25,3 +25,24 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-main-3.22: + name: Check main(3.22) repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 4 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From 1351bcc0fd9235301950a97faaacdbee67660689 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:53:05 -0400 Subject: [PATCH 136/313] ci: also check last 2 years of alpine releases on main --- .forgejo/workflows/check-main.yml | 65 ++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-main.yml b/.forgejo/workflows/check-main.yml index 5c3a1eb..58e8001 100644 --- a/.forgejo/workflows/check-main.yml +++ b/.forgejo/workflows/check-main.yml @@ -33,7 +33,70 @@ jobs: env: downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/main ISSUE_TOKEN: ${{ secrets.issue_token }} - LABEL_NUMBER: 4 + LABEL_NUMBER: 13 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-main-3.21: + name: Check main(3.21) repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.21/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-main-3.20: + name: Check main(3.20) repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.20/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-main-3.19: + name: Check main(3.19) repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.19/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 fix_only: all steps: - name: Environment setup From e861045fe30550f054f6601d512b1f38b5489dd5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:54:28 -0400 Subject: [PATCH 137/313] ci: check community workflow title change --- .forgejo/workflows/check-community.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 7b8b5a3..8c5f3c5 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -25,13 +25,13 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh - check-community-v3.22: - name: Check community(v3.22) repo + check-community-3.22: + name: Check community(3.22) repo runs-on: x86_64 container: image: alpine:latest env: - downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community + downstream: https://dl-cdn.alpinelinux.org/alpine/3.22/community ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all From c7b89349dd8fe3742eec382d464a02252ed2fbc1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 17:59:21 -0400 Subject: [PATCH 138/313] backports/*: sync with v3.21 --- backports/calibre/APKBUILD | 5 +- backports/caprine/APKBUILD | 12 +- backports/coin/APKBUILD | 10 +- backports/dex/APKBUILD | 6 +- backports/electron/APKBUILD | 59 +++-- backports/electron/README.md | 59 +++++ backports/electron/compiler.patch | 50 +++- .../electron_system-zlib-headers.patch | 18 +- .../electron/electron_unbundle-node.patch | 179 +++++++++----- backports/electron/fix-opus.patch | 7 +- backports/electron/gperf-3.2-fix.patch | 29 +++ backports/electron/pipewire-1.4.patch | 23 ++ backports/element-desktop/APKBUILD | 171 +++++++++++++ .../element-desktop/add-alpine-targets.patch | 52 ++++ backports/element-desktop/element-desktop | 3 + .../element-desktop/no-source-maps.patch.web | 18 ++ .../element-desktop/tasje-no-fuses.patch | 52 ++++ backports/element-desktop/tasje-one-hak.patch | 20 ++ .../use-system-fonts.patch.web | 79 ++++++ .../element-desktop/use-system-headers.patch | 15 ++ backports/freecad/APKBUILD | 80 +++++++ backports/freecad/no-execinfo.patch | 54 +++++ backports/freetube/APKBUILD | 6 +- backports/gn/APKBUILD | 59 +++++ backports/libmedc/APKBUILD | 43 ++++ backports/libmedc/cmake-config-dir.patch | 11 + backports/libmedc/hdf5.patch | 94 ++++++++ backports/nb/APKBUILD | 4 +- .../pnpm/0001-no-check-for-updates.patch | 14 ++ backports/pnpm/0002-no-self-update.patch | 14 ++ backports/pnpm/APKBUILD | 73 ++++++ backports/py3-apsw/APKBUILD | 4 +- backports/py3-colored/APKBUILD | 10 +- backports/py3-levenshtein/APKBUILD | 11 +- backports/py3-limits/APKBUILD | 15 +- .../py3-limits/our-std-is-good-enough.patch | 13 +- .../tests-drop-etcd3-and-k-argument.patch | 24 ++ backports/py3-pathvalidate/APKBUILD | 4 +- backports/rapidfuzz/APKBUILD | 6 +- backports/signal-desktop/APKBUILD | 168 +++++++------ backports/signal-desktop/README.md | 61 +++++ .../ringrtc-webrtc-renamed.patch | 34 +-- backports/signal-desktop/signal-desktop.sh | 6 + .../signal-disable-updates.patch | 4 +- ...signal-do-not-package-sqlcipher-deps.patch | 12 + .../signal-rollback-locale-changes.patch | 225 ++++++++++++++++++ .../signal-show-window-please.patch | 6 +- .../signal-desktop/signal-update-links.patch | 8 +- .../signal-use-system-sqlcipher.patch | 40 +--- .../signal-desktop/webrtc-compiler.patch | 72 +++++- backports/signal-desktop/webrtc-gcc13.patch | 11 + .../signal-desktop/webrtc-pipewire-1.4.patch | 23 ++ .../webrtc-rollback-3rdparty-build-gn.patch | 31 +++ .../signal-desktop/webrtc-rollback-red.patch | 136 +++++++++++ backports/soqt/APKBUILD | 13 +- backports/swig3/APKBUILD | 46 ++++ ...de-for-constant-expressions-containi.patch | 191 +++++++++++++++ 57 files changed, 2185 insertions(+), 308 deletions(-) create mode 100644 backports/electron/README.md create mode 100644 backports/electron/gperf-3.2-fix.patch create mode 100644 backports/electron/pipewire-1.4.patch create mode 100644 backports/element-desktop/APKBUILD create mode 100644 backports/element-desktop/add-alpine-targets.patch create mode 100755 backports/element-desktop/element-desktop create mode 100644 backports/element-desktop/no-source-maps.patch.web create mode 100644 backports/element-desktop/tasje-no-fuses.patch create mode 100644 backports/element-desktop/tasje-one-hak.patch create mode 100644 backports/element-desktop/use-system-fonts.patch.web create mode 100644 backports/element-desktop/use-system-headers.patch create mode 100644 backports/freecad/APKBUILD create mode 100644 backports/freecad/no-execinfo.patch create mode 100644 backports/gn/APKBUILD create mode 100644 backports/libmedc/APKBUILD create mode 100644 backports/libmedc/cmake-config-dir.patch create mode 100644 backports/libmedc/hdf5.patch create mode 100644 backports/pnpm/0001-no-check-for-updates.patch create mode 100644 backports/pnpm/0002-no-self-update.patch create mode 100644 backports/pnpm/APKBUILD create mode 100644 backports/py3-limits/tests-drop-etcd3-and-k-argument.patch create mode 100644 backports/signal-desktop/README.md create mode 100755 backports/signal-desktop/signal-desktop.sh create mode 100644 backports/signal-desktop/signal-do-not-package-sqlcipher-deps.patch create mode 100644 backports/signal-desktop/signal-rollback-locale-changes.patch create mode 100644 backports/signal-desktop/webrtc-pipewire-1.4.patch create mode 100644 backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch create mode 100644 backports/signal-desktop/webrtc-rollback-red.patch create mode 100644 backports/swig3/APKBUILD create mode 100644 backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch diff --git a/backports/calibre/APKBUILD b/backports/calibre/APKBUILD index 64a7a04..3cf2747 100644 --- a/backports/calibre/APKBUILD +++ b/backports/calibre/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Cowington Post pkgname=calibre -pkgver=7.21.0 +pkgver=7.26.0 pkgrel=0 pkgdesc="Ebook management application" # qt6-webengine @@ -41,6 +41,7 @@ depends=" qt6-qtimageformats qt6-qtsvg qt6-qtwebengine + qt6-qtbase-dev udisks2 " makedepends=" @@ -111,6 +112,6 @@ package() { } sha512sums=" -0c2ee610833df83219c0c33b09e1374a8262f1630ccd48e3c4725c92922a3ac5d102ad83fc213457fb9de3efa4f5a2c98ff6dff039828e1661085a1054d7f631 calibre-7.21.0.tar.xz +e477a2dcdd1c52074bd5c0df5d79b2b609d76bf9e1cb5e3d32f79a89d6e0e2798cb980e2cf74e126fb2856273a14b0e2e92b39ffca74461569233c0a87968bfe calibre-7.26.0.tar.xz eb8e7ce40ff8b8daf6e7e55a5dff8ec4dff06c45744266bb48b3194e92ab1196bc91468203e3c2ca1e5144166a7d6be90e6cf0253513e761b56a4c85be4c2c76 0001-calibre-no-update.patch " diff --git a/backports/caprine/APKBUILD b/backports/caprine/APKBUILD index 9a73d39..41f1806 100644 --- a/backports/caprine/APKBUILD +++ b/backports/caprine/APKBUILD @@ -1,7 +1,7 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=caprine -pkgver=2.60.1 +pkgver=2.60.3 pkgrel=2 pkgdesc="Elegant Facebook Messenger desktop app" arch="x86_64 aarch64" # blocked by electron @@ -17,12 +17,10 @@ source=" " build() { - npm install --ignore-scripts - npx --yes patch-package + npm ci --ignore-scripts + npx patch-package npx tsc - rm -r node_modules - npm install --ignore-scripts --production - npx --yes patch-package + npm prune --ignore-scripts --omit=dev } package() { @@ -59,7 +57,7 @@ package() { -or -name "test" -prune -exec rm -r '{}' \; } sha512sums=" -0df7f233c91f5a044dcffde94b976c6ad71e6d355518615c48cd825a249c01d63f455de31ece69193a66ca0fd8157506f9b88088da1bd47fc75e9d3800784ed0 caprine-2.60.1.tar.gz +edf6452294b3c661befd9811c5836da33311171d587cb9a5939ac11a0c1e2a7ebbc4f2a8d81e02c1db1a2d814ac1aa7bbdadca9e21892cc8d7f7e9c23dc2e221 caprine-2.60.3.tar.gz a469e3bea24926119e51642b777ef794c5fa65421107903f967c36d81bbb1adb3d52469ce3a3301b2c890f1aa53ab989ded22a7c6e811fb8cf0a582dbd835e19 caprine.desktop 3ad8994c1a0417e73d622587769e527b4236a32c1a89442ff76413b75b4392d667c9e2908979b453e5926e54db6d94b31625340c5a94e84e91ea77f56feae778 caprine.sh " diff --git a/backports/coin/APKBUILD b/backports/coin/APKBUILD index 723ea30..e6068c3 100644 --- a/backports/coin/APKBUILD +++ b/backports/coin/APKBUILD @@ -1,15 +1,15 @@ # Contributor: Aiden Grossman -# Maintainer: +# Maintainer: Antoine Martin (ayakael) pkgname=coin -pkgver=4.0.0 -pkgrel=7 +pkgver=4.0.3 +pkgrel=0 pkgdesc="OpenGL OpenInventor compatible graphics library" url="https://github.com/coin3d/coin" license="BSD-3-Clause" arch="all" makedepends="boost-dev cmake glu-dev graphviz samurai" subpackages="$pkgname-dev" -source="https://github.com/coin3d/coin/releases/download/Coin-$pkgver/coin-$pkgver-src.tar.gz +source="https://github.com/coin3d/coin/releases/download/v$pkgver/coin-$pkgver-src.tar.gz TestSuitePatch.patch " builddir="$srcdir/coin" @@ -31,6 +31,6 @@ package() { } sha512sums=" -e036276a243bfe252569cee1b67d38b8633fcf35bdf4e366a92ca67e23799d54d91fe272c23b383c451d330cee284809f28f237857493948149e0da1ebd64fae coin-4.0.0-src.tar.gz +b661bf2124b0de1b46e76a6699b0975abb3aed4dc9019bf32531c535179dc84a90fe4e19def6f6cda7b175470636040d0e58812d532198cf207296d37c539915 coin-4.0.3-src.tar.gz aab464244b13371badf0878e5bfbcce859a42756cf8c7657d1480318aa291d296eac2741219c346bae056f761c5f46857f8fd1ec1c4129f86bc10236d3869deb TestSuitePatch.patch " diff --git a/backports/dex/APKBUILD b/backports/dex/APKBUILD index e777d8d..2b9e1e0 100644 --- a/backports/dex/APKBUILD +++ b/backports/dex/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Anjandev Momi # Maintainer: Anjandev Momi pkgname=dex -pkgver=0.9.0 -pkgrel=1 +pkgver=0.10.1 +pkgrel=0 pkgdesc="program to generate and execute DesktopEntry files of the Application type" url="https://github.com/jceb/dex" arch="all" @@ -22,5 +22,5 @@ package() { } sha512sums=" -d68f5482cb0948f27a724437ddfc6de9a0f502bfd0d5c60c76fb85dda3c30e4c432013e530f6a91138c9ac9ff36b3824cd5e382e9d29bb9fb2ec2b9de4133094 dex-0.9.0.tar.gz +4832e60416f07b90d4f4d03d6493322ccd44a73270edf289d80136587859d137cf39db12fc5cf38d3bdfa46aae3a4d1353c7776e702240b560a287190bdc2b57 dex-0.10.1.tar.gz " diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 72d6e87..424b602 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,11 +1,11 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=33.2.1 +pkgver=35.3.0 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 -_chromium=130.0.6723.127 -_copium_tag=129.1 +_chromium=134.0.6998.205 +_copium_tag=134.0 _depot_tools=495b23b39aaba2ca3b55dd27cadc523f1cb17ee6 pkgdesc="Electron cross-platform desktop toolkit" url="https://github.com/electron/electron" @@ -17,7 +17,6 @@ makedepends=" ada-dev alsa-lib-dev aom-dev - base64-dev bash brotli-dev bsd-compat-headers @@ -59,7 +58,6 @@ makedepends=" libbsd-dev libcap-dev libdrm-dev - libevent-dev libexif-dev libgcrypt-dev libjpeg-turbo-dev @@ -77,6 +75,7 @@ makedepends=" libxslt-dev linux-headers lld + llhttp-dev llvm$_llvmver mesa-dev minizip-dev @@ -96,12 +95,12 @@ makedepends=" py3-setuptools py3-six python3 - qt5-qtbase-dev re2-dev rsync rust rust-bindgen samurai + simdutf-dev snappy-dev speex-dev spirv-tools-dev @@ -129,7 +128,6 @@ source=" musl-auxv.patch musl-sandbox.patch musl-tid-caching.patch - musl-v8-monotonic-pthread-cont_timedwait.patch no-execinfo.patch no-mallinfo.patch no-res-ninit-nclose.patch @@ -137,7 +135,6 @@ source=" partalloc-no-tagging-arm64.patch pvalloc.patch temp-failure-retry.patch - yes-musl.patch electron_icon.patch electron_python-jinja-3.10.patch @@ -150,17 +147,18 @@ source=" electron-launcher.sh " _copium_patches=" - cr124-iwyu-sys-select-dawn-terminal.patch - cr126-aarch64-musl-unsupported-relocation.patch - cr129-ffmpeg-no-noh264parse.patch - cr129-musl-metricts-imports.patch + cr131-v8-non4k-pages.patch + cr133-ffmpeg-no-noh264parse.patch + cr133-is-musl-libcxx.patch + cr133-mv2-still-not-dead.patch + cr134-unbundle-simdutf.patch " +# Avoid conflicting providers +sonameprefix="$pkgname:" # tests are todo for some base checks options="!check net suid" builddir="$srcdir/electron-$_gittag-$_chromium" -export PATH="$PATH:/usr/lib/qt5/bin" - export CC=clang-$_llvmver export CXX=clang++-$_llvmver @@ -312,6 +310,7 @@ prepare() { # libaom - https://aomedia.googlesource.com/aom/+/706ee36dcc82%5E%21/ # but watch this space: https://aomedia-review.googlesource.com/c/aom/+/188606 # jsoncpp, re2, snappy, swiftshader-*, woff2 - requires use_custom_libcxx=false + # icu 76 does not build - https://bugs.gentoo.org/943216 local chromium_use_system=" brotli crc32c @@ -322,9 +321,7 @@ prepare() { fontconfig freetype harfbuzz-ng - icu libdrm - libevent libjpeg libsecret libusb @@ -333,6 +330,7 @@ prepare() { libxslt openh264 opus + simdutf zlib zstd " @@ -352,10 +350,9 @@ prepare() { -delete done - # llhttp - 9.x needed, 8.x in repo (2023-12-17) # ada - needs use_custom_libcxx=false local node_use_system=" - base64 + llhttp brotli cares corepack @@ -432,10 +429,14 @@ _configure() { local symbol_level=0 local vaapi=true + # added_rust_stdlib_libs and removed_rust_stdlib_libs workaround change in Rust 1.86, + # feel free to remove after upgrading rust + # shellcheck disable=2089 local gn_config=" import(\"//electron/build/args/release.gn\") + added_rust_stdlib_libs=[\"adler\"] blink_enable_generated_code_formatting=false cc_wrapper=\"$cc_wrapper\" chrome_pgo_phase=0 @@ -458,9 +459,11 @@ _configure() { is_clang=true is_component_ffmpeg=true is_debug=false + is_musl=true is_official_build=true link_pulseaudio=true proprietary_codecs=true + removed_rust_stdlib_libs=[\"adler2\"] rtc_link_pipewire=true rtc_use_pipewire=true rustc_version=\"yes\" @@ -482,12 +485,11 @@ _configure() { skia_use_dawn=false use_dawn=false use_system_ada=false - use_system_base64=true use_system_cares=true use_system_histogram=true use_system_lcms2=true use_system_libffi=true - use_system_llhttp=false + use_system_llhttp=true use_system_nghttp2=true " @@ -497,14 +499,13 @@ _configure() { } build() { - export PATH="$PATH:/usr/lib/qt5/bin" + export ELECTRON_OUT_DIR="$builddir"/out/Release/ ninja -C out/Release \ copy_node_headers \ electron_dist_zip \ node_gypi_headers \ node_version_header - } package() { @@ -544,21 +545,20 @@ lang() { } sha512sums=" -e2df4454f4178af859c13aadee4ea04a5b6aa202972cad625e54bc68f5b8c25e098e50d428ec9c1886c37ccf49aaaedb4c5f02fc8bdd498314ba216901932185 electron-v33.2.1-130.0.6723.127.tar.zst -6138b3dbf3903c78f4ca1ed5a6c3c3c485471ded31976010484ce8893d03953df2b8f066a4fe84bbde5ae7ef9bbff664ef917e247b2e95dd471de40f2774d7d0 copium-129.1.tar.gz +7dd33e03f30b753a52a8801bd8aaffbd4229280df0c6754e2fadbf6d22e7f89f9bb1db0b30de0c403e9f61a09b1989e9b810d2cb7e8a301724132c20540618ef electron-v35.3.0-134.0.6998.205.tar.zst +c1857b5d6975650f915f3db552666f521822b857e39958ccfb54129f3878f272deaafc3dd446bc8441a5e84f075791feeeb62841b74bb555d8c546bfe231d164 copium-134.0.tar.gz 29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch -53b7cdee8f7bfb4c9371cb385c473e34ed3d8ac7efaa43c0af061107560be30d8747b07fb0b16c01079b8c770f2c721bb5a8081313b7c126856ea4078a74da2a compiler.patch +d9cc4a37a0311d23ae315a8d8124f8dbf60db8cc4a3943818638174b20387f1d770d00871f6608957b246ad956abca43c22ea0b072724287f2947e1909e47323 compiler.patch 4057cc78f10bfd64092bc35a373869abb1d68b880cdbca70422f39ffd78a929c19c7728d4d4c40709aaba25581148a93ae5343e724849fd35323062ed68753fa disable-dns_config_service.patch 2470904846e3adde2c9506f9e78220daca0932320b628dd3d427bf2b7c17a8f7880cb97e787b046c28de7aca642e1a8d30824d6049905976da77e7473baa64da disable-failing-tests.patch 5fc5c012c1db6cf1ba82f38c6f3f4f5ca3a209e47ac708a74de379b018e0649b7694877c9571ef79002dde875ffc07b458a3355425f1c01867f362c66c2bc1bf fc-cache-version.patch -b24563e9a738c00fce7ff2fbdee3d7c024d9125d7c74d9ab90af6bdb16f7ec8419f2c8aa78c0640f6d5d81c17dc2c673a194401d354f466749672729b48ed068 fix-opus.patch +f7fe8a8e5eee17310fb4c3e5de621b4b89ea0567f75033c65be970950cca62b50c5fbd004735e4ad39bdb2e1638b3b73ea614203d323f8181ae18c71edf302a0 fix-opus.patch c63dee5044353eb306a39ca1526158c0f003ab310ecb03d1c368dc2a979454590c84b8d3c15484517d5e66bb8add9b231da9abbadf2e50850abd72ac1345c4ab fstatat-32bit.patch 33ee60863cc438ef57ffef92ba4cf67a856a5ffc16138bce241bcf87e47b15154aa86918e793c26f7ec4dc62a445257ad5673ed7001daf22c4043cf6cc57da7f gdbinit.patch 36a764fa73443b47d38050b52dbe6ad2fa8d67201ff4ccdbad13b52308ef165ca046aac6f9609fe35890a6485f0f3e672e78cc41e3e44f3cdc7f145e540524e8 generic-sensor-include.patch 99bcc7dd485b404a90c606a96addab1d900852128d44fb8cea8acc7303189ef87c89a7b0e749fd0e10c5ef5f6bf1fadeb5c16a34503cab6a59938ce2653d887e musl-auxv.patch 51f1959bd622af26a1c3a1f4b0ad9a5bfa461057aa4cf9960c568dddf8ac47d55989c277f5d5ab5db040a04c54925a531af7a1cc767559218b408eaa6bdd7577 musl-sandbox.patch e7163ac5810ac85366cef2447412287c856e3d67c6b77f219a6e5a418b1965b98e449c409424ad0704a5bded9355dd0aec3dc4585918ce5a2ab36c079707afe2 musl-tid-caching.patch -92eb002718026611f5542362ad69b67f0a398ff71b3fca5c05d55cb5c6f9f29334e5e127bb4860cfaa3fba0f0d4c901e2b98808217e7dc02e254a64a5c9521aa musl-v8-monotonic-pthread-cont_timedwait.patch a250cff50d282b02ce0f28880d0a2b4fb8e7df51bc072bfeeddc561c29a7c76453dbcbc7b17b82966a7b30a31409d2555720d1dcf963e1b3fb8a2a06a6abcf46 no-execinfo.patch 0b41aeb6b212f9c3f61aa0a8d3085c9e865a2e68f3270ceec2376aab67f337ac46eaea7da36d3fd7219e2a1cb731b7aa2d3fb619a374d2b7653976b9f4f384bb no-mallinfo.patch e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9c46ea066405857536964a36436a68eecf7da7952736333cf no-res-ninit-nclose.patch @@ -566,12 +566,11 @@ e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9 f2b08538ff57c50b3772a07ca91845f9d45f4a5112f608b6192d4fb5d7be48f478c0c36194d95ab7bbf933e0278e5c6d578619d8643895cdc40386eebc5b975f partalloc-no-tagging-arm64.patch 03f829a2da633533ef3fd0f287f5ec602d936a97a98b53cd2415553c2537ae9d571f35397ca7c9fb3f4b0806c300e3b189569f8d979ca132e1a2a4dae7206396 pvalloc.patch e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb temp-failure-retry.patch -914ccf649d7771f19f209ab97f99c481aebc6f66174d68e8b539f6ad4a70bc8cb0fae2df6dadbf0415958ffb3574c420fe029079dcce45f5e5add4db2e903566 yes-musl.patch 465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch 2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch -57aa81d46b9cc931092d9d9b3cb4a9859f86c183a236bc5cca6abbaeca86b82bf1b537dd9cb3412114fa4e86087c0022ee3f7e88de974d29b309e9d1714df7a5 electron_unbundle-node.patch -1b35edcf0b41e39e20c4d64dbb978bcaab8036f2fe839930709b269c50cb1321458a15b4d0013246f9e03f58f250a1e3a57ea910db1aa0adbd602a6a11ad33b9 electron_system-zlib-headers.patch +1ab45199c5eb896f57407876e9ca435af3ed63a65136f97526f6a07c3a2db223e646ea365630b0eda441ea88dbb0c07ab00b77de25edce07453f038c5339203d electron_unbundle-node.patch +4d9287d4cdfe27fbfb7be3d4b26c0c40edbd6a0c3ff926d60f2093ca09c15bcb58e20c2ccc8c0606aafd66c6d25a54225bc329cb056d8c5b297db4c6d0e768e6 electron_system-zlib-headers.patch e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e default.conf 191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463 electron.desktop 5f7ba5ad005f196facec1c0f26108356b64cafb1e5cfa462ff714a33b8a4c757ac00bfcb080da09eb5b65032f8eb245d9676a61ec554515d125ed63912708648 electron-launcher.sh diff --git a/backports/electron/README.md b/backports/electron/README.md new file mode 100644 index 0000000..2a12409 --- /dev/null +++ b/backports/electron/README.md @@ -0,0 +1,59 @@ +# electron + +This is the `electron` package for Alpine Linux. + +Please report any issues [using Gitlab](https://gitlab.alpinelinux.org/alpine/aports/-/issues/new) and tag @ayakael + +## Building electron + +Electron is an application framework based on `chromium`. Just like `chromium`, +and any Google application, the build process is a form of [hostile +architecture] (https://en.wikipedia.org/wiki/Hostile_architecture) It's quite +literally chromium with patches applied on top for the most part. The build +process applies a series of git patches against `chromium` from directories +with a script. + +Its source code isn't available as a downloadable tarball. It is only fetchable +using Google's `gclient` available in `depot_tools` with a reimplemented +version in the `teapot` package. By executing, `abuild snapshot`, the tarball +can be fetched and packaged, as long as `gclient` is in your path. For ease of +maintenance, a workflow on [Ayakael's Forge](https://ayakael.net/mirrors/electron) +automatically fetches and packages the source code on new releases and makes it +available in a [generic Forgejo repository](https://ayakael.net/mirrors/-/packages/generic/electron). + +## Electron maintenance cycle + +Security / bug fixes land from upstream land randomly, but chromium security fixes land +basically weekly around Tuesday in `America/Los_Angeles`. Minor relases only require +an upgrade to the `electron` packages. It is advisable to follow chromium weekly +security fixes, although following `electron` minor releases is fine. + +Major version upgrades require a more thorough approach. For one, most changes +can be backported from `chromium` APKBUILD by diffing the previous version +packaged with `electron` with the current (set with `_chromium` var). You also +need to rebuild all `electron` apps, with patches sometimes necessary when +upstream bumps to a new `nodejs` major verion. Major electron releases are +every two `chromium` major releases, with [dates known well ahead] +(https://chromiumdash.appspot.com/schedule) with a few major releases of +`electron` [officially supported at a time](https://www.electronjs.org/docs/latest/tutorial/electron-timelines). + +Steps, in a nutshell: + +1. Set `pkgver` to up-to-date version + +2. Optional: fetch source-code using `abuild snapshot`, making sure `gclient` +is in your path + +3. Update source checksum using `abuild checksum` + +4. If major update, backport changes from `chromium` aport and bump `pkgrel` +for all electron-based applications. + +## Why is this package still in testing + +[Work is under way](https://gitlab.alpinelinux.org/alpine/aports/-/issues/15760) +to make this aport ready for `community` + +Until that happens, this package is also kept-to-date against the latest +release of Alpine Linux in [Ayakael's Forge](https://ayakael.net/forge/-/packages/alpine/signal-desktop) +This is true of all Ayakael's packages still in `testing`. diff --git a/backports/electron/compiler.patch b/backports/electron/compiler.patch index cce8a23..df41f2c 100644 --- a/backports/electron/compiler.patch +++ b/backports/electron/compiler.patch @@ -1,6 +1,6 @@ --- ./build/config/compiler/BUILD.gn.orig +++ ./build/config/compiler/BUILD.gn -@@ -568,24 +568,6 @@ +@@ -591,24 +591,6 @@ } } @@ -25,7 +25,7 @@ # TODO(crbug.com/40192287): Investigate why/if this should be needed. if (is_win) { cflags += [ "/clang:-ffp-contract=off" ] -@@ -998,17 +980,6 @@ +@@ -1045,20 +1027,6 @@ # `-nodefaultlibs` from the linker invocation from Rust, which would be used # to compile dylibs on Android, such as for constructing unit test APKs. "-Cdefault-linker-libraries", @@ -40,13 +40,24 @@ - # For deterministic builds, keep the local machine's current working - # directory from appearing in build outputs. - "-Zremap-cwd-prefix=.", +- +- # We use clang-rt sanitizer runtimes. +- "-Zexternal-clangrt", ] if (!is_win || force_rustc_color_output) { -@@ -1175,8 +1146,8 @@ +@@ -1107,7 +1075,6 @@ + # Don't allow unstable features to be enabled by `#![feature()]` without + # additional command line flags. + config("disallow_unstable_features") { +- rustflags = [ "-Zallow-features=" ] + } + + config("libcxx_hardening") { +@@ -1242,8 +1209,8 @@ + } } else if (current_cpu == "arm") { - if (is_clang && !is_android && !is_nacl && - !(is_chromeos_lacros && is_chromeos_device)) { + if (is_clang && !is_android && !is_nacl && !is_chromeos_device) { - cflags += [ "--target=arm-linux-gnueabihf" ] - ldflags += [ "--target=arm-linux-gnueabihf" ] + cflags += [ "--target=armv7-alpine-linux-musleabihf" ] @@ -54,10 +65,10 @@ } if (!is_nacl) { cflags += [ -@@ -1190,8 +1161,8 @@ +@@ -1257,8 +1224,8 @@ } else if (current_cpu == "arm64") { if (is_clang && !is_android && !is_nacl && !is_fuchsia && - !(is_chromeos_lacros && is_chromeos_device)) { + !is_chromeos_device) { - cflags += [ "--target=aarch64-linux-gnu" ] - ldflags += [ "--target=aarch64-linux-gnu" ] + cflags += [ "--target=aarch64-alpine-linux-musl" ] @@ -65,7 +76,7 @@ } } else if (current_cpu == "mipsel" && !is_nacl) { ldflags += [ "-Wl,--hash-style=sysv" ] -@@ -1982,7 +1953,7 @@ +@@ -2086,7 +2053,7 @@ defines = [ "_HAS_NODISCARD" ] } } else { @@ -76,41 +87,46 @@ cflags += [ "-Wextra" ] --- ./build/config/rust.gni.orig +++ ./build/config/rust.gni -@@ -185,11 +185,11 @@ +@@ -198,13 +198,13 @@ rust_abi_target = "" if (is_linux || is_chromeos) { if (current_cpu == "arm64") { - rust_abi_target = "aarch64-unknown-linux-gnu" + rust_abi_target = "aarch64-alpine-linux-musl" + cargo_target_abi = "" } else if (current_cpu == "x86") { - rust_abi_target = "i686-unknown-linux-gnu" + rust_abi_target = "i586-alpine-linux-musl" + cargo_target_abi = "" } else if (current_cpu == "x64") { - rust_abi_target = "x86_64-unknown-linux-gnu" + rust_abi_target = "x86_64-alpine-linux-musl" + cargo_target_abi = "" } else if (current_cpu == "arm") { if (arm_float_abi == "hard") { - float_suffix = "hf" -@@ -198,15 +198,15 @@ +@@ -214,18 +214,18 @@ } if (arm_arch == "armv7-a" || arm_arch == "armv7") { # No way to inform Rust about the -a suffix. - rust_abi_target = "armv7-unknown-linux-gnueabi" + float_suffix + rust_abi_target = "armv7-alpine-linux-musleabi" + float_suffix + cargo_target_abi = "eabi" + float_suffix } else { - rust_abi_target = "arm-unknown-linux-gnueabi" + float_suffix + rust_abi_target = "armv6-alpine-linux-musleabi" + float_suffix + cargo_target_abi = "eabi" + float_suffix } } else if (current_cpu == "riscv64") { - rust_abi_target = "riscv64gc-unknown-linux-gnu" + rust_abi_target = "riscv64-alpine-linux-musl" + cargo_target_abi = "" } else { # Best guess for other future platforms. - rust_abi_target = current_cpu + "-unknown-linux-gnu" + rust_abi_target = current_cpu + "-alpine-linux-musl" + cargo_target_abi = "" } } else if (is_android) { - import("//build/config/android/abi.gni") --- ./build/config/clang/BUILD.gn.orig +++ ./build/config/clang/BUILD.gn @@ -128,14 +128,15 @@ @@ -133,3 +149,13 @@ } else { assert(false) # Unhandled cpu type } +--- ./build/config/gcc/BUILD.gn.orig ++++ ./build/config/gcc/BUILD.gn +@@ -32,7 +32,6 @@ + # See http://gcc.gnu.org/wiki/Visibility + config("symbol_visibility_hidden") { + cflags = [ "-fvisibility=hidden" ] +- rustflags = [ "-Zdefault-visibility=hidden" ] + + # Visibility attribute is not supported on AIX. + if (current_os != "aix") { diff --git a/backports/electron/electron_system-zlib-headers.patch b/backports/electron/electron_system-zlib-headers.patch index 0dc5c8e..644f5e7 100644 --- a/backports/electron/electron_system-zlib-headers.patch +++ b/backports/electron/electron_system-zlib-headers.patch @@ -1,10 +1,12 @@ ---- ./electron/BUILD.gn.orig -+++ ./electron/BUILD.gn -@@ -1565,7 +1565,6 @@ - public_deps = header_groups + [ - ":node_gypi_headers", - ":node_version_header", -- ":zlib_headers", - ] +diff --git a/electron/BUILD.gn.orig b/electron/BUILD.gn +index 235c7abd3e8..088c24ac45e 100644 +--- a/electron/BUILD.gn.orig ++++ b/electron/BUILD.gn +@@ -1569,7 +1569,6 @@ group("copy_node_headers") { + ":generate_node_headers", + ":node_gypi_headers", + ":node_version_header", +- ":zlib_headers", + ] } diff --git a/backports/electron/electron_unbundle-node.patch b/backports/electron/electron_unbundle-node.patch index d69f5ae..8392a85 100644 --- a/backports/electron/electron_unbundle-node.patch +++ b/backports/electron/electron_unbundle-node.patch @@ -1,69 +1,122 @@ ---- ./third_party/electron_node/BUILD.gn.orig -+++ ./third_party/electron_node/BUILD.gn -@@ -40,6 +40,8 @@ - node_release_urlbase = "" - - # Allows downstream packagers (eg. Linux distributions) to build Electron against system shared libraries. -+ use_system_ada = false -+ use_system_base64 = false - use_system_cares = false - use_system_nghttp2 = false - use_system_llhttp = false -@@ -48,6 +50,16 @@ - - if (is_linux) { - import("//build/config/linux/pkg_config.gni") -+ if (use_system_ada) { -+ config("ada") { -+ libs = [ "ada" ] -+ } -+ } -+ if (use_system_base64) { -+ pkg_config("base64") { -+ packages = [ "base64" ] -+ } -+ } - if (use_system_cares) { - pkg_config("cares") { - packages = [ "libcares" ] -@@ -258,8 +270,6 @@ - deps = [ - ":node_js2c_exec", - "deps/googletest:gtest", -- "deps/ada", -- "deps/base64", - "deps/simdutf", - "deps/uvwasi", - "//third_party/zlib", -@@ -267,6 +277,16 @@ - "//third_party/brotli:enc", - "//v8:v8_libplatform", - ] -+ if (use_system_ada) { -+ configs += [ ":ada" ] -+ } else { -+ deps += [ "deps/ada" ] -+ } -+ if (use_system_base64) { -+ configs += [ ":base64" ] -+ } else { -+ deps += [ "deps/base64" ] -+ } - if (use_system_cares) { - configs += [ ":cares" ] - } else { -diff --git a/./electron/script/generate-config-gypi.py.orig b/./electron/script/generate-config-gypi.py -index b41cd7eb450..bc4098debb5 100755 ---- a/./electron/script/generate-config-gypi.py.orig -+++ b/./electron/script/generate-config-gypi.py -@@ -62,6 +62,11 @@ def main(target_file, target_cpu): - # Used by certain versions of node-gyp. - v['build_v8_with_gn'] = 'false' - +diff --git a/electron/script/generate-config-gypi.py.orig b/electron/script/generate-config-gypi.py +index 58c973b..c215d90 100755 +--- a/electron/script/generate-config-gypi.py.orig ++++ b/electron/script/generate-config-gypi.py +@@ -64,6 +64,11 @@ def main(target_file, target_cpu): + # in common.gypi + if 'clang' in v: + del v['clang'] ++ + with open(os.path.join(NODE_DIR, 'use_system.txt')) as f: + for dep in f.read().strip().split(' '): + if v.get(f'node_shared_{dep}') is not None: + v[f'node_shared_{dep}'] = 'true' -+ + with open(target_file, 'w+', encoding='utf-8') as file_out: file_out.write(pprint.pformat(config, indent=2)) + +diff --git a/third_party/electron_node/node.gni.orig b/third_party/electron_node/node.gni +index 73bf383..1c80d5a 100644 +--- a/third_party/electron_node/node.gni.orig ++++ b/third_party/electron_node/node.gni +@@ -73,6 +73,7 @@ declare_args() { + node_use_amaro = true + + # Allows downstream packagers (eg. Linux distributions) to build against system shared libraries. ++ use_system_ada = false + use_system_cares = false + use_system_nghttp2 = false + use_system_llhttp = false +diff --git a/third_party/electron_node/unofficial.gni.orig b/third_party/electron_node/unofficial.gni +index d61a9bd..8bf990e 100644 +--- a/third_party/electron_node/unofficial.gni.orig ++++ b/third_party/electron_node/unofficial.gni +@@ -143,7 +143,6 @@ template("node_gn_build") { + "deps/googletest:googletest_config", + ] + public_deps = [ +- "deps/ada", + "deps/uv", + "//electron:electron_js2c", + "deps/simdjson", +@@ -151,10 +150,7 @@ template("node_gn_build") { + ] + deps = [ + ":run_node_js2c", +- "deps/cares", +- "deps/histogram", + "deps/nbytes", +- "deps/nghttp2", + "deps/postject", + "deps/sqlite", + "deps/uvwasi", +@@ -182,12 +178,30 @@ template("node_gn_build") { + if (is_posix) { + configs -= [ "//build/config/gcc:symbol_visibility_hidden" ] + configs += [ "//build/config/gcc:symbol_visibility_default" ] ++ libs = [] ++ include_dirs = [] + } + if (use_system_llhttp) { + libs += [ "llhttp" ] + } else { + deps += [ "deps/llhttp" ] + } ++ if (use_system_cares) { ++ libs += [ "cares" ] ++ } else { ++ deps += [ "deps/cares" ] ++ } ++ if (use_system_nghttp2) { ++ libs += [ "nghttp2" ] ++ } else { ++ deps += [ "deps/nghttp2" ] ++ } ++ if (use_system_ada) { ++ libs += [ "ada" ] ++ include_dirs += [ "/usr/include/ada" ] ++ } else { ++ public_deps += [ "deps/ada" ] ++ } + if (use_system_histogram) { + libs += [ "hdr_histogram" ] + include_dirs += [ "/usr/include/hdr" ] +@@ -208,7 +222,7 @@ template("node_gn_build") { + "src/inspector:node_protocol_generated_sources", + "src/inspector:v8_inspector_compress_protocol_json", + ] +- include_dirs = [ ++ include_dirs += [ + "$target_gen_dir/src", + "$target_gen_dir/src/inspector", + "$node_inspector_protocol_path", +@@ -222,17 +236,18 @@ template("node_gn_build") { + sources += node_inspector.node_inspector_sources + + node_inspector.node_inspector_generated_sources + } +- if (is_linux) { +- import("//build/config/linux/pkg_config.gni") +- if (use_system_cares) { +- pkg_config("cares") { +- packages = [ "libcares" ] +- } +- } +- if (use_system_nghttp2) { +- pkg_config("nghttp2") { +- packages = [ "libnghttp2" ] +- } ++ } ++ ++ if (is_linux) { ++ import("//build/config/linux/pkg_config.gni") ++ if (use_system_cares) { ++ pkg_config("cares") { ++ packages = [ "libcares" ] ++ } ++ } ++ if (use_system_nghttp2) { ++ pkg_config("nghttp2") { ++ packages = [ "libnghttp2" ] + } + } + } diff --git a/backports/electron/fix-opus.patch b/backports/electron/fix-opus.patch index 8841a32..836b719 100644 --- a/backports/electron/fix-opus.patch +++ b/backports/electron/fix-opus.patch @@ -1,6 +1,6 @@ ---- a/media/filters/ffmpeg_glue.cc -+++ b/media/filters/ffmpeg_glue.cc -@@ -142,7 +142,7 @@ const char* FFmpegGlue::GetAllowedAudioDecoders() { +--- a/media/ffmpeg/ffmpeg_common.cc ++++ b/media/ffmpeg/ffmpeg_common.cc +@@ -1025,7 +1025,7 @@ static const base::NoDestructor kAllowedAudioCodecs([]() { // This should match the configured lists in //third_party/ffmpeg. std::string allowed_decoders( @@ -9,4 +9,3 @@ "mp3,pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw"); #if BUILDFLAG(USE_PROPRIETARY_CODECS) allowed_decoders += ",aac"; - diff --git a/backports/electron/gperf-3.2-fix.patch b/backports/electron/gperf-3.2-fix.patch new file mode 100644 index 0000000..fa462e3 --- /dev/null +++ b/backports/electron/gperf-3.2-fix.patch @@ -0,0 +1,29 @@ +diff --git a/third_party/blink/renderer/build/scripts/gperf.py.orig b/third_party/blink/renderer/build/scripts/gperf.py +index 42630d3..d909aee 100644 +--- a/third_party/blink/renderer/build/scripts/gperf.py.orig ++++ b/third_party/blink/renderer/build/scripts/gperf.py +@@ -28,24 +28,6 @@ def generate_gperf(gperf_path, gperf_input, gperf_args): + stdout=subprocess.PIPE, + universal_newlines=True) + gperf_output = gperf.communicate(gperf_input)[0] +- # Massage gperf output to be more palatable for modern compilers. +- # TODO(thakis): Upstream these to gperf so we don't need massaging. +- # `register` is deprecated in C++11 and removed in C++17, so remove +- # it from gperf's output. +- # https://savannah.gnu.org/bugs/index.php?53028 +- gperf_output = re.sub(r'\bregister ', '', gperf_output) +- # -Wimplicit-fallthrough needs an explicit fallthrough statement, +- # so replace gperf's /*FALLTHROUGH*/ comment with the statement. +- # https://savannah.gnu.org/bugs/index.php?53029 +- gperf_output = gperf_output.replace('/*FALLTHROUGH*/', +- ' [[fallthrough]];') +- # -Wpointer-to-int-cast warns about casting pointers to smaller ints +- # Replace {(int)(long)&(foo), bar} with +- # {static_cast(reinterpret_cast(&(foo)), bar} +- gperf_output = re.sub( +- r'\(int\)\(long\)(.*?),', +- r'static_cast(reinterpret_cast(\1)),', +- gperf_output) + script = 'third_party/blink/renderer/build/scripts/gperf.py' + return '// Generated by %s\n' % script + gperf_output + except OSError: diff --git a/backports/electron/pipewire-1.4.patch b/backports/electron/pipewire-1.4.patch new file mode 100644 index 0000000..ab9c37f --- /dev/null +++ b/backports/electron/pipewire-1.4.patch @@ -0,0 +1,23 @@ +Patch-Source: https://webrtc-review.googlesource.com/c/src/+/380500 +--- +--- a/third_party/webrtc/modules/video_capture/linux/pipewire_session.cc ++++ b/third_party/webrtc/modules/video_capture/linux/pipewire_session.cc +@@ -87,7 +87,7 @@ + .param = OnNodeParam, + }; + +- pw_node_add_listener(proxy_, &node_listener_, &node_events, this); ++ pw_node_add_listener(reinterpret_cast(proxy_), &node_listener_, &node_events, this); + } + + // static +@@ -119,7 +119,7 @@ + uint32_t id = info->params[i].id; + if (id == SPA_PARAM_EnumFormat && + info->params[i].flags & SPA_PARAM_INFO_READ) { +- pw_node_enum_params(that->proxy_, 0, id, 0, UINT32_MAX, nullptr); ++ pw_node_enum_params(reinterpret_cast(that->proxy_), 0, id, 0, UINT32_MAX, nullptr); + break; + } + } + diff --git a/backports/element-desktop/APKBUILD b/backports/element-desktop/APKBUILD new file mode 100644 index 0000000..de6a4d7 --- /dev/null +++ b/backports/element-desktop/APKBUILD @@ -0,0 +1,171 @@ +# Contributor: lauren n. liberda +maintainer="lauren n. liberda " +pkgname=element-desktop +pkgver=1.11.100 +pkgrel=1 +pkgdesc="Secure and independent communication, connected via Matrix" +url="https://element.io/" +arch="aarch64 x86_64" # same as electron +license="GPL-3.0-only" +_electronver=35 +depends=" + electron~$_electronver + font-inconsolata + font-inter + font-nunito + font-opensans + font-twemoji + " +makedepends=" + cargo + electron-dev~$_electronver + electron-tasje + jq + libsecret-dev + nodejs + npm + python3 + py3-setuptools + sqlcipher-dev + swc + yarn + " +source=" + https://github.com/vector-im/element-desktop/archive/refs/tags/v$pkgver/element-desktop-$pkgver.tar.gz + https://github.com/vector-im/element-web/archive/refs/tags/v$pkgver/element-web-$pkgver.tar.gz + + add-alpine-targets.patch + use-system-headers.patch + tasje-one-hak.patch + tasje-no-fuses.patch + no-source-maps.patch.web + use-system-fonts.patch.web + + element-desktop + " +options="net !check" # broken + +# secfixes: +# 1.11.30-r0: +# - CVE-2023-30609 +# 1.11.26-r0: +# - CVE-2023-28103 +# - CVE-2023-28427 +# 1.11.7-r0: +# - CVE-2022-39249 +# - CVE-2022-39250 +# - CVE-2022-39251 +# - CVE-2022-39236 +# 1.11.4-r0: +# - CVE-2022-36059 +# - CVE-2022-36060 + +# used by buildscripts (at least web's webpack) +export VERSION=$pkgver + +export CARGO_PROFILE_RELEASE_OPT_LEVEL=2 +export CARGO_PROFILE_RELEASE_STRIP="symbols" +export NODE_OPTIONS="--openssl-legacy-provider" + +prepare() { + default_prepare + + msg "Applying more patches" + for x in $source; do + case "$x" in + *.patch.web) + msg "$x" + patch -p1 -i "$srcdir"/$x -d "$srcdir"/element-web-$pkgver + ;; + esac + done + + rm -rf res/fonts + + ( + cd "$srcdir"/element-web-$pkgver + + msg "Fetch element-web dependencies" + yarn install --frozen-lockfile --ignore-scripts --ignore-engines + jq '.show_labs_settings = true' < config.sample.json > config.json + ) + + ln -s "$srcdir"/element-web-$pkgver/webapp webapp + + msg "Fetch element-desktop dependencies" + yarn install --frozen-lockfile --ignore-scripts +} + +build() { + ( + cd "$srcdir"/element-web-$pkgver + + msg "Build element-web" + NODE_ENV=production yarn build + ) + + msg "Build element-desktop" + + yarn asar-webapp + + # add "optional" native dependencies + # hak stands for hack + yarn run hak --target "$(uname -m)-alpine-linux-musl" + + yarn build:ts + + yarn build:res + + # we need it as js to be of any use for tasje. + # fails with `yarn tsc`. https://github.com/electron-userland/electron-builder/issues/7961 + swc compile electron-builder.ts --out-file electron-builder.mjs + + yarn install --frozen-lockfile --ignore-scripts --production + + npm rebuild keytar-forked --nodedir=/usr/include/electron/node_headers --build-from-source + find node_modules/keytar-forked/build/ -type f \ + \! -path node_modules/keytar-forked/build/Release/keytar.node \ + -delete + # stripping in build because it gets into asar + strip node_modules/keytar-forked/build/Release/keytar.node + + tasje -c electron-builder.mjs pack +} + +check() { + ( + cd "$srcdir"/element-web-$pkgver + + yarn test + ) +} + +package() { + local resources="dist/resources" + + install -Dm644 $resources/app.asar "$pkgdir"/usr/lib/element-desktop/app.asar + install -Dm644 webapp.asar "$pkgdir"/usr/lib/element-desktop/webapp.asar + + cp -r $resources/app.asar.unpacked "$pkgdir"/usr/lib/element-desktop/app.asar.unpacked + + install -Dm644 $resources/img/element.png "$pkgdir"/usr/lib/element-desktop/img/element.png + + install -Dm755 "$srcdir"/$pkgname "$pkgdir"/usr/bin/$pkgname + + install -Dm644 dist/$pkgname.desktop "$pkgdir"/usr/share/applications/$pkgname.desktop + while read -r size; do + install -Dm644 dist/icons/$size.png "$pkgdir"/usr/share/icons/hicolor/$size/apps/$pkgname.png + done < dist/icons/size-list +} + +sha512sums=" +a8ac5180df3b204fb1947ecaa4786c9c5fdd53ffe705f4dfe97a0b051fa371fd9102c41a898e8783cf25f732674da2d987ef315f2facc7b18b20ef214ea0f81d element-desktop-1.11.100.tar.gz +e3e50fd867f9b7388eb22778ccb97d6504a480ab4e2aa9eba10fd0f4d0324a1525c2afe6c80181567d8e554f03086a9e0994a6221cfcb0ca29700754c8f31cac element-web-1.11.100.tar.gz +4747893ed3e43d3074e9afe1cdd668a6be0de073d439205fe8c38c5e0f4091cc76e3cd15d98818bea5139add29501d8d07e83c58e9da230a4ce5bb538d388f80 add-alpine-targets.patch +755b17f7b828eb6920c06a6950ad4e14c32c99d22e9c05fcef7a081b5d2034adb03db3958aa5209c99fb7201f4d888c2383fc9864c5e743dd33f8b5c4925acd7 use-system-headers.patch +92e69817fdc71f60c5c7dcbd3c7b13428cc18141cf5f27720326390f6817bec85fb1c60f8016b3a8fa275f601b16f646cda12b5e379a349368eef2f801b4de7a tasje-one-hak.patch +a1399662bdbe5e7256d31f7bdc05070e7009d70113699856b025a1d5ab1d9b8bf1020072a08255d4eddab0874044131dec296f98a91ba5c12ca61948b1d18dbe tasje-no-fuses.patch +ec635fde026f7fce8e8cc57960b5b9dcec4418416d4867ed47711422d48f068bb58a3c9ceb7715efc9c177beca3788da6b0babc9b689ea8c0724a0395f2b85f8 no-source-maps.patch.web +aaf46476bac403aa5204aa265fcf0654fad4c149fd74d0ec4273c051a5549943384cae3cdd62c5b78fdedfed55c11ecceb898b886e44165cbe7e30953a095cf9 use-system-fonts.patch.web +afc588311dc3b566a754e3e7fe6b37b99a06d47b8bbce0ed9acca8ef308fdab0bd1d41b406199e5cbdd86bdce695ff847cd8668857a235cbdc292ad8b899c063 element-desktop +" diff --git a/backports/element-desktop/add-alpine-targets.patch b/backports/element-desktop/add-alpine-targets.patch new file mode 100644 index 0000000..87e1148 --- /dev/null +++ b/backports/element-desktop/add-alpine-targets.patch @@ -0,0 +1,52 @@ +--- a/scripts/hak/target.ts ++++ b/scripts/hak/target.ts +@@ -29,8 +29,10 @@ + | "i686-unknown-linux-gnu" + | "x86_64-unknown-linux-musl" + | "x86_64-unknown-linux-gnu" ++ | "x86_64-alpine-linux-musl" + | "aarch64-unknown-linux-musl" + | "aarch64-unknown-linux-gnu" ++ | "aarch64-alpine-linux-musl" + | "powerpc64le-unknown-linux-musl" + | "powerpc64le-unknown-linux-gnu"; + +@@ -112,6 +114,13 @@ + libC: MUSL, + }; + ++const x8664AlpineLinuxMusl: LinuxTarget = { ++ id: "x86_64-alpine-linux-musl", ++ platform: "linux", ++ arch: "x64", ++ libC: MUSL, ++}; ++ + const i686UnknownLinuxGnu: LinuxTarget = { + id: "i686-unknown-linux-gnu", + platform: "linux", +@@ -140,6 +149,13 @@ + libC: MUSL, + }; + ++const aarch64AlpineLinuxMusl: LinuxTarget = { ++ id: "aarch64-alpine-linux-musl", ++ platform: "linux", ++ arch: "arm64", ++ libC: MUSL, ++}; ++ + const powerpc64leUnknownLinuxGnu: LinuxTarget = { + id: "powerpc64le-unknown-linux-gnu", + platform: "linux", +@@ -167,8 +183,10 @@ + "i686-unknown-linux-gnu": i686UnknownLinuxGnu, + "x86_64-unknown-linux-musl": x8664UnknownLinuxMusl, + "x86_64-unknown-linux-gnu": x8664UnknownLinuxGnu, ++ "x86_64-alpine-linux-musl": x8664AlpineLinuxMusl, + "aarch64-unknown-linux-musl": aarch64UnknownLinuxMusl, + "aarch64-unknown-linux-gnu": aarch64UnknownLinuxGnu, ++ "aarch64-alpine-linux-musl": aarch64AlpineLinuxMusl, + "powerpc64le-unknown-linux-musl": powerpc64leUnknownLinuxMusl, + "powerpc64le-unknown-linux-gnu": powerpc64leUnknownLinuxGnu, + }; diff --git a/backports/element-desktop/element-desktop b/backports/element-desktop/element-desktop new file mode 100755 index 0000000..de3c5b2 --- /dev/null +++ b/backports/element-desktop/element-desktop @@ -0,0 +1,3 @@ +#!/bin/sh + +exec electron /usr/lib/element-desktop/app.asar "$@" diff --git a/backports/element-desktop/no-source-maps.patch.web b/backports/element-desktop/no-source-maps.patch.web new file mode 100644 index 0000000..86b3bac --- /dev/null +++ b/backports/element-desktop/no-source-maps.patch.web @@ -0,0 +1,18 @@ +--- ./webpack.config.js.orig ++++ ./webpack.config.js +@@ -102,15 +102,6 @@ + } + + const development = {}; +- if (devMode) { +- // Embedded source maps for dev builds, can't use eval-source-map due to CSP +- development["devtool"] = "inline-source-map"; +- } else { +- // High quality source maps in separate .map files which include the source. This doesn't bulk up the .js +- // payload file size, which is nice for performance but also necessary to get the bundle to a small enough +- // size that sentry will accept the upload. +- development["devtool"] = "source-map"; +- } + + // Resolve the directories for the js-sdk for later use. We resolve these early, so we + // don't have to call them over and over. We also resolve to the package.json instead of the src diff --git a/backports/element-desktop/tasje-no-fuses.patch b/backports/element-desktop/tasje-no-fuses.patch new file mode 100644 index 0000000..72c515f --- /dev/null +++ b/backports/element-desktop/tasje-no-fuses.patch @@ -0,0 +1,52 @@ +we can't do fuses because we ship one binary in the electron package. +and we can't import them here, since they are in devDependencies, which are uninstalled at this stage. + +--- ./electron-builder.ts.orig ++++ ./electron-builder.ts +@@ -2,8 +2,7 @@ + import * as fs from "node:fs"; + import * as path from "node:path"; + import * as plist from "plist"; +-import { AfterPackContext, Arch, Configuration as BaseConfiguration, Platform } from "electron-builder"; +-import { computeData } from "app-builder-lib/out/asar/integrity"; ++import { Configuration as BaseConfiguration } from "electron-builder"; + import { readFile, writeFile } from "node:fs/promises"; + + /** +@@ -46,26 +45,6 @@ + } & BaseConfiguration["deb"]; + } + +-async function injectAsarIntegrity(context: AfterPackContext) { +- const packager = context.packager; +- +- // We only need to re-generate asar on universal Mac builds, due to https://github.com/electron/universal/issues/116 +- if (packager.platform !== Platform.MAC || context.arch !== Arch.universal) return; +- +- const resourcesPath = packager.getResourcesDir(context.appOutDir); +- const asarIntegrity = await computeData({ +- resourcesPath, +- resourcesRelativePath: "Resources", +- resourcesDestinationPath: resourcesPath, +- extraResourceMatchers: [], +- }); +- +- const plistPath = path.join(resourcesPath, "..", "Info.plist"); +- const data = plist.parse(await readFile(plistPath, "utf8")) as unknown as Writable; +- data["ElectronAsarIntegrity"] = asarIntegrity as unknown as Writable; +- await writeFile(plistPath, plist.build(data)); +-} +- + /** + * @type {import('electron-builder').Configuration} + * @see https://www.electron.build/configuration/configuration +@@ -89,9 +68,6 @@ + + loadBrowserProcessSpecificV8Snapshot: false, + enableEmbeddedAsarIntegrityValidation: true, +- }, +- afterPack: async (context: AfterPackContext) => { +- await injectAsarIntegrity(context); + }, + files: [ + "package.json", diff --git a/backports/element-desktop/tasje-one-hak.patch b/backports/element-desktop/tasje-one-hak.patch new file mode 100644 index 0000000..a855eee --- /dev/null +++ b/backports/element-desktop/tasje-one-hak.patch @@ -0,0 +1,20 @@ +directories in .hak/hakModules are already symlinked inside node_modules, +and as such are already being copied by default. this makes tasje fail with: +``` +thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: +FileAlreadyWritten("/node_modules/keytar/package.json")', src/main.rs:200:18 +``` + +--- ./electron-builder.ts.orig ++++ ./electron-builder.ts +@@ -74,10 +74,6 @@ + }, + files: [ + "package.json", +- { +- from: ".hak/hakModules", +- to: "node_modules", +- }, + "lib/**", + ], + extraResources: [ diff --git a/backports/element-desktop/use-system-fonts.patch.web b/backports/element-desktop/use-system-fonts.patch.web new file mode 100644 index 0000000..855fdea --- /dev/null +++ b/backports/element-desktop/use-system-fonts.patch.web @@ -0,0 +1,79 @@ +--- a/src/vector/jitsi/index.pcss ++++ b/src/vector/jitsi/index.pcss +@@ -14,7 +14,7 @@ + font-family: "Nunito"; + font-style: normal; + font-weight: 400; +- src: url("$(res)/fonts/Nunito/Nunito-Regular.ttf") format("truetype"); ++ src: local("Nunito Regular"); + } + + $dark-fg: #edf3ff; +--- a/res/themes/light/css/_fonts.pcss ++++ b/res/themes/light/css/_fonts.pcss +@@ -5,16 +5,16 @@ + @font-face { + font-family: "Twemoji"; + font-weight: 400; +- src: url("$(res)/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2") format("woff2"); ++ src: local("Twemoji"); + } + /* For at least Chrome on Windows 10, we have to explictly add extra weights for the emoji to appear in bold messages, etc. */ + @font-face { + font-family: "Twemoji"; + font-weight: 600; +- src: url("$(res)/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2") format("woff2"); ++ src: local("Twemoji"); + } + @font-face { + font-family: "Twemoji"; + font-weight: 700; +- src: url("$(res)/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2") format("woff2"); ++ src: local("Twemoji"); + } +--- a/res/themes/legacy-light/css/_fonts.pcss ++++ b/res/themes/legacy-light/css/_fonts.pcss +@@ -23,17 +23,17 @@ + font-family: "Nunito"; + font-style: normal; + font-weight: 400; +- src: url("$(res)/fonts/Nunito/Nunito-Regular.ttf") format("truetype"); ++ src: local("Nunito Regular"); + } + @font-face { + font-family: "Nunito"; + font-style: normal; + font-weight: 600; +- src: url("$(res)/fonts/Nunito/Nunito-SemiBold.ttf") format("truetype"); ++ src: local("Nunito SemiBold"); + } + @font-face { + font-family: "Nunito"; + font-style: normal; + font-weight: 700; +- src: url("$(res)/fonts/Nunito/Nunito-Bold.ttf") format("truetype"); ++ src: local("Nunito Bold"); + } +--- ./src/theme.ts.orig ++++ ./src/theme.ts +@@ -7,20 +7,6 @@ + Please see LICENSE files in the repository root for full details. + */ + +-import "@fontsource/inter/400.css"; +-import "@fontsource/inter/400-italic.css"; +-import "@fontsource/inter/500.css"; +-import "@fontsource/inter/500-italic.css"; +-import "@fontsource/inter/600.css"; +-import "@fontsource/inter/600-italic.css"; +-import "@fontsource/inter/700.css"; +-import "@fontsource/inter/700-italic.css"; +- +-import "@fontsource/inconsolata/latin-ext-400.css"; +-import "@fontsource/inconsolata/latin-400.css"; +-import "@fontsource/inconsolata/latin-ext-700.css"; +-import "@fontsource/inconsolata/latin-700.css"; +- + import { logger } from "matrix-js-sdk/src/logger"; + + import { _t } from "./languageHandler"; diff --git a/backports/element-desktop/use-system-headers.patch b/backports/element-desktop/use-system-headers.patch new file mode 100644 index 0000000..6ea957b --- /dev/null +++ b/backports/element-desktop/use-system-headers.patch @@ -0,0 +1,15 @@ +--- a/scripts/hak/hakEnv.ts ++++ b/scripts/hak/hakEnv.ts +@@ -101,11 +101,10 @@ + ...process.env, + npm_config_arch: this.target.arch, + npm_config_target_arch: this.target.arch, +- npm_config_disturl: "https://electronjs.org/headers", ++ npm_config_nodedir: "/usr/include/electron/node_headers", + npm_config_runtime: this.runtime, + npm_config_target: this.runtimeVersion, + npm_config_build_from_source: "true", +- npm_config_devdir: path.join(os.homedir(), ".electron-gyp"), + }; + } + diff --git a/backports/freecad/APKBUILD b/backports/freecad/APKBUILD new file mode 100644 index 0000000..8967ba7 --- /dev/null +++ b/backports/freecad/APKBUILD @@ -0,0 +1,80 @@ +# Contributor: Bryce Vandegrift +# Maintainer: Bryce Vandegrift +pkgname=freecad +pkgver=1.0.0 +_ondsel_ver="2e3659c4bce3e6885269e0cb3d640261b2a91108" +_gsl_ver="b39e7e4b0987859f5b19ff7686b149c916588658" +pkgrel=0 +pkgdesc="Open-source parametric 3D modeler" +url="https://www.freecad.org/" +# armv7, armhf, and aarch64: GL_MULTISAMPLE not declared +# s390x: blocked by opencascade-dev, vtk-dev, and freeimage-dev +# riscv64: blocked by py3-pivy, py3-pyside6, pyside6-dev, and py3-shiboken6 +arch="all !aarch64 !armhf !armv7 !s390x !riscv64" +license="LGPL-2.0-or-later" +depends="py3-pivy py3-matplotlib py3-pyside6" +makedepends=" + cmake + ninja + boost-dev + doxygen + python3-dev + xerces-c-dev + opencascade-dev + glew-dev + gtest-dev + vtk-dev + libmedc-dev + eigen-dev + coin-dev + libspnav-dev + pyside6-dev + py3-shiboken6 + py3-pivy + py3-matplotlib + swig + jsoncpp-dev + freeimage-dev + qt6-qtbase-dev + qt6-qtsvg-dev + qt6-qttools-dev + yaml-cpp-dev" +subpackages="$pkgname-doc $pkgname-dev" +options="!check" +source="$pkgname-$pkgver.tar.gz::https://github.com/FreeCAD/FreeCAD/archive/$pkgver.tar.gz + OndselSolver-$_ondsel_ver.tar.gz::https://github.com/Ondsel-Development/OndselSolver/archive/$_ondsel_ver.tar.gz + GSL-$_gsl_ver.tar.gz::https://github.com/microsoft/GSL/archive/$_gsl_ver.tar.gz + no-execinfo.patch" +builddir="$srcdir/FreeCAD-$pkgver" + +prepare() { + default_prepare + + cp -r $srcdir/OndselSolver-$_ondsel_ver/* $builddir/src/3rdParty/OndselSolver + cp -r $srcdir/GSL-$_gsl_ver/* $builddir/src/3rdParty/GSL +} + +build() { + cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DFREECAD_QT_VERSION=6 \ + -DFREECAD_USE_EXTERNAL_PIVY=ON \ + -DBUILD_FLAT_MESH=ON \ + -DENABLE_DEVELOPER_TESTS=OFF \ + -DBUILD_TEST=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_DATAROOTDIR=/usr/share \ + -DCMAKE_INSTALL_DATADIR=/usr/share/$pkgname + ninja -C build +} + +package() { + DESTDIR="$pkgdir" ninja -C build install +} + +sha512sums=" +afc1079ea04fd5bb8135f8ad1012d9e4e05c8839dd0a4e00253eada58fe018f445c1200d1ca7ac9f268644c946cbf55b7b313dc3d6bd010f9da3a3334103b7db freecad-1.0.0.tar.gz +8b08a668c63b57a49b8d95308f31496c1bcb27a5fb024d2e6b9744bd2e4819e82c59f68a8b99cc1be3e2bdfcdf435da5e342afaff4f28d97a849f9c01736af89 OndselSolver-2e3659c4bce3e6885269e0cb3d640261b2a91108.tar.gz +01ae556b70f7b5b572d15a427a6a5e0e7a4047727958be4c61d7dd84fc3bc97aebeaebf60c48064c565884441605fca180d5fdc8c920d35b2a8874664c024b01 GSL-b39e7e4b0987859f5b19ff7686b149c916588658.tar.gz +2f190118bddbf2e070519d0244eafd15ae7919f9759f925f593ce43988a7f9ab023c50bec3768404926e8cc661e829f6a55bec5e9e58c58735c050338fbcec16 no-execinfo.patch +" diff --git a/backports/freecad/no-execinfo.patch b/backports/freecad/no-execinfo.patch new file mode 100644 index 0000000..9443301 --- /dev/null +++ b/backports/freecad/no-execinfo.patch @@ -0,0 +1,54 @@ +From 9cd1f5e5b90ef2e17c61719ffdb2f6c43cbae185 Mon Sep 17 00:00:00 2001 +From: Bryce Vandegrift +Date: Sun, 24 Nov 2024 18:19:39 -0500 +Subject: [PATCH] Remove dependency on execinfo.h + +--- + .../salomesmesh/src/DriverSTL/Basics_Utils.cpp | 11 ----------- + src/App/Application.cpp | 1 - + 2 files changed, 12 deletions(-) + +diff --git a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp +index 23c5083fdf..5ea06ad3f4 100644 +--- a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp ++++ b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp +@@ -29,7 +29,6 @@ + #ifndef WIN32 + #include + #include +-#include + #endif + + +@@ -113,16 +112,6 @@ namespace Kernel_Utils + size_t size; + char **strings; + size_t i; +- +- size = backtrace (array, 40); +- strings = backtrace_symbols (array, size); +- +- for (i = 0; i < size; i++) +- { +- std::cerr << strings[i] << std::endl; +- } +- +- free (strings); + } + #else + #if (_MSC_VER >= 1400) // Visual Studio 2005 +diff --git a/src/App/Application.cpp b/src/App/Application.cpp +index 9384790627..9155c00d25 100644 +--- a/src/App/Application.cpp ++++ b/src/App/Application.cpp +@@ -1798,7 +1798,6 @@ static void freecadNewHandler () + #endif + + #if defined(FC_OS_LINUX) +-#include + #include + #include + +-- +2.47.0 + diff --git a/backports/freetube/APKBUILD b/backports/freetube/APKBUILD index 3d4ac08..19bacf0 100644 --- a/backports/freetube/APKBUILD +++ b/backports/freetube/APKBUILD @@ -1,8 +1,8 @@ # Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) pkgname=freetube -pkgver=0.21.3 -pkgrel=2 +pkgver=0.23.5 +pkgrel=1 pkgdesc="An open source desktop YouTube player built with privacy in mind." arch="x86_64 aarch64" # blocked by electron license="AGPL-3.0-only" @@ -50,7 +50,7 @@ package() { } sha512sums=" -22e5ab677cd442d50237b2d62534698d8ad73a37e1731003dc23c4ea3da992b3cae936f0bb3a0a86cd4b7fba731c9fa53276cb0a6cd5bab213ff2a6c9006cb05 freetube-0.21.3.tar.gz +5811ac53788a12f94cbd4cec6f7075350c223865cb4cf4436f131b9d1197b89aa5da128d6c531d1e56a0302aa3d2523c7ba8d48edbf5f328be6fed3fbba02752 freetube-0.23.5.tar.gz 2ce2effc794bb663789cefe968b5899122127983dbfa1b240aa33a2be383720b18204e6d01b4a550df72956f02b6636b79c93a58f470a970b09b770f5b8f2fc4 freetube.sh d27cb896b65a7e8d52ffe86e5f74eed72b6cf976b28e1a13012d34c7eceba5ff6f20298017738dfa93c0336ffa52b8ee4da7e06b02747062898db7e678819526 tasje-dotdash.patch " diff --git a/backports/gn/APKBUILD b/backports/gn/APKBUILD new file mode 100644 index 0000000..b5ec871 --- /dev/null +++ b/backports/gn/APKBUILD @@ -0,0 +1,59 @@ +# Contributor: TBK +maintainer="lauren n. liberda " +pkgname=gn +pkgver=0_git20250311 +pkgrel=0 +_commit=18602f6cf1168cf78302024043edc02e8bad2ffb +pkgdesc="Meta-build system that generates build files for Ninja" +arch="all" +url="https://gn.googlesource.com/gn" +license="BSD-3-Clause" +depends="samurai" +makedepends="python3 zstd" +# gitiles has no clones +source="https://ab-sn.lnl.gay/gn-$_commit.tar.zst + " +builddir="$srcdir/gn" + +_distbucket="sakamoto/lnl-aports-snapshots/" +snapshot() { + clean + deps + mkdir -p "$srcdir" && cd "$srcdir" + git clone https://gn.googlesource.com/gn + ( + cd gn + git checkout -q $_commit + python3 ./build/gen.py + ) + rm -rf gn/.git + tar cf gn-$_commit.tar gn + zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv gn-$_commit.tar \ + -o "$SRCDEST"/gn-$_commit.tar.zst + mcli cp "$SRCDEST"/gn-$_commit.tar.zst "$_distbucket" +} + +build() { + unset CFLAGS # all sources C++ but passes both + # Breaks build since upstream passes -Wno-format, + # annotated: "Use of %llx, which is supported by _UCRT, false positive" + CXXFLAGS="${CXXFLAGS/-Werror=format-security} -flto=auto" \ + python3 ./build/gen.py \ + --no-last-commit-position \ + --no-static-libstdc++ \ + --no-strip \ + --allow-warnings + ninja -C out +} + +check() { + ./out/gn_unittests +} + +package() { + install -Dm755 out/gn "$pkgdir"/usr/bin/gn +} + +sha512sums=" +9638e177bfd6eecc6af1a9323efa93dc65d1d1f3599037851d19ba076f3b0c9e91366c143e6b6e334fc63baa0bdad80415dbad4ec96585850b462e2904c836d6 gn-18602f6cf1168cf78302024043edc02e8bad2ffb.tar.zst +" diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD new file mode 100644 index 0000000..39408fc --- /dev/null +++ b/backports/libmedc/APKBUILD @@ -0,0 +1,43 @@ +# Contributor: Aiden Grossman +# Maintainer: +pkgname=libmedc +pkgver=4.1.1 +pkgrel=4 +pkgdesc="Open source library for numerical simulation" +url="https://www.salome-platform.org/" +arch="all" +license="GPL-3.0-or-later" +makedepends="cmake hdf5-dev swig3 python3-dev samurai" +options="!check" #test suite is nonfunctional with python bindings +subpackages="$pkgname-dev $pkgname-doc $pkgname-python-pyc $pkgname-python:_py" +source=" + ftp://ftp.cea.fr/pub/salome/prerequisites/med-$pkgver.tar.gz + hdf5.patch + cmake-config-dir.patch + " +builddir="$srcdir"/med-$pkgver + +build() { + cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=None \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DMEDFILE_BUILD_TESTS=OFF \ + -DMEDFILE_BUILD_PYTHON=ON + cmake --build build +} + +package() { + DESTDIR="$pkgdir" cmake --install build +} + +_py() { + pkgdesc="Python bindings for libmedc" + depends="python3" + amove usr/lib/python3* +} + +sha512sums=" +f211fa82750a7cc935baa3a50a55d16e40117a0f2254b482492ba8396d82781ca84960995da7a16b2b5be0b93ce76368bf4b311bb8af0e5f0243e7051c9c554c med-4.1.1.tar.gz +68d9291e73a68d674081314028c0fce7bbd4a7b78b93b7e5078117ce62f2d07318bc33ec95091ce677148ec3926c1ce653d0760c34e74b29257a7be59210f040 hdf5.patch +8d0f58cd67d205fbacaff0e6da76e2ee5473457b478ede13a551ebe5853c0716c7406b74c3792e1ace33a34d352fccca8dd2940f063a7c060a12529d060a991a cmake-config-dir.patch +" diff --git a/backports/libmedc/cmake-config-dir.patch b/backports/libmedc/cmake-config-dir.patch new file mode 100644 index 0000000..e1f43a4 --- /dev/null +++ b/backports/libmedc/cmake-config-dir.patch @@ -0,0 +1,11 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -101,7 +101,7 @@ + IF(WIN32 AND NOT CYGWIN) + SET(INSTALL_CMAKE_CONFIG_DIR cmake) + ELSE() +- SET(INSTALL_CMAKE_CONFIG_DIR share/cmake/medfile-${MED_STR_VERSION}) ++ SET(INSTALL_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/medfile-${MED_STR_VERSION}) + ENDIF() + SET(INSTALL_INCLUDE_DIR include) + diff --git a/backports/libmedc/hdf5.patch b/backports/libmedc/hdf5.patch new file mode 100644 index 0000000..bc4764b --- /dev/null +++ b/backports/libmedc/hdf5.patch @@ -0,0 +1,94 @@ +Originally from https://gist.github.com/jedbrown/527ef81ff59a0dccf833da40fdd15a47 +diff -rupN med-4.1.0/config/cmake_files/medMacros.cmake med-4.1.0-new/config/cmake_files/medMacros.cmake +--- med-4.1.0/config/cmake_files/medMacros.cmake 2021-12-03 09:35:30.675827163 +0100 ++++ med-4.1.0-new/config/cmake_files/medMacros.cmake 2021-12-03 09:32:31.894994147 +0100 +@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5) + ## + ## Requires 1.10.x version + ## +- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 10 OR NOT HDF_VERSION_RELEASE_REF GREATER 1) ++ IF (HDF5_VERSION VERSION_LESS 1.10.2) + MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.10.2 are supported.") + ENDIF() + ## +diff -rupN med-4.1.0/src/ci/MEDfileCompatibility.c med-4.1.0-new/src/ci/MEDfileCompatibility.c +--- med-4.1.0/src/ci/MEDfileCompatibility.c 2021-12-03 09:35:30.676827162 +0100 ++++ med-4.1.0-new/src/ci/MEDfileCompatibility.c 2021-12-03 09:33:26.292942149 +0100 +@@ -71,7 +71,7 @@ MEDfileCompatibility(const char* const f + _hversionMMR=10000*_hmajeur+100*_hmineur+_hrelease; + /* ISCRUTE(_hversionMMR); */ + /* ISCRUTE(HDF_VERSION_NUM_REF); */ +- if ( (_hversionMMR >= HDF_VERSION_NUM_REF) && (_hmineur == HDF_VERSION_MINOR_REF) ) *hdfok = MED_TRUE; ++ if (_hversionMMR >= HDF_VERSION_NUM_REF) *hdfok = MED_TRUE; + + /* TODO : Vérifier si la version mineure HDF du fichier est supérieure + à la version mineure de la bibliothèque HDF utilisée : +@@ -113,7 +113,7 @@ MEDfileCompatibility(const char* const f + #if MED_NUM_MAJEUR != 4 + #error "Don't forget to update the test version here when you change the major version of the library !" + #endif +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !" + #error "Cf. _MEDfileCreate ..." + #endif +diff -rupN med-4.1.0/src/hdfi/_MEDfileCreate.c med-4.1.0-new/src/hdfi/_MEDfileCreate.c +--- med-4.1.0/src/hdfi/_MEDfileCreate.c 2021-12-03 09:35:30.677827161 +0100 ++++ med-4.1.0-new/src/hdfi/_MEDfileCreate.c 2021-12-03 09:32:31.894994147 +0100 +@@ -159,7 +159,7 @@ med_idt _MEDfileCreate(const char * cons + * En HDF5-1.10.0p1 cela n'a aucun effet ! + * Un test autoconf permet de fixer un intervalle de version HDF à MED. + */ +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + +diff -rupN med-4.1.0/src/hdfi/_MEDfileOpen.c med-4.1.0-new/src/hdfi/_MEDfileOpen.c +--- med-4.1.0/src/hdfi/_MEDfileOpen.c 2021-12-03 09:35:30.677827161 +0100 ++++ med-4.1.0-new/src/hdfi/_MEDfileOpen.c 2021-12-03 09:32:31.894994147 +0100 +@@ -72,7 +72,7 @@ med_idt _MEDfileOpen(const char * const + + • The creation order tracking property, H5P_CRT_ORDER_TRACKED, has been set in the group creation property list (see H5Pset_link_creation_order). + */ +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + /* L'avantage de bloquer le modèle interne HDF5 +diff -rupN med-4.1.0/src/hdfi/_MEDmemFileOpen.c med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c +--- med-4.1.0/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:35:30.678827160 +0100 ++++ med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:32:31.894994147 +0100 +@@ -434,7 +434,7 @@ med_idt _MEDmemFileOpen(const char * con + goto ERROR; + } + +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18) ) { +diff -rupN med-4.1.0/src/hdfi/_MEDparFileCreate.c med-4.1.0-new/src/hdfi/_MEDparFileCreate.c +--- med-4.1.0/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:35:30.678827160 +0100 ++++ med-4.1.0-new/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:32:31.894994147 +0100 +@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c + * En HDF5-1.10.0p1 cela n'a aucun effet ! + * Un test autoconf permet de fixer un intervalle de version HDF à MED. + */ +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + +diff -rupN med-4.1.0/src/hdfi/_MEDparFileOpen.c med-4.1.0-new/src/hdfi/_MEDparFileOpen.c +--- med-4.1.0/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:35:30.679827159 +0100 ++++ med-4.1.0-new/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:32:31.894994147 +0100 +@@ -55,7 +55,7 @@ med_idt _MEDparFileOpen(const char * con + MED_ERR_(_fid,MED_ERR_INIT,MED_ERR_PROPERTY,MED_ERR_PARALLEL_MSG); + goto ERROR; + } +-#if H5_VERS_MINOR > 10 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18 ) ) { diff --git a/backports/nb/APKBUILD b/backports/nb/APKBUILD index d8b8b08..d5ba0c6 100644 --- a/backports/nb/APKBUILD +++ b/backports/nb/APKBUILD @@ -1,7 +1,7 @@ # Contributor: Quillith # Maintainer: Quillith pkgname=nb -pkgver=7.12.1 +pkgver=7.15.1 pkgrel=0 pkgdesc="Command line note-taking, bookmarking, archiving, and knowledge base application" url="https://github.com/xwmx/nb" @@ -41,5 +41,5 @@ full() { } sha512sums=" -ed3d41a809e39a19711c6c97c38216f17f144b8b474eb94aec4134f9756da03440073f3f6557acf8f7959d3d9fba6392d1d5f59e8b94d5269b7336b11353457e nb-7.12.1.tar.gz +95229ac3c7da47c8e8e80fb68376dcf866fa2c2799e0c150e225f453e92b714c592dd67e016054a6a6f7d53c09f7cc537250217057d42872fb273ee911e82757 nb-7.15.1.tar.gz " diff --git a/backports/pnpm/0001-no-check-for-updates.patch b/backports/pnpm/0001-no-check-for-updates.patch new file mode 100644 index 0000000..2d74688 --- /dev/null +++ b/backports/pnpm/0001-no-check-for-updates.patch @@ -0,0 +1,14 @@ +Disable available update messages as it outputs invalid upgrade process + +diff --git a/dist/pnpm.cjs b/dist/pnpm.cjs +index b93ea78..6daefd6 100644 +--- a/dist/pnpm.cjs ++++ b/dist/pnpm.cjs +@@ -114026,6 +114026,7 @@ var require_checkForUpdates = __commonJS({ + var write_json_file_1 = __importDefault2(require_write_json_file()); + var UPDATE_CHECK_FREQUENCY = 24 * 60 * 60 * 1e3; + async function checkForUpdates(config) { ++ return; + const stateFile = path_1.default.join(config.stateDir, "pnpm-state.json"); + let state; + try { diff --git a/backports/pnpm/0002-no-self-update.patch b/backports/pnpm/0002-no-self-update.patch new file mode 100644 index 0000000..b016ecc --- /dev/null +++ b/backports/pnpm/0002-no-self-update.patch @@ -0,0 +1,14 @@ +Disable command "pnpm self-update" as we install via apk + +diff --git a/dist/pnpm.cjs b/dist/pnpm.cjs +index b93ea78..8da50c3 100644 +--- a/dist/pnpm.cjs ++++ b/dist/pnpm.cjs +@@ -220258,6 +220258,7 @@ var require_selfUpdate = __commonJS({ + }); + } + async function handler(opts, params) { ++ throw new error_1.PnpmError("CANT_SELF_UPDATE_IN_APK", "You should update pnpm with apk"); + if ((0, cli_meta_1.isExecutedByCorepack)()) { + throw new error_1.PnpmError("CANT_SELF_UPDATE_IN_COREPACK", "You should update pnpm with corepack"); + } diff --git a/backports/pnpm/APKBUILD b/backports/pnpm/APKBUILD new file mode 100644 index 0000000..8772842 --- /dev/null +++ b/backports/pnpm/APKBUILD @@ -0,0 +1,73 @@ +# Contributor: Hygna +# Contributor: Fabricio Silva +maintainer="Fabricio Silva " +pkgname=pnpm +pkgver=10.9.0 +pkgrel=0 +pkgdesc="Fast, disk space efficient package manager" +url="https://pnpm.io" +arch="noarch" +license="MIT" +depends="nodejs" +subpackages=" + $pkgname-doc + $pkgname-bash-completion + $pkgname-zsh-completion + $pkgname-fish-completion + " +source="https://registry.npmjs.org/pnpm/-/pnpm-$pkgver.tgz + 0001-no-check-for-updates.patch + 0002-no-self-update.patch + " +builddir="$srcdir/package" + +prepare() { + default_prepare + + # remove node-gyp + rm -rf dist/node-gyp-bin dist/node_modules/node-gyp + # remove windows files + rm -rf dist/vendor/*.exe + + # remove other unnecessary files + find . -type f \( \ + -name '.*' -o \ + -name '*.cmd' -o \ + -name '*.bat' -o \ + -name '*.map' -o \ + -name '*.md' -o \ + -name '*.darwin*' -o \ + -name '*.win*' -o \ + -iname 'README*' \) -delete +} + +check() { + ./bin/pnpm.cjs --help +} + +package() { + local destdir="$pkgdir"/usr/share/node_modules/$pkgname + + install -Dm644 LICENSE -t "$pkgdir"/usr/share/licenses/$pkgname + + install -Dm644 dist/templates/completion.bash \ + "$pkgdir"/usr/share/bash-completion/completions/$pkgname + install -Dm644 dist/templates/completion.zsh \ + "$pkgdir"/usr/share/zsh/site-functions/_$pkgname + install -Dm644 dist/templates/completion.fish \ + "$pkgdir"/usr/share/fish/vendor_completions.d/$pkgname.fish + + install -Dm644 package.json -t "$destdir" + install -Dm755 bin/pnpm.cjs bin/pnpx.cjs -t "$destdir"/bin + cp -r dist "$destdir"/dist + + mkdir -p "$pkgdir"/usr/bin + ln -sf ../share/node_modules/pnpm/bin/pnpm.cjs "$pkgdir"/usr/bin/pnpm + ln -sf ../share/node_modules/pnpm/bin/pnpx.cjs "$pkgdir"/usr/bin/pnpx +} + +sha512sums=" +0486e394640d3c1fb3c9d43d49cf92879ff74f8516959c235308f5a8f62e2e19528a65cdc2a3058f587cde71eba3d5b56327c8c33a97e4c4051ca48a10ca2d5f pnpm-10.9.0.tgz +f53903c506a676393dd8b31e1194b92612bfa877a8e17edc530e308921caf454248e181a3e620a17a941eba126349128963b2b0b1e48f8d927307c9cf335290e 0001-no-check-for-updates.patch +5582d11fcd1782f40a4f9269b477af25057e3a3d60cddef8b64a8592fafdc7a572822c8267a7abf9e8bfa4b726dcb291885642070a838e360fc542cee10c9569 0002-no-self-update.patch +" diff --git a/backports/py3-apsw/APKBUILD b/backports/py3-apsw/APKBUILD index c0b8c6d..051f2c9 100644 --- a/backports/py3-apsw/APKBUILD +++ b/backports/py3-apsw/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Francesco Colista pkgname=py3-apsw _pkgname=apsw -pkgver=3.46.1.0 +pkgver=3.47.2.0 pkgrel=0 pkgdesc="Another Python SQLite Wrapper" url="https://github.com/rogerbinns/apsw" @@ -41,6 +41,6 @@ package() { } sha512sums=" -8d24825c8346b05a99b8959ce1fd45ae5162c95b020ecc63bd3491bfd1579370a0e6b1a962f7f64a7e7e415846007e64d90b28e2065ae047e228d60b12b9cb02 py3-apsw-3.46.1.0.zip +9884f36811bfff7276642841ebaa198669c48f4d54bb764a985ea5bdd88f9f630f9fd8a13cf0a44b5675e374c2a911fcec579ca4165622e8049bff327ef66c1d py3-apsw-3.47.2.0.zip 8f3957bd6fecb5660a7cab367043e4ccdacd87d8963bbe41cc3d525265de28f08aa207099658d785be29c5c90b818c1418f766995cd780d02b8e36252a389758 detect-sqlite-config.patch " diff --git a/backports/py3-colored/APKBUILD b/backports/py3-colored/APKBUILD index deb152a..f2efb49 100644 --- a/backports/py3-colored/APKBUILD +++ b/backports/py3-colored/APKBUILD @@ -1,14 +1,14 @@ -# Maintainer: Hoang Nguyen +# Maintainer: Antoine Martin (ayakael) pkgname=py3-colored _pyname=${pkgname/py3-/} -pkgver=1.4.4 -pkgrel=3 +pkgver=2.2.4 +pkgrel=0 pkgdesc="Simple Python library for color and formatting in terminal" url="https://gitlab.com/dslackw/colored" arch="noarch" license="MIT" depends="python3" -makedepends="py3-setuptools py3-gpep517" +makedepends="py3-setuptools py3-gpep517 py3-flit" checkdepends="py3-pytest" subpackages="$pkgname-pyc" source="https://gitlab.com/dslackw/colored/-/archive/$pkgver/colored-$pkgver.tar.gz" @@ -27,5 +27,5 @@ package() { } sha512sums=" -d49075f97bcc220802a8a64780b4c3910acd420e7e0e82ee71659132e7a294a638b098e4e46ae54f531739f8a43cd35979e521c02bb359205a13d96e37cfe8ed colored-1.4.4.tar.gz +8fd293c95c2cfa6c3c31a91f946414e5c2581ea12a60e38ad1e6a5e44a85589a81c5e8205c4c518ed0d809840bf1b37b0cb5af4cf48c0706aa52017bf9c04489 colored-2.2.4.tar.gz " diff --git a/backports/py3-levenshtein/APKBUILD b/backports/py3-levenshtein/APKBUILD index c146867..d6a7572 100644 --- a/backports/py3-levenshtein/APKBUILD +++ b/backports/py3-levenshtein/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Galen Abell # Maintainer: Galen Abell pkgname=py3-levenshtein -pkgver=0.25.1 -pkgrel=2 +pkgver=0.26.1 +pkgrel=0 pkgdesc="Python extension for computing string edit distances and similarities" url="https://github.com/maxbachmann/Levenshtein" arch="all" @@ -13,6 +13,7 @@ makedepends=" cython py3-gpep517 py3-scikit-build + py3-scikit-build-core python3-dev rapidfuzz samurai @@ -31,15 +32,15 @@ build() { check() { python3 -m venv --clear --without-pip --system-site-packages .testenv .testenv/bin/python3 -m installer \ - .dist/Levenshtein*.whl + .dist/levenshtein*.whl .testenv/bin/python3 -m pytest } package() { python3 -m installer -d "$pkgdir" \ - .dist/Levenshtein*.whl + .dist/levenshtein*.whl } sha512sums=" -936dab36b15df6f2ee5425efb1fdb1490fb8f618ba453f464a6dd615bcc427e55ceee7474f06b34392871d9f38470b853602a11d8f9776eee66ec34156511ca4 py3-levenshtein-0.25.1.tar.gz +589b1f404108f488caf880063f20ee9c6a2033b0a2cd819352bf15e285ea8537c1dc8117de70679f720fd3da47546f7e0e5c620e4da8cf09bf8df9b119e6abc9 py3-levenshtein-0.26.1.tar.gz " diff --git a/backports/py3-limits/APKBUILD b/backports/py3-limits/APKBUILD index 814a4bd..af4516d 100644 --- a/backports/py3-limits/APKBUILD +++ b/backports/py3-limits/APKBUILD @@ -1,8 +1,8 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=py3-limits -pkgver=3.13.0 -pkgrel=1 +pkgver=3.14.1 +pkgrel=0 pkgdesc="Rate limiting using various strategies and storage backends such as redis & memcached" url="https://github.com/alisaifee/limits" arch="noarch" @@ -19,14 +19,16 @@ checkdepends=" py3-pytest-asyncio py3-pytest-benchmark py3-pytest-cov + py3-pytest-lazy-fixtures + py3-pymemcache py3-redis " subpackages="$pkgname-pyc" -options="!check" # most tests are integration with db connections, assume all connectors installed source=" https://github.com/alisaifee/limits/archive/refs/tags/$pkgver/limits-$pkgver.tar.gz our-std-is-good-enough.patch + tests-drop-etcd3-and-k-argument.patch " builddir="$srcdir/limits-$pkgver" @@ -39,7 +41,7 @@ build() { check() { python3 -m venv --clear --without-pip --system-site-packages .testenv gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest \ + .testenv/bin/python3 -m pytest -W ignore::DeprecationWarning \ -m 'not benchmark and not etcd and not integration and not memcached' \ -k 'not aio and not Storage and not strategy' -v } @@ -50,6 +52,7 @@ package() { } sha512sums=" -0a13d08001c2f95e559ac1be35fa8cc178ad2d41bd5bf7b7e85781a428f550c350c21b92942b5b7e45f0f4c0604e96e579c8a26b5e9ca1196e6605608721030a limits-3.13.0.tar.gz -0364d51f9f879b95c6a4a3c9e9fd3d7d1e15ea214c50ae98cd36826b8c0b2d903cf1128741ac83738e305a207dae8955a0b2c8679484d2d6643e334595bdb1d7 our-std-is-good-enough.patch +f30c7ec19c2d1edad9ed77dc590ae35717efa3956a4d97e465793e1923a4af08dc9921d90ee95d3c54ce3364b867ca67a9de62c61d627e07a3f50da20bdabd0f limits-3.14.1.tar.gz +271e3b0501f9f144eda8d2e96c93b285714e339b9217385e38cdbce1f4dec88f9c949e9419f8be94885092e7977f7dca29b86b5499e9fead678b42a686c337db our-std-is-good-enough.patch +e84f4db49349a6feba0f701b9d4357c5f66d64c4a23f8ce512528b0f44b5bbef55041c02d92aae3a4cc8d5340846f9e909217beb869a5aeb49df166dd29ae9e3 tests-drop-etcd3-and-k-argument.patch " diff --git a/backports/py3-limits/our-std-is-good-enough.patch b/backports/py3-limits/our-std-is-good-enough.patch index 94c0c30..32d7d73 100644 --- a/backports/py3-limits/our-std-is-good-enough.patch +++ b/backports/py3-limits/our-std-is-good-enough.patch @@ -1,14 +1,3 @@ ---- ./limits/util.py.orig -+++ ./limits/util.py -@@ -8,7 +8,7 @@ - from types import ModuleType - from typing import TYPE_CHECKING, cast - --import importlib_resources -+from importlib import resources as importlib_resources - from packaging.version import Version - - from limits.typing import Dict, List, NamedTuple, Optional, Tuple, Type, Union --- ./limits/typing.py.orig +++ ./limits/typing.py @@ -13,7 +13,7 @@ @@ -19,4 +8,4 @@ +from typing import ClassVar, Counter, ParamSpec, Protocol, TypeAlias Serializable = Union[int, str, float] - + diff --git a/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch b/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch new file mode 100644 index 0000000..cab3a06 --- /dev/null +++ b/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch @@ -0,0 +1,24 @@ +diff --git a/tests/conftest.py.orig b/tests/conftest.py +index 2aeb758dda6..a9b2b8b2bd1 100644 +--- a/tests/conftest.py.orig ++++ b/tests/conftest.py +@@ -3,7 +3,6 @@ import platform + import socket + import time + +-import etcd3 + import pymemcache + import pymemcache.client + import pymongo +diff --git a/pytest.ini.orig b/pytest.ini +index 38c40a713d0..8c6659e21c2 100644 +--- a/pytest.ini.orig ++++ b/pytest.ini +@@ -17,7 +17,6 @@ addopts = + -rfEsxX + --cov=limits + -m "not benchmark" +- -K + filterwarnings = + error + module::ResourceWarning diff --git a/backports/py3-pathvalidate/APKBUILD b/backports/py3-pathvalidate/APKBUILD index fc26a08..94d2053 100644 --- a/backports/py3-pathvalidate/APKBUILD +++ b/backports/py3-pathvalidate/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: lauren n. liberda pkgname=py3-pathvalidate -pkgver=3.2.1 +pkgver=3.2.3 pkgrel=0 pkgdesc="Python library to sanitize/validate a string such as filenames/file-paths/etc" url="https://github.com/thombashi/pathvalidate" @@ -33,5 +33,5 @@ package() { } sha512sums=" -094bb442258ba58fff11691f5b60976513924443247e808effbc26b9dd6c336f5f84d8e4563643b7def19d9f82170eb9ec6cd89491f9115df8d1634d2aa12206 pathvalidate-3.2.1.tar.gz +674cddcf94d4f03aff5fe968c4c678f6fa510c8ff4dfd9232b2b075ccfaa17de86a08d497c10664399694c5e72b354d452d75f11f6b40d2f9778a2466af0b265 pathvalidate-3.2.3.tar.gz " diff --git a/backports/rapidfuzz/APKBUILD b/backports/rapidfuzz/APKBUILD index 4194b3a..aa0eefd 100644 --- a/backports/rapidfuzz/APKBUILD +++ b/backports/rapidfuzz/APKBUILD @@ -1,6 +1,6 @@ -# Maintainer: +# Maintainer: Antoine Martin (ayakael) pkgname=rapidfuzz -pkgver=3.0.0 +pkgver=3.2.0 pkgrel=0 pkgdesc="Rapid fuzzy string matching in C++ using the Levenshtein Distance" url="https://github.com/maxbachmann/rapidfuzz-cpp" @@ -40,6 +40,6 @@ package() { } sha512sums=" -c5f20399bd1cfaa057c40cc17be5d730d50c1014553241f80f461a2fa89de670357d17a4f090394170263b09a53aa29238e5eff2caf9064a2a118c42aa14f320 rapidfuzz-cpp-3.0.0.tar.gz +cf306fc4a6c0b6fc1a1c3b0b235aa54588bd87a5d07f96c1bc9711a08159ca71580b5958e66e8b4358d34e522041934903079aabe6e5a450cece7d6db6edcbe0 rapidfuzz-cpp-3.2.0.tar.gz 216c5082498830d42d2eb14d3eba35dd08446008916c920db7b55eaf3dd2358f86a61c238315b85fefecf08b9e902dc4db172f91a8479cfd735e53c7b3e03bf5 cstdint.patch " diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index 0bfb575..aea8d4c 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,14 +2,14 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.34.0 +pkgver=7.54.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" # same as electron arch="aarch64 x86_64" license="AGPL-3.0-only" -_llvmver=18 +_llvmver=19 depends=" electron font-barlow @@ -40,16 +40,16 @@ makedepends=" libavif-dev libjpeg-turbo-dev libepoxy-dev - libevent-dev libsecret-dev libvpx-dev libwebp-dev libxml2-dev - lld$_llvmver + lld llvm$_llvmver-dev mesa-dev nodejs npm + pnpm openh264-dev openssl-dev opus-dev @@ -58,6 +58,7 @@ makedepends=" pulseaudio-dev py3-setuptools python3 + re2-dev samurai sqlcipher-dev vips-dev @@ -66,31 +67,35 @@ makedepends=" options="net !check" # use _check_depends to validate this -_libsignalver=0.60.2 -_ringrtcver=2.48.7 -_webrtcver=6723a -_stokenizerver=0.2.1 +_libsignalver=0.70.0 +_ringrtcver=2.51.0 +_webrtcver=6998b +_sqlcipherver=2.0.1 source=" https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz https://github.com/signalapp/libsignal/archive/refs/tags/v$_libsignalver/libsignal-$_libsignalver.tar.gz https://github.com/signalapp/ringrtc/archive/refs/tags/v$_ringrtcver/ringrtc-$_ringrtcver.tar.gz + https://github.com/signalapp/node-sqlcipher/archive/refs/tags/v$_sqlcipherver/node-sqlcipher-$_sqlcipherver.tar.gz https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst - https://github.com/signalapp/Signal-FTS5-Extension/archive/refs/tags/v$_stokenizerver/stokenizer-$_stokenizerver.tar.gz libsignal-auditable.patch signal-use-system-sqlcipher.patch signal-disable-updates.patch signal-update-links.patch signal-show-window-please.patch + signal-rollback-locale-changes.patch + signal-do-not-package-sqlcipher-deps.patch ringrtc-webrtc-renamed.patch webrtc-shared-libs.patch webrtc-compiler.patch webrtc-gcc13.patch + webrtc-rollback-red.patch + webrtc-rollback-3rdparty-build-gn.patch - signal-desktop + signal-desktop.sh " -builddir="$srcdir/Signal-Desktop-$pkgver" +builddir="$srcdir" # webrtc broken on clang https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101227 export CC=gcc @@ -112,24 +117,25 @@ export CARGO_PROFILE_RELEASE_STRIP="symbols" export YARN_CACHE_FOLDER="$srcdir/.yarn" -_check_depends() { +_update_depends() { + msg "Updating extra dependencies version information in $APKBUILD..." # _libsignalver: follow signal-desktop package.json -> @signalapp/libsignal-client # _ringrtcver: follow signal-desktop package.json -> @signalapp/ringrtc # _webrtcver: follow ringrtc (on version above) -> config/version.properties -> webrtc.version # downloading tarball generated with abuild snapshot (with gclient dependencies fetched) - # _stokenizerver: follow @signalapp/better-sqlite3 (on version in package.json) -> deps/download.js -> TOKENIZER_VERSION + # _sqlcipherver: follow signal-desktop package.json -> @signalapp/sqlcipher - local _libsignalver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/libsignal-client\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) - local _ringrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/ringrtc\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) - local _bsqlitever=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package-lock.json | grep "@signalapp/better-sqlite3\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) + local _libsignalver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/libsignal-client\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) + local _ringrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/ringrtc\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) local _webrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/ringrtc/v$_ringrtcver/config/version.properties | awk -F '=' '{if($1 == "webrtc.version"){print $2}}' | head -n 1) - local _extensionver=$(curl --silent https://raw.githubusercontent.com/signalapp/better-sqlite3/v$_bsqlitever/deps/download.js | grep "const EXTENSION_VERSION" | awk '{print $4}' | tr -d "'" | tr -d ';' | head -n 1) - local _stokenizerver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Sqlcipher-Extension/refs/tags/v$_extensionver/Cargo.lock | sed -n "/^name = \"signal-tokenizer\"$/,/^$/p" | awk -F ' = ' '{if($1=="version"){print $2}}' | tr -d '"') + local _sqlcipherver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/sqlcipher\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1) - echo _libsignalver=$_libsignalver - echo _ringrtcver=$_ringrtcver - echo _webrtcver=$_webrtcver - echo _stokenizerver=$_stokenizerver + sed -i \ + -e "s|^_libsignalver=.*|_libsignalver=$_libsignalver|" \ + -e "s|^_ringrtcver=.*|_ringrtcver=$_ringrtcver|" \ + -e "s|^_webrtcver=.*|_webrtcver=$_webrtcver|" \ + -e "s|^_sqlcipherver=.*|_sqlcipherver=$_sqlcipherver|" \ + APKBUILD } # webrtc only, the other dependencies are fine with tarballs @@ -183,14 +189,21 @@ target_cpu_only = True prepare() { # Moves to builddir to use abuild patch logics - for i in libsignal-$_libsignalver ringrtc-$_ringrtcver webrtc-$_webrtcver Signal-FTS5-Extension-$_stokenizerver; do + for i in Signal-Desktop-$pkgver libsignal-$_libsignalver ringrtc-$_ringrtcver webrtc-$_webrtcver node-sqlcipher-$_sqlcipherver; do mv "$srcdir"/$i "$builddir"/${i%-*} done + default_prepare + + cd "$builddir"/Signal-Desktop + + # puts node modules in the root node_modules instead of under .pnpm + echo "node-linker=hoisted" >> .npmrc msg "Installing signal-desktop JS dependencies" - npm ci --ignore-scripts + pnpm install --ignore-scripts - default_prepare + # remove shipped fonts for system-provided (part 1) + rm -rf fonts/ ( cd "$builddir"/webrtc @@ -211,7 +224,6 @@ prepare() { libaom libavif libdrm - libevent libjpeg libpng libsecret @@ -245,6 +257,9 @@ prepare() { python3 build/linux/unbundle/replace_gn_files.py --system-libraries \ $use_system + # zlib depends on base for no reason + sed -i '/\/\/base/d' ./third_party/zlib/BUILD.gn + # allow system dependencies in "official builds" sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \ tools/generate_shim_headers/generate_shim_headers.py @@ -268,10 +283,13 @@ prepare() { ) ( - cd "$builddir"/Signal-FTS5-Extension + cd "$builddir"/node-sqlcipher - msg "Installing signal tokenizer rust dependencies" - cargo fetch --target="$CTARGET" --locked + # fix target + sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' deps/extension/extension.gyp + + msg "Installing sqlcipher js dependencies" + pnpm install --ignore-scripts ) ( @@ -290,9 +308,6 @@ prepare() { msg "Installing libsignal js dependencies" yarn --ignore-scripts --frozen-lockfile ) - - # remove shipped fonts for system-provided (part 1) - rm -rf fonts/ } build() { @@ -379,58 +394,73 @@ build() { ) ( - cd "$builddir"/Signal-FTS5-Extension + cd "$builddir"/node-sqlcipher - msg "Building signal tokenizer" - cargo auditable build --features extension --release --frozen - cbindgen --profile release . -o target/release/signal-tokenizer.h + ( + cd deps/extension + msg "Building sqlcipher-extension" + cargo auditable build --release --target $CTARGET + ) + + msg "Building sqlcipher" + node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source + node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source + + msg "Building sqlcipher glue code" + pnpm build + + mkdir -p prebuilds/linux-$chromium_arch + mv build/Release/obj.target/node_sqlcipher.node prebuilds/linux-$chromium_arch/node.napi.node + + msg "Cleaning dev dependencies for sqlcipher" + pnpm prune --ignore-scripts --prod ) + msg "Building signal-desktop" + cd "$builddir"/Signal-Desktop + # from package.json postinstall - npm run build:acknowledgments - npm exec patch-package + pnpm run build:acknowledgments rm -rf node_modules/dtrace-provider # get esbuild installed (needed for next step) - npm rebuild esbuild + pnpm rebuild esbuild # build front + # resets GIT_CEILING_DIRECTORIES as sometimes abuild sets this and breaks get-expire-time NODE_ENV=production \ SIGNAL_ENV=production \ NODE_OPTIONS=--openssl-legacy-provider \ - npm run build:dev + GIT_CEILING_DIRECTORIES= \ + pnpm run build:dev # purge non-production deps - npm prune --ignore-scripts --omit=dev + pnpm prune --ignore-scripts --prod # use our libsignal rm -rf node_modules/@signalapp/libsignal-client/ - mv libsignal/node/ node_modules/@signalapp/libsignal-client + cp -r "$builddir"/libsignal/node/ node_modules/@signalapp/libsignal-client # use our libringrtc rm -rf node_modules/@signalapp/ringrtc/ - mv ringrtc/src/node/ node_modules/@signalapp/ringrtc + cp -r "$builddir"/ringrtc/src/node/ node_modules/@signalapp/ringrtc - mkdir node_modules/@signalapp/better-sqlite3/tokenizer - mv Signal-FTS5-Extension/target/release/libsignal_tokenizer.a node_modules/@signalapp/better-sqlite3/tokenizer/ - mv Signal-FTS5-Extension/target/release/signal-tokenizer.h node_modules/@signalapp/better-sqlite3/tokenizer/ - - npm rebuild \ - sharp @signalapp/better-sqlite3 spellchecker websocket \ - utf-8-validate bufferutil fs-xattr \ - --nodedir=/usr/include/electron/node_headers --build-from-source + # use our sqlcipher + rm -rf node_modules/@signalapp/sqlcipher/ + cp -r "$builddir"/node-sqlcipher node_modules/@signalapp/sqlcipher SIGNAL_ENV=production \ tasje pack } check() { + cd "$builddir"/Signal-Desktop # tests run against downloaded build of electron for glibc, probably can be patched - npm run test + pnpm run test } package() { - cd "$builddir"/tasje_out + cd "$builddir"/Signal-Desktop/tasje_out install -Dm644 resources/app.asar "$pkgdir"/usr/lib/$pkgname/app.asar cp -r resources/app.asar.unpacked "$pkgdir"/usr/lib/$pkgname/app.asar.unpacked @@ -439,7 +469,7 @@ package() { # this should be in /usr/lib/signal-desktop. however, it does not simply work and I stopped to care install -Dm755 "$builddir"/ringrtc/out/release/libsignaldeswebrtc.so "$pkgdir"/usr/lib/libsignaldeswebrtc.so - install -Dm755 "$srcdir"/signal-desktop "$pkgdir"/usr/bin/signal-desktop + install -Dm755 "$srcdir"/signal-desktop.sh "$pkgdir"/usr/bin/signal-desktop while read -r size; do install -Dm644 icons/$size.png "$pkgdir"/usr/share/icons/hicolor/$size/apps/$pkgname.png @@ -447,19 +477,23 @@ package() { } sha512sums=" -30e06721b01e580414c5e57b63350fc42edbe837b0a60a9cd100bc6ab1758fa6fd5744dc3a35d991db62f363eab791c45b43e1d9d5c81af9e67685114ae2e630 Signal-Desktop-7.34.0.tar.gz -26780a0a6a529cee18f5c3b58f0395c6b5b630dbc8d2bbaa345dd7dd319a0e8548575c915dc16de6ac5d421fffdbe898f2dedb1fa3b4eab5d26debdfc1da515b libsignal-0.60.2.tar.gz -e5e5ab27dc3bd37ef577c248d450e70fa11e72bdfab00fef233aad84d3d8aa3434166c03267f6b95b69d593e9da2f37017b5b7a0913f68499f387354742ba50a ringrtc-2.48.7.tar.gz -64eed5c2a6f5a505d014bc4fa80e15b21103df1ea27825eaa1dfecc23c269f198a7e98472f29de7cae4ac7fa4fede6e837c27494b8ec4d03e36b85b029c64831 webrtc-6723a.tar.zst -84a1f2fc29262a12842e94698d124a85b823128e72a493b0be8ea92fbb72c5c268499f4a6827cdedaae06ec73cce4039a39fe5c5d536cbef330e59ba0183da28 stokenizer-0.2.1.tar.gz +ca512bfdd8c78b6c440214db95347b59928314cd27d74b22828de5d701aaf8e675eb5c71603bb6a39fd224812204d9f656290637d402966760bdb3958d3923c8 Signal-Desktop-7.54.0.tar.gz +52d66cf2643402673858def81a9a3c98a0d16525e126c9e5ea1e3c62150f321e486c8c79bcea11a9636c9b05f541fdf0718869d52b9a789f05cad741ba37c7ad libsignal-0.70.0.tar.gz +8e32d75f9f8216106b6858d9ab58ad53f209408fc155fe27dec184c8c65c9ab5a3a93e9567953f209424ed435ccc6d4903a49a4edae36eb744a897cc02098312 ringrtc-2.51.0.tar.gz +592987c1661de464a4e6dee3081cb5fd32e5afdacdba43d901557a217e62301b4655009ad5bdc0c1dcff5e8b67d7acd68ac953cd638f31196162aa3ccdd9c63b node-sqlcipher-2.0.1.tar.gz +ba02cb0c293210f9a683b0e08c6acbe84f5b78089329ec017b0db3493b38ccf39e92c49c2475dc66b5ce3bfe060686718cb5053787e2d61ed320dadb22891989 webrtc-6998b.tar.zst 8d2d2d82c8546c2dd1fef161b61df79918f8c22235a56a46adb375a0beb4acef12c5fe53e67242a4be97f77adc522ff79b47949c352956c742a70d50f4179f7f libsignal-auditable.patch -cee74edb504ee5ae685e8a449ac35fabf949c33bfee5905778f850c3b18e17f9ae9bd501c89a7fd2c9c81a5bb2b0af0c0b3c72e32128603b3923c32d2a493ce9 signal-use-system-sqlcipher.patch -152435231cdcf52a17a9e24aadf95d77511258e818172941ba074a73a90a541f0136feb58868674f2bcb19191a6d12933fe6cd5baf3ee99e508915c72523163b signal-disable-updates.patch -d50eb5724502df9ea4d795db8cfc27af767c25168d7db2af512e615be7cc2ca290210a9ae78e1abb153c0198677e858ad3d74926c958099d0319295e7d9e7f1d signal-update-links.patch -bfc8acdd13aa48d29c7657311733cc9d33c4899782efbd1ef6d25ad1698be4de7cc67e829324bc0309715d69ae37ea9f782cf54887317e817213e110d73d68e7 signal-show-window-please.patch -10284e0d86ab88de161ae689871082194f689ce416f3ebada8991d5db707994ea1cb8b4212756dd93ba5a3469964050988220f18afc37e38f3404a6e17ec8caf ringrtc-webrtc-renamed.patch +7ee747c8aaa9d6e9149fe0a031e3d4cc9e9c08f22c42076bd05e2acb86952f8170032613d13a53716010edfa3f26ad97b530e82460318eb46a42e28cf5faeb9d signal-use-system-sqlcipher.patch +fc2af28645364cd85c106304a26811b036f6be048c52137fbbcc112870a84132a181f532563e0569b560fde3cf8c02480666a9b01d804b0008f97c728005b1c7 signal-disable-updates.patch +853de84d636f730694f17bcec63463fa7bfbdd0a7f7a64618a8fc6bc523ce1a9854b4c651753735af735c18101295d3efbe54f83ae0bccbed83c8c1fee3e7049 signal-update-links.patch +882d6889b23a3ebc6449c8b6acec8c3853674a7e94f066d65b57bab674ba8c11d582ba2c760825cb67b9202716e6d8b7123001d1e9f9229e49a0b77e9d978265 signal-show-window-please.patch +aca92e4de6cd005d660d7e8b99607de96ca2d7dc220e3465247d517e915e4d41a4b0eb519e85c5eca1c81cd8bac9821acd03ff57f1603918987829c6ea7757b4 signal-rollback-locale-changes.patch +961568777b86f8fbcc73360252123686c9d1e16b2650f23d8afbc6d7580d53024f81b62e9e9cbdcd0031b5cf99854bd47c6dd4580197f2b27b8b4cbb51c6c9c9 signal-do-not-package-sqlcipher-deps.patch +02a648bb8541a39c75fec2db39f024a27976afca41908eefa2fe1f2e30b05b5d59f980ccc930021c0b0c09ba8b0cbcae071e9f0dd530543c667adbc4272af552 ringrtc-webrtc-renamed.patch 98a7e4df27c3ed56c5968ebc3ae8e08bfb54362d0c910f9af1d414079a6d5fe0f18aa570ae3c38042f4691af6a130cb3ff689625e26a3987720dd319a5f587b1 webrtc-shared-libs.patch -fe78cdc58c18826fc4227cc8e9377980766229390544578f6a1a6f7322bc3243c066963b589323dbfe4f2bfd37f8859ad84f63cb3783317892e5ae3652270a3a webrtc-compiler.patch -48ab5c733e643eaff08ccbe839086bebbb68d397984ad7c5c5b68df8071f75d2dfe92c3f52d9fbf9b81754934bdfa8a67c69addd476ce4265b978592fb4ff9bd webrtc-gcc13.patch -87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop +897174fa3b1eaa74a3b2d7d861863a9f60550ddb0d7be700cd590600efdc3bd962f52c21e371276eaf8d5657c98fe8ade9853b0197b61a68d5dce6fa03b5899b webrtc-compiler.patch +3f1095861a79862ab5a55c86d7e353d272974617afba39e4d4441024bede8d7b9b8e122da90d56a9c3c0965171803d6b9e29e91d78167a08c6bcc86b3eedab18 webrtc-gcc13.patch +8f53dcf3264c5cec338f037e57a7770ec939ee06dfb0c5dfeab23967a3a64d3f861a6b5419766ac892676036b4522bce2f47279ca3658b5c0b6a31c82ac05053 webrtc-rollback-red.patch +f8bd574a0de077a643ced26e8a0e3f162e014bbf91c957bbefd113883a70e2b63e483bf400b7e2da8d09edfe76d4f6a257f194a14124f344f1625c5632d12acb webrtc-rollback-3rdparty-build-gn.patch +87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop.sh " diff --git a/backports/signal-desktop/README.md b/backports/signal-desktop/README.md new file mode 100644 index 0000000..a23f037 --- /dev/null +++ b/backports/signal-desktop/README.md @@ -0,0 +1,61 @@ +# signal-desktop + +This is the `signal-desktop` package for Alpine Linux. + +Please report any issues [using Gitlab](https://gitlab.alpinelinux.org/alpine/aports/-/issues/new) and tag @ayakael + +## Building signal-desktop + +Signal-desktop is an electron application that is rather complex to build + +The first layer of complexity is the use of dependencies that are themselves +rather complex to build. Some are based on nodejs, others rust. Those +dependencies are built before signal-desktop, like ringrtc, webrtc and +libsignal. The versions of those dependencies are tracked in different files, +which adds complexity when maintaining the package. Executing `abuild +_update_depends` automatically fetches the expected versions and updates +the relevant variables. + +A second layer of complexity is that webrtc's source code isn't available as a +downloadable tarball. It is only fetchable using Google's `gclient` available +in `depot_tools` with a reimplemented version in the `teapot` package. By +executing, `abuild snapshot`, webrtc tarball can be fetched and packaged, as +long as `gclient` is in your path. For ease of maintenance, a workflow on +[Ayakael's Forge](https://ayakael.net/mirrors/signal-desktop) automatically +fetches and packages the source code and makes it available in a [generic +Forgejo repository](https://ayakael.net/mirrors/-/packages/generic/webrtc). + +## Updating signal-desktop + +In a nutshell: + +1. Set `pkgver` to up-to-date version + +2. Update the dependency versions using `abuild _update_depends` + +3. Optional: fetch webrtc using `abuild snapshot`, making sure `client` +is in your path + +4. Update source checksum using `abuild checksum` + +## Finding dependency version information + +Here is where the version information is stored. It is different for every +extra dependency. + +* _libsignalver: follow signal-desktop package.json -> +@signalapp/libsignal-client +* _ringrtcver: follow signal-desktop package.json -> @signalapp/ringrtc +* _webrtcver: follow ringrtc (on version above) -> config/version.properties -> +webrtc.version downloading tarball generated with abuild snapshot (with gclient +dependencies fetched) +* _stokenizerver: follow @signalapp/better-sqlite3 (on version in package.json) +-> deps/download.js -> TOKENIZER_VERSION + +## Why is this package still in testing + +As `electron` is still in testing, this package cannot yet be moved to +`community`. Until that changes, this package is also kept-to-date against the +latest release of Alpine Linux (along with `electron`) in +[Ayakael's Forge](https://ayakael.net/forge/-/packages/alpine/signal-desktop). +This is true of all Ayakael's packages still in `testing`. diff --git a/backports/signal-desktop/ringrtc-webrtc-renamed.patch b/backports/signal-desktop/ringrtc-webrtc-renamed.patch index 6f8a2b3..6e5e6d1 100644 --- a/backports/signal-desktop/ringrtc-webrtc-renamed.patch +++ b/backports/signal-desktop/ringrtc-webrtc-renamed.patch @@ -1,20 +1,22 @@ ---- ./ringrtc/src/rust/build.rs.orig -+++ ./ringrtc/src/rust/build.rs -@@ -79,6 +79,7 @@ - +diff --git a/ringrtc/src/rust/build.rs.orig b/ringrtc/src/rust/build.rs +index ff2ce04d1cf..ccdaaaef84d 100644 +--- a/ringrtc/src/rust/build.rs.orig ++++ b/ringrtc/src/rust/build.rs +@@ -61,6 +61,7 @@ fn main() { if cfg!(feature = "native") { - let webrtc_dir = if cfg!(feature = "prebuilt_webrtc") { -+ panic!("trying to download prebuild webrtc"); - if let Err(e) = fs::create_dir_all(&out_dir) { - panic!("Failed to create webrtc out directory: {:?}", e); - } -@@ -86,12 +87,12 @@ - // Ignore build type since we only have release prebuilts - format!("{}/release/obj/", out_dir) - } else { -- format!("{}/{}/obj", out_dir, build_type) -+ format!("{}/{}", out_dir, build_type) - }; + let webrtc_dir = + if cfg!(feature = "prebuilt_webrtc") || cfg!(feature = "prebuilt_webrtc_sim") { ++ panic!("trying to download prebuild webrtc"); + if let Err(e) = fs::create_dir_all(&out_dir) { + panic!("Failed to create webrtc out directory: {:?}", e); + } +@@ -74,12 +75,12 @@ fn main() { + // Ignore build type since we only have release prebuilts + format!("{}/release/obj/", out_dir) + } else { +- format!("{}/{}/obj", out_dir, build_type) ++ format!("{}/{}", out_dir, build_type) + }; println!("cargo:rerun-if-changed={}", webrtc_dir); println!("cargo:rerun-if-changed={}", config_dir()); println!("cargo:rustc-link-search=native={}", webrtc_dir); diff --git a/backports/signal-desktop/signal-desktop.sh b/backports/signal-desktop/signal-desktop.sh new file mode 100755 index 0000000..370469c --- /dev/null +++ b/backports/signal-desktop/signal-desktop.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# app chooses config (including used endpoints) based on this +export NODE_ENV=production + +exec electron /usr/lib/signal-desktop/app.asar diff --git a/backports/signal-desktop/signal-disable-updates.patch b/backports/signal-desktop/signal-disable-updates.patch index 9b9c134..f5496f4 100644 --- a/backports/signal-desktop/signal-disable-updates.patch +++ b/backports/signal-desktop/signal-disable-updates.patch @@ -1,5 +1,5 @@ ---- a/config/production.json -+++ b/config/production.json +--- a/Signal-Desktop/config/production.json ++++ b/Signal-Desktop/config/production.json @@ -16,5 +16,5 @@ "serverTrustRoot": "BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF", "genericServerPublicParams": "AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN", diff --git a/backports/signal-desktop/signal-do-not-package-sqlcipher-deps.patch b/backports/signal-desktop/signal-do-not-package-sqlcipher-deps.patch new file mode 100644 index 0000000..c91209d --- /dev/null +++ b/backports/signal-desktop/signal-do-not-package-sqlcipher-deps.patch @@ -0,0 +1,12 @@ +diff --git a/Signal-Desktop/package.json.orig b/Signal-Desktop/package.json +index 5b7b015e20a..bb348fdb4c2 100644 +--- a/Signal-Desktop/package.json.orig ++++ b/Signal-Desktop/package.json +@@ -607,6 +607,7 @@ + "node_modules/socks/build/client/*.js", + "node_modules/smart-buffer/build/*.js", + "node_modules/@signalapp/sqlcipher/prebuilds/${platform}-${arch}/*.node", ++ "!node_modules/@signalapp/sqlcipher/deps/**", + "node_modules/@signalapp/libsignal-client/prebuilds/${platform}-${arch}/*.node", + "!node_modules/@signalapp/ringrtc/scripts/*", + "node_modules/@signalapp/ringrtc/build/${platform}/*${arch}*.node", diff --git a/backports/signal-desktop/signal-rollback-locale-changes.patch b/backports/signal-desktop/signal-rollback-locale-changes.patch new file mode 100644 index 0000000..fce29a2 --- /dev/null +++ b/backports/signal-desktop/signal-rollback-locale-changes.patch @@ -0,0 +1,225 @@ +From a094a2ca2b6d8758b4aea24389c35fc4f142b715 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> +Date: Mon, 3 Mar 2025 19:10:01 -0800 +Subject: [PATCH] Compactify locales even more + +Rollback of Compactify locales even more. For some reason, (maybe tasje?), +these new locales aren't working + +--- + app/locale.ts | 56 ++++++++++++++++-- + package.json | 2 +- + ts/scripts/generate-compact-locales.ts | 82 +++++++++++++++++++------- + 3 files changed, 112 insertions(+), 28 deletions(-) + + +diff --git a/Signal-Desktop/package.json.orig b/Signal-Desktop/package.json +index 04dd9f9200b..e7b69ef963f 100644 +--- a/Signal-Desktop/package.json.orig ++++ b/Signal-Desktop/package.json +@@ -538,10 +538,7 @@ + { + "from": "build/compact-locales", + "to": "_locales", +- "filter": [ +- "**/values.json", +- "keys.json" +- ] ++ "filter": "**/messages.json" + }, + "js/**", + "libtextsecure/**", +diff --git a/Signal-Desktop/app/locale.ts.orig b/Signal-Desktop/app/locale.ts +index a63eef4079d..2a959da4d0d 100644 +--- a/Signal-Desktop/app/locale.ts.orig ++++ b/Signal-Desktop/app/locale.ts +@@ -1,9 +1,8 @@ + // Copyright 2017 Signal Messenger, LLC + // SPDX-License-Identifier: AGPL-3.0-only + +-import { join } from 'node:path'; +-import { readFileSync } from 'node:fs'; +-import { app } from 'electron'; ++import { join } from 'path'; ++import { readFileSync } from 'fs'; + import { merge } from 'lodash'; + import * as LocaleMatcher from '@formatjs/intl-localematcher'; + import { z } from 'zod'; +@@ -16,9 +15,6 @@ import type { LocalizerType } from '../ts/types/Util'; + import * as Errors from '../ts/types/errors'; + import { parseUnknown } from '../ts/util/schemas'; + +-type CompactLocaleMessagesType = ReadonlyArray; +-type CompactLocaleKeysType = ReadonlyArray; +- + const TextInfoSchema = z.object({ + direction: z.enum(['ltr', 'rtl']), + }); +@@ -29,17 +25,6 @@ function getLocaleMessages(locale: string): LocaleMessagesType { + return JSON.parse(readFileSync(targetFile, 'utf-8')); + } + +-function getCompactLocaleKeys(): CompactLocaleKeysType { +- const targetFile = join(__dirname, '..', '_locales', 'keys.json'); +- return JSON.parse(readFileSync(targetFile, 'utf-8')); +-} +- +-function getCompactLocaleValues(locale: string): CompactLocaleMessagesType { +- const targetFile = join(__dirname, '..', '_locales', locale, 'values.json'); +- +- return JSON.parse(readFileSync(targetFile, 'utf-8')); +-} +- + export type LocaleDisplayNames = Record>; + export type CountryDisplayNames = Record>; + +@@ -154,42 +139,13 @@ export function load({ + + logger.info(`locale: Matched locale: ${matchedLocale}`); + ++ const matchedLocaleMessages = getLocaleMessages(matchedLocale); ++ const englishMessages = getLocaleMessages('en'); + const localeDisplayNames = getLocaleDisplayNames(); + const countryDisplayNames = getCountryDisplayNames(); + +- let finalMessages: LocaleMessagesType; +- if (app.isPackaged) { +- const matchedLocaleMessages = getCompactLocaleValues(matchedLocale); +- const englishMessages = getCompactLocaleValues('en'); +- const keys = getCompactLocaleKeys(); +- if (matchedLocaleMessages.length !== keys.length) { +- throw new Error( +- `Invalid "${matchedLocale}" entry count, ` + +- `${matchedLocaleMessages.length} != ${keys.length}` +- ); +- } +- if (englishMessages.length !== keys.length) { +- throw new Error( +- `Invalid "en" entry count, ${englishMessages.length} != ${keys.length}` +- ); +- } +- +- // We start with english, then overwrite that with anything present in locale +- finalMessages = Object.create(null); +- for (const [i, key] of keys.entries()) { +- finalMessages[key] = { +- messageformat: +- matchedLocaleMessages[i] ?? englishMessages[i] ?? undefined, +- }; +- } +- } else { +- const matchedLocaleMessages = getLocaleMessages(matchedLocale); +- const englishMessages = getLocaleMessages('en'); +- +- // We start with english, then overwrite that with anything present in locale +- finalMessages = merge(englishMessages, matchedLocaleMessages); +- } +- ++ // We start with english, then overwrite that with anything present in locale ++ const finalMessages = merge(englishMessages, matchedLocaleMessages); + const i18n = setupI18n(matchedLocale, finalMessages, { + renderEmojify: shouldNeverBeCalled, + }); +diff --git a/Signal-Desktop/ts/scripts/generate-compact-locales.ts.orig b/Signal-Desktop/ts/scripts/generate-compact-locales.ts +index 7187d287acc..9a17d638f44 100644 +--- a/Signal-Desktop/ts/scripts/generate-compact-locales.ts.orig ++++ b/Signal-Desktop/ts/scripts/generate-compact-locales.ts +@@ -3,49 +3,6 @@ + + import { readdir, mkdir, readFile, writeFile } from 'node:fs/promises'; + import { join, dirname } from 'node:path'; +-import pMap from 'p-map'; +-import { isLocaleMessageType } from '../util/setupI18nMain'; +- +-async function compact({ +- sourceDir, +- targetDir, +- locale, +- keys, +-}: { +- sourceDir: string; +- targetDir: string; +- locale: string; +- keys: ReadonlyArray; +-}): Promise> { +- const sourcePath = join(sourceDir, locale, 'messages.json'); +- const targetPath = join(targetDir, locale, 'values.json'); +- +- await mkdir(dirname(targetPath), { recursive: true }); +- +- const json = JSON.parse(await readFile(sourcePath, 'utf8')); +- +- const result = new Array(); +- for (const key of keys) { +- if (json[key] == null) { +- // Pull English translation, or leave blank (string was deleted) +- result.push(null); +- continue; +- } +- +- const value = json[key]; +- if (!isLocaleMessageType(value)) { +- continue; +- } +- if (value.messageformat == null) { +- continue; +- } +- result.push(value.messageformat); +- } +- +- await writeFile(targetPath, JSON.stringify(result)); +- +- return keys; +-} + + async function main(): Promise { + const rootDir = join(__dirname, '..', '..'); +@@ -54,27 +11,30 @@ async function main(): Promise { + + const locales = await readdir(sourceDir); + +- const allKeys = await pMap( +- locales, +- async locale => { ++ await Promise.all( ++ locales.map(async locale => { + const sourcePath = join(sourceDir, locale, 'messages.json'); +- const json = JSON.parse(await readFile(sourcePath, 'utf8')); +- return Object.entries(json) +- .filter(([, value]) => isLocaleMessageType(value)) +- .map(([key]) => key); +- }, +- { concurrency: 10 } +- ); ++ const targetPath = join(targetDir, locale, 'messages.json'); + +- // Sort keys alphabetically for better incremental updates. +- const keys = Array.from(new Set(allKeys.flat())).sort(); +- await mkdir(targetDir, { recursive: true }); +- await writeFile(join(targetDir, 'keys.json'), JSON.stringify(keys)); ++ await mkdir(dirname(targetPath), { recursive: true }); + +- await pMap( +- locales, +- locale => compact({ sourceDir, targetDir, locale, keys }), +- { concurrency: 10 } ++ const json = JSON.parse(await readFile(sourcePath, 'utf8')); ++ for (const value of Object.values(json)) { ++ const typedValue = value as { description?: string }; ++ delete typedValue.description; ++ } ++ delete json.smartling; ++ ++ const entries = [...Object.entries(json)]; ++ ++ // Sort entries alphabetically for better incremental updates. ++ entries.sort(([a], [b]) => { ++ return a < b ? -1 : 1; ++ }); ++ ++ const result = Object.fromEntries(entries); ++ await writeFile(targetPath, JSON.stringify(result)); ++ }) + ); + } + diff --git a/backports/signal-desktop/signal-show-window-please.patch b/backports/signal-desktop/signal-show-window-please.patch index 73c94af..c8c5a65 100644 --- a/backports/signal-desktop/signal-show-window-please.patch +++ b/backports/signal-desktop/signal-show-window-please.patch @@ -1,7 +1,7 @@ -diff --git a/app/main.ts.orig b/app/main.ts +diff --git a/Signal-Desktop/app/main.ts.orig b/Signal-Desktop/app/main.ts index aa1bec8..bd7c1d5 100644 ---- a/app/main.ts.orig -+++ b/app/main.ts +--- a/Signal-Desktop/app/main.ts.orig ++++ b/Signal-Desktop/app/main.ts @@ -690,7 +690,7 @@ async function createWindow() { : DEFAULT_HEIGHT; diff --git a/backports/signal-desktop/signal-update-links.patch b/backports/signal-desktop/signal-update-links.patch index 39ec819..afd0b6b 100644 --- a/backports/signal-desktop/signal-update-links.patch +++ b/backports/signal-desktop/signal-update-links.patch @@ -1,5 +1,5 @@ ---- ./ts/components/DialogExpiredBuild.tsx.orig -+++ ./ts/components/DialogExpiredBuild.tsx +--- ./Signal-Desktop/ts/components/DialogExpiredBuild.tsx.orig ++++ ./Signal-Desktop/ts/components/DialogExpiredBuild.tsx @@ -23,9 +23,9 @@ containerWidthBreakpoint={containerWidthBreakpoint} type="error" @@ -12,8 +12,8 @@ hasAction > {i18n('icu:expiredWarning')}{' '} ---- ./ts/types/support.ts.orig -+++ ./ts/types/support.ts +--- ./Signal-Desktop/ts/types/support.ts.orig ++++ ./Signal-Desktop/ts/types/support.ts @@ -1,7 +1,7 @@ // Copyright 2023 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only diff --git a/backports/signal-desktop/signal-use-system-sqlcipher.patch b/backports/signal-desktop/signal-use-system-sqlcipher.patch index 22b2e2f..576ee66 100644 --- a/backports/signal-desktop/signal-use-system-sqlcipher.patch +++ b/backports/signal-desktop/signal-use-system-sqlcipher.patch @@ -1,26 +1,25 @@ -diff --git a/node_modules/@signalapp/better-sqlite3/binding.gyp.orig b/node_modules/@signalapp/better-sqlite3/binding.gyp -index c370c30b309..bf0207e6fec 100644 ---- a/node_modules/@signalapp/better-sqlite3/binding.gyp.orig -+++ b/node_modules/@signalapp/better-sqlite3/binding.gyp -@@ -7,7 +7,16 @@ +diff --git a/node-sqlcipher/binding.gyp.orig b/node-sqlcipher/binding.gyp +index 9a5caa2f713..8d3da54fea7 100644 +--- a/node-sqlcipher/binding.gyp.orig ++++ b/node-sqlcipher/binding.gyp +@@ -3,8 +3,15 @@ 'targets': [ { - 'target_name': 'better_sqlite3', -- 'dependencies': ['deps/sqlite3.gyp:sqlite3'], -+ 'include_dirs': [ + 'target_name': 'node_sqlcipher', ++ 'include_dirs': [ + '/usr/include/sqlcipher', -+ 'tokenizer', + ], + 'link_settings': { + 'libraries': [ + '-lsqlcipher', -+ ' #include #include + +--- ./webrtc/rtc_base/ssl_stream_adapter.h.orig ++++ ./webrtc/rtc_base/ssl_stream_adapter.h +@@ -24,6 +24,7 @@ + #include "rtc_base/ssl_certificate.h" + #include "rtc_base/ssl_identity.h" + #include "rtc_base/stream.h" ++#include + namespace rtc { + + diff --git a/backports/signal-desktop/webrtc-pipewire-1.4.patch b/backports/signal-desktop/webrtc-pipewire-1.4.patch new file mode 100644 index 0000000..2c39a9e --- /dev/null +++ b/backports/signal-desktop/webrtc-pipewire-1.4.patch @@ -0,0 +1,23 @@ +Patch-Source: https://webrtc-review.googlesource.com/c/src/+/380500 +--- +--- a/webrtc/modules/video_capture/linux/pipewire_session.cc ++++ b/webrtc/modules/video_capture/linux/pipewire_session.cc +@@ -87,7 +87,7 @@ + .param = OnNodeParam, + }; + +- pw_node_add_listener(proxy_, &node_listener_, &node_events, this); ++ pw_node_add_listener(reinterpret_cast(proxy_), &node_listener_, &node_events, this); + } + + // static +@@ -119,7 +119,7 @@ + uint32_t id = info->params[i].id; + if (id == SPA_PARAM_EnumFormat && + info->params[i].flags & SPA_PARAM_INFO_READ) { +- pw_node_enum_params(that->proxy_, 0, id, 0, UINT32_MAX, nullptr); ++ pw_node_enum_params(reinterpret_cast(that->proxy_), 0, id, 0, UINT32_MAX, nullptr); + break; + } + } + diff --git a/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch b/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch new file mode 100644 index 0000000..6352e27 --- /dev/null +++ b/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch @@ -0,0 +1,31 @@ +diff --git a/webrtc/third_party/BUILD.gn b/webrtc/third_party/BUILD.gn +index 256fd092e2e..4ce797ebad7 100644 +--- a/webrtc/third_party/BUILD.gn ++++ b/webrtc/third_party/BUILD.gn +@@ -55,12 +55,10 @@ group("jpeg_includes") { + component("freetype_harfbuzz") { + public_configs = [] + public_deps = [] +- if (enable_freetype) { +- if (use_system_freetype) { +- public_configs += [ "//build/linux:freetype_from_pkgconfig" ] +- } else { +- public_deps += [ "//third_party/freetype:freetype_source" ] +- } ++ if (use_system_freetype) { ++ public_configs += [ "//build/linux:freetype_from_pkgconfig" ] ++ } else { ++ public_deps += [ "//third_party/freetype:freetype_source" ] + } + if (use_system_harfbuzz) { + public_configs += [ "//third_party/harfbuzz-ng:harfbuzz_from_pkgconfig" ] +@@ -71,8 +69,5 @@ component("freetype_harfbuzz") { + + buildflag_header("freetype_buildflags") { + header = "freetype_buildflags.h" +- flags = [ +- "USE_SYSTEM_FREETYPE=$use_system_freetype", +- "ENABLE_FREETYPE=$enable_freetype", +- ] ++ flags = [ "USE_SYSTEM_FREETYPE=$use_system_freetype" ] + } diff --git a/backports/signal-desktop/webrtc-rollback-red.patch b/backports/signal-desktop/webrtc-rollback-red.patch new file mode 100644 index 0000000..c11eb07 --- /dev/null +++ b/backports/signal-desktop/webrtc-rollback-red.patch @@ -0,0 +1,136 @@ +diff --git a/webrtc/ringrtc/rffi/src/sdp_observer.cc b/webrtc/ringrtc/rffi/src/sdp_observer.cc +index d60f3d5e7ba..d561dedd1d0 100644 +--- a/webrtc/ringrtc/rffi/src/sdp_observer.cc ++++ b/webrtc/ringrtc/rffi/src/sdp_observer.cc +@@ -6,7 +6,7 @@ + #include "rffi/api/sdp_observer_intf.h" + #include "rffi/src/ptr.h" + #include "rffi/src/sdp_observer.h" +-#include "third_party/re2/src/re2/re2.h" ++#include + + namespace webrtc { + namespace rffi { +@@ -29,8 +29,8 @@ void CreateSessionDescriptionObserverRffi::OnSuccess(SessionDescriptionInterface + // TODO tweak the response a little + std::string sdp; + if (session_description->ToString(&sdp)) { +- static LazyRE2 ssrc_re = {".+urn:ietf:params:rtp-hdrext:ssrc-audio-level.*\r?\n"}; +- RE2::Replace(&sdp, *ssrc_re, ""); ++ sdp = std::regex_replace(sdp, std::regex("(a=fmtp:111 ((?!cbr=).)*)\r?\n"), "$1;cbr=1\r\n"); ++ sdp = std::regex_replace(sdp, std::regex(".+urn:ietf:params:rtp-hdrext:ssrc-audio-level.*\r?\n"), ""); + + std::unique_ptr session_description2 = CreateSessionDescription(session_description->GetType(), sdp); + delete session_description; +diff --git a/webrtc/ringrtc/rffi/BUILD.gn b/webrtc/ringrtc/rffi/BUILD.gn +index 4564e734e63..341535b0fc7 100644 +--- a/webrtc/ringrtc/rffi/BUILD.gn ++++ b/webrtc/ringrtc/rffi/BUILD.gn +@@ -58,7 +58,6 @@ if (is_android) { + "${android_sdk}:libjingle_peerconnection_jni", + "${android_sdk}:libjingle_peerconnection_metrics_default_jni", + "//pc:libjingle_peerconnection", +- "//third_party/re2", + ] + output_extension = "so" + } +@@ -78,7 +77,6 @@ if (is_ios) { + + deps = [ + "//third_party/libyuv", +- "//third_party/re2", + ] + } + } +@@ -94,7 +92,6 @@ if (is_linux || is_mac || is_win) { + deps = [ + "//sdk:media_constraints", + "//media:rtc_simulcast_encoder_adapter", +- "//third_party/re2", + ] + } + } +diff --git a/webrtc/ringrtc/rffi/api/peer_connection_intf.h b/webrtc/ringrtc/rffi/api/peer_connection_intf.h +index 66958254fed..4cd223beb93 100644 +--- a/webrtc/ringrtc/rffi/api/peer_connection_intf.h ++++ b/webrtc/ringrtc/rffi/api/peer_connection_intf.h +@@ -105,6 +105,7 @@ RUSTEXPORT webrtc::SessionDescriptionInterface* + Rust_sessionDescriptionFromV4(bool offer, + const RffiConnectionParametersV4* v4_borrowed, + bool enable_tcc_audio, ++ bool enable_red_audio, + bool enable_vp9); + + RUSTEXPORT void +diff --git a/webrtc/ringrtc/rffi/src/peer_connection.cc b/webrtc/ringrtc/rffi/src/peer_connection.cc +index 9db5ed8219d..0714b3589e3 100644 +--- a/webrtc/ringrtc/rffi/src/peer_connection.cc ++++ b/webrtc/ringrtc/rffi/src/peer_connection.cc +@@ -42,6 +42,7 @@ int VIDEO_LAYERS_ALLOCATION_EXT_ID = 14; + // 101 used by connection.rs + int DATA_PT = 101; + int OPUS_PT = 102; ++int OPUS_RED_PT = 105; + int VP8_PT = 108; + int VP8_RTX_PT = 118; + int VP9_PT = 109; +@@ -317,12 +318,14 @@ RUSTEXPORT webrtc::SessionDescriptionInterface* + Rust_sessionDescriptionFromV4(bool offer, + const RffiConnectionParametersV4* v4_borrowed, + bool enable_tcc_audio, ++ bool enable_red_audio, + bool enable_vp9) { + // Major changes from the default WebRTC behavior: + // 1. We remove all codecs except Opus, VP8, and VP9 + // 2. We remove all header extensions except for transport-cc, video orientation, + // and abs send time. + // 3. Opus CBR and DTX is enabled. ++ // 4. RED is enabled for audio. + + // For some reason, WebRTC insists that the video SSRCs for one side don't + // overlap with SSRCs from the other side. To avoid potential problems, we'll give the +@@ -361,6 +364,15 @@ Rust_sessionDescriptionFromV4(bool offer, + auto video = std::make_unique(); + set_rtp_params(video.get()); + ++ // Turn on the RED "meta codec" for Opus redundancy. ++ auto opus_red = cricket::CreateAudioCodec(OPUS_RED_PT, cricket::kRedCodecName, 48000, 2); ++ opus_red.SetParam("", std::to_string(OPUS_PT) + "/" + std::to_string(OPUS_PT)); ++ ++ if (enable_red_audio) { ++ // Add RED before Opus to use it by default when sending. ++ audio->AddCodec(opus_red); ++ } ++ + auto opus = cricket::CreateAudioCodec(OPUS_PT, cricket::kOpusCodecName, 48000, 2); + // These are the current defaults for WebRTC + // We set them explicitly to avoid having the defaults change on us. +@@ -378,6 +390,11 @@ Rust_sessionDescriptionFromV4(bool offer, + opus.AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); + audio->AddCodec(opus); + ++ if (!enable_red_audio) { ++ // Add RED after Opus so that RED packets can at least be decoded properly if received. ++ audio->AddCodec(opus_red); ++ } ++ + auto add_video_feedback_params = [] (cricket::Codec* video_codec) { + video_codec->AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); + video_codec->AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)); +@@ -589,9 +606,16 @@ CreateSessionDescriptionForGroupCall(bool local, + opus.SetParam("cbr", "1"); + opus.AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); + ++ // Turn on the RED "meta codec" for Opus redundancy. ++ auto opus_red = cricket::CreateAudioCodec(OPUS_RED_PT, cricket::kRedCodecName, 48000, 2); ++ opus_red.SetParam("", std::to_string(OPUS_PT) + "/" + std::to_string(OPUS_PT)); ++ ++ // Add RED after Opus so that RED packets can at least be decoded properly if received. + local_audio->AddCodec(opus); ++ local_audio->AddCodec(opus_red); + for (auto& remote_audio : remote_audios) { + remote_audio->AddCodec(opus); ++ remote_audio->AddCodec(opus_red); + } + + auto add_video_feedback_params = [] (cricket::Codec* video_codec) { diff --git a/backports/soqt/APKBUILD b/backports/soqt/APKBUILD index 359bfb2..e4c6995 100644 --- a/backports/soqt/APKBUILD +++ b/backports/soqt/APKBUILD @@ -1,22 +1,23 @@ # Contributor: Aiden Grossman -# Maintainer: +# Maintainer: Antoine Martin (ayakael) pkgname=soqt -pkgver=1.6.0 -pkgrel=1 +pkgver=1.6.3 +pkgrel=0 pkgdesc="GUI binding library for coin" url="https://github.com/coin3d/soqt" arch="all" license="BSD-3-Clause" -makedepends="coin-dev cmake mesa-dev qt5-qtbase-dev" +makedepends="coin-dev cmake mesa-dev qt5-qtbase-dev doxygen" options="!check" # test suite consists only of interactive programs subpackages="$pkgname-dev $pkgname-doc" -source="https://github.com/coin3d/soqt/releases/download/SoQt-$pkgver/soqt-$pkgver-src.tar.gz" +source="https://github.com/coin3d/soqt/releases/download/v$pkgver/soqt-$pkgver-src.tar.gz" builddir="$srcdir/$pkgname" build() { cmake -B build . \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=None \ + -DSOQT_BUILD_DOCUMENTATION=ON \ -DSOQT_BUILD_DOC_MAN=ON cmake --build build } @@ -26,5 +27,5 @@ package() { } sha512sums=" -4221e98f51cca4dda23043428e869b60ab4d994710f97c0f44cd82631ffad2bd8bbaf0b820434a4636892df663d66ecd2aec14b185972671b2d22c0fe242b553 soqt-1.6.0-src.tar.gz +8cef22cf4214dd03bb4639c1fff77c127bf80f99e3b7fb7c1c21c25a281aa484252414f4a48fa59b8b2485afe7920ce9e86366fd1343badc77b75b78d3ac4c53 soqt-1.6.3-src.tar.gz " diff --git a/backports/swig3/APKBUILD b/backports/swig3/APKBUILD new file mode 100644 index 0000000..4abe017 --- /dev/null +++ b/backports/swig3/APKBUILD @@ -0,0 +1,46 @@ +# Maintainer: Noel Kuntze +pkgname=swig3 +pkgver=3.0.12 +pkgrel=3 +pkgdesc="A compiler that makes it easy to integrate C and C++ code with scripting languages" +url="https://www.swig.org/" +arch="all" +license="GPL-3.0-only" +depends="guile" +makedepends="zlib-dev pcre-dev bison" +checkdepends="boost-dev perl-dev python3-dev diffutils" +options="!check" # Check for javascript fails +subpackages="$pkgname-doc" +source="https://downloads.sourceforge.net/swig/swig-$pkgver.tar.gz + swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch +" + +builddir="$srcdir/swig-$pkgver" + +prepare() { + default_prepare + update_config_sub +} + +build() { + ./configure \ + --build=$CBUILD \ + --host=$CHOST \ + --prefix=/usr \ + --with-python3=/usr/bin/python3 \ + --program-suffix=3.0 + make +} + +check() { + env PERL5LIB=. make check +} + +package() { + make DESTDIR="$pkgdir" install + install -D -m644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE + install -D -m644 LICENSE-UNIVERSITIES "$pkgdir"/usr/share/licenses/$pkgname/LICENSE-UNIVERSITIES +} + +sha512sums="5eaa2e06d8e4197fd02194051db1e518325dbb074a4c55a91099ad9c55193874f577764afc9029409a41bd520a95154095f26e33ef5add5c102bb2c1d98d33eb swig-3.0.12.tar.gz +0cde94a04a3f914f6e1ac79866d199981600c0f4be18b52d08194de96d524027c6572eacd5c1e155a9007fc34ed9dece27dbcb974874de072fb42bf564978cd0 swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch" diff --git a/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch b/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch new file mode 100644 index 0000000..7198c21 --- /dev/null +++ b/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch @@ -0,0 +1,191 @@ +From 90ba174fcea1618af57aa594199541d47a89b7f6 Mon Sep 17 00:00:00 2001 +From: William S Fulton +Date: Sun, 17 Sep 2017 19:02:55 +0100 +Subject: [PATCH 1/2] Fix generated code for constant expressions containing + wchar_t L literals. + +Such as: + # define __WCHAR_MAX (0x7fffffff + L'\0') + +Reported on swig-user mailing list. +--- + CHANGES.current | 5 +++++ + Examples/test-suite/csharp/preproc_constants_c_runme.cs | 3 ++- + Examples/test-suite/csharp/preproc_constants_runme.cs | 2 ++ + Examples/test-suite/d/preproc_constants_c_runme.1.d | 2 ++ + Examples/test-suite/d/preproc_constants_c_runme.2.d | 2 ++ + Examples/test-suite/d/preproc_constants_runme.1.d | 2 ++ + Examples/test-suite/d/preproc_constants_runme.2.d | 2 ++ + Examples/test-suite/php/preproc_constants_c_runme.php | 2 ++ + Examples/test-suite/php/preproc_constants_runme.php | 2 ++ + Examples/test-suite/php5/preproc_constants_c_runme.php | 2 ++ + Examples/test-suite/php5/preproc_constants_runme.php | 2 ++ + Examples/test-suite/preproc_constants.i | 3 +++ + Source/CParse/parser.y | 2 +- + 13 files changed, 29 insertions(+), 2 deletions(-) + +#diff --git a/CHANGES.current b/CHANGES.current +#index 1e4a244..b455a9f 100644 +#--- a/CHANGES.current +#+++ b/CHANGES.current +#@@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ +# Version 4.0.0 (in progress) +# =========================== +# +#+2017-09-17: wsfulton +#+ Fix generated code for constant expressions containing wchar_t L literals such as: +#+ # define __WCHAR_MAX (0x7fffffff + L'\0') +#+ # define __WCHAR_MIN (-__WCHAR_MAX - 1) +#+ +# 2017-09-10: mlamarre +# [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio +# /LDd, /MDd or /MTd compiler options. +diff --git a/Examples/test-suite/csharp/preproc_constants_c_runme.cs b/Examples/test-suite/csharp/preproc_constants_c_runme.cs +index 76c684d..1c28e49 100644 +--- a/Examples/test-suite/csharp/preproc_constants_c_runme.cs ++++ b/Examples/test-suite/csharp/preproc_constants_c_runme.cs +@@ -61,7 +61,8 @@ public class runme { + assert( typeof(int) == preproc_constants_c.EXPR_LAND.GetType() ); + assert( typeof(int) == preproc_constants_c.EXPR_LOR.GetType() ); + assert( typeof(double) == preproc_constants_c.EXPR_CONDITIONAL.GetType() ); +- ++ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MAX.GetType() ); ++ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MIN.GetType() ); + } + static void assert(bool assertion) { + if (!assertion) +diff --git a/Examples/test-suite/csharp/preproc_constants_runme.cs b/Examples/test-suite/csharp/preproc_constants_runme.cs +index 9fae591..6b02e30 100644 +--- a/Examples/test-suite/csharp/preproc_constants_runme.cs ++++ b/Examples/test-suite/csharp/preproc_constants_runme.cs +@@ -60,6 +60,8 @@ public class runme { + assert( typeof(bool) == preproc_constants.EXPR_LAND.GetType() ); + assert( typeof(bool) == preproc_constants.EXPR_LOR.GetType() ); + assert( typeof(double) == preproc_constants.EXPR_CONDITIONAL.GetType() ); ++ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MAX.GetType() ); ++ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MIN.GetType() ); + + } + static void assert(bool assertion) { +diff --git a/Examples/test-suite/d/preproc_constants_c_runme.1.d b/Examples/test-suite/d/preproc_constants_c_runme.1.d +index d846c71..2b349af 100644 +--- a/Examples/test-suite/d/preproc_constants_c_runme.1.d ++++ b/Examples/test-suite/d/preproc_constants_c_runme.1.d +@@ -61,4 +61,6 @@ void main() { + static assert(is(int == typeof(EXPR_LAND()))); + static assert(is(int == typeof(EXPR_LOR()))); + static assert(is(double == typeof(EXPR_CONDITIONAL()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); + } +diff --git a/Examples/test-suite/d/preproc_constants_c_runme.2.d b/Examples/test-suite/d/preproc_constants_c_runme.2.d +index 9bdbb93..1bac525 100644 +--- a/Examples/test-suite/d/preproc_constants_c_runme.2.d ++++ b/Examples/test-suite/d/preproc_constants_c_runme.2.d +@@ -61,4 +61,6 @@ void main() { + static assert(is(int == typeof(EXPR_LAND()))); + static assert(is(int == typeof(EXPR_LOR()))); + static assert(is(double == typeof(EXPR_CONDITIONAL()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); + } +diff --git a/Examples/test-suite/d/preproc_constants_runme.1.d b/Examples/test-suite/d/preproc_constants_runme.1.d +index 009405f..f743f48 100644 +--- a/Examples/test-suite/d/preproc_constants_runme.1.d ++++ b/Examples/test-suite/d/preproc_constants_runme.1.d +@@ -60,4 +60,6 @@ void main() { + static assert(is(bool == typeof(EXPR_LAND()))); + static assert(is(bool == typeof(EXPR_LOR()))); + static assert(is(double == typeof(EXPR_CONDITIONAL()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); + } +diff --git a/Examples/test-suite/d/preproc_constants_runme.2.d b/Examples/test-suite/d/preproc_constants_runme.2.d +index 2d92ef0..0d96c37 100644 +--- a/Examples/test-suite/d/preproc_constants_runme.2.d ++++ b/Examples/test-suite/d/preproc_constants_runme.2.d +@@ -60,4 +60,6 @@ void main() { + static assert(is(bool == typeof(EXPR_LAND()))); + static assert(is(bool == typeof(EXPR_LOR()))); + static assert(is(double == typeof(EXPR_CONDITIONAL()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); ++ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); + } +diff --git a/Examples/test-suite/php/preproc_constants_c_runme.php b/Examples/test-suite/php/preproc_constants_c_runme.php +index af9b76e..e59fe18 100644 +--- a/Examples/test-suite/php/preproc_constants_c_runme.php ++++ b/Examples/test-suite/php/preproc_constants_c_runme.php +@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant + check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type"); + check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); + check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); ++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); ++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); + + ?> +diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php +index 5c9119b..8e117ea 100644 +--- a/Examples/test-suite/php/preproc_constants_runme.php ++++ b/Examples/test-suite/php/preproc_constants_runme.php +@@ -61,5 +61,7 @@ check::equal(gettype(preproc_constants::EXPR_OR), "integer", "preproc_constants. + check::equal(gettype(preproc_constants::EXPR_LAND), "boolean", "preproc_constants.EXPR_LAND has unexpected type"); + check::equal(gettype(preproc_constants::EXPR_LOR), "boolean", "preproc_constants.EXPR_LOR has unexpected type"); + check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); ++check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); ++check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); + + ?> +diff --git a/Examples/test-suite/php5/preproc_constants_c_runme.php b/Examples/test-suite/php5/preproc_constants_c_runme.php +index 1ea0195..d978fab 100644 +--- a/Examples/test-suite/php5/preproc_constants_c_runme.php ++++ b/Examples/test-suite/php5/preproc_constants_c_runme.php +@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant + check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type"); + check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); + check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); ++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); ++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); + + ?> +diff --git a/Examples/test-suite/php5/preproc_constants_runme.php b/Examples/test-suite/php5/preproc_constants_runme.php +index fb9ee4f..7527026 100644 +--- a/Examples/test-suite/php5/preproc_constants_runme.php ++++ b/Examples/test-suite/php5/preproc_constants_runme.php +@@ -70,5 +70,7 @@ check::equal(gettype(preproc_constants::EXPR_LAND), "integer", "preproc_constant + check::equal(gettype(preproc_constants::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); + + check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); ++check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); ++check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); + + ?> +diff --git a/Examples/test-suite/preproc_constants.i b/Examples/test-suite/preproc_constants.i +index 3a999ad..16b44c9 100644 +--- a/Examples/test-suite/preproc_constants.i ++++ b/Examples/test-suite/preproc_constants.i +@@ -87,6 +87,9 @@ + #define EXPR_LOR 0xFF || 1 + #define EXPR_CONDITIONAL true ? 2 : 2.2 + ++#define EXPR_WCHAR_MAX (0x7fffffff + L'\0') ++#define EXPR_WCHAR_MIN (-EXPR_WCHAR_MAX - 1) ++ + #define EXPR_CHAR_COMPOUND_ADD 'A' + 12 + #define EXPR_CHAR_COMPOUND_LSHIFT 'B' << 6 + #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p') +diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y +index 2e92cd0..273dadb 100644 +--- a/Source/CParse/parser.y ++++ b/Source/CParse/parser.y +@@ -194,7 +194,7 @@ int SWIG_cparse_template_reduce(int treduce) { + * ----------------------------------------------------------------------------- */ + + static int promote_type(int t) { +- if (t <= T_UCHAR || t == T_CHAR) return T_INT; ++ if (t <= T_UCHAR || t == T_CHAR || t == T_WCHAR) return T_INT; + return t; + } + +-- +2.9.5 + From 0261319dda85376b6132081585ac4157df93339e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 21 May 2025 23:01:10 -0400 Subject: [PATCH 139/313] backports/electron: upgrade to 35.4.0 --- backports/electron/APKBUILD | 6 +++--- .../electron/electron_unbundle-node.patch | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 424b602..21ed96e 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=35.3.0 +pkgver=35.4.0 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 _chromium=134.0.6998.205 @@ -545,7 +545,7 @@ lang() { } sha512sums=" -7dd33e03f30b753a52a8801bd8aaffbd4229280df0c6754e2fadbf6d22e7f89f9bb1db0b30de0c403e9f61a09b1989e9b810d2cb7e8a301724132c20540618ef electron-v35.3.0-134.0.6998.205.tar.zst +30a116328f9a5af05b16cf85e31672407c51aef895b29441220f439d66af947272daa8e2ac88d9e4b8f7a9e0bb883932c36d2f1642fd18c5da885931c1c97fe0 electron-v35.4.0-134.0.6998.205.tar.zst c1857b5d6975650f915f3db552666f521822b857e39958ccfb54129f3878f272deaafc3dd446bc8441a5e84f075791feeeb62841b74bb555d8c546bfe231d164 copium-134.0.tar.gz 29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch d9cc4a37a0311d23ae315a8d8124f8dbf60db8cc4a3943818638174b20387f1d770d00871f6608957b246ad956abca43c22ea0b072724287f2947e1909e47323 compiler.patch @@ -569,7 +569,7 @@ e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274 465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch 2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch -1ab45199c5eb896f57407876e9ca435af3ed63a65136f97526f6a07c3a2db223e646ea365630b0eda441ea88dbb0c07ab00b77de25edce07453f038c5339203d electron_unbundle-node.patch +c7f57929943a86f9e5f333da9d5691da88038770eeb46dd0a0719962c934deb2879f0e7a1ed714e9383e38ee4d68eb754501f362c4d7cdee76cfc2e980b21272 electron_unbundle-node.patch 4d9287d4cdfe27fbfb7be3d4b26c0c40edbd6a0c3ff926d60f2093ca09c15bcb58e20c2ccc8c0606aafd66c6d25a54225bc329cb056d8c5b297db4c6d0e768e6 electron_system-zlib-headers.patch e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e default.conf 191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463 electron.desktop diff --git a/backports/electron/electron_unbundle-node.patch b/backports/electron/electron_unbundle-node.patch index 8392a85..d518d7e 100644 --- a/backports/electron/electron_unbundle-node.patch +++ b/backports/electron/electron_unbundle-node.patch @@ -120,3 +120,24 @@ index d61a9bd..8bf990e 100644 } } } +diff --git a/third_party/electron_node/unofficial.gni.orig b/third_party/electron_node/unofficial.gni +index 6bcc40b..7e383b2 100644 +--- a/third_party/electron_node/unofficial.gni.orig ++++ b/third_party/electron_node/unofficial.gni +@@ -142,7 +142,6 @@ template("node_gn_build") { + public_configs = [ + ":node_external_config", + "deps/googletest:googletest_config", +- ":zstd_include_config" + ] + public_deps = [ + "deps/ada", +@@ -163,8 +162,6 @@ template("node_gn_build") { + "//third_party/zlib", + "//third_party/brotli:dec", + "//third_party/brotli:enc", +- "//third_party/zstd:decompress", +- "//third_party/zstd:headers", + "$node_simdutf_path", + "$node_v8_path:v8_libplatform", + ] From b4c27f6e3e6f81013e41c272de9cff486d61c95c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:13:10 -0400 Subject: [PATCH 140/313] backports/dex: drop due to in community --- backports/dex/APKBUILD | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 backports/dex/APKBUILD diff --git a/backports/dex/APKBUILD b/backports/dex/APKBUILD deleted file mode 100644 index 2b9e1e0..0000000 --- a/backports/dex/APKBUILD +++ /dev/null @@ -1,26 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Anjandev Momi -pkgname=dex -pkgver=0.10.1 -pkgrel=0 -pkgdesc="program to generate and execute DesktopEntry files of the Application type" -url="https://github.com/jceb/dex" -arch="all" -license="GPL-3.0-or-later" -depends="python3" -makedepends="py3-sphinx" -subpackages="$pkgname-doc" -source="$pkgname-$pkgver.tar.gz::https://github.com/jceb/dex/archive/refs/tags/v$pkgver.tar.gz" -options="!check" # no testsuite - -build() { - make -} - -package() { - make install PREFIX=/usr MANPREFIX=/usr/share/man DESTDIR="$pkgdir" -} - -sha512sums=" -4832e60416f07b90d4f4d03d6493322ccd44a73270edf289d80136587859d137cf39db12fc5cf38d3bdfa46aae3a4d1353c7776e702240b560a287190bdc2b57 dex-0.10.1.tar.gz -" From 1f49286ca28c1f57d9f83c12b73cc6e0c52dfe8f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:14:06 -0400 Subject: [PATCH 141/313] backports/gn: drop due to needed version --- backports/gn/APKBUILD | 59 ------------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 backports/gn/APKBUILD diff --git a/backports/gn/APKBUILD b/backports/gn/APKBUILD deleted file mode 100644 index b5ec871..0000000 --- a/backports/gn/APKBUILD +++ /dev/null @@ -1,59 +0,0 @@ -# Contributor: TBK -maintainer="lauren n. liberda " -pkgname=gn -pkgver=0_git20250311 -pkgrel=0 -_commit=18602f6cf1168cf78302024043edc02e8bad2ffb -pkgdesc="Meta-build system that generates build files for Ninja" -arch="all" -url="https://gn.googlesource.com/gn" -license="BSD-3-Clause" -depends="samurai" -makedepends="python3 zstd" -# gitiles has no clones -source="https://ab-sn.lnl.gay/gn-$_commit.tar.zst - " -builddir="$srcdir/gn" - -_distbucket="sakamoto/lnl-aports-snapshots/" -snapshot() { - clean - deps - mkdir -p "$srcdir" && cd "$srcdir" - git clone https://gn.googlesource.com/gn - ( - cd gn - git checkout -q $_commit - python3 ./build/gen.py - ) - rm -rf gn/.git - tar cf gn-$_commit.tar gn - zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv gn-$_commit.tar \ - -o "$SRCDEST"/gn-$_commit.tar.zst - mcli cp "$SRCDEST"/gn-$_commit.tar.zst "$_distbucket" -} - -build() { - unset CFLAGS # all sources C++ but passes both - # Breaks build since upstream passes -Wno-format, - # annotated: "Use of %llx, which is supported by _UCRT, false positive" - CXXFLAGS="${CXXFLAGS/-Werror=format-security} -flto=auto" \ - python3 ./build/gen.py \ - --no-last-commit-position \ - --no-static-libstdc++ \ - --no-strip \ - --allow-warnings - ninja -C out -} - -check() { - ./out/gn_unittests -} - -package() { - install -Dm755 out/gn "$pkgdir"/usr/bin/gn -} - -sha512sums=" -9638e177bfd6eecc6af1a9323efa93dc65d1d1f3599037851d19ba076f3b0c9e91366c143e6b6e334fc63baa0bdad80415dbad4ec96585850b462e2904c836d6 gn-18602f6cf1168cf78302024043edc02e8bad2ffb.tar.zst -" From c319f2b6cae692e6b6a534b8c2b97aea21670099 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:15:00 -0400 Subject: [PATCH 142/313] backports/openssl1.1-compat: drop due to not necessary --- backports/openssl1.1-compat/APKBUILD | 168 ------------------ backports/openssl1.1-compat/man-section.patch | 54 ------ backports/openssl1.1-compat/ppc64.patch | 96 ---------- 3 files changed, 318 deletions(-) delete mode 100644 backports/openssl1.1-compat/APKBUILD delete mode 100644 backports/openssl1.1-compat/man-section.patch delete mode 100644 backports/openssl1.1-compat/ppc64.patch diff --git a/backports/openssl1.1-compat/APKBUILD b/backports/openssl1.1-compat/APKBUILD deleted file mode 100644 index fb31eaa..0000000 --- a/backports/openssl1.1-compat/APKBUILD +++ /dev/null @@ -1,168 +0,0 @@ -# Contributor: Ariadne Conill -# Maintainer: Timo Teras -pkgname=openssl1.1-compat -pkgver=1.1.1w -_abiver=${pkgver%.*} -pkgrel=1 -pkgdesc="toolkit for transport layer security (TLS) - version 1.1" -url="https://www.openssl.org/" -arch="all" -license="OpenSSL" -replaces="libressl" -depends_dev="!openssl-dev" -makedepends_build="perl" -makedepends_host="linux-headers" -makedepends="$makedepends_host $makedepends_build" -subpackages="$pkgname-dbg $pkgname-libs-static:_static $pkgname-dev - libcrypto$_abiver:_libcrypto libssl$_abiver:_libssl" -source="https://www.openssl.org/source/openssl-$pkgver.tar.gz - man-section.patch - ppc64.patch - " -builddir="$srcdir/openssl-$pkgver" -pcprefix="openssl$_abiver:pc:" - -# secfixes: -# 1.1.1u-r1: -# - CVE-2023-3446 -# 1.1.1t-r2: -# - CVE-2023-0465 -# 1.1.1t-r1: -# - CVE-2023-0464 -# 1.1.1t-r0: -# - CVE-2022-4304 -# - CVE-2022-4450 -# - CVE-2023-0215 -# - CVE-2023-0286 -# 1.1.1q-r0: -# - CVE-2022-2097 -# 1.1.1n-r0: -# - CVE-2022-0778 -# 1.1.1l-r0: -# - CVE-2021-3711 -# - CVE-2021-3712 -# 1.1.1k-r0: -# - CVE-2021-3449 -# - CVE-2021-3450 -# 1.1.1j-r0: -# - CVE-2021-23841 -# - CVE-2021-23840 -# - CVE-2021-23839 -# 1.1.1i-r0: -# - CVE-2020-1971 -# 1.1.1g-r0: -# - CVE-2020-1967 -# 1.1.1d-r3: -# - CVE-2019-1551 -# 1.1.1d-r1: -# - CVE-2019-1547 -# - CVE-2019-1549 -# - CVE-2019-1563 -# 1.1.1b-r1: -# - CVE-2019-1543 -# 1.1.1a-r0: -# - CVE-2018-0734 -# - CVE-2018-0735 -# 0: -# - CVE-2022-1292 -# - CVE-2022-2068 - -build() { - local _target _optflags - - # openssl will prepend crosscompile always core CC et al - CC=${CC#${CROSS_COMPILE}} - CXX=${CXX#${CROSS_COMPILE}} - CPP=${CPP#${CROSS_COMPILE}} - - # determine target OS for openssl - case "$CARCH" in - aarch64*) _target="linux-aarch64" ;; - arm*) _target="linux-armv4" ;; - ppc) _target="linux-ppc" ;; - ppc64) _target="linux-ppc64" ;; - ppc64le) _target="linux-ppc64le" ;; - x86) _target="linux-elf" ;; - x86_64) _target="linux-x86_64"; _optflags="enable-ec_nistp_64_gcc_128" ;; - s390x) _target="linux64-s390x";; - riscv64) _target="linux-generic64";; - loongarch64) _target="linux-generic64";; - *) msg "Unable to determine architecture from (CARCH=$CARCH)" ; return 1 ;; - esac - - # Configure assumes --options are for it, so can't use - # gcc's --sysroot fake this by overriding CC - [ -n "$CBUILDROOT" ] && CC="$CC --sysroot=$CBUILDROOT" - - # when cross building do not enable threads as libatomic is not avaiable - if [ "$CBUILD" != "$CHOST" ]; then - case $CARCH in - riscv64) _optflags="$_optflags no-threads";; - esac - fi - - perl ./Configure \ - $_target \ - --prefix=/usr \ - --libdir=/usr/lib \ - --openssldir=/etc/ssl1.1 \ - shared \ - no-zlib \ - no-async \ - no-comp \ - no-idea \ - no-mdc2 \ - no-rc5 \ - no-ec2m \ - no-sm2 \ - no-sm4 \ - no-ssl2 \ - no-ssl3 \ - no-seed \ - no-weak-ssl-ciphers \ - $_optflags \ - $CPPFLAGS \ - $CFLAGS \ - $LDFLAGS -Wa,--noexecstack - make -} - -check() { - # AFALG tests have a sporadic test failure, just delete the broken - # test for now. - rm -f test/recipes/30-test_afalg.t - - make test -} - -package() { - make DESTDIR="$pkgdir" install_sw install_ssldirs - # remove the script c_rehash - rm "$pkgdir"/usr/bin/c_rehash - mv -f "$pkgdir"/usr/bin/openssl "$pkgdir"/usr/bin/openssl$_abiver -} - -_libcrypto() { - pkgdesc="Crypto library from openssl" - replaces="libressl2.7-libcrypto" - - amove etc - amove usr/lib/libcrypto* - amove usr/lib/engines-$_abiver -} - -_libssl() { - pkgdesc="SSL shared libraries" - - amove usr/lib/libssl* -} - -_static() { - default_static -} - -sha512sums=" -b4c625fe56a4e690b57b6a011a225ad0cb3af54bd8fb67af77b5eceac55cc7191291d96a660c5b568a08a2fbf62b4612818e7cca1bb95b2b6b4fc649b0552b6d openssl-1.1.1w.tar.gz -43c3255118db6f5f340dc865c0f25ccbcafe5bf7507585244ca59b4d27daf533d6c3171aa32a8685cbb6200104bec535894b633de13feaadff87ab86739a445a man-section.patch -e040f23770d52b988578f7ff84d77563340f37c026db7643db8e4ef18e795e27d10cb42cb8656da4d9c57a28283a2828729d70f940edc950c3422a54fea55509 ppc64.patch -" diff --git a/backports/openssl1.1-compat/man-section.patch b/backports/openssl1.1-compat/man-section.patch deleted file mode 100644 index 0606897..0000000 --- a/backports/openssl1.1-compat/man-section.patch +++ /dev/null @@ -1,54 +0,0 @@ -From: Debian OpenSSL Team -Date: Sun, 5 Nov 2017 15:09:09 +0100 -Subject: man-section - ---- - Configurations/unix-Makefile.tmpl | 6 ++++-- - util/process_docs.pl | 3 ++- - 2 files changed, 6 insertions(+), 3 deletions(-) - -diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl -index 1292053546f5..c034d21884d8 100644 ---- a/Configurations/unix-Makefile.tmpl -+++ b/Configurations/unix-Makefile.tmpl -@@ -183,7 +183,8 @@ HTMLDIR=$(DOCDIR)/html - # MANSUFFIX is for the benefit of anyone who may want to have a suffix - # appended after the manpage file section number. "ssl" is popular, - # resulting in files such as config.5ssl rather than config.5. --MANSUFFIX= -+MANSUFFIX=ssl -+MANSECTION=SSL - HTMLSUFFIX=html - - # For "optional" echo messages, to get "real" silence -@@ -726,7 +727,8 @@ uninstall_runtime: uninstall_programs uninstall_runtime_libs - @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1) - @$(ECHO) "*** Installing manpages" - $(PERL) $(SRCDIR)/util/process_docs.pl \ -- "--destdir=$(DESTDIR)$(MANDIR)" --type=man --suffix=$(MANSUFFIX) -+ "--destdir=$(DESTDIR)$(MANDIR)" --type=man --suffix=$(MANSUFFIX) \ -+ --mansection=$(MANSECTION) - - uninstall_man_docs: - @$(ECHO) "*** Uninstalling manpages" -diff --git a/util/process_docs.pl b/util/process_docs.pl -index 30b149eb8fcc..424155ea808e 100755 ---- a/util/process_docs.pl -+++ b/util/process_docs.pl -@@ -37,6 +37,7 @@ GetOptions(\%options, - 'type=s', # The result type, 'man' or 'html' - 'suffix:s', # Suffix to add to the extension. - # Only used with type=man -+ 'mansection:s', # Section to put to manpage in - 'remove', # To remove files rather than writing them - 'dry-run|n', # Only output file names on STDOUT - 'debug|D+', -@@ -97,7 +98,7 @@ foreach my $section (sort @{$options{section}}) { - my $name = uc $podname; - my $suffix = { man => ".$podinfo{section}".($options{suffix} // ""), - html => ".html" } -> {$options{type}}; -- my $generate = { man => "pod2man --name=$name --section=$podinfo{section} --center=OpenSSL --release=$config{version} \"$podpath\"", -+ my $generate = { man => "pod2man --name=$name --section=$podinfo{section}$options{mansection} --center=OpenSSL --release=$config{version} \"$podpath\"", - html => "pod2html \"--podroot=$options{sourcedir}\" --htmldir=$updir --podpath=man1:man3:man5:man7 \"--infile=$podpath\" \"--title=$podname\" --quiet" - } -> {$options{type}}; - my $output_dir = catdir($options{destdir}, "man$podinfo{section}"); diff --git a/backports/openssl1.1-compat/ppc64.patch b/backports/openssl1.1-compat/ppc64.patch deleted file mode 100644 index c75ceed..0000000 --- a/backports/openssl1.1-compat/ppc64.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 34ab13b7d8e3e723adb60be8142e38b7c9cd382a Mon Sep 17 00:00:00 2001 -From: Andy Polyakov -Date: Sun, 5 May 2019 18:25:50 +0200 -Subject: [PATCH] crypto/perlasm/ppc-xlate.pl: add linux64v2 flavour -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This is a big endian ELFv2 configuration. ELFv2 was already being -used for little endian, and big endian was traditionally ELFv1 -but there are practical configurations that use ELFv2 with big -endian nowadays (Adélie Linux, Void Linux, possibly Gentoo, etc.) - -Reviewed-by: Paul Dale -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/8883) ---- - crypto/perlasm/ppc-xlate.pl | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/crypto/perlasm/ppc-xlate.pl b/crypto/perlasm/ppc-xlate.pl -index e52f2f6ea62..5fcd0526dff 100755 ---- a/crypto/perlasm/ppc-xlate.pl -+++ b/crypto/perlasm/ppc-xlate.pl -@@ -49,7 +49,7 @@ - /osx/ && do { $name = "_$name"; - last; - }; -- /linux.*(32|64le)/ -+ /linux.*(32|64(le|v2))/ - && do { $ret .= ".globl $name"; - if (!$$type) { - $ret .= "\n.type $name,\@function"; -@@ -80,7 +80,7 @@ - }; - my $text = sub { - my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text"; -- $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64le/); -+ $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64(le|v2)/); - $ret; - }; - my $machine = sub { -@@ -186,7 +186,7 @@ - - # Some ABIs specify vrsave, special-purpose register #256, as reserved - # for system use. --my $no_vrsave = ($flavour =~ /aix|linux64le/); -+my $no_vrsave = ($flavour =~ /aix|linux64(le|v2)/); - my $mtspr = sub { - my ($f,$idx,$ra) = @_; - if ($idx == 256 && $no_vrsave) { -@@ -318,7 +318,7 @@ sub vfour { - if ($label) { - my $xlated = ($GLOBALS{$label} or $label); - print "$xlated:"; -- if ($flavour =~ /linux.*64le/) { -+ if ($flavour =~ /linux.*64(le|v2)/) { - if ($TYPES{$label} =~ /function/) { - printf "\n.localentry %s,0\n",$xlated; - } - -From 098404128383ded87ba390dd74ecd9e2ffa6f530 Mon Sep 17 00:00:00 2001 -From: Andy Polyakov -Date: Sun, 5 May 2019 18:30:55 +0200 -Subject: [PATCH] Configure: use ELFv2 ABI on some ppc64 big endian systems - -If _CALL_ELF is defined to be 2, it's an ELFv2 system. -Conditionally switch to the v2 perlasm scheme. - -Reviewed-by: Paul Dale -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/8883) ---- - Configure | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/Configure b/Configure -index 22082deb4c7..e303d98deb3 100755 ---- a/Configure -+++ b/Configure -@@ -1402,8 +1402,15 @@ - my %predefined_C = compiler_predefined($config{CROSS_COMPILE}.$config{CC}); - my %predefined_CXX = $config{CXX} - ? compiler_predefined($config{CROSS_COMPILE}.$config{CXX}) - : (); - -+unless ($disabled{asm}) { -+ # big endian systems can use ELFv2 ABI -+ if ($target eq "linux-ppc64") { -+ $target{perlasm_scheme} = "linux64v2" if ($predefined_C{_CALL_ELF} == 2); -+ } -+} -+ - # Check for makedepend capabilities. - if (!$disabled{makedepend}) { - if ($config{target} =~ /^(VC|vms)-/) { From 16e489995a936e152c14e9f10bbba539cbc5d406 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:15:11 -0400 Subject: [PATCH 143/313] backports/pnpm: drop due to not necessary --- .../pnpm/0001-no-check-for-updates.patch | 14 ---- backports/pnpm/0002-no-self-update.patch | 14 ---- backports/pnpm/APKBUILD | 73 ------------------- 3 files changed, 101 deletions(-) delete mode 100644 backports/pnpm/0001-no-check-for-updates.patch delete mode 100644 backports/pnpm/0002-no-self-update.patch delete mode 100644 backports/pnpm/APKBUILD diff --git a/backports/pnpm/0001-no-check-for-updates.patch b/backports/pnpm/0001-no-check-for-updates.patch deleted file mode 100644 index 2d74688..0000000 --- a/backports/pnpm/0001-no-check-for-updates.patch +++ /dev/null @@ -1,14 +0,0 @@ -Disable available update messages as it outputs invalid upgrade process - -diff --git a/dist/pnpm.cjs b/dist/pnpm.cjs -index b93ea78..6daefd6 100644 ---- a/dist/pnpm.cjs -+++ b/dist/pnpm.cjs -@@ -114026,6 +114026,7 @@ var require_checkForUpdates = __commonJS({ - var write_json_file_1 = __importDefault2(require_write_json_file()); - var UPDATE_CHECK_FREQUENCY = 24 * 60 * 60 * 1e3; - async function checkForUpdates(config) { -+ return; - const stateFile = path_1.default.join(config.stateDir, "pnpm-state.json"); - let state; - try { diff --git a/backports/pnpm/0002-no-self-update.patch b/backports/pnpm/0002-no-self-update.patch deleted file mode 100644 index b016ecc..0000000 --- a/backports/pnpm/0002-no-self-update.patch +++ /dev/null @@ -1,14 +0,0 @@ -Disable command "pnpm self-update" as we install via apk - -diff --git a/dist/pnpm.cjs b/dist/pnpm.cjs -index b93ea78..8da50c3 100644 ---- a/dist/pnpm.cjs -+++ b/dist/pnpm.cjs -@@ -220258,6 +220258,7 @@ var require_selfUpdate = __commonJS({ - }); - } - async function handler(opts, params) { -+ throw new error_1.PnpmError("CANT_SELF_UPDATE_IN_APK", "You should update pnpm with apk"); - if ((0, cli_meta_1.isExecutedByCorepack)()) { - throw new error_1.PnpmError("CANT_SELF_UPDATE_IN_COREPACK", "You should update pnpm with corepack"); - } diff --git a/backports/pnpm/APKBUILD b/backports/pnpm/APKBUILD deleted file mode 100644 index 8772842..0000000 --- a/backports/pnpm/APKBUILD +++ /dev/null @@ -1,73 +0,0 @@ -# Contributor: Hygna -# Contributor: Fabricio Silva -maintainer="Fabricio Silva " -pkgname=pnpm -pkgver=10.9.0 -pkgrel=0 -pkgdesc="Fast, disk space efficient package manager" -url="https://pnpm.io" -arch="noarch" -license="MIT" -depends="nodejs" -subpackages=" - $pkgname-doc - $pkgname-bash-completion - $pkgname-zsh-completion - $pkgname-fish-completion - " -source="https://registry.npmjs.org/pnpm/-/pnpm-$pkgver.tgz - 0001-no-check-for-updates.patch - 0002-no-self-update.patch - " -builddir="$srcdir/package" - -prepare() { - default_prepare - - # remove node-gyp - rm -rf dist/node-gyp-bin dist/node_modules/node-gyp - # remove windows files - rm -rf dist/vendor/*.exe - - # remove other unnecessary files - find . -type f \( \ - -name '.*' -o \ - -name '*.cmd' -o \ - -name '*.bat' -o \ - -name '*.map' -o \ - -name '*.md' -o \ - -name '*.darwin*' -o \ - -name '*.win*' -o \ - -iname 'README*' \) -delete -} - -check() { - ./bin/pnpm.cjs --help -} - -package() { - local destdir="$pkgdir"/usr/share/node_modules/$pkgname - - install -Dm644 LICENSE -t "$pkgdir"/usr/share/licenses/$pkgname - - install -Dm644 dist/templates/completion.bash \ - "$pkgdir"/usr/share/bash-completion/completions/$pkgname - install -Dm644 dist/templates/completion.zsh \ - "$pkgdir"/usr/share/zsh/site-functions/_$pkgname - install -Dm644 dist/templates/completion.fish \ - "$pkgdir"/usr/share/fish/vendor_completions.d/$pkgname.fish - - install -Dm644 package.json -t "$destdir" - install -Dm755 bin/pnpm.cjs bin/pnpx.cjs -t "$destdir"/bin - cp -r dist "$destdir"/dist - - mkdir -p "$pkgdir"/usr/bin - ln -sf ../share/node_modules/pnpm/bin/pnpm.cjs "$pkgdir"/usr/bin/pnpm - ln -sf ../share/node_modules/pnpm/bin/pnpx.cjs "$pkgdir"/usr/bin/pnpx -} - -sha512sums=" -0486e394640d3c1fb3c9d43d49cf92879ff74f8516959c235308f5a8f62e2e19528a65cdc2a3058f587cde71eba3d5b56327c8c33a97e4c4051ca48a10ca2d5f pnpm-10.9.0.tgz -f53903c506a676393dd8b31e1194b92612bfa877a8e17edc530e308921caf454248e181a3e620a17a941eba126349128963b2b0b1e48f8d927307c9cf335290e 0001-no-check-for-updates.patch -5582d11fcd1782f40a4f9269b477af25057e3a3d60cddef8b64a8592fafdc7a572822c8267a7abf9e8bfa4b726dcb291885642070a838e360fc542cee10c9569 0002-no-self-update.patch -" From ef52fcc239cdc907174a6aa8776bded39b10cada Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:15:40 -0400 Subject: [PATCH 144/313] backports/py3-colored: drop due to in community --- backports/py3-colored/APKBUILD | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 backports/py3-colored/APKBUILD diff --git a/backports/py3-colored/APKBUILD b/backports/py3-colored/APKBUILD deleted file mode 100644 index f2efb49..0000000 --- a/backports/py3-colored/APKBUILD +++ /dev/null @@ -1,31 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -pkgname=py3-colored -_pyname=${pkgname/py3-/} -pkgver=2.2.4 -pkgrel=0 -pkgdesc="Simple Python library for color and formatting in terminal" -url="https://gitlab.com/dslackw/colored" -arch="noarch" -license="MIT" -depends="python3" -makedepends="py3-setuptools py3-gpep517 py3-flit" -checkdepends="py3-pytest" -subpackages="$pkgname-pyc" -source="https://gitlab.com/dslackw/colored/-/archive/$pkgver/colored-$pkgver.tar.gz" -builddir="$srcdir/$_pyname-$pkgver" -options="!check" # No testsuite - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -8fd293c95c2cfa6c3c31a91f946414e5c2581ea12a60e38ad1e6a5e44a85589a81c5e8205c4c518ed0d809840bf1b37b0cb5af4cf48c0706aa52017bf9c04489 colored-2.2.4.tar.gz -" From 90bda986c797e8db2e9d0849d3cc6517872d858c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:16:03 -0400 Subject: [PATCH 145/313] backports/py3-fuzzywuzzy: drop due to in community --- backports/py3-fuzzywuzzy/APKBUILD | 37 ------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 backports/py3-fuzzywuzzy/APKBUILD diff --git a/backports/py3-fuzzywuzzy/APKBUILD b/backports/py3-fuzzywuzzy/APKBUILD deleted file mode 100644 index c659b1b..0000000 --- a/backports/py3-fuzzywuzzy/APKBUILD +++ /dev/null @@ -1,37 +0,0 @@ -# Contributor: Galen Abell -# Maintainer: Galen Abell -pkgname=py3-fuzzywuzzy -_pyname=fuzzywuzzy -pkgver=0.18.0 -pkgrel=7 -pkgdesc="Fuzzy string matching in python" -url="https://github.com/seatgeek/fuzzywuzzy" -arch="noarch" -license="GPL-2.0-only" -depends="python3 py3-levenshtein" -makedepends="py3-setuptools py3-gpep517" -checkdepends="py3-pytest py3-pycodestyle py3-hypothesis" -subpackages="$pkgname-pyc" -source="https://files.pythonhosted.org/packages/source/${_pyname%${_pyname#?}}/$_pyname/$_pyname-$pkgver.tar.gz" -builddir="$srcdir/$_pyname-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -4a21ea67278fa525842d48fed8db666d00eae6d13254e8844d11f63b47c3a305b3cac760f28c24c6347aebcf73e96180e0a7cfba29c75f01ece2f7751e0398c5 fuzzywuzzy-0.18.0.tar.gz -" From 2162431bb5ec65172049e111c1203bd77eba6e23 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:16:20 -0400 Subject: [PATCH 146/313] backports/py3-levenshtein: drop due to in community --- backports/py3-levenshtein/APKBUILD | 46 ------------------------------ 1 file changed, 46 deletions(-) delete mode 100644 backports/py3-levenshtein/APKBUILD diff --git a/backports/py3-levenshtein/APKBUILD b/backports/py3-levenshtein/APKBUILD deleted file mode 100644 index d6a7572..0000000 --- a/backports/py3-levenshtein/APKBUILD +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor: Galen Abell -# Maintainer: Galen Abell -pkgname=py3-levenshtein -pkgver=0.26.1 -pkgrel=0 -pkgdesc="Python extension for computing string edit distances and similarities" -url="https://github.com/maxbachmann/Levenshtein" -arch="all" -license="GPL-2.0-only" -depends="py3-rapidfuzz" -makedepends=" - cmake - cython - py3-gpep517 - py3-scikit-build - py3-scikit-build-core - python3-dev - rapidfuzz - samurai - " -checkdepends="py3-pytest" -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/maxbachmann/Levenshtein/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/Levenshtein-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer \ - .dist/levenshtein*.whl - .testenv/bin/python3 -m pytest -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/levenshtein*.whl -} - -sha512sums=" -589b1f404108f488caf880063f20ee9c6a2033b0a2cd819352bf15e285ea8537c1dc8117de70679f720fd3da47546f7e0e5c620e4da8cf09bf8df9b119e6abc9 py3-levenshtein-0.26.1.tar.gz -" From 10c0f61045dc57d0eaa701da99e5bbf6ebb194e5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:16:37 -0400 Subject: [PATCH 147/313] backports/rapidfuzz: drop due to in community --- backports/rapidfuzz/APKBUILD | 45 ------------------------------- backports/rapidfuzz/cstdint.patch | 12 --------- 2 files changed, 57 deletions(-) delete mode 100644 backports/rapidfuzz/APKBUILD delete mode 100644 backports/rapidfuzz/cstdint.patch diff --git a/backports/rapidfuzz/APKBUILD b/backports/rapidfuzz/APKBUILD deleted file mode 100644 index aa0eefd..0000000 --- a/backports/rapidfuzz/APKBUILD +++ /dev/null @@ -1,45 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -pkgname=rapidfuzz -pkgver=3.2.0 -pkgrel=0 -pkgdesc="Rapid fuzzy string matching in C++ using the Levenshtein Distance" -url="https://github.com/maxbachmann/rapidfuzz-cpp" -arch="all" -license="MIT" -makedepends=" - cmake - samurai - " -checkdepends="catch2-3" -source="$pkgname-cpp-$pkgver.tar.gz::https://github.com/maxbachmann/rapidfuzz-cpp/archive/refs/tags/v$pkgver.tar.gz - cstdint.patch - " -builddir="$srcdir/rapidfuzz-cpp-$pkgver" - -case "$CARCH" in -x86) - # float rounding - options="!check" - ;; -esac - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DRAPIDFUZZ_BUILD_TESTING="$(want_check && echo ON || echo OFF)" - cmake --build build -} - -check() { - ctest --test-dir build --output-on-failure -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -cf306fc4a6c0b6fc1a1c3b0b235aa54588bd87a5d07f96c1bc9711a08159ca71580b5958e66e8b4358d34e522041934903079aabe6e5a450cece7d6db6edcbe0 rapidfuzz-cpp-3.2.0.tar.gz -216c5082498830d42d2eb14d3eba35dd08446008916c920db7b55eaf3dd2358f86a61c238315b85fefecf08b9e902dc4db172f91a8479cfd735e53c7b3e03bf5 cstdint.patch -" diff --git a/backports/rapidfuzz/cstdint.patch b/backports/rapidfuzz/cstdint.patch deleted file mode 100644 index cce9033..0000000 --- a/backports/rapidfuzz/cstdint.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/rapidfuzz_reference/JaroWinkler.hpp b/rapidfuzz_reference/JaroWinkler.hpp -index 3b717d8..9d415e4 100644 ---- a/rapidfuzz_reference/JaroWinkler.hpp -+++ b/rapidfuzz_reference/JaroWinkler.hpp -@@ -2,6 +2,7 @@ - /* Copyright © 2022-present Max Bachmann */ - - #pragma once -+#include - #include "Jaro.hpp" - - namespace rapidfuzz_reference { From dc8a32f4b9cef26cb9ed3218637e581574878819 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:17:26 -0400 Subject: [PATCH 148/313] backports/calibre: upgrade to 8.4.0 --- backports/calibre/APKBUILD | 8 +++++--- backports/calibre/musl-pread.patch | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 backports/calibre/musl-pread.patch diff --git a/backports/calibre/APKBUILD b/backports/calibre/APKBUILD index 3cf2747..5771907 100644 --- a/backports/calibre/APKBUILD +++ b/backports/calibre/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Cowington Post pkgname=calibre -pkgver=7.26.0 +pkgver=8.4.0 pkgrel=0 pkgdesc="Ebook management application" # qt6-webengine @@ -41,7 +41,7 @@ depends=" qt6-qtimageformats qt6-qtsvg qt6-qtwebengine - qt6-qtbase-dev + qt6-qtbase-private-dev udisks2 " makedepends=" @@ -70,6 +70,7 @@ subpackages=" " source="https://download.calibre-ebook.com/$pkgver/calibre-$pkgver.tar.xz 0001-$pkgname-no-update.patch + musl-pread.patch " # net: downloads iso-codes # !check: no tests ran @@ -112,6 +113,7 @@ package() { } sha512sums=" -e477a2dcdd1c52074bd5c0df5d79b2b609d76bf9e1cb5e3d32f79a89d6e0e2798cb980e2cf74e126fb2856273a14b0e2e92b39ffca74461569233c0a87968bfe calibre-7.26.0.tar.xz +df998fa31b9e581739872a649669fccf29f34d3ac1b4d0a96c37e08a0b049b1357b56a2af25f2733936e78901dd61b38a24e536e107e7094ada7e60a5c2c56ab calibre-8.4.0.tar.xz eb8e7ce40ff8b8daf6e7e55a5dff8ec4dff06c45744266bb48b3194e92ab1196bc91468203e3c2ca1e5144166a7d6be90e6cf0253513e761b56a4c85be4c2c76 0001-calibre-no-update.patch +d27d29c434a3d2df1b18125225a4d3762bf6fdba77385b377b18a7f325f29ae0b698974a39263f4f7aed8a368c87d0dc4446f488505b8e38664f8e9ee5b9bd12 musl-pread.patch " diff --git a/backports/calibre/musl-pread.patch b/backports/calibre/musl-pread.patch new file mode 100644 index 0000000..241ce63 --- /dev/null +++ b/backports/calibre/musl-pread.patch @@ -0,0 +1,11 @@ +--- a/src/calibre/utils/speedup.c ++++ b/src/calibre/utils/speedup.c +@@ -748,7 +748,7 @@ + break; + } + #else +-#ifdef __linux__ ++#ifdef __GLIBC__ + ssize_t nr = pread64(fd, buf + pos, n - pos, offset); + #else + ssize_t nr = pread(fd, buf + pos, n - pos, offset); From 366cbca424cab4bc5cb7066d12b08409809bb050 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:17:54 -0400 Subject: [PATCH 149/313] backports/electron: fix build on edge --- backports/electron/APKBUILD | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 21ed96e..6721e7c 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -12,7 +12,7 @@ url="https://github.com/electron/electron" arch="aarch64 x86_64" # same as chromium license="MIT" depends="gtk+3.0 so:libudev.so.1 xdg-utils" -_llvmver=19 +_llvmver=20 makedepends=" ada-dev alsa-lib-dev @@ -135,6 +135,8 @@ source=" partalloc-no-tagging-arm64.patch pvalloc.patch temp-failure-retry.patch + pipewire-1.4.patch + gperf-3.2-fix.patch electron_icon.patch electron_python-jinja-3.10.patch @@ -429,14 +431,10 @@ _configure() { local symbol_level=0 local vaapi=true - # added_rust_stdlib_libs and removed_rust_stdlib_libs workaround change in Rust 1.86, - # feel free to remove after upgrading rust - # shellcheck disable=2089 local gn_config=" import(\"//electron/build/args/release.gn\") - added_rust_stdlib_libs=[\"adler\"] blink_enable_generated_code_formatting=false cc_wrapper=\"$cc_wrapper\" chrome_pgo_phase=0 @@ -463,7 +461,6 @@ _configure() { is_official_build=true link_pulseaudio=true proprietary_codecs=true - removed_rust_stdlib_libs=[\"adler2\"] rtc_link_pipewire=true rtc_use_pipewire=true rustc_version=\"yes\" @@ -566,6 +563,8 @@ e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9 f2b08538ff57c50b3772a07ca91845f9d45f4a5112f608b6192d4fb5d7be48f478c0c36194d95ab7bbf933e0278e5c6d578619d8643895cdc40386eebc5b975f partalloc-no-tagging-arm64.patch 03f829a2da633533ef3fd0f287f5ec602d936a97a98b53cd2415553c2537ae9d571f35397ca7c9fb3f4b0806c300e3b189569f8d979ca132e1a2a4dae7206396 pvalloc.patch e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb temp-failure-retry.patch +1814096bc611e7f56cc5c570214dae715a4cda1fba96a6b585a73a1abc8b9161efaa799dc83887dac531dbafe9479bbe235cabe1a61cb3081e268c53a6144908 pipewire-1.4.patch +4bc087a1e5acbb0f8f884756b40c127df88699ecd6eb42c4aff6691b87239bb6915dd102e9ef2544502a12bff011859ad497206940473e6b0a0fd75afb562a4c gperf-3.2-fix.patch 465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch 2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch From 5901ea37ae3a9a73c0f816540a809ea1d14b8ac9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:18:11 -0400 Subject: [PATCH 150/313] backports/freecad: upgrade to 1.0.1 --- backports/freecad/APKBUILD | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backports/freecad/APKBUILD b/backports/freecad/APKBUILD index 8967ba7..7b99447 100644 --- a/backports/freecad/APKBUILD +++ b/backports/freecad/APKBUILD @@ -1,9 +1,9 @@ # Contributor: Bryce Vandegrift # Maintainer: Bryce Vandegrift pkgname=freecad -pkgver=1.0.0 -_ondsel_ver="2e3659c4bce3e6885269e0cb3d640261b2a91108" -_gsl_ver="b39e7e4b0987859f5b19ff7686b149c916588658" +pkgver=1.0.1 +_ondsel_ver="09d6175a2ba69e7016fcecc4f384946a2f84f92d" +_gsl_ver="2828399820ef4928cc89b65605dca5dc68efca6e" pkgrel=0 pkgdesc="Open-source parametric 3D modeler" url="https://www.freecad.org/" @@ -73,8 +73,8 @@ package() { } sha512sums=" -afc1079ea04fd5bb8135f8ad1012d9e4e05c8839dd0a4e00253eada58fe018f445c1200d1ca7ac9f268644c946cbf55b7b313dc3d6bd010f9da3a3334103b7db freecad-1.0.0.tar.gz -8b08a668c63b57a49b8d95308f31496c1bcb27a5fb024d2e6b9744bd2e4819e82c59f68a8b99cc1be3e2bdfcdf435da5e342afaff4f28d97a849f9c01736af89 OndselSolver-2e3659c4bce3e6885269e0cb3d640261b2a91108.tar.gz -01ae556b70f7b5b572d15a427a6a5e0e7a4047727958be4c61d7dd84fc3bc97aebeaebf60c48064c565884441605fca180d5fdc8c920d35b2a8874664c024b01 GSL-b39e7e4b0987859f5b19ff7686b149c916588658.tar.gz +69a82c0af45137079b1ce184a4a3df475c005da66b4a4cab17371a1f62432b13f721e3da8b350b3ad50125c939cdfa5fed477e0605d52bd8fcee3c528931a185 freecad-1.0.1.tar.gz +7ad78da60320a686f0734da5196ce4cba49a2ff9ecf0bcd6016a56d65c8a8f7570f2898f84c2602a454bc9ccd8ac12fd137d2a952ffb7cbd15e38350fbbd3d79 OndselSolver-09d6175a2ba69e7016fcecc4f384946a2f84f92d.tar.gz +a6d731c450da91cba34c13293cc0881a842bd90268dd5ef721ae1f48752c41dc355ebea7716a6de5b49d41568e55751c46a9dd78da4cd68656bffd33e5ee448e GSL-2828399820ef4928cc89b65605dca5dc68efca6e.tar.gz 2f190118bddbf2e070519d0244eafd15ae7919f9759f925f593ce43988a7f9ab023c50bec3768404926e8cc661e829f6a55bec5e9e58c58735c050338fbcec16 no-execinfo.patch " From 4677e14f49e0193e31d91984b988170989a0fbbb Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:18:58 -0400 Subject: [PATCH 151/313] backports/libmedc: fix source url --- backports/libmedc/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD index 39408fc..8976805 100644 --- a/backports/libmedc/APKBUILD +++ b/backports/libmedc/APKBUILD @@ -7,15 +7,15 @@ pkgdesc="Open source library for numerical simulation" url="https://www.salome-platform.org/" arch="all" license="GPL-3.0-or-later" -makedepends="cmake hdf5-dev swig3 python3-dev samurai" +makedepends="cmake hdf5-dev swig python3-dev samurai" options="!check" #test suite is nonfunctional with python bindings subpackages="$pkgname-dev $pkgname-doc $pkgname-python-pyc $pkgname-python:_py" source=" - ftp://ftp.cea.fr/pub/salome/prerequisites/med-$pkgver.tar.gz + https://files.salome-platform.org/Salome/medfile/med-$pkgver.tar.gz hdf5.patch cmake-config-dir.patch " -builddir="$srcdir"/med-$pkgver +builddir="$srcdir/med-$pkgver" build() { cmake -B build -G Ninja \ From bcbb961623dfcace9ef39789a6e322ee404dbade Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:19:19 -0400 Subject: [PATCH 152/313] backports/libnestd: fix build on edge --- backports/libnest2d/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/libnest2d/APKBUILD b/backports/libnest2d/APKBUILD index bc8059b..c0e8dd5 100644 --- a/backports/libnest2d/APKBUILD +++ b/backports/libnest2d/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Anjandev Momi pkgname=libnest2d pkgver=0.4 -pkgrel=6 +pkgrel=7 pkgdesc="2D irregular bin packaging and nesting library written in modern C++" url="https://github.com/tamasmeszaros/libnest2d" arch="noarch" @@ -27,7 +27,7 @@ build() { check() { cd build - CTEST_OUTPUT_ON_FAILURE=TRUE ctest + ctest } package() { From 5ccaf8e4d76c4d93af30c5a1ca83af8afb40c487 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:19:33 -0400 Subject: [PATCH 153/313] backports/libspatialindex: fix build on edge --- backports/libspatialindex/APKBUILD | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backports/libspatialindex/APKBUILD b/backports/libspatialindex/APKBUILD index 1de6552..4ef768c 100644 --- a/backports/libspatialindex/APKBUILD +++ b/backports/libspatialindex/APKBUILD @@ -1,33 +1,36 @@ # Contributor: Alex Yam -# Maintainer: Alex Yam +# Maintainer: Celeste +maintainer="Celeste " pkgname=libspatialindex pkgver=0_git20210205 _commit=8ee223632f95c81f49f5eb2d547ad973475c4601 -pkgrel=1 -pkgdesc="extensible framework for robust spatial indexing methods" +pkgrel=2 +pkgdesc="Extensible framework for robust spatial indexing methods" url="https://libspatialindex.org/" arch="all" license="MIT" -makedepends="cmake" +makedepends="cmake samurai" subpackages="$pkgname-dev" source="$pkgname-$_commit.tar.gz::https://github.com/libspatialindex/libspatialindex/archive/$_commit.tar.gz" builddir="$srcdir/$pkgname-$_commit" build() { - cmake -B build \ + cmake -B build -G Ninja \ -DCMAKE_BUILD_TYPE=MinSizeRel \ -DCMAKE_PREFIX_PATH=/usr \ -DCMAKE_INSTALL_PREFIX=/usr \ - -DBUILD_TESTING=ON + -DBUILD_TESTING="$(want_check && echo ON || echo OFF)" cmake --build build } check() { - cd build && ctest + ctest --test-dir build } package() { - DESTDIR="$pkgdir" cmake --build build --target install + DESTDIR="$pkgdir" cmake --install build } -sha512sums="caf91aac77b75445e4fc4d0baedcd10c619b2097dfd841b00339d9ddd4b73db05b99de1d84be88f1083f4713a936cf110d5851523491f5a74c6f96e1d5795dbb libspatialindex-8ee223632f95c81f49f5eb2d547ad973475c4601.tar.gz" +sha512sums=" +caf91aac77b75445e4fc4d0baedcd10c619b2097dfd841b00339d9ddd4b73db05b99de1d84be88f1083f4713a936cf110d5851523491f5a74c6f96e1d5795dbb libspatialindex-8ee223632f95c81f49f5eb2d547ad973475c4601.tar.gz +" From c1baeb0f355ff86e725383b42f1410c0edcdeec2 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:19:47 -0400 Subject: [PATCH 154/313] backports/nb: upgrade to 7.19.1 --- backports/nb/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/nb/APKBUILD b/backports/nb/APKBUILD index d5ba0c6..9540e5c 100644 --- a/backports/nb/APKBUILD +++ b/backports/nb/APKBUILD @@ -1,7 +1,7 @@ # Contributor: Quillith # Maintainer: Quillith pkgname=nb -pkgver=7.15.1 +pkgver=7.19.1 pkgrel=0 pkgdesc="Command line note-taking, bookmarking, archiving, and knowledge base application" url="https://github.com/xwmx/nb" @@ -41,5 +41,5 @@ full() { } sha512sums=" -95229ac3c7da47c8e8e80fb68376dcf866fa2c2799e0c150e225f453e92b714c592dd67e016054a6a6f7d53c09f7cc537250217057d42872fb273ee911e82757 nb-7.15.1.tar.gz +fdfcedc5a32c1a5fe62b00141e25193bc33eee9249fef559938f2b4baf0bff5eb7cc792db3c664c68afb2ba2db84303432790ae5254a9cdd319ce4d9a9face9f nb-7.19.1.tar.gz " From 91d930b63d60df33b6f78e2441fccf2df22769e5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:19:57 -0400 Subject: [PATCH 155/313] backports/nlopt: upgrade to 2.10.0 --- backports/nlopt/APKBUILD | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backports/nlopt/APKBUILD b/backports/nlopt/APKBUILD index 49b6b8b..66aea68 100644 --- a/backports/nlopt/APKBUILD +++ b/backports/nlopt/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Celeste maintainer="Celeste " pkgname=nlopt -pkgver=2.8.0 +pkgver=2.10.0 pkgrel=0 pkgdesc="Library for nonlinear optimization" url="https://github.com/stevengj/nlopt" @@ -40,12 +40,13 @@ build() { -DCMAKE_INSTALL_LIBDIR=lib \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DNLOPT_TESTS="$(want_check && echo ON || echo OFF)" \ $crossopts cmake --build build } check() { - ctest --test-dir build --output-on-failure + ctest --test-dir build } package() { @@ -67,5 +68,5 @@ octave() { } sha512sums=" -cb294caa5532e11ae0d22ed849705920bbae79f712144c840a5ca865ef8e6a15c6c9540c81ced0c3c05b9f44c360d50f74e235e69d893be34b7e1c5599f07c71 nlopt-2.8.0.tar.gz +7668db6997ba141ee1759f222bad23a7854aa17962470653ddb5824c25100b50f52c462441f0cc12a62e2322ff084c7f7b7fab09471b0acb13a861d7f7575655 nlopt-2.10.0.tar.gz " From 637e2f14edd9413779e885e0a4cfc5562d7318f5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:20:15 -0400 Subject: [PATCH 156/313] backports/apsw: upgrade to 3.49.1.0 --- backports/py3-apsw/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-apsw/APKBUILD b/backports/py3-apsw/APKBUILD index 051f2c9..8f034f7 100644 --- a/backports/py3-apsw/APKBUILD +++ b/backports/py3-apsw/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Francesco Colista pkgname=py3-apsw _pkgname=apsw -pkgver=3.47.2.0 +pkgver=3.49.1.0 pkgrel=0 pkgdesc="Another Python SQLite Wrapper" url="https://github.com/rogerbinns/apsw" @@ -41,6 +41,6 @@ package() { } sha512sums=" -9884f36811bfff7276642841ebaa198669c48f4d54bb764a985ea5bdd88f9f630f9fd8a13cf0a44b5675e374c2a911fcec579ca4165622e8049bff327ef66c1d py3-apsw-3.47.2.0.zip +faae9cceb462428345fd2815a970dfc80574848f87bade7cceb09aed17127d020fd16402b3d36afe0fbc6bf707a408feea0ce038486c2a68a2ab1077a9b68d0a py3-apsw-3.49.1.0.zip 8f3957bd6fecb5660a7cab367043e4ccdacd87d8963bbe41cc3d525265de28f08aa207099658d785be29c5c90b818c1418f766995cd780d02b8e36252a389758 detect-sqlite-config.patch " From 0a65a63be1896cad8b3d78a69a7c8a3118e0eab5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:20:35 -0400 Subject: [PATCH 157/313] backports/py3-arcus: bump pkgrel --- backports/py3-arcus/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/py3-arcus/APKBUILD b/backports/py3-arcus/APKBUILD index 1971b01..d3643d7 100644 --- a/backports/py3-arcus/APKBUILD +++ b/backports/py3-arcus/APKBUILD @@ -3,7 +3,7 @@ pkgname=py3-arcus # Needs to be upgraded in sync with libarcus pkgver=5.3.0 -pkgrel=1 +pkgrel=4 pkgdesc="Python bindings for libarcus" url="https://github.com/Ultimaker/pyArcus" arch="all" From 11b717b3c22be762fca85da1a2be7959091933ad Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:20:52 -0400 Subject: [PATCH 158/313] backports/py3-flask-limiter: upgrade to 3.10.1 --- backports/py3-flask-limiter/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-flask-limiter/APKBUILD b/backports/py3-flask-limiter/APKBUILD index 9bca96d..cd15f22 100644 --- a/backports/py3-flask-limiter/APKBUILD +++ b/backports/py3-flask-limiter/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda maintainer="lauren n. liberda " pkgname=py3-flask-limiter -pkgver=3.9.2 +pkgver=3.10.1 pkgrel=0 pkgdesc="Rate Limiting extension for Flask" url="https://github.com/alisaifee/flask-limiter" @@ -50,6 +50,6 @@ package() { } sha512sums=" -69e488a641ab39c088185fabcde19ebb4cbe1683e9143efdf146163bb0254e0c4f8b4b72df407542d540394e7e3b2d7498b9c93c25ae8a8128e05e319f342318 flask-limiter-3.9.2.tar.gz +a0d3af6f93d4283309d6df46ddb7fed4c358bbc712c2bd9e6897362c6d086c395cb9587c3d9da283ad757b574fd8c09d909f3c4b76d02ae8aade3e61dbea6aa0 flask-limiter-3.10.1.tar.gz 1b90e9134076cda249695d5ea741db9d205a2ae452c7d6edfe01eb37a221ce6f64b0e8ddcdbbee9b0e0fb16a28e5eabf14f1c1e41e965c7e3b93ea4f42caf553 our-std-is-good-enough.patch " From 48ef10378e69262ade6c72f1487f56efdfdcea10 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:21:15 -0400 Subject: [PATCH 159/313] backports/py3-piby: sync with aports --- backports/py3-pivy/APKBUILD | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backports/py3-pivy/APKBUILD b/backports/py3-pivy/APKBUILD index 6b5f0f5..300d9e7 100644 --- a/backports/py3-pivy/APKBUILD +++ b/backports/py3-pivy/APKBUILD @@ -5,8 +5,9 @@ pkgver=0.6.9 pkgrel=2 pkgdesc="Python3 bindings for coin" url="https://github.com/coin3d/pivy" -# riscv64: blocked by py3-pyside6 -arch="all !riscv64" +# riscv64 blocked by py3-pyside6 +# armhf blocked by qt6-qtdeclarative -> py3-pyside6 +arch="all !riscv64 !armhf" license="ISC" depends="py3-pyside6" makedepends="swig soqt-dev qt6-qtbase-dev python3-dev glu-dev cmake samurai" From 747c2c79a6936f4bd6e386de16c5b8a3bc538d15 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:21:27 -0400 Subject: [PATCH 160/313] backports/py3-pyinstrument: upgrade to 5.0.2 --- backports/py3-pyinstrument/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-pyinstrument/APKBUILD b/backports/py3-pyinstrument/APKBUILD index e4ab2cf..6070e94 100644 --- a/backports/py3-pyinstrument/APKBUILD +++ b/backports/py3-pyinstrument/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Celeste maintainer="Celeste " pkgname=py3-pyinstrument -pkgver=4.7.3 +pkgver=5.0.2 pkgrel=0 pkgdesc="Call stack profiler for Python" url="https://github.com/joerick/pyinstrument" @@ -46,5 +46,5 @@ package() { } sha512sums=" -24feac08a9726379b749f391bdb6ddbca6d3631cf3515d3ead85ace7a96f213bf60e2cd4d4f3c7cade68b5e481b4bfd562482817befe6322579101a8d91add66 py3-pyinstrument-4.7.3.tar.gz +7eeb0e05ceb31eab6b4cfcfae7095e7fe9399a7292a12ea427c6ce4f343b1f85be60496c071c2a983b9d0b40f76e18140a836b77a6df0765e40779758212d4cf py3-pyinstrument-5.0.2.tar.gz " From 420fc93b8481751627ac8404b1da9ee39a5df7f6 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:21:45 -0400 Subject: [PATCH 161/313] backports/py3-pynest2d: fix build on edge --- backports/py3-pynest2d/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-pynest2d/APKBUILD b/backports/py3-pynest2d/APKBUILD index 357a1c3..503b762 100644 --- a/backports/py3-pynest2d/APKBUILD +++ b/backports/py3-pynest2d/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Anjandev Momi pkgname=py3-pynest2d pkgver=5.2.2 -pkgrel=4 +pkgrel=5 pkgdesc="Python bindings for libnest2d" url="https://github.com/Ultimaker/pynest2d" arch="all" @@ -34,7 +34,7 @@ build() { check() { cd build - CTEST_OUTPUT_ON_FAILURE=TRUE ctest + ctest } package() { From ffdbdaafd93f7bc34d66e0202dd2550c1ac426c5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:21:58 -0400 Subject: [PATCH 162/313] backports/py3-rtree: upgrade to 1.4.0 --- backports/py3-rtree/APKBUILD | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backports/py3-rtree/APKBUILD b/backports/py3-rtree/APKBUILD index 491e8e9..f42ccfc 100644 --- a/backports/py3-rtree/APKBUILD +++ b/backports/py3-rtree/APKBUILD @@ -1,9 +1,9 @@ # Contributor: Alex Yam -# Maintainer: Alex Yam +# Maintainer: Celeste +maintainer="Celeste " pkgname=py3-rtree -_pkgname=rtree -pkgver=1.1.0 -pkgrel=2 +pkgver=1.4.0 +pkgrel=1 pkgdesc="Python3 library for r-tree spatial index (wrapper for libspatialindex)" url="https://pypi.org/project/Rtree/" # s390x: Test failed: IndexSerialization::test_interleaving - AssertionError @@ -15,7 +15,7 @@ makedepends="py3-setuptools py3-wheel py3-gpep517" checkdepends="py3-pytest py3-numpy" subpackages="$pkgname-pyc" source="$pkgname-$pkgver.tar.gz::https://github.com/Toblerity/rtree/archive/$pkgver.tar.gz" -builddir="$srcdir"/$_pkgname-$pkgver +builddir="$srcdir/rtree-$pkgver" build() { gpep517 build-wheel \ @@ -35,5 +35,5 @@ package() { } sha512sums=" -97a87027e49520f12cb86444ee8a9795fabeec6d8f0e3e869f2714df8f7c649ced1374385852af0ce7d7eb91e5a2cb464a4330807be15d538dc0a4d8de7b7ca2 py3-rtree-1.1.0.tar.gz +9f253a4e4bce1e9210943d1a7b211895baf0478927c58a576235492f2705f4ff61df5fff46db382d6b7c04bde058f046ea0a408a4b504bd1a9bde37c8b1c277c py3-rtree-1.4.0.tar.gz " From 83207c4dae9c2dbded5d698f5590a7527dde7af7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:22:17 -0400 Subject: [PATCH 163/313] backports/shntool: sync pkgrel --- backports/shntool/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/shntool/APKBUILD b/backports/shntool/APKBUILD index 60dd2b5..117a36b 100644 --- a/backports/shntool/APKBUILD +++ b/backports/shntool/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Carlo Landmeter -# Maintainer: Jean-Louis Fuchs +# Maintainer: Jean-Louis Fuchs pkgname=shntool pkgver=3.0.10 -pkgrel=4 +pkgrel=5 pkgdesc="A multi-purpose WAVE data processing and reporting utility" url="http://shnutils.freeshell.org/shntool/" arch="all" From 25ba00ae7fe3f52b255cfda4b890df4285c7e114 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:22:43 -0400 Subject: [PATCH 164/313] backports/signal-desktop: upgrade to 7.55.0 --- backports/signal-desktop/APKBUILD | 12 +++++++----- backports/signal-desktop/signal-desktop | 6 ------ 2 files changed, 7 insertions(+), 11 deletions(-) delete mode 100755 backports/signal-desktop/signal-desktop diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index aea8d4c..f1cd958 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,14 +2,14 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.54.0 +pkgver=7.55.0 pkgrel=0 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" # same as electron arch="aarch64 x86_64" license="AGPL-3.0-only" -_llvmver=19 +_llvmver=20 depends=" electron font-barlow @@ -67,7 +67,7 @@ makedepends=" options="net !check" # use _check_depends to validate this -_libsignalver=0.70.0 +_libsignalver=0.71.1 _ringrtcver=2.51.0 _webrtcver=6998b _sqlcipherver=2.0.1 @@ -92,6 +92,7 @@ source=" webrtc-gcc13.patch webrtc-rollback-red.patch webrtc-rollback-3rdparty-build-gn.patch + webrtc-pipewire-1.4.patch signal-desktop.sh " @@ -477,8 +478,8 @@ package() { } sha512sums=" -ca512bfdd8c78b6c440214db95347b59928314cd27d74b22828de5d701aaf8e675eb5c71603bb6a39fd224812204d9f656290637d402966760bdb3958d3923c8 Signal-Desktop-7.54.0.tar.gz -52d66cf2643402673858def81a9a3c98a0d16525e126c9e5ea1e3c62150f321e486c8c79bcea11a9636c9b05f541fdf0718869d52b9a789f05cad741ba37c7ad libsignal-0.70.0.tar.gz +59e1aae568735976e79ee38d55c87b137f7075063985e72deb42b53af6facd7ed2a8c0912fd86cb88df3182d17c1b58af11bf1501135e6855cfd5ee70270905e Signal-Desktop-7.55.0.tar.gz +3d1b5b84d42b4f6da46a2f626ec72931d3d7432c10c0d43e562851933f6cf0a434630eb5f8bb9a586d27d6ad5a5d8a6c96873dc468e53bbf6297c35a8da090d8 libsignal-0.71.1.tar.gz 8e32d75f9f8216106b6858d9ab58ad53f209408fc155fe27dec184c8c65c9ab5a3a93e9567953f209424ed435ccc6d4903a49a4edae36eb744a897cc02098312 ringrtc-2.51.0.tar.gz 592987c1661de464a4e6dee3081cb5fd32e5afdacdba43d901557a217e62301b4655009ad5bdc0c1dcff5e8b67d7acd68ac953cd638f31196162aa3ccdd9c63b node-sqlcipher-2.0.1.tar.gz ba02cb0c293210f9a683b0e08c6acbe84f5b78089329ec017b0db3493b38ccf39e92c49c2475dc66b5ce3bfe060686718cb5053787e2d61ed320dadb22891989 webrtc-6998b.tar.zst @@ -495,5 +496,6 @@ aca92e4de6cd005d660d7e8b99607de96ca2d7dc220e3465247d517e915e4d41a4b0eb519e85c5ec 3f1095861a79862ab5a55c86d7e353d272974617afba39e4d4441024bede8d7b9b8e122da90d56a9c3c0965171803d6b9e29e91d78167a08c6bcc86b3eedab18 webrtc-gcc13.patch 8f53dcf3264c5cec338f037e57a7770ec939ee06dfb0c5dfeab23967a3a64d3f861a6b5419766ac892676036b4522bce2f47279ca3658b5c0b6a31c82ac05053 webrtc-rollback-red.patch f8bd574a0de077a643ced26e8a0e3f162e014bbf91c957bbefd113883a70e2b63e483bf400b7e2da8d09edfe76d4f6a257f194a14124f344f1625c5632d12acb webrtc-rollback-3rdparty-build-gn.patch +7fa0344a144d5b8f05d0962799b8ce1dbe8f2d403a311d4fbf802a2d032e6586a1268387052b529e809c4740a79d6737a63d7e37ea8902ce926b74309dd44fc3 webrtc-pipewire-1.4.patch 87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop.sh " diff --git a/backports/signal-desktop/signal-desktop b/backports/signal-desktop/signal-desktop deleted file mode 100755 index 370469c..0000000 --- a/backports/signal-desktop/signal-desktop +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -# app chooses config (including used endpoints) based on this -export NODE_ENV=production - -exec electron /usr/lib/signal-desktop/app.asar From 4919fe261cffa782c901a5a28886e5a9596a830f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:22:59 -0400 Subject: [PATCH 165/313] backports/soqt: fix build on edge --- backports/soqt/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/soqt/APKBUILD b/backports/soqt/APKBUILD index e4c6995..b96f3dd 100644 --- a/backports/soqt/APKBUILD +++ b/backports/soqt/APKBUILD @@ -7,14 +7,14 @@ pkgdesc="GUI binding library for coin" url="https://github.com/coin3d/soqt" arch="all" license="BSD-3-Clause" -makedepends="coin-dev cmake mesa-dev qt5-qtbase-dev doxygen" +makedepends="coin-dev cmake mesa-dev samurai qt5-qtbase-dev doxygen" options="!check" # test suite consists only of interactive programs subpackages="$pkgname-dev $pkgname-doc" source="https://github.com/coin3d/soqt/releases/download/v$pkgver/soqt-$pkgver-src.tar.gz" builddir="$srcdir/$pkgname" build() { - cmake -B build . \ + cmake -B build -G Ninja . \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=None \ -DSOQT_BUILD_DOCUMENTATION=ON \ From cea504a9246d9df2dbc5111234b8a270248bf5e4 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:23:34 -0400 Subject: [PATCH 166/313] backports/swig3: drop to not needed --- backports/swig3/APKBUILD | 46 ----- ...de-for-constant-expressions-containi.patch | 191 ------------------ 2 files changed, 237 deletions(-) delete mode 100644 backports/swig3/APKBUILD delete mode 100644 backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch diff --git a/backports/swig3/APKBUILD b/backports/swig3/APKBUILD deleted file mode 100644 index 4abe017..0000000 --- a/backports/swig3/APKBUILD +++ /dev/null @@ -1,46 +0,0 @@ -# Maintainer: Noel Kuntze -pkgname=swig3 -pkgver=3.0.12 -pkgrel=3 -pkgdesc="A compiler that makes it easy to integrate C and C++ code with scripting languages" -url="https://www.swig.org/" -arch="all" -license="GPL-3.0-only" -depends="guile" -makedepends="zlib-dev pcre-dev bison" -checkdepends="boost-dev perl-dev python3-dev diffutils" -options="!check" # Check for javascript fails -subpackages="$pkgname-doc" -source="https://downloads.sourceforge.net/swig/swig-$pkgver.tar.gz - swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch -" - -builddir="$srcdir/swig-$pkgver" - -prepare() { - default_prepare - update_config_sub -} - -build() { - ./configure \ - --build=$CBUILD \ - --host=$CHOST \ - --prefix=/usr \ - --with-python3=/usr/bin/python3 \ - --program-suffix=3.0 - make -} - -check() { - env PERL5LIB=. make check -} - -package() { - make DESTDIR="$pkgdir" install - install -D -m644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE - install -D -m644 LICENSE-UNIVERSITIES "$pkgdir"/usr/share/licenses/$pkgname/LICENSE-UNIVERSITIES -} - -sha512sums="5eaa2e06d8e4197fd02194051db1e518325dbb074a4c55a91099ad9c55193874f577764afc9029409a41bd520a95154095f26e33ef5add5c102bb2c1d98d33eb swig-3.0.12.tar.gz -0cde94a04a3f914f6e1ac79866d199981600c0f4be18b52d08194de96d524027c6572eacd5c1e155a9007fc34ed9dece27dbcb974874de072fb42bf564978cd0 swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch" diff --git a/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch b/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch deleted file mode 100644 index 7198c21..0000000 --- a/backports/swig3/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch +++ /dev/null @@ -1,191 +0,0 @@ -From 90ba174fcea1618af57aa594199541d47a89b7f6 Mon Sep 17 00:00:00 2001 -From: William S Fulton -Date: Sun, 17 Sep 2017 19:02:55 +0100 -Subject: [PATCH 1/2] Fix generated code for constant expressions containing - wchar_t L literals. - -Such as: - # define __WCHAR_MAX (0x7fffffff + L'\0') - -Reported on swig-user mailing list. ---- - CHANGES.current | 5 +++++ - Examples/test-suite/csharp/preproc_constants_c_runme.cs | 3 ++- - Examples/test-suite/csharp/preproc_constants_runme.cs | 2 ++ - Examples/test-suite/d/preproc_constants_c_runme.1.d | 2 ++ - Examples/test-suite/d/preproc_constants_c_runme.2.d | 2 ++ - Examples/test-suite/d/preproc_constants_runme.1.d | 2 ++ - Examples/test-suite/d/preproc_constants_runme.2.d | 2 ++ - Examples/test-suite/php/preproc_constants_c_runme.php | 2 ++ - Examples/test-suite/php/preproc_constants_runme.php | 2 ++ - Examples/test-suite/php5/preproc_constants_c_runme.php | 2 ++ - Examples/test-suite/php5/preproc_constants_runme.php | 2 ++ - Examples/test-suite/preproc_constants.i | 3 +++ - Source/CParse/parser.y | 2 +- - 13 files changed, 29 insertions(+), 2 deletions(-) - -#diff --git a/CHANGES.current b/CHANGES.current -#index 1e4a244..b455a9f 100644 -#--- a/CHANGES.current -#+++ b/CHANGES.current -#@@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ -# Version 4.0.0 (in progress) -# =========================== -# -#+2017-09-17: wsfulton -#+ Fix generated code for constant expressions containing wchar_t L literals such as: -#+ # define __WCHAR_MAX (0x7fffffff + L'\0') -#+ # define __WCHAR_MIN (-__WCHAR_MAX - 1) -#+ -# 2017-09-10: mlamarre -# [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio -# /LDd, /MDd or /MTd compiler options. -diff --git a/Examples/test-suite/csharp/preproc_constants_c_runme.cs b/Examples/test-suite/csharp/preproc_constants_c_runme.cs -index 76c684d..1c28e49 100644 ---- a/Examples/test-suite/csharp/preproc_constants_c_runme.cs -+++ b/Examples/test-suite/csharp/preproc_constants_c_runme.cs -@@ -61,7 +61,8 @@ public class runme { - assert( typeof(int) == preproc_constants_c.EXPR_LAND.GetType() ); - assert( typeof(int) == preproc_constants_c.EXPR_LOR.GetType() ); - assert( typeof(double) == preproc_constants_c.EXPR_CONDITIONAL.GetType() ); -- -+ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MAX.GetType() ); -+ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MIN.GetType() ); - } - static void assert(bool assertion) { - if (!assertion) -diff --git a/Examples/test-suite/csharp/preproc_constants_runme.cs b/Examples/test-suite/csharp/preproc_constants_runme.cs -index 9fae591..6b02e30 100644 ---- a/Examples/test-suite/csharp/preproc_constants_runme.cs -+++ b/Examples/test-suite/csharp/preproc_constants_runme.cs -@@ -60,6 +60,8 @@ public class runme { - assert( typeof(bool) == preproc_constants.EXPR_LAND.GetType() ); - assert( typeof(bool) == preproc_constants.EXPR_LOR.GetType() ); - assert( typeof(double) == preproc_constants.EXPR_CONDITIONAL.GetType() ); -+ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MAX.GetType() ); -+ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MIN.GetType() ); - - } - static void assert(bool assertion) { -diff --git a/Examples/test-suite/d/preproc_constants_c_runme.1.d b/Examples/test-suite/d/preproc_constants_c_runme.1.d -index d846c71..2b349af 100644 ---- a/Examples/test-suite/d/preproc_constants_c_runme.1.d -+++ b/Examples/test-suite/d/preproc_constants_c_runme.1.d -@@ -61,4 +61,6 @@ void main() { - static assert(is(int == typeof(EXPR_LAND()))); - static assert(is(int == typeof(EXPR_LOR()))); - static assert(is(double == typeof(EXPR_CONDITIONAL()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); - } -diff --git a/Examples/test-suite/d/preproc_constants_c_runme.2.d b/Examples/test-suite/d/preproc_constants_c_runme.2.d -index 9bdbb93..1bac525 100644 ---- a/Examples/test-suite/d/preproc_constants_c_runme.2.d -+++ b/Examples/test-suite/d/preproc_constants_c_runme.2.d -@@ -61,4 +61,6 @@ void main() { - static assert(is(int == typeof(EXPR_LAND()))); - static assert(is(int == typeof(EXPR_LOR()))); - static assert(is(double == typeof(EXPR_CONDITIONAL()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); - } -diff --git a/Examples/test-suite/d/preproc_constants_runme.1.d b/Examples/test-suite/d/preproc_constants_runme.1.d -index 009405f..f743f48 100644 ---- a/Examples/test-suite/d/preproc_constants_runme.1.d -+++ b/Examples/test-suite/d/preproc_constants_runme.1.d -@@ -60,4 +60,6 @@ void main() { - static assert(is(bool == typeof(EXPR_LAND()))); - static assert(is(bool == typeof(EXPR_LOR()))); - static assert(is(double == typeof(EXPR_CONDITIONAL()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); - } -diff --git a/Examples/test-suite/d/preproc_constants_runme.2.d b/Examples/test-suite/d/preproc_constants_runme.2.d -index 2d92ef0..0d96c37 100644 ---- a/Examples/test-suite/d/preproc_constants_runme.2.d -+++ b/Examples/test-suite/d/preproc_constants_runme.2.d -@@ -60,4 +60,6 @@ void main() { - static assert(is(bool == typeof(EXPR_LAND()))); - static assert(is(bool == typeof(EXPR_LOR()))); - static assert(is(double == typeof(EXPR_CONDITIONAL()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MAX()))); -+ static assert(is(int == typeof(EXPR_WCHAR_MIN()))); - } -diff --git a/Examples/test-suite/php/preproc_constants_c_runme.php b/Examples/test-suite/php/preproc_constants_c_runme.php -index af9b76e..e59fe18 100644 ---- a/Examples/test-suite/php/preproc_constants_c_runme.php -+++ b/Examples/test-suite/php/preproc_constants_c_runme.php -@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant - check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type"); - check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); - check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); -+check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); -+check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); - - ?> -diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php -index 5c9119b..8e117ea 100644 ---- a/Examples/test-suite/php/preproc_constants_runme.php -+++ b/Examples/test-suite/php/preproc_constants_runme.php -@@ -61,5 +61,7 @@ check::equal(gettype(preproc_constants::EXPR_OR), "integer", "preproc_constants. - check::equal(gettype(preproc_constants::EXPR_LAND), "boolean", "preproc_constants.EXPR_LAND has unexpected type"); - check::equal(gettype(preproc_constants::EXPR_LOR), "boolean", "preproc_constants.EXPR_LOR has unexpected type"); - check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); -+check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); -+check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); - - ?> -diff --git a/Examples/test-suite/php5/preproc_constants_c_runme.php b/Examples/test-suite/php5/preproc_constants_c_runme.php -index 1ea0195..d978fab 100644 ---- a/Examples/test-suite/php5/preproc_constants_c_runme.php -+++ b/Examples/test-suite/php5/preproc_constants_c_runme.php -@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant - check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type"); - check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); - check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); -+check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); -+check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); - - ?> -diff --git a/Examples/test-suite/php5/preproc_constants_runme.php b/Examples/test-suite/php5/preproc_constants_runme.php -index fb9ee4f..7527026 100644 ---- a/Examples/test-suite/php5/preproc_constants_runme.php -+++ b/Examples/test-suite/php5/preproc_constants_runme.php -@@ -70,5 +70,7 @@ check::equal(gettype(preproc_constants::EXPR_LAND), "integer", "preproc_constant - check::equal(gettype(preproc_constants::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type"); - - check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type"); -+check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type"); -+check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type"); - - ?> -diff --git a/Examples/test-suite/preproc_constants.i b/Examples/test-suite/preproc_constants.i -index 3a999ad..16b44c9 100644 ---- a/Examples/test-suite/preproc_constants.i -+++ b/Examples/test-suite/preproc_constants.i -@@ -87,6 +87,9 @@ - #define EXPR_LOR 0xFF || 1 - #define EXPR_CONDITIONAL true ? 2 : 2.2 - -+#define EXPR_WCHAR_MAX (0x7fffffff + L'\0') -+#define EXPR_WCHAR_MIN (-EXPR_WCHAR_MAX - 1) -+ - #define EXPR_CHAR_COMPOUND_ADD 'A' + 12 - #define EXPR_CHAR_COMPOUND_LSHIFT 'B' << 6 - #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p') -diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y -index 2e92cd0..273dadb 100644 ---- a/Source/CParse/parser.y -+++ b/Source/CParse/parser.y -@@ -194,7 +194,7 @@ int SWIG_cparse_template_reduce(int treduce) { - * ----------------------------------------------------------------------------- */ - - static int promote_type(int t) { -- if (t <= T_UCHAR || t == T_CHAR) return T_INT; -+ if (t <= T_UCHAR || t == T_CHAR || t == T_WCHAR) return T_INT; - return t; - } - --- -2.9.5 - From 260eca3424a8cb654b48b2604f7d4ee5aa1d60d0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:23:54 -0400 Subject: [PATCH 167/313] backports/uranium: fix build on edge --- backports/uranium/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/uranium/APKBUILD b/backports/uranium/APKBUILD index 7badd09..e896971 100644 --- a/backports/uranium/APKBUILD +++ b/backports/uranium/APKBUILD @@ -42,7 +42,7 @@ build() { check() { # useless code style test with another dependency - ctest --output-on-failure -T Test + ctest -T Test } package() { From 50524f1f2a1ae8671bf83ea85347335582cab271 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 18:38:31 -0400 Subject: [PATCH 168/313] ci: check backports of 3.22 --- .forgejo/workflows/check-backports.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index a25ad4e..cd8f63b 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -11,7 +11,7 @@ jobs: container: image: alpine:latest env: - downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports + downstream: https://ayakael.net/api/packages/forge/alpine/v3.22/backports ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 1 ALL_PACKAGES: true From 48447cd14c9c7786a5715c0877aa2cade9542e15 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:05:21 -0400 Subject: [PATCH 169/313] unmaintained/znapzend: move from user --- {user => unmaintained}/znapzend/APKBUILD | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/znapzend/APKBUILD (100%) diff --git a/user/znapzend/APKBUILD b/unmaintained/znapzend/APKBUILD similarity index 100% rename from user/znapzend/APKBUILD rename to unmaintained/znapzend/APKBUILD From 24d2f84bab20ea195a9ff76ac0d5abb192a81e00 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:05:47 -0400 Subject: [PATCH 170/313] unmaintained/soci: move from user --- {user => unmaintained}/soci/APKBUILD | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/soci/APKBUILD (100%) diff --git a/user/soci/APKBUILD b/unmaintained/soci/APKBUILD similarity index 100% rename from user/soci/APKBUILD rename to unmaintained/soci/APKBUILD From ff38eb32003e9592d79caaf4ebc0f48087ec89b9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:06:56 -0400 Subject: [PATCH 171/313] user/freecad: drop due to in backports --- user/freecad/APKBUILD | 108 --- user/freecad/missing-include-cstdint.patch | 11 - user/freecad/no-execinfo.patch | 46 -- user/freecad/no-workaround-spnav.patch | 69 -- user/freecad/numpy-1.20.patch | 25 - user/freecad/opencascade-7.8.0.patch | 877 --------------------- user/freecad/resourceDirectory.patch | 11 - user/freecad/tests.patch | 33 - 8 files changed, 1180 deletions(-) delete mode 100644 user/freecad/APKBUILD delete mode 100644 user/freecad/missing-include-cstdint.patch delete mode 100644 user/freecad/no-execinfo.patch delete mode 100644 user/freecad/no-workaround-spnav.patch delete mode 100644 user/freecad/numpy-1.20.patch delete mode 100644 user/freecad/opencascade-7.8.0.patch delete mode 100644 user/freecad/resourceDirectory.patch delete mode 100644 user/freecad/tests.patch diff --git a/user/freecad/APKBUILD b/user/freecad/APKBUILD deleted file mode 100644 index 30c9eb5..0000000 --- a/user/freecad/APKBUILD +++ /dev/null @@ -1,108 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: Aiden Grossman -pkgname=freecad -pkgver=0.20.2 -pkgrel=5 -pkgdesc="Free and open source 3D parametric modeler" -url="https://freecadweb.org/" -license="LGPL-2.0-or-later" -arch="" # removed dependency py3-pyside2 -#arch="x86_64" # dependency OpenCascade is only x86_64 -depends=" - graphviz - hdf5 - opencascade - py3-matplotlib - py3-numpy - py3-pivy - py3-ply - py3-pyside2 - py3-six - py3-yaml - python3 - " -makedepends=" - boost-dev - cmake - coin-dev - doxygen - eigen-dev - freeimage-dev - glu-dev - hdf5-dev - libmedc-dev - libshiboken2-dev - onetbb-dev - opencascade-dev - py3-pyside2-dev - python3-dev - shiboken2 - qt5-qtsvg-dev - qt5-qtwebengine-dev - qt5-qtxmlpatterns-dev - samurai - swig - vtk-dev - xerces-c-dev - " -checkdepends="xvfb-run mesa mesa-dri-gallium font-opensans" -source="https://github.com/FreeCAD/FreeCAD/archive/$pkgver/freecad-$pkgver.tar.gz - $pkgname-python3.11-1.patch::https://github.com/FreeCAD/FreeCAD/commit/fe02d63c8c9b1280978be841d04e68a0a55cceb9.patch - numpy-1.20.patch - no-execinfo.patch - no-workaround-spnav.patch - resourceDirectory.patch - tests.patch - opencascade-7.8.0.patch - missing-include-cstdint.patch - " -builddir="$srcdir/FreeCAD-$pkgver" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_C_FLAGS="$CFLAGS -fPIC -w" \ - -DCMAKE_CXX_FLAGS="$CXXFLAGS -fPIC -w" \ - -DCMAKE_INSTALL_PREFIX=/usr/lib/freecad \ - -DCMAKE_INSTALL_DATADIR=/usr/share/freecad \ - -DCMAKE_INSTALL_DATAROOTDIR=/usr/share \ - -DCMAKE_INSTALL_DOCDIR=/usr/share/freecad/doc \ - -DBUILD_ENABLE_CXX_STD=C++17 \ - -DBUILD_QT5=ON \ - -DFREECAD_USE_EXTERNAL_PIVY=ON \ - -DFREECAD_USE_OCC_VARIANT="Official Version" \ - -DFREECAD_USE_QT_FILEDIALOG=ON \ - -DPYTHON_EXECUTABLE=/usr/bin/python3 - cmake --build build -} - -check() { - DESTDIR=test_install cmake --install build - mkdir -p test_install/usr/bin - ln -s ../lib/freecad/bin/FreeCAD test_install/usr/bin/FreeCAD - ln -s ../lib/freecad/bin/FreeCADCmd test_install/usr/bin/FreeCADCmd - LD_LIBRARY_PATH="$PWD"/test_install/usr/lib/freecad/lib \ - xvfb-run "$PWD"/test_install/usr/bin/FreeCAD -t 0 -} - -package() { - DESTDIR="$pkgdir" cmake --install build - - # FreeCAD does not initialize correctly when binaries - # are located under /usr/bin; thus, symlinks are necessary. - install -d "$pkgdir"/usr/bin - ln -s /usr/lib/freecad/bin/FreeCAD "$pkgdir"/usr/bin/FreeCAD - ln -s /usr/lib/freecad/bin/FreeCADCmd "$pkgdir"/usr/bin/FreeCADCmd -} - -sha512sums=" -c3acd77dd2bb9a2a23ac354da3b6102effb89c95d675e91421d65486414dfe8cc0188a7212245e0deb63f17b9c5df76133017be09e4cd14b833be8cbec52a08d freecad-0.20.2.tar.gz -75a237f7ed7a89a98c0e5bdb3d3f0788749602daf718089aa0814e05f93ced1e15ad5867c7c87f170b48c5984f9ace1bbc95c4f386ce72bfb8d616323b47f1e5 freecad-python3.11-1.patch -80b08b031810fce7b6d698c662f64fa4f8a904f283f46b478b1d718529164c0ee61ce190f633abf04e03212720480f3f0603b0c1e160af79d7b6bb82da3bd0e4 numpy-1.20.patch -73aaba7015dce7048eb7d2456131b5b5ba4673cc980503331987be54d99daed5f61db015ca33d7d2ef0f02bd3192da8ce122c103c3b93f9959927deb4f0b933e no-execinfo.patch -15696bdaaf77482f1b5d3806535a8004c8cec7d598d62092d9f0394b4ca9e2ad6cedd77c4b86a83a06324d16678c1c6bbf3a390b807729717a2f513e858afd50 no-workaround-spnav.patch -8ba13b17bad66316757d180c1b9e9e72a24382627eac7c43a2264b3b5101e6e8f701775f2b805ed733f500fbcd8b0e8e422ec58a9ab3d948d613b666157d4c52 resourceDirectory.patch -5db19e0aa2ca1fd21f4c56afc9db54390a799262aaa0a741704c2c304b0068fd6ca1dcc086465e12e9c0cfe06aac750aaf9b8f5f4db324539af4dd3394803ff9 tests.patch -f933680dea8744e147f38abce389cb7fd0ec3fb3566454fdd5e6ea07b2faaac5fe61aabe1df3bda9f0d7b4fca16055aa2ad700e9cce10d2604ae37b761b68ade opencascade-7.8.0.patch -fec515cc63830f0e715527c7890173705b24e7d99d225821ec4300104cf3affdee49243bbd4d0a331a902cf04db756a1b8f18f0a17cc71f5757f8b5c73c78ede missing-include-cstdint.patch -" diff --git a/user/freecad/missing-include-cstdint.patch b/user/freecad/missing-include-cstdint.patch deleted file mode 100644 index 363a706..0000000 --- a/user/freecad/missing-include-cstdint.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff --color -rupN a/src/3rdParty/libE57Format/include/E57Format.h b/src/3rdParty/libE57Format/include/E57Format.h ---- a/src/3rdParty/libE57Format/include/E57Format.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/libE57Format/include/E57Format.h 2024-02-27 14:06:29.308892531 +0100 -@@ -32,6 +32,7 @@ - //! @file E57Format.h header file for the E57 API - - #include -+#include - #include - #include - diff --git a/user/freecad/no-execinfo.patch b/user/freecad/no-execinfo.patch deleted file mode 100644 index 3e1c39c..0000000 --- a/user/freecad/no-execinfo.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -index 23c5083..54c7ecf 100644 ---- a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -+++ b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -@@ -29,7 +29,6 @@ - #ifndef WIN32 - #include - #include --#include - #endif - - -@@ -109,20 +108,7 @@ namespace Kernel_Utils - #ifndef WIN32 - void print_traceback() - { -- void *array[50]; -- size_t size; -- char **strings; -- size_t i; -- -- size = backtrace (array, 40); -- strings = backtrace_symbols (array, size); -- -- for (i = 0; i < size; i++) -- { -- std::cerr << strings[i] << std::endl; -- } -- -- free (strings); -+ std::cerr << "there is no backtrace." << std::endl; - } - #else - #if (_MSC_VER >= 1400) // Visual Studio 2005 -diff --git a/src/App/Application.cpp b/src/App/Application.cpp -index 3081623..ba3525f 100644 ---- a/src/App/Application.cpp -+++ b/src/App/Application.cpp -@@ -1732,7 +1732,6 @@ static void freecadNewHandler () - #endif - - #if defined(FC_OS_LINUX) --#include - #include - #include - diff --git a/user/freecad/no-workaround-spnav.patch b/user/freecad/no-workaround-spnav.patch deleted file mode 100644 index ee4fead..0000000 --- a/user/freecad/no-workaround-spnav.patch +++ /dev/null @@ -1,69 +0,0 @@ -Patch-Source: https://github.com/FreeCAD/FreeCAD/commit/7b377a216b9185960e4cee980a6504dc1a755f50 -fixes stderr reassignment --- -From 7b377a216b9185960e4cee980a6504dc1a755f50 Mon Sep 17 00:00:00 2001 -From: wmayer -Date: Wed, 29 Jun 2022 15:19:18 +0200 -Subject: [PATCH] Gui: remove workaround for spnav 0.23 due to build failure - with musl libc - ---- - src/Gui/3Dconnexion/GuiNativeEventLinux.cpp | 27 --------------------- - 1 file changed, 27 deletions(-) - -diff --git a/src/Gui/3Dconnexion/GuiNativeEventLinux.cpp b/src/Gui/3Dconnexion/GuiNativeEventLinux.cpp -index 7f0ddd75d262..455ece0b36bd 100644 ---- a/src/Gui/3Dconnexion/GuiNativeEventLinux.cpp -+++ b/src/Gui/3Dconnexion/GuiNativeEventLinux.cpp -@@ -21,42 +21,17 @@ - ***************************************************************************/ - - #include --#include - - #include "GuiNativeEventLinux.h" - - #include "GuiApplicationNativeEventAware.h" - #include --#include - #include - - #include - - #include - --namespace { --class RedirectStdErr --{ --public: -- RedirectStdErr() -- : fi(Base::FileInfo::getTempFileName()) -- , file(stderr) -- { -- stderr = fopen(fi.filePath().c_str(), "w"); -- } -- ~RedirectStdErr() -- { -- fclose(stderr); -- fi.deleteFile(); -- stderr = file; -- } -- --private: -- Base::FileInfo fi; -- FILE* file; --}; --} -- - Gui::GuiNativeEvent::GuiNativeEvent(Gui::GUIApplicationNativeEventAware *app) - : GuiAbstractNativeEvent(app) - { -@@ -72,8 +47,6 @@ Gui::GuiNativeEvent::~GuiNativeEvent() - - void Gui::GuiNativeEvent::initSpaceball(QMainWindow *window) - { -- // tmp. redirect stderr to a file to suppress an error message from spnav_open() -- RedirectStdErr err; - Q_UNUSED(window) - if (spnav_open() == -1) { - Base::Console().Log("Couldn't connect to spacenav daemon. Please ignore if you don't have a spacemouse.\n"); diff --git a/user/freecad/numpy-1.20.patch b/user/freecad/numpy-1.20.patch deleted file mode 100644 index 20f4b41..0000000 --- a/user/freecad/numpy-1.20.patch +++ /dev/null @@ -1,25 +0,0 @@ -Patch-Source: https://github.com/FreeCAD/FreeCAD/commit/8b0df1dc936b544091f6a2d68df1c1a14ae3de5b --- -From 8b0df1dc936b544091f6a2d68df1c1a14ae3de5b Mon Sep 17 00:00:00 2001 -From: lorenz -Date: Tue, 27 Dec 2022 04:59:35 +0100 -Subject: [PATCH] FEM: femmesh: fix AttributeError: module 'numpy' has no - attribute 'int' - ---- - src/Mod/Fem/femmesh/meshtools.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/Mod/Fem/femmesh/meshtools.py b/src/Mod/Fem/femmesh/meshtools.py -index dd8671b..d2e2b0a 100644 ---- a/src/Mod/Fem/femmesh/meshtools.py -+++ b/src/Mod/Fem/femmesh/meshtools.py -@@ -485,7 +485,7 @@ def get_femelement_sets( - # fem_objects = FreeCAD FEM document objects - # get femelements for reference shapes of each obj.References - count_femelements = 0 -- referenced_femelements = np.zeros((max(femelement_table.keys())+1,),dtype=np.int) -+ referenced_femelements = np.zeros((max(femelement_table.keys())+1,),dtype=int) - has_remaining_femelements = None - for fem_object_i, fem_object in enumerate(fem_objects): - obj = fem_object["Object"] diff --git a/user/freecad/opencascade-7.8.0.patch b/user/freecad/opencascade-7.8.0.patch deleted file mode 100644 index 582fbde..0000000 --- a/user/freecad/opencascade-7.8.0.patch +++ /dev/null @@ -1,877 +0,0 @@ -Fix compilation with opencascase 7.8.0 - -Base on https://github.com/FreeCAD/FreeCAD/pull/11909 - -diff --color -rupN a/cMake/FindOCC.cmake b/cMake/FindOCC.cmake ---- a/cMake/FindOCC.cmake 2022-12-07 03:35:37.000000000 +0100 -+++ b/cMake/FindOCC.cmake 2024-02-27 15:00:48.248873883 +0100 -@@ -127,8 +127,6 @@ if(OCC_FOUND) - TKG2d - TKG3d - TKMath -- TKIGES -- TKSTL - TKShHealing - TKXSBase - TKBool -@@ -139,10 +137,6 @@ if(OCC_FOUND) - TKGeomBase - TKOffset - TKPrim -- TKSTEPBase -- TKSTEPAttr -- TKSTEP209 -- TKSTEP - TKHLR - TKFeat - ) -@@ -154,17 +148,19 @@ if(OCC_FOUND) - TKLCAF - TKVCAF - TKCDF -- TKXDESTEP -- TKXDEIGES - TKMeshVS - TKService - TKV3d - ) -- if(OCC_VERSION_STRING VERSION_LESS 6.7.3) -- list(APPEND OCC_OCAF_LIBRARIES TKAdvTools) -- elseif(NOT OCC_VERSION_STRING VERSION_LESS 7.5.0) -+ if(NOT OCC_VERSION_STRING VERSION_LESS 7.5.0) - list(APPEND OCC_OCAF_LIBRARIES TKRWMesh) -- endif(OCC_VERSION_STRING VERSION_LESS 6.7.3) -+ endif(NOT OCC_VERSION_STRING VERSION_LESS 7.5.0) -+ if(OCC_VERSION_STRING VERSION_LESS 7.8.0) -+ list(APPEND OCC_LIBRARIES TKIGES TKSTL TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP) -+ list(APPEND OCC_OCAF_LIBRARIES TKXDESTEP TKXDEIGES) -+ else(OCC_VERSION_STRING VERSION_LESS 7.8.0) -+ list(APPEND OCC_LIBRARIES TKDESTEP TKDEIGES TKDEGLTF TKDESTL) -+ endif(OCC_VERSION_STRING VERSION_LESS 7.8.0) - message(STATUS "-- Found OCE/OpenCASCADE version: ${OCC_VERSION_STRING}") - message(STATUS "-- OCE/OpenCASCADE include directory: ${OCC_INCLUDE_DIR}") - message(STATUS "-- OCE/OpenCASCADE shared libraries directory: ${OCC_LIBRARY_DIR}") -diff --color -rupN a/src/3rdParty/salomesmesh/inc/SMESHDS_DataMapOfShape.hxx b/src/3rdParty/salomesmesh/inc/SMESHDS_DataMapOfShape.hxx ---- a/src/3rdParty/salomesmesh/inc/SMESHDS_DataMapOfShape.hxx 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/inc/SMESHDS_DataMapOfShape.hxx 2024-02-27 15:00:48.248873883 +0100 -@@ -29,22 +29,35 @@ - - #include - -+#include -+ - /* - * This method needed for instance NCollection_DataMap with TopoDS_Shape as key - */ -+#if OCC_VERSION_HEX >= 0x070800 - struct SMESHDS_Hasher - { -- static inline Standard_Boolean IsEqual(const TopoDS_Shape& S1, -- const TopoDS_Shape& S2) -- { -- return S1.IsSame(S2); -+ size_t operator()(const TopoDS_Shape& S) const noexcept { -+ return std::hash{}(S); - } -- static inline Standard_Integer HashCode(const TopoDS_Shape& S, -- const Standard_Integer Upper) -- { -- return ::HashCode( S, Upper); -+ size_t operator()(const TopoDS_Shape& S1, const TopoDS_Shape& S2) const noexcept { -+ return S1.IsSame(S2); - } - }; -- -+#else -+struct SMESHDS_Hasher -+{ -+static inline Standard_Boolean IsEqual(const TopoDS_Shape& S1, -+ const TopoDS_Shape& S2) -+{ -+ return S1.IsSame(S2); -+} -+static inline Standard_Integer HashCode(const TopoDS_Shape& S, -+ const Standard_Integer Upper) -+{ -+ return ::HashCode( S, Upper); -+} -+}; -+#endif - - #endif -diff --color -rupN a/src/3rdParty/salomesmesh/inc/SMESH_MeshVSLink.hxx b/src/3rdParty/salomesmesh/inc/SMESH_MeshVSLink.hxx ---- a/src/3rdParty/salomesmesh/inc/SMESH_MeshVSLink.hxx 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/inc/SMESH_MeshVSLink.hxx 2024-02-27 15:00:48.248873883 +0100 -@@ -57,9 +57,6 @@ - #ifndef _MeshVS_EntityType_HeaderFile - #include - #endif --#ifndef _Standard_Address_HeaderFile --#include --#endif - #ifndef _TColStd_HArray1OfInteger_HeaderFile - #include - #endif -diff --color -rupN a/src/3rdParty/salomesmesh/inc/SMESH_SMESH.hxx b/src/3rdParty/salomesmesh/inc/SMESH_SMESH.hxx ---- a/src/3rdParty/salomesmesh/inc/SMESH_SMESH.hxx 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/inc/SMESH_SMESH.hxx 2024-02-27 15:00:48.248873883 +0100 -@@ -37,4 +37,5 @@ - #define SMESH_EXPORT - #endif - -+#include - #endif -diff --color -rupN a/src/3rdParty/salomesmesh/inc/SMESH_SequenceOfNode.hxx b/src/3rdParty/salomesmesh/inc/SMESH_SequenceOfNode.hxx ---- a/src/3rdParty/salomesmesh/inc/SMESH_SequenceOfNode.hxx 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/inc/SMESH_SequenceOfNode.hxx 2024-02-27 15:00:48.252207183 +0100 -@@ -28,10 +28,11 @@ - - #include "SMESH_SMESH.hxx" - --#include - #if OCC_VERSION_HEX >= 0x060703 - #include - #include -+#else -+#include - #endif - - typedef const SMDS_MeshNode* SMDS_MeshNodePtr; -diff --color -rupN a/src/3rdParty/salomesmesh/inc/SMESH_TypeDefs.hxx b/src/3rdParty/salomesmesh/inc/SMESH_TypeDefs.hxx ---- a/src/3rdParty/salomesmesh/inc/SMESH_TypeDefs.hxx 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/inc/SMESH_TypeDefs.hxx 2024-02-27 15:00:48.252207183 +0100 -@@ -185,11 +185,18 @@ typedef std::vector< UVPtStruct > UVPtSt - - // -------------------------------------------------------------------------------- - // class SMESH_SequenceOfElemPtr -+#include -+#if OCC_VERSION_HEX >= 0x060703 -+#include -+#else - #include -+#endif - - class SMDS_MeshElement; - - typedef const SMDS_MeshElement* SMDS_MeshElementPtr; -+#define DEFINE_SEQUENCE(_ClassName_, _BaseCollection_, TheItemType) \ -+typedef NCollection_Sequence _ClassName_; - - DEFINE_SEQUENCE (SMESH_SequenceOfElemPtr, SMESH_BaseCollectionElemPtr, SMDS_MeshElementPtr) - -diff --color -rupN a/src/3rdParty/salomesmesh/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cpp b/src/3rdParty/salomesmesh/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cpp ---- a/src/3rdParty/salomesmesh/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -33,10 +33,33 @@ - #include "SMDS_MeshNode.hxx" - #include "SMESH_File.hxx" - -+#include -+ - namespace - { - struct Hasher - { -+#if OCC_VERSION_HEX >= 0x070800 -+ size_t operator()(const gp_Pnt& point) const noexcept -+ { -+ union -+ { -+ Standard_Real R[3]; -+ Standard_Integer I[6]; -+ } U; -+ -+ point.Coord( U.R[0], U.R[1], U.R[2] ); -+ return std::hash{}(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7); -+ } -+ -+ size_t operator()(const gp_Pnt& point1, const gp_Pnt& point2) const noexcept -+ { -+ static Standard_Real tab1[3], tab2[3]; -+ point1.Coord(tab1[0],tab1[1],tab1[2]); -+ point2.Coord(tab2[0],tab2[1],tab2[2]); -+ return (memcmp(tab1,tab2,sizeof(tab1)) == 0); -+ } -+#else - //======================================================================= - //function : HashCode - //purpose : -@@ -51,9 +74,9 @@ namespace - } U; - - point.Coord( U.R[0], U.R[1], U.R[2] ); -- -- return ::HashCode(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7,Upper); -+ return std::hash{}(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7); - } -+ - //======================================================================= - //function : IsEqual - //purpose : -@@ -66,7 +89,9 @@ namespace - point2.Coord(tab2[0],tab2[1],tab2[2]); - return (memcmp(tab1,tab2,sizeof(tab1)) == 0); - } -+#endif - }; -+ - typedef NCollection_DataMap TDataMapOfPntNodePtr; - - const int HEADER_SIZE = 84; -diff --color -rupN a/src/3rdParty/salomesmesh/src/StdMeshers/StdMeshers_Quadrangle_2D.cpp b/src/3rdParty/salomesmesh/src/StdMeshers/StdMeshers_Quadrangle_2D.cpp ---- a/src/3rdParty/salomesmesh/src/StdMeshers/StdMeshers_Quadrangle_2D.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/3rdParty/salomesmesh/src/StdMeshers/StdMeshers_Quadrangle_2D.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -48,7 +48,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Drawing/App/PreCompiled.h b/src/Mod/Drawing/App/PreCompiled.h ---- a/src/Mod/Drawing/App/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Drawing/App/PreCompiled.h 2024-02-27 15:00:48.252207183 +0100 -@@ -70,7 +70,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Drawing/Gui/TaskDialog.cpp b/src/Mod/Drawing/Gui/TaskDialog.cpp ---- a/src/Mod/Drawing/Gui/TaskDialog.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Drawing/Gui/TaskDialog.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -29,7 +29,6 @@ - #endif - - --#include - #include "TaskDialog.h" - #include - #include -diff --color -rupN a/src/Mod/Fem/Gui/PreCompiled.h b/src/Mod/Fem/Gui/PreCompiled.h ---- a/src/Mod/Fem/Gui/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Fem/Gui/PreCompiled.h 2024-02-27 15:00:48.252207183 +0100 -@@ -63,7 +63,6 @@ - #endif - - // OCC --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Fem/Gui/TaskCreateNodeSet.cpp b/src/Mod/Fem/Gui/TaskCreateNodeSet.cpp ---- a/src/Mod/Fem/Gui/TaskCreateNodeSet.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Fem/Gui/TaskCreateNodeSet.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -28,7 +28,6 @@ - - # include - # include --# include - #endif - - #include -diff --color -rupN a/src/Mod/Import/App/ImportOCAF.cpp b/src/Mod/Import/App/ImportOCAF.cpp ---- a/src/Mod/Import/App/ImportOCAF.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Import/App/ImportOCAF.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -165,7 +165,11 @@ void ImportOCAF::loadShapes(const TDF_La - std::vector localValue; - - if (aShapeTool->GetShape(label,aShape)) { -+#if OCC_VERSION_HEX >= 0x070800 -+ hash = std::hash{}(aShape); -+#else - hash = aShape.HashCode(HashUpper); -+#endif - } - - Handle(TDataStd_Name) name; -@@ -235,7 +239,11 @@ void ImportOCAF::loadShapes(const TDF_La - if (isRef || myRefShapes.find(hash) == myRefShapes.end()) { - TopoDS_Shape aShape; - if (isRef && aShapeTool->GetShape(label, aShape)) -+#if OCC_VERSION_HEX >= 0x070800 -+ myRefShapes.insert(std::hash{}(aShape)); -+#else - myRefShapes.insert(aShape.HashCode(HashUpper)); -+#endif - - if (aShapeTool->IsSimpleShape(label) && (isRef || aShapeTool->IsFree(label))) { - if (!asm_name.empty()) -@@ -565,7 +573,11 @@ void ImportXCAF::createShape(const TopoD - part->Label.setValue(default_name); - part->Shape.setValue(shape); - std::map::const_iterator jt; -+#if OCC_VERSION_HEX >= 0x070800 -+ jt = myColorMap.find(std::hash{}(shape)); -+#else - jt = myColorMap.find(shape.HashCode(INT_MAX)); -+#endif - - App::Color partColor(0.8f,0.8f,0.8f); - #if 0//TODO -@@ -586,7 +598,11 @@ void ImportXCAF::createShape(const TopoD - // set label name if defined - if (setname && !myNameMap.empty()) { - std::map::const_iterator jt; -+#if OCC_VERSION_HEX >= 0x070800 -+ jt = myNameMap.find(std::hash{}(shape)); -+#else - jt = myNameMap.find(shape.HashCode(INT_MAX)); -+#endif - if (jt != myNameMap.end()) { - part->Label.setValue(jt->second); - } -@@ -606,7 +622,11 @@ void ImportXCAF::createShape(const TopoD - faceColors.resize(faces.Extent(), partColor); - xp.Init(shape,TopAbs_FACE); - while (xp.More()) { -+#if OCC_VERSION_HEX >= 0x070800 -+ jt = myColorMap.find(std::hash{}(xp.Current())); -+#else - jt = myColorMap.find(xp.Current().HashCode(INT_MAX)); -+#endif - if (jt != myColorMap.end()) { - int index = faces.FindIndex(xp.Current()); - faceColors[index-1] = convertColor(jt->second); -@@ -641,23 +661,51 @@ void ImportXCAF::loadShapes(const TDF_La - // add the shapes - TopExp_Explorer xp; - for (xp.Init(aShape, TopAbs_SOLID); xp.More(); xp.Next(), ctSolids++) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->mySolids[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->mySolids[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - for (xp.Init(aShape, TopAbs_SHELL, TopAbs_SOLID); xp.More(); xp.Next(), ctShells++) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myShells[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myShells[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - // if no solids and no shells were found then go for compounds - if (ctSolids == 0 && ctShells == 0) { - for (xp.Init(aShape, TopAbs_COMPOUND); xp.More(); xp.Next(), ctComps++) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myCompds[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myCompds[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - } - if (ctComps == 0) { - for (xp.Init(aShape, TopAbs_FACE, TopAbs_SHELL); xp.More(); xp.Next()) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myShapes[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myShapes[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - for (xp.Init(aShape, TopAbs_WIRE, TopAbs_FACE); xp.More(); xp.Next()) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myShapes[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myShapes[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - for (xp.Init(aShape, TopAbs_EDGE, TopAbs_WIRE); xp.More(); xp.Next()) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myShapes[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myShapes[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - for (xp.Init(aShape, TopAbs_VERTEX, TopAbs_EDGE); xp.More(); xp.Next()) -+#if OCC_VERSION_HEX >= 0x070800 -+ this->myShapes[std::hash{}(xp.Current())] = (xp.Current()); -+#else - this->myShapes[xp.Current().HashCode(INT_MAX)] = (xp.Current()); -+#endif - } - } - -@@ -667,7 +715,11 @@ void ImportXCAF::loadShapes(const TDF_La - hColors->GetColor(label, XCAFDoc_ColorSurf, col) || - hColors->GetColor(label, XCAFDoc_ColorCurv, col)) { - // add defined color -+#if OCC_VERSION_HEX >= 0x070800 -+ myColorMap[std::hash{}(aShape)] = col; -+#else - myColorMap[aShape.HashCode(INT_MAX)] = col; -+#endif - } - else { - // http://www.opencascade.org/org/forum/thread_17107/ -@@ -677,7 +729,11 @@ void ImportXCAF::loadShapes(const TDF_La - hColors->GetColor(it.Value(), XCAFDoc_ColorSurf, col) || - hColors->GetColor(it.Value(), XCAFDoc_ColorCurv, col)) { - // add defined color -+#if OCC_VERSION_HEX >= 0x070800 -+ myColorMap[std::hash{}(it.Value())] = col; -+#else - myColorMap[it.Value().HashCode(INT_MAX)] = col; -+#endif - } - } - } -@@ -690,7 +746,11 @@ void ImportXCAF::loadShapes(const TDF_La - extstr.ToUTF8CString(str); - std::string labelName(str); - if (!labelName.empty()) -+#if OCC_VERSION_HEX >= 0x070800 -+ myNameMap[std::hash{}(aShape)] = labelName; -+#else - myNameMap[aShape.HashCode(INT_MAX)] = labelName; -+#endif - delete [] str; - } - -diff --color -rupN a/src/Mod/Import/App/ImportOCAF.h b/src/Mod/Import/App/ImportOCAF.h ---- a/src/Mod/Import/App/ImportOCAF.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Import/App/ImportOCAF.h 2024-02-27 15:00:48.252207183 +0100 -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Import/App/ImportOCAF2.h b/src/Mod/Import/App/ImportOCAF2.h ---- a/src/Mod/Import/App/ImportOCAF2.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Import/App/ImportOCAF2.h 2024-02-27 15:06:12.358890276 +0100 -@@ -27,7 +27,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -57,13 +56,21 @@ namespace Import { - - struct ShapeHasher { - std::size_t operator()(const TopoDS_Shape &s) const { -+#if OCC_VERSION_HEX >= 0x070800 -+ return std::hash{}(s); -+#else - return s.HashCode(INT_MAX); -+#endif - } - }; - - struct LabelHasher { - std::size_t operator()(const TDF_Label &l) const { -+#if OCC_VERSION_HEX >= 0x070800 -+ return std::hash {}(l); -+#else - return TDF_LabelMapHasher::HashCode(l,INT_MAX); -+#endif - } - }; - -diff --color -rupN a/src/Mod/MeshPart/App/CurveProjector.h b/src/Mod/MeshPart/App/CurveProjector.h ---- a/src/Mod/MeshPart/App/CurveProjector.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/MeshPart/App/CurveProjector.h 2024-02-27 15:00:48.252207183 +0100 -@@ -20,6 +20,7 @@ - * * - ***************************************************************************/ - -+#include - - #ifndef _CurveProjector_h_ - #define _CurveProjector_h_ -@@ -64,8 +65,13 @@ public: - - template - struct TopoDSLess { -- bool operator()(const T& x, const T& y) const { -- return x.HashCode(INT_MAX-1) < y.HashCode(INT_MAX-1); -+ bool operator()(const T& x, const T& y) const { -+#if OCC_VERSION_HEX >= 0x070800 -+ std::hash hasher; -+ return hasher(x) < hasher(y); -+#else -+ return x.HashCode(INT_MAX-1) < y.HashCode(INT_MAX-1); -+#endif - } - }; - -diff --color -rupN a/src/Mod/MeshPart/App/PreCompiled.h b/src/Mod/MeshPart/App/PreCompiled.h ---- a/src/Mod/MeshPart/App/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/MeshPart/App/PreCompiled.h 2024-02-27 15:00:48.252207183 +0100 -@@ -76,7 +76,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/MeshPart/Gui/CrossSections.cpp b/src/Mod/MeshPart/Gui/CrossSections.cpp ---- a/src/Mod/MeshPart/Gui/CrossSections.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/MeshPart/Gui/CrossSections.cpp 2024-02-27 15:00:48.252207183 +0100 -@@ -24,7 +24,6 @@ - #include "PreCompiled.h" - #ifndef _PreComp_ - # include --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Part/App/ImportStep.cpp b/src/Mod/Part/App/ImportStep.cpp ---- a/src/Mod/Part/App/ImportStep.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/App/ImportStep.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -167,7 +167,12 @@ int Part::ImportStepParts(App::Document - // This is a trick to access the GUI via Python and set the color property - // of the associated view provider. If no GUI is up an exception is thrown - // and cleared immediately -+#if OCC_VERSION_HEX >= 0x070800 -+ std::hash hasher; -+ std::map::iterator it = hash_col.find(hasher(aSolid)); -+#else - std::map::iterator it = hash_col.find(aSolid.HashCode(INT_MAX)); -+#endif - if (it != hash_col.end()) { - try { - Py::Object obj(pcFeature->getPyObject(), true); -diff --color -rupN a/src/Mod/Part/App/OCCError.h b/src/Mod/Part/App/OCCError.h ---- a/src/Mod/Part/App/OCCError.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/App/OCCError.h 2024-02-27 15:00:48.255540482 +0100 -@@ -50,7 +50,6 @@ - # include - # include - # include --# include - # include - # include - -diff --color -rupN a/src/Mod/Part/App/OpenCascadeAll.h b/src/Mod/Part/App/OpenCascadeAll.h ---- a/src/Mod/Part/App/OpenCascadeAll.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/App/OpenCascadeAll.h 2024-02-27 15:00:48.255540482 +0100 -@@ -49,7 +49,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp ---- a/src/Mod/Part/App/TopoShapePyImp.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/App/TopoShapePyImp.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -1321,7 +1321,11 @@ PyObject* TopoShapePy::ancestorsOfType( - TopTools_ListIteratorOfListOfShape it(ancestors); - for (; it.More(); it.Next()) { - // make sure to avoid duplicates -+#if OCC_VERSION_HEX >= 0x070800 -+ const size_t code = std::hash{}(static_cast(it.Value())); -+#else - Standard_Integer code = it.Value().HashCode(INT_MAX); -+#endif - if (hashes.find(code) == hashes.end()) { - list.append(shape2pyshape(it.Value())); - hashes.insert(code); -@@ -1943,7 +1947,11 @@ PyObject* TopoShapePy::hashCode(PyObject - if (!PyArg_ParseTuple(args, "|i",&upper)) - return nullptr; - -+#if OCC_VERSION_HEX >= 0x070800 -+ int hc = std::hash{}(getTopoShapePtr()->getShape()); -+#else - int hc = getTopoShapePtr()->getShape().HashCode(upper); -+#endif - return Py_BuildValue("i", hc); - } - -diff --color -rupN a/src/Mod/Part/Gui/AppPartGui.cpp b/src/Mod/Part/Gui/AppPartGui.cpp ---- a/src/Mod/Part/Gui/AppPartGui.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/AppPartGui.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -11,9 +11,6 @@ - - - #include "PreCompiled.h" --#ifndef _PreComp_ --# include --#endif - - #include - #include -diff --color -rupN a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp ---- a/src/Mod/Part/Gui/Command.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/Command.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -26,7 +26,6 @@ - # include - # include - # include --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Part/Gui/CommandSimple.cpp b/src/Mod/Part/Gui/CommandSimple.cpp ---- a/src/Mod/Part/Gui/CommandSimple.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/CommandSimple.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -22,9 +22,6 @@ - - - #include "PreCompiled.h" --#ifndef _PreComp_ --# include --#endif - - #include - #include -diff --color -rupN a/src/Mod/Part/Gui/CrossSections.cpp b/src/Mod/Part/Gui/CrossSections.cpp ---- a/src/Mod/Part/Gui/CrossSections.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/CrossSections.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -23,7 +23,6 @@ - - #include "PreCompiled.h" - #ifndef _PreComp_ --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Part/Gui/ViewProvider2DObject.cpp b/src/Mod/Part/Gui/ViewProvider2DObject.cpp ---- a/src/Mod/Part/Gui/ViewProvider2DObject.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProvider2DObject.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -26,8 +26,6 @@ - #ifndef _PreComp_ - # include - --# include -- - # include - # include - # include -diff --color -rupN a/src/Mod/Part/Gui/ViewProviderExt.cpp b/src/Mod/Part/Gui/ViewProviderExt.cpp ---- a/src/Mod/Part/Gui/ViewProviderExt.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProviderExt.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -978,7 +978,11 @@ void ViewProviderPartExt::updateVisual() - - TopExp_Explorer xp; - for (xp.Init(faceMap(i),TopAbs_EDGE);xp.More();xp.Next()) -+#if OCC_VERSION_HEX >= 0x070800 -+ faceEdges.insert(std::hash{}(xp.Current())); -+#else - faceEdges.insert(xp.Current().HashCode(INT_MAX)); -+#endif - numFaces++; - } - -@@ -1006,7 +1010,11 @@ void ViewProviderPartExt::updateVisual() - // So, we have to store the hashes of the edges associated to a face. - // If the hash of a given edge is not in this list we know it's really - // a free edge. -+#if OCC_VERSION_HEX >= 0x070800 -+ int hash = std::hash{}(aEdge); -+#else - int hash = aEdge.HashCode(INT_MAX); -+#endif - if (faceEdges.find(hash) == faceEdges.end()) { - Handle(Poly_Polygon3D) aPoly = Part::Tools::polygonOfEdge(aEdge, aLoc); - if (!aPoly.IsNull()) { -@@ -1205,7 +1213,11 @@ void ViewProviderPartExt::updateVisual() - TopLoc_Location aLoc; - - // handling of the free edge that are not associated to a face -+#if OCC_VERSION_HEX >= 0x070800 -+ int hash = std::hash{}(aEdge); -+#else - int hash = aEdge.HashCode(INT_MAX); -+#endif - if (faceEdges.find(hash) == faceEdges.end()) { - Handle(Poly_Polygon3D) aPoly = Part::Tools::polygonOfEdge(aEdge, aLoc); - if (!aPoly.IsNull()) { -diff --color -rupN a/src/Mod/Part/Gui/ViewProviderExt.h b/src/Mod/Part/Gui/ViewProviderExt.h ---- a/src/Mod/Part/Gui/ViewProviderExt.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProviderExt.h 2024-02-27 15:00:48.255540482 +0100 -@@ -24,7 +24,6 @@ - #ifndef PARTGUI_VIEWPROVIDERPARTEXT_H - #define PARTGUI_VIEWPROVIDERPARTEXT_H - --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Part/Gui/ViewProviderMirror.cpp b/src/Mod/Part/Gui/ViewProviderMirror.cpp ---- a/src/Mod/Part/Gui/ViewProviderMirror.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProviderMirror.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -27,7 +27,6 @@ - # include - # include - # include --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Part/Gui/ViewProviderPython.cpp b/src/Mod/Part/Gui/ViewProviderPython.cpp ---- a/src/Mod/Part/Gui/ViewProviderPython.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProviderPython.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -23,7 +23,6 @@ - - #include "PreCompiled.h" - --#include - #ifndef _PreComp_ - # include - #endif -diff --color -rupN a/src/Mod/Part/Gui/ViewProviderReference.h b/src/Mod/Part/Gui/ViewProviderReference.h ---- a/src/Mod/Part/Gui/ViewProviderReference.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Part/Gui/ViewProviderReference.h 2024-02-27 15:00:48.255540482 +0100 -@@ -24,7 +24,6 @@ - #ifndef PARTGUI_ViewProviderPartReference_H - #define PARTGUI_ViewProviderPartReference_H - --#include - #include - #include - #include -diff --color -rupN a/src/Mod/PartDesign/Gui/PreCompiled.h b/src/Mod/PartDesign/Gui/PreCompiled.h ---- a/src/Mod/PartDesign/Gui/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/PartDesign/Gui/PreCompiled.h 2024-02-27 15:00:48.255540482 +0100 -@@ -44,7 +44,6 @@ - #include - - // OCC --#include - #include - #include - #include -diff --color -rupN a/src/Mod/Path/App/Voronoi.cpp b/src/Mod/Path/App/Voronoi.cpp ---- a/src/Mod/Path/App/Voronoi.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Path/App/Voronoi.cpp 2024-02-27 15:00:48.255540482 +0100 -@@ -23,10 +23,6 @@ - - #include "PreCompiled.h" - --#ifndef _PreComp_ --# include --#endif -- - #include - - #include "Voronoi.h" -diff --color -rupN a/src/Mod/Path/Gui/PreCompiled.h b/src/Mod/Path/Gui/PreCompiled.h ---- a/src/Mod/Path/Gui/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Path/Gui/PreCompiled.h 2024-02-27 15:00:48.258873781 +0100 -@@ -38,8 +38,6 @@ - # define PathGuiExport - #endif - --#include -- - #ifdef _MSC_VER - # pragma warning( disable : 4273 ) - #endif -diff --color -rupN a/src/Mod/Robot/Gui/PreCompiled.h b/src/Mod/Robot/Gui/PreCompiled.h ---- a/src/Mod/Robot/Gui/PreCompiled.h 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Robot/Gui/PreCompiled.h 2024-02-27 15:00:48.258873781 +0100 -@@ -39,8 +39,6 @@ - # define RobotGuiExport - #endif - --#include -- - #ifdef _MSC_VER - # pragma warning(disable : 4005) - # pragma warning(disable : 4273) -diff --color -rupN a/src/Mod/Sandbox/Gui/AppSandboxGui.cpp b/src/Mod/Sandbox/Gui/AppSandboxGui.cpp ---- a/src/Mod/Sandbox/Gui/AppSandboxGui.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sandbox/Gui/AppSandboxGui.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -24,7 +24,6 @@ - #include "PreCompiled.h" - #ifndef _PreComp_ - # include --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Sketcher/App/SketchAnalysis.cpp b/src/Mod/Sketcher/App/SketchAnalysis.cpp ---- a/src/Mod/Sketcher/App/SketchAnalysis.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/App/SketchAnalysis.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -25,7 +25,6 @@ - #include "PreCompiled.h" - - #ifndef _PreComp_ --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp ---- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -24,7 +24,6 @@ - #include "PreCompiled.h" - - #ifndef _PreComp_ --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Sketcher/Gui/EditDatumDialog.cpp b/src/Mod/Sketcher/Gui/EditDatumDialog.cpp ---- a/src/Mod/Sketcher/Gui/EditDatumDialog.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/Gui/EditDatumDialog.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -23,7 +23,6 @@ - #include "PreCompiled.h" - - #ifndef _PreComp_ --# include - /// Qt Include Files - # include - # include -diff --color -rupN a/src/Mod/Sketcher/Gui/TaskSketcherValidation.cpp b/src/Mod/Sketcher/Gui/TaskSketcherValidation.cpp ---- a/src/Mod/Sketcher/Gui/TaskSketcherValidation.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/Gui/TaskSketcherValidation.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -24,7 +24,6 @@ - #include "PreCompiled.h" - - #ifndef _PreComp_ --# include - # include - # include - # include -diff --color -rupN a/src/Mod/Sketcher/Gui/ViewProviderPython.cpp b/src/Mod/Sketcher/Gui/ViewProviderPython.cpp ---- a/src/Mod/Sketcher/Gui/ViewProviderPython.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/Gui/ViewProviderPython.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -23,7 +23,6 @@ - - #include "PreCompiled.h" - --#include - #ifndef _PreComp_ - # include - #endif -diff --color -rupN a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp ---- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -24,7 +24,6 @@ - #include "PreCompiled.h" - - #ifndef _PreComp_ --# include - - # include - # include -diff --color -rupN a/src/Mod/Surface/Gui/Command.cpp b/src/Mod/Surface/Gui/Command.cpp ---- a/src/Mod/Surface/Gui/Command.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/Surface/Gui/Command.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -31,7 +31,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --color -rupN a/src/Mod/TechDraw/Gui/TaskProjection.cpp b/src/Mod/TechDraw/Gui/TaskProjection.cpp ---- a/src/Mod/TechDraw/Gui/TaskProjection.cpp 2022-12-07 03:35:37.000000000 +0100 -+++ b/src/Mod/TechDraw/Gui/TaskProjection.cpp 2024-02-27 15:00:48.258873781 +0100 -@@ -29,9 +29,6 @@ - # include - #endif - -- --#include -- - #include - #include - #include diff --git a/user/freecad/resourceDirectory.patch b/user/freecad/resourceDirectory.patch deleted file mode 100644 index a2a16d1..0000000 --- a/user/freecad/resourceDirectory.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./cMake/FreeCAD_Helpers/ConfigureCMakeVariables.cmake.orig -+++ ./cMake/FreeCAD_Helpers/ConfigureCMakeVariables.cmake -@@ -23,7 +23,7 @@ - "Path to the directory containing PyCXX's cxxextensions.c source file") - - # used as compiler defines -- set(RESOURCEDIR "${CMAKE_INSTALL_DATADIR}") -+ set(RESOURCEDIR "../../share/freecad") - set(LIBRARYDIR "${CMAKE_INSTALL_LIBDIR}") - set(DOCDIR "${CMAKE_INSTALL_DOCDIR}") - diff --git a/user/freecad/tests.patch b/user/freecad/tests.patch deleted file mode 100644 index 4b63a20..0000000 --- a/user/freecad/tests.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- ./src/Mod/Mesh/App/MeshTestsApp.py.orig -+++ ./src/Mod/Mesh/App/MeshTestsApp.py -@@ -423,30 +423,6 @@ - self.planarMesh = [] - FreeCAD.newDocument("MeshTest") - -- def testRayPick(self): -- if not FreeCAD.GuiUp: -- return -- self.planarMesh.append( [-16.097176,-29.891157,15.987688] ) -- self.planarMesh.append( [-16.176304,-29.859991,15.947966] ) -- self.planarMesh.append( [-16.071451,-29.900553,15.912505] ) -- self.planarMesh.append( [-16.092241,-29.893408,16.020439] ) -- self.planarMesh.append( [-16.007210,-29.926180,15.967641] ) -- self.planarMesh.append( [-16.064457,-29.904951,16.090832] ) -- planarMeshObject = Mesh.Mesh(self.planarMesh) -- -- from pivy import coin; import FreeCADGui -- Mesh.show(planarMeshObject) -- view=FreeCADGui.ActiveDocument.ActiveView.getViewer() -- rp=coin.SoRayPickAction(view.getSoRenderManager().getViewportRegion()) -- rp.setRay(coin.SbVec3f(-16.05,16.0,16.0),coin.SbVec3f(0,-1,0)) -- rp.apply(view.getSoRenderManager().getSceneGraph()) -- pp=rp.getPickedPoint() -- self.assertTrue(pp != None) -- det=pp.getDetail() -- self.assertTrue(det.getTypeId() == coin.SoFaceDetail.getClassTypeId()) -- det=coin.cast(det, det.getTypeId().getName().getString()) -- self.assertTrue(det.getFaceIndex() == 1) -- - def testPrimitiveCount(self): - if not FreeCAD.GuiUp: - return From ab89660806ecf36a69d1160d64dc2efc36556270 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:16:38 -0400 Subject: [PATCH 172/313] user/sane: drop due to in community --- user/sane/APKBUILD | 163 ------------------ user/sane/check.patch | 11 -- user/sane/include.patch | 11 -- user/sane/pidfile.patch | 11 -- user/sane/sane-backends-no-avahi-thread.patch | 48 ------ user/sane/sane-saned.pre-install | 5 - user/sane/sane.pre-install | 5 - user/sane/saned.initd | 14 -- 8 files changed, 268 deletions(-) delete mode 100644 user/sane/APKBUILD delete mode 100644 user/sane/check.patch delete mode 100644 user/sane/include.patch delete mode 100644 user/sane/pidfile.patch delete mode 100644 user/sane/sane-backends-no-avahi-thread.patch delete mode 100644 user/sane/sane-saned.pre-install delete mode 100644 user/sane/sane.pre-install delete mode 100644 user/sane/saned.initd diff --git a/user/sane/APKBUILD b/user/sane/APKBUILD deleted file mode 100644 index 62a8a34..0000000 --- a/user/sane/APKBUILD +++ /dev/null @@ -1,163 +0,0 @@ -# Contributor: Fabio Riga -# Contributor: Valery Kartel -# Maintainer: Valery Kartel -pkgname=sane -_pkgname=sane-backends -pkgver=1.1.1 -pkgrel=3 -pkgdesc="Scanner Access Now Easy - universal scanner interface" -url="http://www.sane-project.org/" -# FTBFS -# arch="all" -license="GPL-2.0-or-later GPL-2.0-or-later-with-sane-exception Public-Domain" -makedepends="diffutils file libtool libusb-dev v4l-utils-dev net-snmp-dev - avahi-dev curl-dev libpng-dev libjpeg-turbo-dev tiff-dev libgphoto2-dev - poppler-dev linux-headers libieee1284-dev libxml2-dev" -install="$pkgname-saned.pre-install $pkgname.pre-install" -pkgusers="saned" -pkggroups="scanner" -_backends="abaton agfafocus apple artec artec_eplus48u as6e avision bh canon - canon630u canon_dr canon_pp cardscan coolscan coolscan2 coolscan3 dc25 - dc210 dc240 dell1600n_net dmc epjitsu epson epson2 epsonds escl fujitsu - genesys gphoto2 gt68xx hp hp3500 hp3900 hp4200 hp5400 hp5590 hpsj5s - hpljm1005 hs2p ibm kodak kodakaio kvs1025 kvs20xx kvs40xx leo lexmark - ma1509 magicolor matsushita microtek microtek2 mustek mustek_pp mustek_usb - mustek_usb2 nec net niash p5 pie pieusb pixma plustek plustek_pp ricoh ricoh2 - rts8891 s9036 sceptre sharp sm3600 sm3840 snapscan sp15c st400 stv680 - tamarack teco1 teco2 teco3 test u12 umax umax_pp umax1220u v4l - xerox_mfp" - -case "$CARCH" in - x86) - options="$options !check" - _backends="$_backends qcam canon_lide70" - ;; - x86_64) - _backends="$_backends qcam canon_lide70" - ;; -esac - -_pkgdesc_dell1600n_net="SANE backend for Dell 1600n that supports colour and monochrome scans over ethernet, usb not supported" -for _backend in $_backends; do - subpackages="$subpackages $pkgname-backend-$_backend:_backend" -done -subpackages="$pkgname-doc $pkgname-dev $subpackages $pkgname-utils $pkgname-saned - $pkgname-udev::noarch $_pkgname::noarch" -source="https://gitlab.com/sane-project/backends/uploads/7d30fab4e115029d91027b6a58d64b43/sane-backends-$pkgver.tar.gz - $pkgname-fix-tests.patch::https://gitlab.com/sane-project/backends/-/commit/edfc90450ee06149537fadb3095ba4b215c5c4fa.patch - saned.initd - include.patch - pidfile.patch - check.patch - sane-backends-no-avahi-thread.patch - " -builddir="$srcdir"/$_pkgname-$pkgver - -# secfixes: -# 1.0.30-r0: -# - CVE-2020-12861 -# - CVE-2020-12862 -# - CVE-2020-12863 -# - CVE-2020-12864 -# - CVE-2020-12865 -# - CVE-2020-12866 -# - CVE-2020-12867 - -build() { - ./configure \ - --prefix=/usr \ - --sysconfdir=/etc \ - --with-docdir=/usr/share/doc/$pkgname \ - --with-usb \ - --enable-avahi \ - --disable-rpath \ - --disable-locking - make -} - -check() { - make check -} - -package() { - make DESTDIR="$pkgdir" install - echo -n "" > "$pkgdir"/etc/$pkgname.d/dll.conf - install -Dm644 backend/dll.aliases "$pkgdir"/etc/$pkgname.d/dll.aliases -} - -doc() { - default_doc - mkdir -p "$subpkgdir"/usr/share/licenses/$_pkgname - mv "$subpkgdir"/usr/share/doc/$_pkgname/LICENSE \ - "$subpkgdir"/usr/share/licenses/$_pkgname -} - -saned() { - local name=${subpkgname#$pkgname-} - pkgdesc="$pkgdesc (network scanner server)" - mkdir -p "$subpkgdir"/etc/$pkgname.d "$subpkgdir"/usr - mv "$pkgdir"/etc/$pkgname.d/$name.conf "$subpkgdir"/etc/$pkgname.d - mv "$pkgdir"/usr/sbin "$subpkgdir"/usr/ - install -Dm755 "$srcdir"/$name.initd "$subpkgdir"/etc/init.d/$name -} - -utils() { - pkgdesc="$pkgdesc (utilities)" - mkdir -p "$subpkgdir"/usr - mv "$pkgdir"/usr/bin "$subpkgdir"/usr - rm -fr "$pkgdir"/usr/share -} - -udev() { - pkgdesc="$pkgdesc (udev rules)" - install_if="$pkgname=$pkgver-r$pkgrel udev" - install -Dm644 "$builddir"/tools/udev/lib$pkgname.rules \ - "$subpkgdir"/usr/lib/udev/rules.d/49-$pkgname.rules - sed -i 's|NAME="%k", ||g' "$subpkgdir"/usr/lib/udev/rules.d/49-$pkgname.rules -} - -backends() { - local _backend; - pkgdesc="$pkgdesc (metapackage)" - depends="$pkgname-utils $pkgname-saned" - for _backend in $_backends; do - [ "$_backend" = "test" ] && continue - depends="$depends $pkgname-backend-$_backend" - done - mkdir -p "$subpkgdir" -} - -_backend() { - local name=${subpkgname#$pkgname-backend-} - depends="$pkgname" - pkgdesc=$(eval echo \$_pkgdesc_$name) - if [ ! "$pkgdesc" ]; then - # cut description from man-page - pkgdesc=$(tr '\n' ' ' < "$builddir"/doc/$pkgname-$name.man) - pkgdesc=${pkgdesc#*\- } - pkgdesc=${pkgdesc%% .SH *}; - fi - mkdir -p "$subpkgdir"/usr/lib/$pkgname \ - "$subpkgdir"/etc/$pkgname.d/dll.d - mv "$pkgdir"/usr/lib/$pkgname/lib$pkgname-$name.* \ - "$subpkgdir"/usr/lib/$pkgname - echo "$name" > "$subpkgdir"/etc/$pkgname.d/dll.d/$name - if [ -f "$pkgdir"/etc/$pkgname.d/$name.conf ]; then - mv "$pkgdir"/etc/$pkgname.d/$name.conf \ - "$subpkgdir"/etc/$pkgname.d - fi - if [ -f "$pkgdir"/usr/bin/$name ]; then - mkdir -p "$subpkgdir"/usr/bin - mv "$pkgdir"/usr/bin/$name "$subpkgdir"/usr/bin - fi -} - -sha512sums=" -25bd9f90d550cfe6a6d01c48e83716a53f4b0e3a294287e455ecb5e5b80c8fe1699f45c6c87f694475cceb85745c70597e18a7b1094669d5091c5fb183dfe94d sane-backends-1.1.1.tar.gz -f4187409a85dbdb95213948fcc1bb34cf319a3a5ae34093d1e9e7983dfc89336c75132713e6f3113ad7ef2b0ed78bdc0c6e031796fca7004787776f46c742ec6 sane-fix-tests.patch -0a06eaa28b345202f2bdf8361e06f843bb7a010b7d8f80132f742672c94249c43f64031cefa161e415e2e2ab3a53b23070fb63854283f9e040f5ff79394ac7d1 saned.initd -1779ff8beb1ba5f9238c25d819a7f0045f7e257c19b511315feb85650e445ca86450a9e1d7ff8650499d3dae808589a6c2e358d5f3f39a3f40ce4999179b86d6 include.patch -09505943f9441854a6c333f19e2535b4a646a8cc060fe82c6261e7d29c72773ebe98d43a91acc951f4336a3c8b4c84ab7c7b0763426136b4b59d9546bc2fa8c0 pidfile.patch -cfa327209efd9a2a2db7cbcf571852959823aaa19b43d5f6415834cd5ae38b6324ecae16779f6f896aa0d7ac890fe23244100b7d6a68e5e9d52cd38ec82bfac8 check.patch -6e6b6336203ee6d1ac96ed2d742e181fb65e8d93386b76d70b6359afbcce98343d89ec8b2b611261f79901779a2999f9262c3f85898bd15c74b00348e0cd3cd7 sane-backends-no-avahi-thread.patch -" diff --git a/user/sane/check.patch b/user/sane/check.patch deleted file mode 100644 index afbc7ef..0000000 --- a/user/sane/check.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/testsuite/sanei/Makefile.in -+++ b/testsuite/sanei/Makefile.in -@@ -77,7 +77,7 @@ - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --check_PROGRAMS = sanei_usb_test$(EXEEXT) test_wire$(EXEEXT) \ -+check_PROGRAMS = test_wire$(EXEEXT) \ - sanei_check_test$(EXEEXT) sanei_config_test$(EXEEXT) \ - sanei_constrain_test$(EXEEXT) - subdir = testsuite/sanei diff --git a/user/sane/include.patch b/user/sane/include.patch deleted file mode 100644 index 518d3b4..0000000 --- a/user/sane/include.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/include/sane/sane.h -+++ b/include/sane/sane.h -@@ -16,6 +16,8 @@ - #ifndef sane_h - #define sane_h - -+#include -+ - #ifdef __cplusplus - extern "C" { - #endif diff --git a/user/sane/pidfile.patch b/user/sane/pidfile.patch deleted file mode 100644 index 457755b..0000000 --- a/user/sane/pidfile.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/frontend/saned.c -+++ b/frontend/saned.c -@@ -224,7 +224,7 @@ - int numchildren; - - #define SANED_CONFIG_FILE "saned.conf" --#define SANED_PID_FILE "/var/run/saned.pid" -+#define SANED_PID_FILE "/run/saned/saned.pid" - - #define SANED_SERVICE_NAME "sane-port" - #define SANED_SERVICE_PORT 6566 diff --git a/user/sane/sane-backends-no-avahi-thread.patch b/user/sane/sane-backends-no-avahi-thread.patch deleted file mode 100644 index 149a305..0000000 --- a/user/sane/sane-backends-no-avahi-thread.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff --git a/backend/net.c.orig b/backend/net.c -index 7c4aae9..0adfbc2 100644 ---- a/backend/net.c.orig -+++ b/backend/net.c -@@ -1043,12 +1043,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) - continue; - } - #if WITH_AVAHI -- avahi_threaded_poll_lock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_lock (avahi_thread); - #endif /* WITH_AVAHI */ - DBG (2, "sane_init: trying to add %s\n", device_name); - add_device (device_name, 0); - #if WITH_AVAHI -- avahi_threaded_poll_unlock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_unlock (avahi_thread); - #endif /* WITH_AVAHI */ - } - -@@ -1094,12 +1094,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) - continue; - #endif /* ENABLE_IPV6 */ - #if WITH_AVAHI -- avahi_threaded_poll_lock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_lock (avahi_thread); - #endif /* WITH_AVAHI */ - DBG (2, "sane_init: trying to add %s\n", host); - add_device (host, 0); - #if WITH_AVAHI -- avahi_threaded_poll_unlock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_unlock (avahi_thread); - #endif /* WITH_AVAHI */ - } - free (copy); -@@ -1517,11 +1517,11 @@ sane_open (SANE_String_Const full_name, SANE_Handle * meta_handle) - "sane_open: device %s not found, trying to register it anyway\n", - nd_name); - #if WITH_AVAHI -- avahi_threaded_poll_lock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_lock (avahi_thread); - #endif /* WITH_AVAHI */ - status = add_device (nd_name, &dev); - #if WITH_AVAHI -- avahi_threaded_poll_unlock (avahi_thread); -+ if(avahi_thread) avahi_threaded_poll_unlock (avahi_thread); - #endif /* WITH_AVAHI */ - if (status != SANE_STATUS_GOOD) - { diff --git a/user/sane/sane-saned.pre-install b/user/sane/sane-saned.pre-install deleted file mode 100644 index caad990..0000000 --- a/user/sane/sane-saned.pre-install +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -adduser -SDH -h /run/saned -s /sbin/nologin -G scanner -g saned saned 2>/dev/null - -exit 0 diff --git a/user/sane/sane.pre-install b/user/sane/sane.pre-install deleted file mode 100644 index b75c867..0000000 --- a/user/sane/sane.pre-install +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -addgroup -S scanner 2>/dev/null - -exit 0 diff --git a/user/sane/saned.initd b/user/sane/saned.initd deleted file mode 100644 index 6482073..0000000 --- a/user/sane/saned.initd +++ /dev/null @@ -1,14 +0,0 @@ -#!/sbin/openrc-run - -description="SANE network scanner server" - -owner=saned -pidfile=/run/saned/saned.pid -cfgfile=/etc/sane.d/saned.conf -command=/usr/sbin/saned -command_args="-a $owner" -required_files="$cfgfile" - -start_pre() { - checkpath -dm755 -o $owner ${pidfile%/*} -} From ea32d2af8eec861491381aa7565260f9178dd631 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:18:39 -0400 Subject: [PATCH 173/313] backports/thelounge: move from user, upgrade to 4.4.3 --- backports/thelounge/APKBUILD | 83 +++++++++++++++++++ .../allow-https-for-connect-src.patch | 0 .../thelounge/no-version-test.patch | 0 backports/thelounge/thelounge.confd | 9 ++ backports/thelounge/thelounge.initd | 34 ++++++++ backports/thelounge/thelounge.post-install | 10 +++ backports/thelounge/thelounge.pre-install | 6 ++ user/thelounge/APKBUILD | 83 ------------------- user/thelounge/thelounge.initd | 14 ---- user/thelounge/thelounge.post-install | 13 --- user/thelounge/thelounge.pre-install | 6 -- 11 files changed, 142 insertions(+), 116 deletions(-) create mode 100644 backports/thelounge/APKBUILD rename {user => backports}/thelounge/allow-https-for-connect-src.patch (100%) rename {user => backports}/thelounge/no-version-test.patch (100%) create mode 100644 backports/thelounge/thelounge.confd create mode 100644 backports/thelounge/thelounge.initd create mode 100644 backports/thelounge/thelounge.post-install create mode 100644 backports/thelounge/thelounge.pre-install delete mode 100644 user/thelounge/APKBUILD delete mode 100644 user/thelounge/thelounge.initd delete mode 100644 user/thelounge/thelounge.post-install delete mode 100644 user/thelounge/thelounge.pre-install diff --git a/backports/thelounge/APKBUILD b/backports/thelounge/APKBUILD new file mode 100644 index 0000000..bc0de04 --- /dev/null +++ b/backports/thelounge/APKBUILD @@ -0,0 +1,83 @@ +# Contributor: Kay Thomas +# Contributor: Fabricio Silva +# Maintainer: Fabricio Silva +pkgname=thelounge +pkgver=4.4.3 +pkgrel=0 +pkgdesc="Modern, responsive, cross-platform, self-hosted web IRC client" +url="https://thelounge.chat" +arch="all !riscv64" # riscv64 gets SIGILL +license="MIT" +depends="nodejs" +makedepends="yarn py3-setuptools" +subpackages="$pkgname-openrc $pkgname-doc" +install="$pkgname.pre-install $pkgname.post-install" +source=" + $pkgname-$pkgver.tar.gz::https://github.com/thelounge/thelounge/archive/v$pkgver.tar.gz + thelounge.initd + thelounge.confd + " +options="net" # net for npm + +case $CARCH in + # loongarch64: 2 tests failed on the builder + # 1) SQLite Message Storage: should retrieve latest LIMIT messages in order + # 2) SQLite Message Storage: should search messages + loongarch64) options="$options !check";; +esac + +prepare() { + default_prepare + + export BROWSERSLIST_IGNORE_OLD_DATA=true + # to build npm/sqlite3 from source + export npm_config_build_from_source=true + yarn install --frozen-lockfile +} + +build() { + NODE_ENV=production yarn build + + # these are the same file + ln -sf ../package.json ./dist/package.json + # set home location + echo "/var/lib/thelounge" >.thelounge_home +} + +check() { + # skips tests that checks if version is using "source" and "git sha" + yarn test:mocha --grep "\#getVersion" --invert +} + +package() { + # cleanup unused files (cant be done before check) + yarn install --production --ignore-scripts --prefer-offline + find ./ -type f \( \ + -iname "*.ts" -o -iname "*.map" -o -iname "*.md" -o -iname "*.sh" -o \ + -iname "babel.config*" -o -iname "webpack.config*" -o -iname "tsconfig*" \ + \) -delete + find ./node_modules -type f \( \ + -iname "Makefile*" -o -iname "README*" -o -iname "LICENSE*" -o -iname "CHANGELOG*" \ + \) -delete + find ./node_modules -type d \( \ + -iname "test" -o -iname "node-gyp" -o -iname ".github" \ + \) -prune -exec rm -rf {} \; + + install -dm755 "$pkgdir"/usr/share/webapps/thelounge + install -Dm755 index.js -t "$pkgdir"/usr/share/webapps/thelounge/ + install -Dm644 package.json .thelounge_home -t "$pkgdir"/usr/share/webapps/thelounge/ + install -Dm644 client/index.html.tpl -t "$pkgdir"/usr/share/webapps/thelounge/client/ + cp -a node_modules public dist "$pkgdir"/usr/share/webapps/thelounge/ + mkdir -p "$pkgdir"/usr/bin + ln -sf ../share/webapps/thelounge/index.js "$pkgdir"/usr/bin/thelounge + + install -Dm644 LICENSE -t "$pkgdir"/usr/share/licenses/thelounge/ + install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname + install -Dm755 "$srcdir"/$pkgname.confd "$pkgdir"/etc/conf.d/$pkgname +} + +sha512sums=" +d1a873b15b5ac003c59257c591030ebeb8810609ea646477cc319ddb82fa2842b0b71f3edfe60eb5b54749ed90d55074d5b82ab6312b55cccee8281057b425f2 thelounge-4.4.3.tar.gz +126913f79c3eda7c0e6f2f792ce8a799e2100259b62de57c97329f079072e3d8d81c5591b08b99630803c9e320c85c8e34ac7ffe2ddba7f2982a5ba958960789 thelounge.initd +2c44963a1e4303a6045b80df0931bb636150cb7b1f14d536c3624bb6dacfabfa08d7ea4e261e40245b80eedbb53a47fbf73672a02c865295300c5121fb83a558 thelounge.confd +" diff --git a/user/thelounge/allow-https-for-connect-src.patch b/backports/thelounge/allow-https-for-connect-src.patch similarity index 100% rename from user/thelounge/allow-https-for-connect-src.patch rename to backports/thelounge/allow-https-for-connect-src.patch diff --git a/user/thelounge/no-version-test.patch b/backports/thelounge/no-version-test.patch similarity index 100% rename from user/thelounge/no-version-test.patch rename to backports/thelounge/no-version-test.patch diff --git a/backports/thelounge/thelounge.confd b/backports/thelounge/thelounge.confd new file mode 100644 index 0000000..a7e59bd --- /dev/null +++ b/backports/thelounge/thelounge.confd @@ -0,0 +1,9 @@ +# thelounge configuration options + +command_user="thelounge:thelounge" # user:group +supervisor="supervise-daemon" +directory="/var/lib/thelounge" + +logdir="/var/log/thelounge" +output_log="$logdir/output.log" +error_log="$logdir/error.log" diff --git a/backports/thelounge/thelounge.initd b/backports/thelounge/thelounge.initd new file mode 100644 index 0000000..fc00ef8 --- /dev/null +++ b/backports/thelounge/thelounge.initd @@ -0,0 +1,34 @@ +#!/sbin/openrc-run + +# fallback values for /etc/conf.d/thelounge +: ${command_user:=thelounge:thelounge} +: ${directory:=/var/lib/thelounge} +: ${logdir:=/var/log/thelounge} + +name="thelounge" +command="/usr/bin/thelounge" +command_args="start" +command_background=true +pidfile="/run/thelounge.pid" + +depend() { + need net + use dns + after firewall +} + +start_pre() { + checkpath -d -o "$command_user" "$directory" + + if [ -n "$logdir" ]; then + checkpath -d -o "$command_user" "$logdir" + fi + + if [ -n "$output_log" ]; then + checkpath -f -o "$command_user" "$output_log" + fi + + if [ -n "$error_log" ]; then + checkpath -f -o "$command_user" "$error_log" + fi +} diff --git a/backports/thelounge/thelounge.post-install b/backports/thelounge/thelounge.post-install new file mode 100644 index 0000000..b08cddb --- /dev/null +++ b/backports/thelounge/thelounge.post-install @@ -0,0 +1,10 @@ +#!/bin/sh + +cat >&2 <<-EOF +* +* The configuration will be placed at /var/lib/thelounge/config.js after first run +* To add users, use the cli: doas -u thelounge thelounge add myuser +* +EOF + +exit 0 diff --git a/backports/thelounge/thelounge.pre-install b/backports/thelounge/thelounge.pre-install new file mode 100644 index 0000000..dd54b45 --- /dev/null +++ b/backports/thelounge/thelounge.pre-install @@ -0,0 +1,6 @@ +#!/bin/sh + +addgroup -S thelounge 2>/dev/null +adduser -S -D -h /var/lib/thelounge -s /sbin/nologin -G thelounge -g thelounge thelounge 2>/dev/null + +exit 0 diff --git a/user/thelounge/APKBUILD b/user/thelounge/APKBUILD deleted file mode 100644 index 7988787..0000000 --- a/user/thelounge/APKBUILD +++ /dev/null @@ -1,83 +0,0 @@ -# Contributor: Kay Thomas -# Maintainer: Kay Thomas -pkgname=thelounge -pkgver=4.4.1 -pkgrel=2 -pkgdesc="Modern, responsive, cross-platform, self-hosted web IRC client" -url="https://thelounge.chat" -# x86: textrels -# s390x: fails to check -# riscv64: fails to build -arch="all !x86 !s390x !riscv64" -license="MIT" -depends="nodejs" -makedepends="yarn npm python3" -subpackages="$pkgname-openrc" -pkgusers="thelounge" -pkggroups="thelounge" -install="$pkgname.pre-install $pkgname.post-install" -source="$pkgname-$pkgver.tar.gz::https://github.com/thelounge/thelounge/archive/v$pkgver.tar.gz - no-version-test.patch - thelounge.initd - allow-https-for-connect-src.patch - " -options="net" # npm - -prepare() { - default_prepare - - yarn install --frozen-lockfile -} - -build() { - NODE_ENV=production yarn run build -} - -check() { - CI=yes yarn run test:mocha -} - -package() { - yarn install --production --ignore-scripts --prefer-offline - NODE_ENV=production npm install --unsafe-perm -g --prefix "$pkgdir"/usr - - # Remove incorrect symlink, copy correct files - rm "$pkgdir"/usr/lib/node_modules/thelounge - mkdir -p "$pkgdir"/usr/lib/node_modules/thelounge - cp -a index.js client public node_modules dist package.json "$pkgdir"/usr/lib/node_modules/thelounge/ - - # cleanup unused files - find "$pkgdir" -type f -a \( \ - -name "*.ts" \ - -o -name "webpack*" \ - -o -name "tsconfig*" \ - -o -name "babel.config*" \ - -o -name "README*" \ - -o -name "CHANGELOG*" \ - -o -name "*.map" \ - -o -name "LICENSE" \ - \) \ - -delete - - # Set home location - echo /var/lib/thelounge > \ - "$pkgdir"/usr/lib/node_modules/$pkgname/.thelounge_home - - # Add default config - # this is only read from 'home' so we have to just put everything in var/lib - install -dm755 -o thelounge -g thelounge \ - "$pkgdir"/var/lib/thelounge - install -m644 -o thelounge -g thelounge \ - "$pkgdir"/usr/lib/node_modules/$pkgname/dist/defaults/config.js \ - "$pkgdir"/var/lib/thelounge/config.js - - install -Dm755 "$srcdir"/$pkgname.initd \ - "$pkgdir"/etc/init.d/$pkgname -} - -sha512sums=" -7695121a713a23688bc6f52dae2574bab1288eea930fd50d4dd85037233e9f23bd8e460980c69cdd14ea8648da4720d84e8196547b6a18e69d2f478b43d6e29a thelounge-4.4.1.tar.gz -cbf80e23b0af8f0185699d6b03816c645c51b85fff7f163d3cd3d00296ed816b6ab01529b359fbfd549a79e8adb72bbc83bc7a389cf13e0afd50636ff79a138e no-version-test.patch -f367d27ebcc412ff03c12ae98e50aeae5051fb5ffa9da6220f664c59993ed0e330b55b3b41fe941d546634901163d006e318891b4b886f6c49a93e0888fccd3e thelounge.initd -212e468d6cedaa528b7fad534b8ba0e7a3d69137940cdabd22dbe34375491900d5b7d577550aa3b245ad7775488a90e308019db55ff15e8ede105c4b9c15b015 allow-https-for-connect-src.patch -" diff --git a/user/thelounge/thelounge.initd b/user/thelounge/thelounge.initd deleted file mode 100644 index b10d1c5..0000000 --- a/user/thelounge/thelounge.initd +++ /dev/null @@ -1,14 +0,0 @@ -#!/sbin/openrc-run - -supervisor=supervise-daemon -name="thelounge" -command="/usr/bin/thelounge" -command_args="start" -command_user="thelounge:thelounge" -command_background=true -pidfile="/run/thelounge.pid" - -depend() { - need net localmount - after firewall -} diff --git a/user/thelounge/thelounge.post-install b/user/thelounge/thelounge.post-install deleted file mode 100644 index 1651780..0000000 --- a/user/thelounge/thelounge.post-install +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cat >&2 <<-EOF -* -* The configuration is in /var/lib/thelounge/config.js. -* To add users, use the cli: -* doas -u thelounge thelounge .. -* e.g. -* doas -u thelounge thelounge add myuser -* -EOF - -exit 0 diff --git a/user/thelounge/thelounge.pre-install b/user/thelounge/thelounge.pre-install deleted file mode 100644 index b91b1ef..0000000 --- a/user/thelounge/thelounge.pre-install +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -addgroup -S thelounge 2>/dev/null -adduser -S -D -H -s /sbin/nologin -G thelounge -g thelounge thelounge 2>/dev/null - -exit 0 From 975ca3acc66b67710789510247f59ae6764e620d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:19:14 -0400 Subject: [PATCH 174/313] user/u-boot-rm: drop for pmos --- user/u-boot-rm/APKBUILD | 125 -------------------- user/u-boot-rm/README.txt | 32 ----- user/u-boot-rm/fix-linking-with-ld.patch | 52 --------- user/u-boot-rm/rm1-ttygs0-serial.diff | 13 --- user/u-boot-rm/rm1-uboot-config-patch.diff | 83 ------------- user/u-boot-rm/rm2-uboot-config-patch.diff | 75 ------------ user/u-boot-rm/update-u-boot | 129 --------------------- 7 files changed, 509 deletions(-) delete mode 100644 user/u-boot-rm/APKBUILD delete mode 100644 user/u-boot-rm/README.txt delete mode 100644 user/u-boot-rm/fix-linking-with-ld.patch delete mode 100644 user/u-boot-rm/rm1-ttygs0-serial.diff delete mode 100644 user/u-boot-rm/rm1-uboot-config-patch.diff delete mode 100644 user/u-boot-rm/rm2-uboot-config-patch.diff delete mode 100755 user/u-boot-rm/update-u-boot diff --git a/user/u-boot-rm/APKBUILD b/user/u-boot-rm/APKBUILD deleted file mode 100644 index da2e135..0000000 --- a/user/u-boot-rm/APKBUILD +++ /dev/null @@ -1,125 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=u-boot-rm -pkgver=2020.09 -_rm1tag=97b35fdddf0077abd2e0f0409b94ef20adbe8565 -_rm2tag=47c91918aa7724c16b6eaf87cf5dfbf4548eafc1 -pkgrel=9 -pkgdesc="u-boot bootloader common files" -url="https://www.denx.de/wiki/U-Boot/" -arch="armv7" -license="GPL-2.0-or-later OFL-1.1 BSD-2-Clause BSD-3-Clause eCos-2.0 IBM-pibs - ISC LGPL-2.0-only LGPL-2.1-only X11" -options="!check" # no tests -makedepends=" - bc - bison - dtc - flex - gnutls-dev - linux-headers - openssl-dev>3 - py3-elftools - py3-setuptools - python3-dev - swig - util-linux-dev - " -source=" - u-boot-rm1-$_rm1tag.tar.gz::https://github.com/reMarkable/uboot/archive/$_rm1tag.tar.gz - u-boot-rm2-$_rm2tag.tar.gz::https://github.com/reMarkable/uboot/archive/$_rm2tag.tar.gz - update-u-boot - README.txt - rm1-uboot-config-patch.diff - rm2-uboot-config-patch.diff - " -builddir="$srcdir" - -#rm2:zero-sugar broken -case "$CARCH" in -arm*) board_configs=" - zerogravitas:zero-gravitas - ";; -esac - -for board_config in $board_configs; do - _allboards="$_allboards $pkgname-${board_config%%:*}" -done - -subpackages="$pkgname-all:_all $_allboards" -prepare() { - default_prepare - - cd "$builddir"/uboot-$_rm1tag - patch -p1 -i "$srcdir"/rm1-uboot-config-patch.diff - # patch -p1 -i "$srcdir"/rm1-ttygs0-serial.diff - cd "$builddir"/uboot-$_rm2tag - patch -p1 -i "$srcdir"/rm2-uboot-config-patch.diff -} - -build() { - local board_config board - for board_config in $board_configs; do - local configs="${board_config#*:}" - for board in ${configs//,/ }; do - msg "Building u-boot for $board" - case $board in - zero-gravitas) cd "$builddir"/uboot-$_rm1tag;; - zero-sugar) cd "$builddir"/uboot-$_rm2tag;; - esac - - touch include/config.h - LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"' > include/timestamp_autogenerated.h - LC_ALL=C date +'#define U_BOOT_TIME "%T"' >> include/timestamp_autogenerated.h - - export BUILD_DIR="$builddir"/build/$board - mkdir -p "$BUILD_DIR" - make O="$BUILD_DIR" ${board}_config - make O="$BUILD_DIR" all - done - done -} - -package() { - mkdir -p "$pkgdir"/usr/share/$pkgname "$pkgdir"/usr/sbin - install "$srcdir"/README.txt "$pkgdir"/usr/share/$pkgname/README.txt - install "$srcdir"/update-u-boot "$pkgdir"/usr/sbin -} - -_all() { - pkgdesc="u-boot for all boards (meta package)" - depends="$_allboards" - - mkdir -p "$subpkgdir"/ -} - -_split_boards() { - cd "$builddir"/build - pkgdesc="u-boot for $1" - depends="u-boot-rm" - shift - local board - for board; do - msg "Including board $board" - mkdir -p "$subpkgdir"/usr/share/$pkgname/$board - export BUILD_DIR="$builddir"/build/$board - - cp "$BUILD_DIR"/u-boot.imx "$subpkgdir"/usr/share/$pkgname/$board/u-boot.bin - done -} - -for board_config in $board_configs; do - _board="${board_config%%:*}" - _configs="${board_config#*:}" - eval "$_board() { _split_boards $_board ${_configs//,/ }; }" -done - -sha512sums=" -7cc8d513cac1d63ee5119529caa056164ee3bc3633da5d880fbfb344b770c7c53c41475d42dd129b505390dcd5449e14524afc06f7cdba9354af7e70a7035ef9 u-boot-rm1-97b35fdddf0077abd2e0f0409b94ef20adbe8565.tar.gz -d0d18b123c4281285a8b3c1afd9ef623b48a33506399c8e0dbc393f22d967ee3e5df7030aab26c4fe8cad614f3f22f1ea5d6b5bb4ef5cc46fffe56b7ac7c3c28 u-boot-rm2-47c91918aa7724c16b6eaf87cf5dfbf4548eafc1.tar.gz -a905e4dcdb2704e0b1d4f0ab4a6333d3f1ffcec5c3a8359f5789800eb2114dad673cf0b5f24cae3a590f27333dff2e96b6f1efae5a466f9281a3d65efe403a1e update-u-boot -f8c9bb6e84d6f0620c976ac7ad5dd7ec7ff9dfdd4b1d03d2bf6653e7beccf80bdf2debfc92fb1f696dba92fb40287d3c45897e0078951451d0835cb61a5f16d1 README.txt -673cb917cc565ae245d4a7d659227bc240473112bc9c73ae184a64ce74be7994273d6dc4db17194d348941f83a42b3b67d3140f6f23c37c13d6dc93f7d76cc39 rm1-uboot-config-patch.diff -0e98404ca6d20eb01bd9c129b05e2eb10c60a692a56adc221ea283b4bfe7b0bcc2851121d4c3fe51e07a9784c339f7ccb221e0cc3f3603144fec46be66d0cbcc rm2-uboot-config-patch.diff -" diff --git a/user/u-boot-rm/README.txt b/user/u-boot-rm/README.txt deleted file mode 100644 index c342913..0000000 --- a/user/u-boot-rm/README.txt +++ /dev/null @@ -1,32 +0,0 @@ -WandBoard ---------- - -- ROM loads boot loader from raw MMC sectors at fixed address -- NOTE: 1st partition needs to start after boot loader - -- Install u-boot with: - dd if=wandboard/SPL of=/dev/mmcblk0 bs=1k seek=1 - dd if=wandboard/u-boot.img of=/dev/mmcblk0 bs=1k seek=69 - sync - - (Note - the SD card node may vary, so adjust this as needed). - -- Insert the SD card into the slot located in the bottom of the board - (same side as the mx6 processor) - -BeagleBoard ------------ - -- ROM looks for 1st partition with FAT, and loads MLO from it -- NOTE: MLO needs to be the first file created on this partition - -- Install u-boot with: - cp am335x_boneblack/{MLO,u-boot.img} /media/mmcblk0p1/ - -Sunxi (Cubie* etc) ------------------- - -- ROM loads boot loader from SD-CARD sectors at fixed address -- Install u-boot with: - sudo dd if=/u-boot-sunxi-with-spl.bin of=/dev/sda bs=1024 seek=8 - diff --git a/user/u-boot-rm/fix-linking-with-ld.patch b/user/u-boot-rm/fix-linking-with-ld.patch deleted file mode 100644 index 827c566..0000000 --- a/user/u-boot-rm/fix-linking-with-ld.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 58772283210e15f8d803db4aa67c877d668db867 Mon Sep 17 00:00:00 2001 -Patch-Source: https://github.com/u-boot/u-boot/commit/58772283210e15f8d803db4aa67c877d668db867 -From: Alistair Delva -Date: Wed, 20 Oct 2021 21:31:33 +0000 -Subject: [PATCH] x86: Fix linking u-boot with ld.lld - -When linking the final u-boot binary with LLD, the following link errors -are seen: - -ld.lld: error: can't create dynamic relocation R_386_32 against local - symbol in readonly segment; recompile object files with - -fPIC or pass '-Wl,-z,notext' to allow text relocations - in the output ->>> defined in arch/x86/cpu/start.o ->>> referenced by arch/x86/cpu/start.o:(.text.start+0x32) -[...] ->>> defined in arch/x86/cpu/start16.o ->>> referenced by arch/x86/cpu/start16.o:(.start16+0x1C) - -According to Nick Desaulniers: - -"This is a known difference between GNU and LLVM linkers; the GNU - linkers permit relocations in readonly segments (making them not read - only), LLVM does not (by default)." - -Since U-Boot apparently seems to use relocations in readonly segments, -change the global linker flags to permit them when linking with LLD by -specifying '-z notext'. - -Signed-off-by: Alistair Delva -Cc: Nick Desaulniers -Cc: Simon Glass -Cc: Bin Meng -Reviewed-by: Simon Glass ---- - Makefile | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/Makefile b/Makefile -index c0ea933cb636..286757986c02 100644 ---- a/Makefile -+++ b/Makefile -@@ -776,6 +776,9 @@ ifneq ($(CONFIG_SYS_TEXT_BASE),) - LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE) - endif - -+# ld.lld support -+LDFLAGS_u-boot += -z notext -+ - # Normally we fill empty space with 0xff - quiet_cmd_objcopy = OBJCOPY $@ - cmd_objcopy = $(OBJCOPY) --gap-fill=0xff $(OBJCOPYFLAGS) \ diff --git a/user/u-boot-rm/rm1-ttygs0-serial.diff b/user/u-boot-rm/rm1-ttygs0-serial.diff deleted file mode 100644 index 9596fc4..0000000 --- a/user/u-boot-rm/rm1-ttygs0-serial.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/include/configs/zero-gravitas.h.orig b/include/configs/zero-gravitas.h -index 818ed56..6eb7447 100644 ---- a/include/configs/zero-gravitas.h.orig -+++ b/include/configs/zero-gravitas.h -@@ -73,7 +73,7 @@ - "active_partition=2\0" \ - "bootlimit=1\0" \ - "por=undefined\0" \ -- "mmcargs=setenv bootargs console=${console},${baudrate} " \ -+ "mmcargs=setenv bootargs console=${console},${baudrate} console=ttyGS0,115200 " \ - "root=/dev/mmcblk1p2 rootwait rootfstype=ext4 rw por=${por};\0" \ - "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \ - "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \ diff --git a/user/u-boot-rm/rm1-uboot-config-patch.diff b/user/u-boot-rm/rm1-uboot-config-patch.diff deleted file mode 100644 index 55d6ce1..0000000 --- a/user/u-boot-rm/rm1-uboot-config-patch.diff +++ /dev/null @@ -1,83 +0,0 @@ -diff --git a/include/configs/zero-gravitas.h b/include/configs/zero-gravitas.h -index 074f171422..818ed56892 100644 ---- a/include/configs/zero-gravitas.h -+++ b/include/configs/zero-gravitas.h -@@ -71,12 +71,10 @@ - "splashimage=0x80000000\0" \ - "splashpos=m,m\0" \ - "active_partition=2\0" \ -- "fallback_partition=3\0" \ - "bootlimit=1\0" \ - "por=undefined\0" \ - "mmcargs=setenv bootargs console=${console},${baudrate} " \ -- "systemd.crash_reboot=true memtest " \ -- "root=/dev/mmcblk1p${active_partition} rootwait rootfstype=ext4 quiet rw por=${por};\0" \ -+ "root=/dev/mmcblk1p2 rootwait rootfstype=ext4 rw por=${por};\0" \ - "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \ - "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \ - "mmcboot=echo Booting from mmc ...; " \ -@@ -89,41 +87,13 @@ - "echo WARN: Cannot load the DT; " \ - "fi; " \ - "fi; " \ -- "fi;\0" \ -- "memboot=echo Booting from memory...; " \ -- "setenv bootargs console=${console},${baudrate} " \ -- "g_mass_storage.stall=0 g_mass_storage.removable=1 " \ -- "g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\ -- "g_mass_storage.iSerialNumber=\"\" rdinit=/linuxrc; "\ -- "bootz ${loadaddr} ${initrd} ${fdt_addr};\0" \ -- "altbootcmd=echo Running from fallback root...; " \ -- "run memboot; " \ -- "if test ${bootcount} -gt 10; then " \ -- "echo WARN: Failed too much, resetting bootcount and turning off; " \ -- "setenv bootcount 0; " \ -- "saveenv; " \ -- "poweroff; " \ -- "fi; " \ -- "setenv mmcpart ${fallback_partition}; " \ -- "setenv bootargs console=${console},${baudrate} " \ -- "root=/dev/mmcblk1p${fallback_partition} rootwait rootfstype=ext4 quiet rw " \ -- "systemd.log_level=debug systemd.log_target=kmsg memtest " \ -- "log_buf_len=1M printk.devkmsg systemd.journald.forward_to_console=1; " \ -- "run mmcboot;\0" \ -+ "fi;\0" - - /* Always try to boot from memory first, in case of USB download mode */ - #define CONFIG_BOOTCOMMAND \ -- "if test ! -e mmc 1:1 uboot.env; then " \ -- "saveenv; " \ -- "fi; " \ -- "run memboot; " \ - "run mmcargs; " \ - "setenv mmcpart ${active_partition}; " \ -- "run mmcboot; " \ -- "echo WARN: unable to boot from either RAM or eMMC; " \ -- "setenv upgrade_available 1; " \ -- "saveenv; " \ -- "reset; " -+ "run mmcboot; " - - #ifdef CONFIG_BOOTDELAY - #undef CONFIG_BOOTDELAY -@@ -157,18 +127,8 @@ - /* Environment organization */ - #define CONFIG_ENV_SIZE SZ_8K - --#define CONFIG_ENV_IS_IN_FAT --/*#define CONFIG_ENV_IS_NOWHERE*/ -- --#ifdef CONFIG_ENV_IS_IN_FAT --#define CONFIG_BOOTCOUNT_LIMIT --#define CONFIG_BOOTCOUNT_ENV -- --#define FAT_ENV_INTERFACE "mmc" --#define FAT_ENV_DEVICE_AND_PART "1:1" --#define CONFIG_FAT_WRITE --#define FAT_ENV_FILE "uboot.env" --#endif -+/*#define CONFIG_ENV_IS_IN_FAT*/ -+#define CONFIG_ENV_IS_NOWHERE - - #ifdef CONFIG_CMD_SF - #define CONFIG_MXC_SPI diff --git a/user/u-boot-rm/rm2-uboot-config-patch.diff b/user/u-boot-rm/rm2-uboot-config-patch.diff deleted file mode 100644 index 4aa04bc..0000000 --- a/user/u-boot-rm/rm2-uboot-config-patch.diff +++ /dev/null @@ -1,75 +0,0 @@ -diff --git a/include/configs/zero-sugar.h.orig b/include/configs/zero-sugar.h -index 6b5450a..dd6da5c 100644 ---- a/include/configs/zero-sugar.h.orig -+++ b/include/configs/zero-sugar.h -@@ -122,12 +122,10 @@ - "panel=EPD\0" \ - "mmcdev=0\0" \ - "active_partition=2\0" \ -- "fallback_partition=3\0 " \ - "bootlimit=1\0 " \ - "mmcautodetect=yes\0" \ - "mmcargs=setenv bootargs console=${console},${baudrate} " \ -- "root=/dev/mmcblk2p${active_partition} rootwait rootfstype=ext4 rw " \ -- "quiet panic=20 systemd.crash_reboot\0" \ -+ "root=/dev/mmcblk2p2 rootwait rootfstype=ext4 rw " \ - "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \ - "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \ - "mmcboot=echo Booting from mmc ...; " \ -@@ -140,41 +138,13 @@ - "echo WARN: Cannot load the DT; " \ - "fi; " \ - "fi; " \ -- "fi;\0" \ -- "memboot=echo Booting from memory...; " \ -- "setenv bootargs console=${console},${baudrate} " \ -- "g_mass_storage.stall=0 g_mass_storage.removable=1 " \ -- "g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\ -- "g_mass_storage.iSerialNumber=\"\" rdinit=/linuxrc; "\ -- "bootz ${loadaddr} ${initrd} ${fdt_addr};\0" \ -- "altbootcmd=echo Running from fallback root...; " \ -- "run memboot; " \ -- "if test ${bootcount} -gt 10; then " \ -- "echo WARN: Failed too much, resetting bootcount and turning off; " \ -- "setenv bootcount 0; " \ -- "saveenv; " \ -- "poweroff; " \ -- "fi; " \ -- "setenv mmcpart ${fallback_partition}; " \ -- "setenv bootargs console=${console},${baudrate} " \ -- "root=/dev/mmcblk2p${fallback_partition} rootwait rootfstype=ext4 quiet rw " \ -- "systemd.log_level=debug systemd.log_target=kmsg memtest " \ -- "log_buf_len=1M printk.devkmsg systemd.journald.forward_to_console=1; " \ -- "run mmcboot;\0" \ -+ "fi;\0" - - /* Always try to boot from memory first, in case of USB download mode */ - #define CONFIG_BOOTCOMMAND \ -- "if test ! -e mmc 0:1 uboot.env; then " \ -- "saveenv; " \ -- "fi; " \ -- "run memboot; " \ - "run mmcargs; " \ - "setenv mmcpart ${active_partition}; " \ -- "run mmcboot; " \ -- "echo WARN: unable to boot from either RAM or eMMC; " \ -- "setenv upgrade_available 1; " \ -- "saveenv; " \ -- "reset; " -+ "run mmcboot; " - - #define CONFIG_SYS_MEMTEST_START 0x80000000 - #define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_MEMTEST_START + 0x20000000) -@@ -198,10 +168,8 @@ - /* Environment organization */ - #define CONFIG_ENV_SIZE SZ_8K - --#ifdef CONFIG_ENV_IS_IN_FAT --#define CONFIG_BOOTCOUNT_LIMIT --#define CONFIG_BOOTCOUNT_ENV --#endif -+/*#define CONFIG_ENV_IS_IN_FAT*/ -+#define CONFIG_ENV_IS_NOWHERE - - #define CONFIG_SYS_FSL_USDHC_NUM 2 - diff --git a/user/u-boot-rm/update-u-boot b/user/u-boot-rm/update-u-boot deleted file mode 100755 index e90bcbd..0000000 --- a/user/u-boot-rm/update-u-boot +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh - -verbose= -board= -device= -dryrun= -imagedir= - -get_defaults() { - if [ -z "$board" -a -e /sys/firmware/devicetree/base/compatible ]; then - case "$(cat /sys/firmware/devicetree/base/compatible 2>/dev/null)" in - wand,*) board=wand ;; - esac - fi - - if [ -z "$device" ]; then - case "$board" in - wand|cubie|cubie2) device=/dev/mmcblk0p0 ;; - zero-gravitas) device=/dev/mmcblk1 ;; - esac - fi - - if [ -z "$imagedir" ]; then - imagedir="$(realpath $(dirname $0))" - [ -f "$imagedir/README.txt" ] || imagedir="/usr/share/u-boot-rm" - fi -} - -die() { - echo "ERROR: $@" - exit 1 -} - -usage() { - get_defaults - - cat <] [-d|--device ] - -options: - - -b,--board Specify the board type: wand, cubie, cubie2 - (current default: ${board:-none}) - - -d,--device Specify the device where to install u-boot - (current default: ${device:-none}) - - -i,--imagedir Specify u-boot image directory - (current default: ${imagedir:-none}) - - -n,--dry-run Print commands but don't execute them - -EOF -} - -while [ $# -gt 0 ]; do - opt="$1" - shift - case "$opt" in - -b|--board) - case "$1" in - wand|wandboard) board="wand" ;; - cubie|cubieboard) board="cubie" ;; - zerogravitas) board="zero-gravitas" ;; - zerosugar) board="zero-sugar" ;; - *) usage; exit 1;; - esac - shift - ;; - -d|--device) - device="$1" - shift - ;; - -i|--imagedir) - imagedir="$1" - shift - ;; - -n|--dry-run) - dryrun="echo" - ;; - --) - break - ;; - -*) - usage - exit 1 - ;; - esac -done - -get_defaults -if [ -z "$board" -o -z "$device" -o -z "$imagedir" -o ! -e "$imagedir" ]; then - usage - exit 1 -fi - -if [ -z "$dryrun" ]; then - echo "Updating $board u-boot in $device in 3 seconds..." - sleep 3 -fi - -( -set -e -case "$board" in -wand) - [ -e "$imagedir/wandboard" ] || die "wandboard images not installed, apk add u-boot-wandboard" - $dryrun dd if=$imagedir/wandboard/SPL of=$device bs=1k seek=1 status=none - $dryrun dd if=$imagedir/wandboard/u-boot.img of=$device bs=1k seek=69 status=none - ;; -cubie|cubie2) - [ -e "$imagedir/Cubieboard${board#cubie}" ] || die "Cubieboard images not installed, apk add u-boot-cubieboard" - $dryrun dd if=$imagedir/Cubieboard${board#cubie}/u-boot-sunxi-with-spl.bin of=/dev/sda bs=1024 seek=8 status=none - ;; -zero-gravitas) - [ -e "$imagedir/zero-gravitas" ] || die "rM1 images not installed, apk add u-boot-rm1" - $dryrun dd if=/dev/zero of=$device bs=512 seek=1536 count=16 - [ -z "$dryrun" ] && echo 0 > /sys/block/${device/\/dev\/}boot0/force_ro - $dryrun dd if=/dev/zero of=${device}boot0 bs=512 count=2 - $dryrun dd if=$imagedir/zero-gravitas/u-boot.bin of=${device}boot0 bs=512 seek=2 - [ -z "$dryrun" ] && echo 1 > /sys/block/${device/\/dev\/}boot0/force_ro - ;; -zero-sugar) - die "rM2 not yet tested" - ;; -esac -$dryrun sync -) || die "U-Boot installation in $device failed" - -[ -z "$dryrun" ] && echo "Completed successfully." From de224ac5c470ff1a590f87e9660d8af5e30417e5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:19:27 -0400 Subject: [PATCH 175/313] user/rm-utils: drop for pmos --- user/rm-utils/APKBUILD | 38 ------- user/rm-utils/battery-monitor.sh | 37 ------- user/rm-utils/epdc-init-auto.c | 126 --------------------- user/rm-utils/epdc-show-bitmap.c | 184 ------------------------------- user/rm-utils/xorg.conf | 62 ----------- 5 files changed, 447 deletions(-) delete mode 100644 user/rm-utils/APKBUILD delete mode 100644 user/rm-utils/battery-monitor.sh delete mode 100644 user/rm-utils/epdc-init-auto.c delete mode 100644 user/rm-utils/epdc-show-bitmap.c delete mode 100644 user/rm-utils/xorg.conf diff --git a/user/rm-utils/APKBUILD b/user/rm-utils/APKBUILD deleted file mode 100644 index d8f2b68..0000000 --- a/user/rm-utils/APKBUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=rm-utils -pkgver=0.0.1 -pkgrel=4 -pkgdesc="Utility files for reMarkable tablet" -arch="armv7" -url="http://www.davisr.me/projects/parabola-rm/" -license="GPL-3.0-only" -makedepends="musl-dev linux-rm-headers" -options="!check" # No testsuite -builddir="$srcdir" -source=" - battery-monitor.sh - epdc-init-auto.c - epdc-show-bitmap.c - xorg.conf -" - -build() { - $CC $CFLAGS epdc-init-auto.c -o epdc-init-auto - $CC $CFLAGS epdc-show-bitmap.c -o epdc-show-bitmap -} - -package() { - install -vDm755 battery-monitor.sh "$pkgdir"/usr/bin/battery-monitor - install -vDm755 epdc-show-bitmap -t "$pkgdir"/usr/bin/ - install -vDm755 epdc-init-auto -t "$pkgdir"/usr/bin/ - install -vDm644 xorg.conf -t "$pkgdir"/etc/defaults/ -} - -sha512sums=" -7f0e6cb276357983b76c37c81a91c0d278dbec16d8982a97618f2217ef5e4d706211d921af6c79db3aad912d50aaed8cf5ce67f52a1081f61585eb97322c8deb battery-monitor.sh -f145d6af541828e69217a73f7b848f7fe57cce37426e15469a1d6a5540604f4078d4cd1f67e69e77b961b608a7b8e2930e1e82b13fe9dd181361e361895a66be epdc-init-auto.c -409744c4bbcac462c38add2b19d3b433e44cb326905fe3af240931e27bb2b71b14696229c46187bf7c060f83d77920376b5c6161f62949a2fa2c0a5464753cc0 epdc-show-bitmap.c -e14a61751e4c830652e7a849b9d596c6bc213fed87ba3f9f7c3df0d5fe35ddf28bde7de2fa977c0321639503ceff5abffd0d856380eacce24389fd50eaf3372a xorg.conf -" diff --git a/user/rm-utils/battery-monitor.sh b/user/rm-utils/battery-monitor.sh deleted file mode 100644 index fb5dbc7..0000000 --- a/user/rm-utils/battery-monitor.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -# -# battery-monitor.sh -# Prints the state of charge of the tablet's battery -# -# Parabola-rM is a free operating system for the reMarakble tablet. -# Copyright (C) 2020 -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. - -# Path for Linux 4.9 -battpath="/sys/class/power_supply/bq27441-0" - -chargenow="$(cat $battpath/charge_now)" -chargefull="$(cat $battpath/charge_full)" -status="$(cat $battpath/status)" - -chargepct="$(echo $chargenow $chargefull \ - | awk '{printf "%f", $1 / $2 * 100}' \ - | cut -d'.' -f1)" -symbol="" -if [[ "Charging" == "$status" ]]; then - symbol=$'\u26a1' # Lightning symbol -fi - -echo "${symbol}${chargepct}%" diff --git a/user/rm-utils/epdc-init-auto.c b/user/rm-utils/epdc-init-auto.c deleted file mode 100644 index 069ea9f..0000000 --- a/user/rm-utils/epdc-init-auto.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - epdc-init-auto.c - Initializes the EPDC framebuffer into a deferred-IO automatic-update - mode - - Parabola-rM is a free operating system for the reMarakble tablet. - Copyright (C) 2020 Davis Remmel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -int main() -{ - int ret; - int fb = open("/dev/fb0", O_RDWR); - struct fb_var_screeninfo vinfo; - ret = ioctl(fb, FBIOGET_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOGET_VSCREENINFO failed with error " - "%d, aborting\n", ret); - return 1; - } - - vinfo.xres = 1872; - vinfo.yres = 1404; - vinfo.pixclock = 160000000; - vinfo.left_margin = 32; - vinfo.right_margin = 326; - vinfo.upper_margin = 4; - vinfo.lower_margin = 12; - vinfo.hsync_len = 44; - vinfo.vsync_len = 1; - vinfo.sync = 0; - vinfo.vmode = FB_VMODE_NONINTERLACED; - vinfo.accel_flags = 0; - vinfo.activate = FB_ACTIVATE_FORCE; - - // Put screen info. Sometimes this fails when trying to set the - // pixclock. This may be a bug in the driver's arithmetic. - ret = ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOPUT_VSCREENINFO failed with error " - "%d, attempting to reset pixclock\n", ret); - vinfo.pixclock = 6250; - ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - vinfo.pixclock = 160000000; - ret = ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOPUT_VSCREENINFO failed " - "with error %d, aborting\n", ret); - return 1; - } - } - - // Pull the screeninfo agian - ret = ioctl(fb, FBIOGET_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOGET_VSCREENINFO failed with error " - "%d, aborting\n", ret); - return 1; - } - - printf("x:%d y:%d activate:%d bpp:%d rotate:%d hsync_len:%d" - "vsync_len: %d sync:%d\n", - vinfo.xres, vinfo.yres, vinfo.activate, - vinfo.bits_per_pixel, vinfo.rotate, vinfo.hsync_len, - vinfo.vsync_len, vinfo.sync); - - struct fb_fix_screeninfo finfo; - ret = ioctl(fb, FBIOGET_FSCREENINFO, &finfo); - if (0 != ret) { - fprintf(stderr, "FBIOGET_FSCREENINFO failed with error " - "%d, aborting\n", ret); - return 1; - } - - // In case the EPDC wasn't accessible - ret = ioctl(fb, MXCFB_ENABLE_EPDC_ACCESS); - if (0 != ret) { - fprintf(stderr, "MXCFB_ENABLE_EPDC_ACCESS failed with " - "error %d, aborting\n", ret); - return 1; - } - - // Set auto update mode - __u32 aumode = AUTO_UPDATE_MODE_AUTOMATIC_MODE; - ret = ioctl(fb, MXCFB_SET_AUTO_UPDATE_MODE, &aumode); - if (0 != ret) { - fprintf(stderr, "MXCFB_SET_AUTO_UPDATE_MODE failed " - "with error %d, aborting\n", ret); - return 1; - } - - // Queue-and-merge is best-performing - __u32 uscheme = UPDATE_SCHEME_QUEUE_AND_MERGE; - ret = ioctl(fb, MXCFB_SET_UPDATE_SCHEME, &uscheme); - if (0 != ret) { - fprintf(stderr, "MXCFB_SET_UPDATE_SCHEME failed with " - "error %d, aborting\n", ret); - return 1; - } - - close(fb); - return 0; -} - diff --git a/user/rm-utils/epdc-show-bitmap.c b/user/rm-utils/epdc-show-bitmap.c deleted file mode 100644 index c42bf30..0000000 --- a/user/rm-utils/epdc-show-bitmap.c +++ /dev/null @@ -1,184 +0,0 @@ -/* -epdc-show-bitmap.c -Displays a raw image to the EPDC framebuffer - -Parabola-rM is a free operating system for the reMarakble tablet. -Copyright (C) 2020 Davis Remmel - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - if (argc < 2) { - printf("Must pass an image as an argument.\n"); - return 1; - } - - int ret; - int fb = open("/dev/fb0", O_RDWR); - struct fb_var_screeninfo vinfo; - ret = ioctl(fb, FBIOGET_VSCREENINFO, &vinfo); - if (0 != ret) { - printf("FBIOGET_VSCREENINFO failed with error %d" - ", aborting\n", ret); - return 1; - } - - vinfo.xres = 1872; - vinfo.yres = 1404; - vinfo.pixclock = 160000000; - vinfo.left_margin = 32; - vinfo.right_margin = 326; - vinfo.upper_margin = 4; - vinfo.lower_margin = 12; - vinfo.hsync_len = 44; - vinfo.vsync_len = 1; - vinfo.sync = 0; - vinfo.vmode = FB_VMODE_NONINTERLACED; - vinfo.accel_flags = 0; - vinfo.activate = FB_ACTIVATE_FORCE; - - // Put screen info. Sometimes this fails when trying to set the - // pixclock. This may be a bug in the driver's arithmetic. - ret = ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOPUT_VSCREENINFO failed with error " - "%d, attempting To reset pixclock\n", ret); - vinfo.pixclock = 6250; - ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - vinfo.pixclock = 160000000; - ret = ioctl(fb, FBIOPUT_VSCREENINFO, &vinfo); - if (0 != ret) { - fprintf(stderr, "FBIOPUT_VSCREENINFO failed " - "with error %d, aborting\n", ret); - return 1; - } - } - - printf("x:%d y:%d activate:%d bpp:%d rotate:%d hsync_len:%d" - "vsync_len: %d sync:%d\n", - vinfo.xres, vinfo.yres, vinfo.activate, - vinfo.bits_per_pixel, vinfo.rotate, vinfo.hsync_len, - vinfo.vsync_len, vinfo.sync); - - struct fb_fix_screeninfo finfo; - ret = ioctl(fb, FBIOGET_FSCREENINFO, &finfo); - if (0 != ret) { - fprintf(stderr, "FBIOGET_FSCREENINFO failed with error " - "%d, aborting\n", ret); - return 1; - } - - // In case the EPDC wasn't accessible - ret = ioctl(fb, MXCFB_ENABLE_EPDC_ACCESS); - if (0 != ret) { - fprintf(stderr, "MXCFB_ENABLE_EPDC_ACCESS failed with " - "error %d, aborting\n", ret); - return 1; - } - - // Set to partial mode to control update parameters - __u32 aumode = AUTO_UPDATE_MODE_REGION_MODE; - ret = ioctl(fb, MXCFB_SET_AUTO_UPDATE_MODE, &aumode); - if (0 != ret) { - fprintf(stderr, "MXCFB_SET_AUTO_UPDATE_MODE failed " - "with error %d, aborting\n", ret); - return 1; - } - - - // No artifacts in display output - __u32 uscheme = UPDATE_SCHEME_SNAPSHOT; - ret = ioctl(fb, MXCFB_SET_UPDATE_SCHEME, &uscheme); - if (0 != ret) { - fprintf(stderr, "MXCFB_SET_UPDATE_SCHEME failed with " - "error %d, aborting\n", ret); - return 1; - } - - // Set up update (same region for all writes, gets reused) - struct mxcfb_update_data bupdate; - bupdate.update_region.left = 0; - bupdate.update_region.top = 0; - bupdate.update_region.width = 1872; - bupdate.update_region.height = 1404; - bupdate.waveform_mode = WAVEFORM_MODE_AUTO; - bupdate.update_mode = UPDATE_MODE_FULL; - bupdate.update_marker = 0; - bupdate.temp = TEMP_USE_AMBIENT; - bupdate.flags = 0; - - struct mxcfb_update_marker_data updm; - updm.update_marker = 0; - - // mmap to framebuffer - int buflength = vinfo.yres_virtual * finfo.line_length; - printf("buflength %d\n", buflength); - char * region = mmap(0, buflength, PROT_READ | PROT_WRITE, - MAP_SHARED, fb, (off_t)0); - if (region == MAP_FAILED) { - fprintf(stderr, "map failed!\n"); - return 1; - } - - // Write black - memset(region, 0x00, buflength); - ioctl(fb, MXCFB_SEND_UPDATE, &bupdate); - ioctl(fb, MXCFB_WAIT_FOR_UPDATE_COMPLETE, &updm); - - // Write white - memset(region, 0xff, buflength); - ioctl(fb, MXCFB_SEND_UPDATE, &bupdate); - ioctl(fb, MXCFB_WAIT_FOR_UPDATE_COMPLETE, &updm); - - // Write image - FILE *pattern = fopen(argv[1], "rb"); - fseek(pattern, 0, SEEK_END); - long psize = ftell(pattern); - printf("psize is %d\n", psize); - fseek(pattern, 0, SEEK_SET); - - if (psize != buflength) { - fprintf(stderr, "Image must match framebuffer size\n"); - return 1; - } - - char *buffer = malloc(psize); - fread(buffer, psize, 1, pattern); - fclose(pattern); - - memcpy(region, buffer, psize); - ret = ioctl(fb, MXCFB_SEND_UPDATE, &bupdate); - ioctl(fb, MXCFB_WAIT_FOR_UPDATE_COMPLETE, &updm); - if (0 != ret) { - fprintf(stderr, "MXCFB_SEND_UPDATE failed with error " - "%d, aborting\n", ret); - return 1; - } - - close(fb); - return 0; -} diff --git a/user/rm-utils/xorg.conf b/user/rm-utils/xorg.conf deleted file mode 100644 index 8ebf064..0000000 --- a/user/rm-utils/xorg.conf +++ /dev/null @@ -1,62 +0,0 @@ -Section "ServerLayout" - Identifier "reMarkable Tablet RM100" - Screen 0 "Screen0" - InputDevice "wacom" "CorePointer" -EndSection - -Section "ServerFlags" - Option "BlankTime" "0" - Option "StandbyTime" "0" - Option "SuspendTime" "0" - Option "OffTime" "0" -EndSection - -Section "Monitor" - Identifier "Monitor0" - DisplaySize 210 158 # mm, sets DPI - Modeline "1872x1404_30.00" 104.26 1872 1960 2152 2432 1404 1405 \ - 1408 1429 -HSync +Vsync - Option "PreferredMode" "1872x1404_30.00" -EndSection - -Section "Screen" - Identifier "Screen0" - Monitor "Monitor0" - Device "epdc0" - DefaultDepth 16 - SubSection "Display" - Depth 16 - Modes "1872x1404_30.00" - EndSubSection -EndSection - -Section "Device" - Identifier "epdc0" - Driver "fbdev" - Option "fbdev" "/dev/fb0" - Option "Rotate" "CW" -EndSection - -Section "InputDevice" - Identifier "wacom" - Driver "evdev" - Option "Protocol" "Auto" - Option "Device" "/dev/input/event0" - Option "SwapAxes" "1" - Option "InvertY" "1" -EndSection - -Section "InputClass" - Identifier "touchscreen" - MatchIsTouchscreen "on" - MatchDevicePath "/dev/input/event1" - Driver "libinput" - Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1" # Rot 180 -EndSection - -Section "InputClass" - Identifier "facialbuttons" - MatchIsKeyboard "on" - MatchDevicePath "/dev/input/event2" - Driver "libinput" -EndSection From c4e065619263be6186dd4c6c6e48a7d318121d1c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:19:39 -0400 Subject: [PATCH 176/313] user/rm-extractor: drop for pmos --- user/rm-extractor/APKBUILD | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 user/rm-extractor/APKBUILD diff --git a/user/rm-extractor/APKBUILD b/user/rm-extractor/APKBUILD deleted file mode 100644 index f581976..0000000 --- a/user/rm-extractor/APKBUILD +++ /dev/null @@ -1,26 +0,0 @@ -# Contributor: Antoine Martin (ayakael) -# Maintainer: Antoine Martin (ayakael) -pkgname=rm-extractor -_gittag=9d37e9437affea379dadb59e646a819b3b9147dd -pkgver=0.0.1 -pkgrel=4 -pkgdesc="Image extractor for reMarkable firmware files" -arch="noarch" -url="https://github.com/ddvk/remarkable-update" -license="MIT" -depends="py3-six py3-protobuf" -options="!check" # No testsuite -builddir="$srcdir/remarkable-update-$_gittag" -source="$pkgname-$pkgver.tar.gz::https://github.com/ddvk/remarkable-update/archive/$_gittag.tar.gz" - -package() { - install -vDm755 "$builddir"/extractor/extractor.py "$pkgdir"/usr/lib/rm-extractor/extractor.py - install -vDm644 "$builddir"/extractor/update_metadata.proto "$pkgdir"/usr/lib/rm-extractor/update_metadata.proto - install -vDm755 "$builddir"/extractor/update_metadata_pb2.py "$pkgdir"/usr/lib/rm-extractor/update_metadata_pb2.py - install -vdm755 "$pkgdir"/usr/bin - ln -s /usr/lib/rm-extractor/extractor.py "$pkgdir"/usr/bin/rm-extractor -} - -sha512sums=" -866c483950ee2cf7085e7d43d8752458d9aeb58b4361c05f50ac3118e87b295ff62b3d4288ad846eda5f93a4afe38891f6a9166f839c66f5ff0ab07afab6ae16 rm-extractor-0.0.1.tar.gz -" From 9ab70541a03989424bbb431e7a9c85345b349214 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:19:51 -0400 Subject: [PATCH 177/313] user/linux-rm: drop for pmos --- user/linux-rm/APKBUILD | 258 ------ ...sun-style-flash-on-section-directive.patch | 428 ---------- .../brcmfmac-disable-power-management.patch | 13 - ...suspend-resume-when-power-is-cut-off.patch | 221 ----- user/linux-rm/config-changes-rm.armhf | 1 - user/linux-rm/config-changes-rm.armv7 | 62 -- user/linux-rm/config-changes-rm2.armhf | 1 - user/linux-rm/config-changes-rm2.armv7 | 1 - .../enable-automatic-partial-refreshing.patch | 26 - user/linux-rm/enable-sdhc1.patch | 790 ------------------ 10 files changed, 1801 deletions(-) delete mode 100644 user/linux-rm/APKBUILD delete mode 100644 user/linux-rm/arm-replace-sun-style-flash-on-section-directive.patch delete mode 100644 user/linux-rm/brcmfmac-disable-power-management.patch delete mode 100644 user/linux-rm/brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch delete mode 120000 user/linux-rm/config-changes-rm.armhf delete mode 100644 user/linux-rm/config-changes-rm.armv7 delete mode 120000 user/linux-rm/config-changes-rm2.armhf delete mode 120000 user/linux-rm/config-changes-rm2.armv7 delete mode 100644 user/linux-rm/enable-automatic-partial-refreshing.patch delete mode 100644 user/linux-rm/enable-sdhc1.patch diff --git a/user/linux-rm/APKBUILD b/user/linux-rm/APKBUILD deleted file mode 100644 index 864b2b5..0000000 --- a/user/linux-rm/APKBUILD +++ /dev/null @@ -1,258 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=linux-rm -pkgver=5.4.70 -_rmver=1.3.4 -pkgrel=11 -pkgdesc="Linux kernel with reMarkable patches" -url=https://github.com/reMarkable/linux -depends="initramfs-generator linux-firmware-brcm linux-firmware-cypress" -_depends_dev="perl gmp-dev elfutils-dev bash mpc1-dev mpfr-dev" -makedepends="$_depends_dev sed installkernel bc linux-headers linux-firmware mawk - bison flex openssl-dev>3 diffutils pahole findutils xz lzop -" -options="!strip !check" -builddir="$srcdir"/linux-RM1XX_${pkgver}_v$_rmver -source=" - https://github.com/reMarkable/linux/archive/refs/tags/RM1XX_${pkgver}_v$_rmver.tar.gz - https://raw.githubusercontent.com/ichaozi/RemarkableFramebuffer/0f37dc8c06d340dc1af52ff2d4d6d5789ccf14bb/kernel-mxc-epdc-fb-reference/epdc_ES103CS1.fw - arm-replace-sun-style-flash-on-section-directive.patch - brcmfmac-disable-power-management.patch - brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch - enable-automatic-partial-refreshing.patch - config-changes-rm.armv7 - config-changes-rm.armhf - " -arch="armv7" -license="GPL-2.0" -for _i in $source; do - case $_i in - config-*.$CARCH) - _f=${_i%."$CARCH"} - _f=${_f#config-changes-} - _flavors="$_flavors $_f" - [ "linux-$_f" != "$pkgname" ] && subpackages="$subpackages linux-$_f::$CTARGET_ARCH" - subpackages="$subpackages linux-$_f-dev:_dev:$CTARGET_ARCH" - ;; - esac -done - -_carch=$CARCH -case "$CARCH" in - aarch64) _carch="arm64" ;; - arm*) _carch="arm" ;; -esac - -# generate config from defconfig and apply local changes. -# config-changes-$flavor.$CARCH holds a list of = delimited -# config command and values used by kernel scripts/config script. -_genconfig() { - local flavor=$1 defconfig= - local subbuilddir="$srcdir"/build-$flavor - local defconfig= - case $flavor in - rm) defconfig=zero-gravitas_defconfig ;; - rm2) defconfig=zero-sugar_defconfig ;; - *) die "Unknown flavor: $flavor" ;; - esac - - cp "$builddir"/arch/$_carch/configs/$defconfig \ - "$subbuilddir"/.config - - while read -r line; do - # skip comments - case "$line" in - "#"*) continue;; - esac - local option=${line%%=*} str= - local cmd=$(echo $line | cut -d= -f2) - case "$cmd" in - y) cmd="enable";; - n) cmd="disable";; - m) cmd="module";; - '"'*) cmd="set-str"; str="${line#*=}";; - [0-9]*) cmd="set-val"; str="${line#*=}";; - *) die "Command $cmd not accepted" ;; - esac - msg "[$flavor] $cmd: $option $str" - "$builddir"/scripts/config \ - --file "$subbuilddir"/.config \ - --$cmd "$option" "${str//\"/}" - done < "$srcdir"/config-changes-$flavor.$CARCH -} - -# verify if options are set to correct value -_verifyconfig() { - local flavor=$1 - local subbuilddir="$srcdir"/build-$flavor - while read -r line; do - [ ${line:0:1} = "#" ] && continue - local option=${line%%=*} str= invert= - local cmd=$(echo $line | cut -d= -f2) - case "$cmd" in - enable) str="$option=y" ;; - disable) str="$option"; invert="-v" ;; - module) str="$option=m" ;; - set-val) str="$option=${line##*=}" ;; - set-str) str=${line##*=} - str="$option=\"${str//\"/}\"" ;; - esac - grep -q $invert "^$str" "$subbuilddir"/.config || \ - die "Config: $option not properly set!" - done < "$srcdir"/config-changes-$flavor.$CARCH -} - -prepare() { - default_prepare - - local flavor= - for flavor in $_flavors; do - local _builddir="$srcdir"/build-$flavor - mkdir -p "$_builddir" - echo "-$pkgrel-$flavor" > "$_builddir"/localversion-alpine - _genconfig $flavor - make -C "$builddir" \ - O="$_builddir" \ - ARCH="$_carch" \ - olddefconfig - _verifyconfig $flavor - done -} - -build() { - unset LDFLAGS - for i in $_flavors; do - cd "$srcdir"/build-$i - local _kver=$(make kernelversion) - if [ "$_kver" != "$pkgver" ]; then - error "Version in Makefile ($_kver) does not correspond with pkgver ($pkgver)" - return 1 - fi - - make ARCH="$_carch" CC="${CC:-gcc}" KLZOP="/usr/bin/lzop" \ - KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-Alpine" - done -} - -_package() { - local _flavor="$1" _outdir="$2" - local _builddir="$srcdir"/build-$_flavor - local _abi_release="$(make -C "$_builddir" -s kernelrelease)" - - cd "$srcdir"/build-$_flavor - - mkdir -p "$_outdir"/boot "$_outdir"/lib/modules - - local _install="zinstall dtbs_install" - - cd "$srcdir"/build-$_flavor - # modules_install seems to regenerate a defect Modules.symvers. Work - # around it by backing it up and restore it after modules_install - cp Module.symvers Module.symvers.backup - - local INSTALL_DTBS_PATH="$_outdir"/boot - make -j1 modules_install $_install \ - ARCH="$_carch" \ - INSTALL_MOD_PATH="$_outdir" \ - INSTALL_MOD_STRIP=1 \ - INSTALL_PATH="$_outdir"/boot \ - INSTALL_DTBS_PATH="$INSTALL_DTBS_PATH" - cp Module.symvers.backup Module.symvers - - cp "$_builddir"/arch/arm/boot/zImage "$_outdir"/boot/zImage - rm "$_outdir"/boot/vmlinuz-$_flavor - - rm -f "$_outdir"/lib/modules/$_abi_release/build \ - "$_outdir"/lib/modules/$_abi_release/source - rm -rf "$_outdir"/lib/firmware - - install -D -m644 include/config/kernel.release \ - "$_outdir"/usr/share/kernel/$_flavor/kernel.release - - # install missing firmware - install -vDm644 "$srcdir"/epdc_ES103CS1.fw "$_outdir"/lib/firmware/imx/epdc/epdc_ES103CS1.fw -} - -# main flavor installs in $pkgdir -package() { - _package rm "$pkgdir" -} - -# subflavors install in $subpkgdir -rm2() { - depends="initramfs-generator linux-firmware-brcm linux-firmware-cypress" - _package rm2 "$subpkgdir" -} - -_dev() { - local _flavor=$(echo $subpkgname | sed -E 's/(^linux-|-dev$)//g') - local _builddir="$srcdir"/build-$_flavor - local _abi_release="$(make -C "$_builddir" -s kernelrelease)" - # copy the only the parts that we really need for build 3rd party - # kernel modules and install those as /usr/src/linux-headers, - # simlar to what ubuntu does - # - # this way you dont need to install the 300-400 kernel sources to - # build a tiny kernel module - # - pkgdesc="Headers and script for third party modules for $_flavor kernel" - depends="$_depends_dev" - local dir="$subpkgdir"/usr/src/linux-headers-$_abi_release - - # first we import config, run prepare to set up for building - # external modules, and create the scripts - mkdir -p "$dir" - cp "$_builddir"/.config "$dir"/.config - echo "-$pkgrel-$_flavor" > "$dir"/localversion-alpine - - make -j1 -C "$builddir" \ - O="$dir" \ - ARCH="$_carch" \ - AWK="${AWK:-mawk}" \ - syncconfig prepare modules_prepare scripts - - # remove the stuff that points to real sources. we want 3rd party - # modules to believe this is the soruces - rm "$dir"/Makefile "$dir"/source - - # scripts aren't being crossbuilt from some reason - if cross_compiling; then - for i in $(scanelf -R "$dir" | awk '{print $2}' | sed '1d'); do rm "$i"; done - fi - - # copy the needed stuff from real sources - # - # this is taken from ubuntu kernel build script - # http://kernel.ubuntu.com/git/ubuntu/ubuntu-zesty.git/tree/debian/rules.d/3-binary-indep.mk - cd "$builddir" - find . -path './include/*' -prune \ - -o -path './scripts/*' -prune -o -type f \ - \( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \ - -name '*.sh' -o -name '*.pl' -o -name '*.lds' \) \ - -print | cpio -pdm "$dir" - - cp -a scripts include "$dir" - - # shellcheck disable=SC2046 - find $(find arch -name include -type d -print) -type f \ - | cpio -pdm "$dir" - - install -Dm644 "$_builddir"/Module.symvers \ - "$dir"/Module.symvers - - mkdir -p "$subpkgdir"/lib/modules/$_abi_release - ln -sf /usr/src/linux-headers-$_abi_release \ - "$subpkgdir"/lib/modules/$_abi_release/build -} - -sha512sums=" -0409c8443f5a705e8254858f966eed571b935f1be952f64c1d74b52a043d0638ba358370ca20f665d69b70aabe06f03e0bfa02ccd1a4a2a174d5b9579a10b44e RM1XX_5.4.70_v1.3.4.tar.gz -ad4bd6f332319aceee7a1c7b71b49439e8217621214b6249c7e20198360d02ea442f31edfc8e1af1b85ed71e6f97c1cb7decf7b0885c9d0293361eef47f218b2 epdc_ES103CS1.fw -f9114f8843317e1d26fbf1831182bc9c8d5907a92af6312c778f32be81414cfddfc3ced7b58375960232031d3295e8770b1a1e7466d2ace99e01bbcccd838543 arm-replace-sun-style-flash-on-section-directive.patch -c5fc4f2f70112cc66a91a2948f7fd4adcd7172a95191b4c862084c7b80093cfa696925aa9a825c41bddac7441ba153eb264b8146e52a4556a73349e6fd10e641 brcmfmac-disable-power-management.patch -27ec1bc1d916dbd2258192c1ed864eacbd2746b49caa554fbaf1124bac478bab0b729e7fabbab8705ae175bb098800f795d415f4de4964da921c1b802560b67a brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch -0f47278c5bfafb939e46224fbf16f9491e3cc560ac128dcf430a1f6cf9064fb1c5bf5db1a3076c35d30c004aec525a7d6616a647564f197bb29c57701c1db982 enable-automatic-partial-refreshing.patch -9d01054ea7e4ee43836cc536bead5c1707b133790a4ef63e29feb10de4e0b290ba8829980b5340f56bee1e9ec0de66e1e4a55f03c0e6aacbce871a9d60e6ef2e config-changes-rm.armv7 -9d01054ea7e4ee43836cc536bead5c1707b133790a4ef63e29feb10de4e0b290ba8829980b5340f56bee1e9ec0de66e1e4a55f03c0e6aacbce871a9d60e6ef2e config-changes-rm.armhf -" diff --git a/user/linux-rm/arm-replace-sun-style-flash-on-section-directive.patch b/user/linux-rm/arm-replace-sun-style-flash-on-section-directive.patch deleted file mode 100644 index 29fef7f..0000000 --- a/user/linux-rm/arm-replace-sun-style-flash-on-section-directive.patch +++ /dev/null @@ -1,428 +0,0 @@ -From 790756c7e0229dedc83bf058ac69633045b1000e Mon Sep 17 00:00:00 2001 -From: Nick Desaulniers -Date: Mon, 4 Nov 2019 19:31:45 +0100 -Subject: [PATCH] ARM: 8933/1: replace Sun/Solaris style flag on section - directive - -It looks like a section directive was using "Solaris style" to declare -the section flags. Replace this with the GNU style so that Clang's -integrated assembler can assemble this directive. - -The modified instances were identified via: -$ ag \.section | grep # - -Link: https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_7.html#SEC119 -Link: https://github.com/ClangBuiltLinux/linux/issues/744 -Link: https://bugs.llvm.org/show_bug.cgi?id=43759 -Link: https://reviews.llvm.org/D69296 - -Acked-by: Nicolas Pitre -Reviewed-by: Ard Biesheuvel -Reviewed-by: Stefan Agner -Signed-off-by: Nick Desaulniers -Suggested-by: Fangrui Song -Suggested-by: Jian Cai -Suggested-by: Peter Smith -Signed-off-by: Russell King ---- - arch/arm/boot/bootp/init.S | 2 +- - arch/arm/boot/compressed/big-endian.S | 2 +- - arch/arm/boot/compressed/head.S | 2 +- - arch/arm/boot/compressed/piggy.S | 2 +- - arch/arm/mm/proc-arm1020.S | 2 +- - arch/arm/mm/proc-arm1020e.S | 2 +- - arch/arm/mm/proc-arm1022.S | 2 +- - arch/arm/mm/proc-arm1026.S | 2 +- - arch/arm/mm/proc-arm720.S | 2 +- - arch/arm/mm/proc-arm740.S | 2 +- - arch/arm/mm/proc-arm7tdmi.S | 2 +- - arch/arm/mm/proc-arm920.S | 2 +- - arch/arm/mm/proc-arm922.S | 2 +- - arch/arm/mm/proc-arm925.S | 2 +- - arch/arm/mm/proc-arm926.S | 2 +- - arch/arm/mm/proc-arm940.S | 2 +- - arch/arm/mm/proc-arm946.S | 2 +- - arch/arm/mm/proc-arm9tdmi.S | 2 +- - arch/arm/mm/proc-fa526.S | 2 +- - arch/arm/mm/proc-feroceon.S | 2 +- - arch/arm/mm/proc-mohawk.S | 2 +- - arch/arm/mm/proc-sa110.S | 2 +- - arch/arm/mm/proc-sa1100.S | 2 +- - arch/arm/mm/proc-v6.S | 2 +- - arch/arm/mm/proc-v7.S | 2 +- - arch/arm/mm/proc-v7m.S | 4 ++-- - arch/arm/mm/proc-xsc3.S | 2 +- - arch/arm/mm/proc-xscale.S | 2 +- - 28 files changed, 29 insertions(+), 29 deletions(-) - -diff --git a/arch/arm/boot/bootp/init.S b/arch/arm/boot/bootp/init.S -index 5c476bd2b4ce9c..b562da2f704088 100644 ---- a/arch/arm/boot/bootp/init.S -+++ b/arch/arm/boot/bootp/init.S -@@ -13,7 +13,7 @@ - * size immediately following the kernel, we could build this into - * a binary blob, and concatenate the zImage using the cat command. - */ -- .section .start,#alloc,#execinstr -+ .section .start, "ax" - .type _start, #function - .globl _start - -diff --git a/arch/arm/boot/compressed/big-endian.S b/arch/arm/boot/compressed/big-endian.S -index 88e2a88d324b25..0e092c36da2f27 100644 ---- a/arch/arm/boot/compressed/big-endian.S -+++ b/arch/arm/boot/compressed/big-endian.S -@@ -6,7 +6,7 @@ - * Author: Nicolas Pitre - */ - -- .section ".start", #alloc, #execinstr -+ .section ".start", "ax" - - mrc p15, 0, r0, c1, c0, 0 @ read control reg - orr r0, r0, #(1 << 7) @ enable big endian mode -diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S -index ae70754d003daa..ead21e5f2b8032 100644 ---- a/arch/arm/boot/compressed/head.S -+++ b/arch/arm/boot/compressed/head.S -@@ -140,7 +140,7 @@ - #endif - .endm - -- .section ".start", #alloc, #execinstr -+ .section ".start", "ax" - /* - * sort out different calling conventions - */ -diff --git a/arch/arm/boot/compressed/piggy.S b/arch/arm/boot/compressed/piggy.S -index 0284f84dcf3804..27577644ee721a 100644 ---- a/arch/arm/boot/compressed/piggy.S -+++ b/arch/arm/boot/compressed/piggy.S -@@ -1,5 +1,5 @@ - /* SPDX-License-Identifier: GPL-2.0 */ -- .section .piggydata,#alloc -+ .section .piggydata, "a" - .globl input_data - input_data: - .incbin "arch/arm/boot/compressed/piggy_data" -diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S -index 4fa5371bc6624c..2785da387c9104 100644 ---- a/arch/arm/mm/proc-arm1020.S -+++ b/arch/arm/mm/proc-arm1020.S -@@ -491,7 +491,7 @@ cpu_arm1020_name: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm1020_proc_info,#object - __arm1020_proc_info: -diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S -index 5d8a8339e09a4e..e9ea237ed78525 100644 ---- a/arch/arm/mm/proc-arm1020e.S -+++ b/arch/arm/mm/proc-arm1020e.S -@@ -449,7 +449,7 @@ arm1020e_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm1020e_proc_info,#object - __arm1020e_proc_info: -diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S -index b3dd95c345e482..920c279e7879d8 100644 ---- a/arch/arm/mm/proc-arm1022.S -+++ b/arch/arm/mm/proc-arm1022.S -@@ -443,7 +443,7 @@ arm1022_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm1022_proc_info,#object - __arm1022_proc_info: -diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S -index e927187157d7d5..0bdf25a95b107d 100644 ---- a/arch/arm/mm/proc-arm1026.S -+++ b/arch/arm/mm/proc-arm1026.S -@@ -437,7 +437,7 @@ arm1026_crval: - string cpu_arm1026_name, "ARM1026EJ-S" - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm1026_proc_info,#object - __arm1026_proc_info: -diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S -index c99d24363f32ee..39361e196d61b8 100644 ---- a/arch/arm/mm/proc-arm720.S -+++ b/arch/arm/mm/proc-arm720.S -@@ -172,7 +172,7 @@ arm720_crval: - * See for a definition of this structure. - */ - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro arm720_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cpu_flush:req - .type __\name\()_proc_info,#object -diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S -index 1b4a3838393fbd..1a94bbf6e53fc2 100644 ---- a/arch/arm/mm/proc-arm740.S -+++ b/arch/arm/mm/proc-arm740.S -@@ -128,7 +128,7 @@ __arm740_setup: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - .type __arm740_proc_info,#object - __arm740_proc_info: - .long 0x41807400 -diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S -index 17a4687065c7f9..52b66cf0259e3f 100644 ---- a/arch/arm/mm/proc-arm7tdmi.S -+++ b/arch/arm/mm/proc-arm7tdmi.S -@@ -72,7 +72,7 @@ __arm7tdmi_setup: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro arm7tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, \ - extra_hwcaps=0 -diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S -index 298c76b47749f9..31ac8acc34dc55 100644 ---- a/arch/arm/mm/proc-arm920.S -+++ b/arch/arm/mm/proc-arm920.S -@@ -434,7 +434,7 @@ arm920_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm920_proc_info,#object - __arm920_proc_info: -diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S -index 824be3a0bc2382..ca2c7ca8af2146 100644 ---- a/arch/arm/mm/proc-arm922.S -+++ b/arch/arm/mm/proc-arm922.S -@@ -412,7 +412,7 @@ arm922_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm922_proc_info,#object - __arm922_proc_info: -diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S -index d40cff8f102c2b..a381a0c9f1092e 100644 ---- a/arch/arm/mm/proc-arm925.S -+++ b/arch/arm/mm/proc-arm925.S -@@ -477,7 +477,7 @@ arm925_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro arm925_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache - .type __\name\()_proc_info,#object -diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S -index 4ef89e1d11276e..1ba253c2bce190 100644 ---- a/arch/arm/mm/proc-arm926.S -+++ b/arch/arm/mm/proc-arm926.S -@@ -460,7 +460,7 @@ arm926_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm926_proc_info,#object - __arm926_proc_info: -diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S -index 1c26d991386d7d..4b8a00220cc976 100644 ---- a/arch/arm/mm/proc-arm940.S -+++ b/arch/arm/mm/proc-arm940.S -@@ -340,7 +340,7 @@ __arm940_setup: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __arm940_proc_info,#object - __arm940_proc_info: -diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S -index 2dc1c75a4fd4a8..555becf9c758d1 100644 ---- a/arch/arm/mm/proc-arm946.S -+++ b/arch/arm/mm/proc-arm946.S -@@ -395,7 +395,7 @@ __arm946_setup: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - .type __arm946_proc_info,#object - __arm946_proc_info: - .long 0x41009460 -diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S -index 913c06e590af51..ef517530130b03 100644 ---- a/arch/arm/mm/proc-arm9tdmi.S -+++ b/arch/arm/mm/proc-arm9tdmi.S -@@ -66,7 +66,7 @@ __arm9tdmi_setup: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro arm9tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req - .type __\name\()_proc_info, #object -diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S -index 8120b6f4dbb83e..dddf833fe00078 100644 ---- a/arch/arm/mm/proc-fa526.S -+++ b/arch/arm/mm/proc-fa526.S -@@ -185,7 +185,7 @@ fa526_cr1_set: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __fa526_proc_info,#object - __fa526_proc_info: -diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S -index bb6dc34d42a374..b12b76bc8d30ca 100644 ---- a/arch/arm/mm/proc-feroceon.S -+++ b/arch/arm/mm/proc-feroceon.S -@@ -571,7 +571,7 @@ feroceon_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro feroceon_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache:req - .type __\name\()_proc_info,#object -diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S -index f083085788857b..d47d6c5cee63a6 100644 ---- a/arch/arm/mm/proc-mohawk.S -+++ b/arch/arm/mm/proc-mohawk.S -@@ -416,7 +416,7 @@ mohawk_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __88sv331x_proc_info,#object - __88sv331x_proc_info: -diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S -index d5bc5d70256399..baba503ba81669 100644 ---- a/arch/arm/mm/proc-sa110.S -+++ b/arch/arm/mm/proc-sa110.S -@@ -196,7 +196,7 @@ sa110_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .type __sa110_proc_info,#object - __sa110_proc_info: -diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S -index be7b611c76c76a..75ebacc8e4e5cb 100644 ---- a/arch/arm/mm/proc-sa1100.S -+++ b/arch/arm/mm/proc-sa1100.S -@@ -239,7 +239,7 @@ sa1100_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro sa1100_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req - .type __\name\()_proc_info,#object -diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S -index c1c85eb3484f31..1dd0d5ca27da8f 100644 ---- a/arch/arm/mm/proc-v6.S -+++ b/arch/arm/mm/proc-v6.S -@@ -261,7 +261,7 @@ v6_crval: - string cpu_elf_name, "v6" - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - /* - * Match any ARMv6 processor core. -diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S -index c4e8006a1a8cdd..48e0ef6f0dccfe 100644 ---- a/arch/arm/mm/proc-v7.S -+++ b/arch/arm/mm/proc-v7.S -@@ -644,7 +644,7 @@ __v7_setup_stack: - string cpu_elf_name, "v7" - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - /* - * Standard v7 proc info content -diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S -index 1a49d503eafc80..84459c1d31b87f 100644 ---- a/arch/arm/mm/proc-v7m.S -+++ b/arch/arm/mm/proc-v7m.S -@@ -93,7 +93,7 @@ ENTRY(cpu_cm7_proc_fin) - ret lr - ENDPROC(cpu_cm7_proc_fin) - -- .section ".init.text", #alloc, #execinstr -+ .section ".init.text", "ax" - - __v7m_cm7_setup: - mov r8, #(V7M_SCB_CCR_DC | V7M_SCB_CCR_IC| V7M_SCB_CCR_BP) -@@ -177,7 +177,7 @@ ENDPROC(__v7m_setup) - string cpu_elf_name "v7m" - string cpu_v7m_name "ARMv7-M" - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro __v7m_proc name, initfunc, cache_fns = nop_cache_fns, hwcaps = 0, proc_fns = v7m_processor_functions - .long 0 /* proc_info_list.__cpu_mm_mmu_flags */ -diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S -index 1ac0fbbe9f127f..42eaecc43cfeff 100644 ---- a/arch/arm/mm/proc-xsc3.S -+++ b/arch/arm/mm/proc-xsc3.S -@@ -496,7 +496,7 @@ xsc3_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro xsc3_proc_info name:req, cpu_val:req, cpu_mask:req - .type __\name\()_proc_info,#object -diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S -index bdb2b7749b0393..18ac5a1f892258 100644 ---- a/arch/arm/mm/proc-xscale.S -+++ b/arch/arm/mm/proc-xscale.S -@@ -610,7 +610,7 @@ xscale_crval: - - .align - -- .section ".proc.info.init", #alloc -+ .section ".proc.info.init", "a" - - .macro xscale_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache - .type __\name\()_proc_info,#object diff --git a/user/linux-rm/brcmfmac-disable-power-management.patch b/user/linux-rm/brcmfmac-disable-power-management.patch deleted file mode 100644 index 2d48b3f..0000000 --- a/user/linux-rm/brcmfmac-disable-power-management.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/./drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c.orig b/./drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index f507d82..6c06044 100644 ---- a/./drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c.orig -+++ b/./drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -2743,6 +2743,8 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, - * preference in cfg struct to apply this to - * FW later while initializing the dongle - */ -+ pr_info("power management disabled\n"); -+ enabled = false; - cfg->pwr_save = enabled; - if (!check_vif_up(ifp->vif)) { - diff --git a/user/linux-rm/brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch b/user/linux-rm/brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch deleted file mode 100644 index 713c034..0000000 --- a/user/linux-rm/brcmfmac-fix-suspend-resume-when-power-is-cut-off.patch +++ /dev/null @@ -1,221 +0,0 @@ -From patchwork Wed Sep 25 13:44:57 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Adrian Ratiu -X-Patchwork-Id: 11160709 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org - [172.30.200.123]) - by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E6264924 - for ; - Wed, 25 Sep 2019 13:45:07 +0000 (UTC) -Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) - by mail.kernel.org (Postfix) with ESMTP id CEE8421D7E - for ; - Wed, 25 Sep 2019 13:45:07 +0000 (UTC) -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S2406776AbfIYNo5 (ORCPT - ); - Wed, 25 Sep 2019 09:44:57 -0400 -Received: from bhuna.collabora.co.uk ([46.235.227.227]:57998 "EHLO - bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S2406646AbfIYNo5 (ORCPT - ); - Wed, 25 Sep 2019 09:44:57 -0400 -Received: from [127.0.0.1] (localhost [127.0.0.1]) - (Authenticated sender: aratiu) - with ESMTPSA id 34818280400 -From: Adrian Ratiu -To: brcm80211-dev-list.pdl@broadcom.com -Cc: linux-wireless@vger.kernel.org, netdev@vger.kernel.org, - linux-kernel@vger.kernel.org, - Martyn Welch -Subject: [PATCH 1/2] brcmfmac: don't WARN when there are no requests -Date: Wed, 25 Sep 2019 16:44:57 +0300 -Message-Id: <20190925134458.1413790-1-adrian.ratiu@collabora.com> -X-Mailer: git-send-email 2.23.0 -MIME-Version: 1.0 -Sender: linux-wireless-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -When n_reqs == 0 there is nothing to do so it doesn't make sense to -search for requests and issue a warning because none is found. - -Signed-off-by: Martyn Welch -Signed-off-by: Adrian Ratiu ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c -index 14e530601ef3..fabfbb0b40b0 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c -@@ -57,6 +57,10 @@ static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid) - - mutex_lock(&pi->req_lock); - -+ /* Nothing to do if we have no requests */ -+ if (pi->n_reqs == 0) -+ goto done; -+ - /* find request */ - for (i = 0; i < pi->n_reqs; i++) { - if (pi->reqs[i]->reqid == reqid) - -From patchwork Wed Sep 25 13:44:58 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Adrian Ratiu -X-Patchwork-Id: 11160707 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org - [172.30.200.123]) - by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 47A3C14DB - for ; - Wed, 25 Sep 2019 13:45:03 +0000 (UTC) -Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) - by mail.kernel.org (Postfix) with ESMTP id 2F3CC21D7F - for ; - Wed, 25 Sep 2019 13:45:03 +0000 (UTC) -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S2406832AbfIYNo6 (ORCPT - ); - Wed, 25 Sep 2019 09:44:58 -0400 -Received: from bhuna.collabora.co.uk ([46.235.227.227]:58004 "EHLO - bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S2406650AbfIYNo5 (ORCPT - ); - Wed, 25 Sep 2019 09:44:57 -0400 -Received: from [127.0.0.1] (localhost [127.0.0.1]) - (Authenticated sender: aratiu) - with ESMTPSA id 8EFA628BCCF -From: Adrian Ratiu -To: brcm80211-dev-list.pdl@broadcom.com -Cc: linux-wireless@vger.kernel.org, netdev@vger.kernel.org, - linux-kernel@vger.kernel.org, - Gustavo Padovan -Subject: [PATCH 2/2] brcmfmac: fix suspend/resume when power is cut off -Date: Wed, 25 Sep 2019 16:44:58 +0300 -Message-Id: <20190925134458.1413790-2-adrian.ratiu@collabora.com> -X-Mailer: git-send-email 2.23.0 -In-Reply-To: <20190925134458.1413790-1-adrian.ratiu@collabora.com> -References: <20190925134458.1413790-1-adrian.ratiu@collabora.com> -MIME-Version: 1.0 -Sender: linux-wireless-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -brcmfmac assumed the wifi device always remains powered on and thus -hardcoded the MMC_PM_KEEP_POWER flag expecting the wifi device to -remain on even during suspend/resume cycles. - -This is not always the case, some appliances cut power to everything -connected via SDIO for efficiency reasons and this leads to wifi not -being usable after coming out of suspend because the device was not -correctly reinitialized. - -So we check for the keep_power capability and if it's not present then -we remove the device and probe it again during resume to mirror what's -happening in hardware and ensure correct reinitialization in the case -when MMC_PM_KEEP_POWER is not supported. - -Suggested-by: Gustavo Padovan -Signed-off-by: Adrian Ratiu ---- - .../broadcom/brcm80211/brcmfmac/bcmsdh.c | 53 ++++++++++++++----- - 1 file changed, 39 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c -index 987731b..dac4685 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c -@@ -1136,7 +1136,8 @@ static int brcmf_ops_sdio_suspend(struct device *dev) - struct sdio_func *func; - struct brcmf_bus *bus_if; - struct brcmf_sdio_dev *sdiodev; -- mmc_pm_flag_t sdio_flags; -+ mmc_pm_flag_t pm_caps, sdio_flags; -+ int ret = 0; - struct brcmf_cfg80211_info *config; - int retry = BRCMF_PM_WAIT_MAXRETRY; - -@@ -1159,19 +1160,33 @@ static int brcmf_ops_sdio_suspend(struct device *dev) - - sdiodev = bus_if->bus_priv.sdio; - -- brcmf_sdiod_freezer_on(sdiodev); -- brcmf_sdio_wd_timer(sdiodev->bus, 0); -- -- sdio_flags = MMC_PM_KEEP_POWER; -- if (sdiodev->wowl_enabled) { -- if (sdiodev->settings->bus.sdio.oob_irq_supported) -- enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); -- else -- sdio_flags |= MMC_PM_WAKE_SDIO_IRQ; -+ pm_caps = sdio_get_host_pm_caps(func); -+ -+ if (pm_caps & MMC_PM_KEEP_POWER) { -+ /* preserve card power during suspend */ -+ brcmf_sdiod_freezer_on(sdiodev); -+ brcmf_sdio_wd_timer(sdiodev->bus, 0); -+ -+ sdio_flags = MMC_PM_KEEP_POWER; -+ if (sdiodev->wowl_enabled) { -+ if (sdiodev->settings->bus.sdio.oob_irq_supported) -+ enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); -+ else -+ sdio_flags |= MMC_PM_WAKE_SDIO_IRQ; -+ } -+ -+ if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags)) -+ brcmf_err("Failed to set pm_flags %x\n", sdio_flags); -+ -+ } else { -+ /* power will be cut so remove device, probe again in resume */ -+ brcmf_sdiod_intr_unregister(sdiodev); -+ ret = brcmf_sdiod_remove(sdiodev); -+ if (ret) -+ brcmf_err("Failed to remove device on suspend\n"); - } -- if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags)) -- brcmf_err("Failed to set pm_flags %x\n", sdio_flags); -- return 0; -+ -+ return ret; - } - - static int brcmf_ops_sdio_resume(struct device *dev) -@@ -1179,13 +1194,23 @@ static int brcmf_ops_sdio_resume(struct device *dev) - struct brcmf_bus *bus_if = dev_get_drvdata(dev); - struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; - struct sdio_func *func = container_of(dev, struct sdio_func, dev); -+ mmc_pm_flag_t pm_caps = sdio_get_host_pm_caps(func); -+ int ret = 0; - - brcmf_dbg(SDIO, "Enter: F%d\n", func->num); - if (func->num != 2) - return 0; - -- brcmf_sdiod_freezer_off(sdiodev); -- return 0; -+ if (!(pm_caps & MMC_PM_KEEP_POWER)) { -+ /* bus was powered off and device removed, probe again */ -+ ret = brcmf_sdiod_probe(sdiodev); -+ if (ret) -+ brcmf_err("Failed to probe device on resume\n"); -+ } else { -+ brcmf_sdiod_freezer_off(sdiodev); -+ } -+ -+ return ret; - } - - static const struct dev_pm_ops brcmf_sdio_pm_ops = { diff --git a/user/linux-rm/config-changes-rm.armhf b/user/linux-rm/config-changes-rm.armhf deleted file mode 120000 index 6c4e6a5..0000000 --- a/user/linux-rm/config-changes-rm.armhf +++ /dev/null @@ -1 +0,0 @@ -config-changes-rm.armv7 \ No newline at end of file diff --git a/user/linux-rm/config-changes-rm.armv7 b/user/linux-rm/config-changes-rm.armv7 deleted file mode 100644 index fa272a1..0000000 --- a/user/linux-rm/config-changes-rm.armv7 +++ /dev/null @@ -1,62 +0,0 @@ -# format is config=command -# where command can be one of: -# y,n,m,", -# from remarkable-microsd project -# see http://www.davisr.me/projects/remarkable-microsd/ -CONFIG_RTL_CARDS=y -CONFIG_BATTERY_BQ27XXX=y -CONFIG_BATTERY_BQ27XXX_I2C=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_CTR=y -CONFIG_CRYPTO_GHASH=y -# serial through USB -CONFIG_USB_ACM=y -CONFIG_USB_F_ACM=y -CONFIG_USB_U_SERIAL=y -CONFIG_USB_CDC_COMPOSITE=y -# console through serial -CONFIG_USB_G_SERIAL=y -CONFIG_U_SERIAL_CONSOLE=y -# wifi module doesn't load early enough for lack of initramfs -CONFIG_CFG80211=m -CONFIG_MAC80211=m -CONFIG_BRCMFMAC=m -CONFIG_BRCMUTIL=m -# iwd requires these modules -CONFIG_CRYPTO_AES=y -CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_USER_API_SKCIPHER=y -CONFIG_KEY_DH_OPERATIONS=y -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_SHA512=y -CONFIG_CRYPTO_SHA1=y -# other -LOCALVERSION="" -CONFIG_DEFAULT_HOSTNAME="remarkable" -CONFIG_MODULE_UNLOAD=y -# f2fs support -CONFIG_F2FS_FS=y -CONFIG_F2FS_STAT_FS=y -CONFIG_F2FS_FS_XATTR=y -CONFIG_F2FS_FS_POSIX_ACL=y -CONFIG_F2FS_FS_SECURITY=y -CONFIG_F2FS_CHECK_FS=n -CONFIG_F2FS_IO_TRACE=n -CONFIG_F2FS_FAULT_INJECTION=n -CONFIG_F2FS_FS_COMPRESSION=y -CONFIG_F2FS_FS_LZO=y -CONFIG_F2FS_FS_LZ4=y -CONFIG_F2FS_FS_ZSTD=y -CONFIG_F2FS_FS_LZORLE=y -# disabled as breaks build -CONFIG_MXC_GPU_VIV=n diff --git a/user/linux-rm/config-changes-rm2.armhf b/user/linux-rm/config-changes-rm2.armhf deleted file mode 120000 index 6c4e6a5..0000000 --- a/user/linux-rm/config-changes-rm2.armhf +++ /dev/null @@ -1 +0,0 @@ -config-changes-rm.armv7 \ No newline at end of file diff --git a/user/linux-rm/config-changes-rm2.armv7 b/user/linux-rm/config-changes-rm2.armv7 deleted file mode 120000 index 6c4e6a5..0000000 --- a/user/linux-rm/config-changes-rm2.armv7 +++ /dev/null @@ -1 +0,0 @@ -config-changes-rm.armv7 \ No newline at end of file diff --git a/user/linux-rm/enable-automatic-partial-refreshing.patch b/user/linux-rm/enable-automatic-partial-refreshing.patch deleted file mode 100644 index e78bc13..0000000 --- a/user/linux-rm/enable-automatic-partial-refreshing.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/drivers/video/fbdev/mxc/mxc_epdc_fb.c.orig b/drivers/video/fbdev/mxc/mxc_epdc_fb.c -index 5c7d87d..5c31379 100644 ---- a/drivers/video/fbdev/mxc/mxc_epdc_fb.c.orig -+++ b/drivers/video/fbdev/mxc/mxc_epdc_fb.c -@@ -3489,10 +3489,10 @@ static void mxc_epdc_fb_update_pages(struct mxc_epdc_fb_data *fb_data, - update.update_region.top = y1; - update.update_region.height = y2 - y1; - update.waveform_mode = WAVEFORM_MODE_AUTO; -- update.update_mode = UPDATE_MODE_FULL; -+ update.update_mode = UPDATE_MODE_PARTIAL; - update.update_marker = 0; - update.temp = TEMP_USE_AMBIENT; -- update.flags = 0; -+ update.flags = EPDC_FLAG_USE_REGAL; - - mxc_epdc_fb_send_update(&update, &fb_data->info); - } -@@ -3687,7 +3687,7 @@ static struct fb_ops mxc_epdc_fb_ops = { - }; - - static struct fb_deferred_io mxc_epdc_fb_defio = { -- .delay = HZ, -+ .delay = HZ / 30, - .deferred_io = mxc_epdc_fb_deferred_io, - }; - diff --git a/user/linux-rm/enable-sdhc1.patch b/user/linux-rm/enable-sdhc1.patch deleted file mode 100644 index 31c2b72..0000000 --- a/user/linux-rm/enable-sdhc1.patch +++ /dev/null @@ -1,790 +0,0 @@ -diff --git a/arch/arm/boot/dts/zero-gravitas.dts b/arch/arm/boot/dts/zero-gravitas.dts -index f51edfdedf8a..947f43c3434c 100644 ---- a/arch/arm/boot/dts/zero-gravitas.dts -+++ b/arch/arm/boot/dts/zero-gravitas.dts -@@ -1,6 +1,783 @@ --#include "zero-gravitas-factory.dts" -+/* -+ * Copyright (C) 2013 Freescale Semiconductor, Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+/dts-v1/; -+ -+#include -+#include -+#include "imx6sl.dtsi" -+#include "zero-gravitas-padctl.h" -+ -+/ { -+ model = "reMarkable 1.0"; -+ compatible = "remarkable,zero-gravitas", "fsl,imx6sl"; -+ -+ memory { -+ reg = <0x80000000 0x20000000>; -+ }; -+ -+ wifi_pwrseq: wifi_pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ reset-gpios = <&gpio3 30 GPIO_ACTIVE_LOW>, -+ <&gpio4 0 GPIO_ACTIVE_LOW>; -+ clocks = <&clks IMX6SL_CLK_OSC>; -+ clock-names = "ext_clock"; -+ }; -+ -+ regulators { -+ compatible = "simple-bus"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ reg_usb_otg1_vbus: regulator@0 { -+ compatible = "regulator-fixed"; -+ reg = <0>; -+ regulator-name = "usb_otg1_vbus"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ gpio = <&gpio4 15 0>; -+ enable-active-high; -+ vin-supply = <&swbst_reg>; -+ }; -+ -+ charger_regulator: regulator@1 { -+ reg = <1>; -+ compatible = "regulator-fixed"; -+ regulator-name = "charger-regulator"; -+ regulator-min-microamp = <5000000>; -+ regulator-max-microamp = <5000000>; -+ gpios = <&gpio3 27 GPIO_ACTIVE_LOW>; -+ enable-active-high; /* Don't invert twice */ -+ regulator-boot-on; -+ status = "disabled"; -+ }; -+ }; -+ -+ wacom_reset: wacom-reset { -+ compatible = "gpio-reset"; -+ reset-gpios = <&gpio4 4 1>; -+ reset-delay-us = <100000>; -+ #reset-cells = <0>; -+ }; -+ -+ gpio-keys { -+ compatible = "gpio-keys"; -+ pinctrl-0 = <&pinctrl_keys>; -+ pinctrl-names = "default"; -+ status = "okay"; -+ -+ button_0 { -+ label = "Power"; -+ gpios = <&gpio4 9 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ gpio-key,wakeup; -+ debounce-interval = <10>; -+ }; -+ -+ button_1 { -+ label = "Left"; -+ gpios = <&gpio3 24 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ gpio-key,wakeup; -+ debounce-interval = <5>; -+ }; -+ -+ button_2 { -+ label = "Home"; -+ gpios = <&gpio3 26 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ gpio-key,wakeup; -+ debounce-interval = <5>; -+ }; -+ button_3 { -+ label = "Right"; -+ gpios = <&gpio3 28 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ gpio-key,wakeup; -+ debounce-interval = <5>; -+ }; -+ button_4 { -+ label = "LowPower"; -+ gpios = <&gpio3 31 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ gpio-key,wakeup; -+ debounce-interval = <100>; -+ }; -+ }; -+ -+ usb_charger: usb_charger { -+ compatible = "gpio-charger"; -+ gpios = <&gpio4 1 0>; -+ status = "disabled"; -+ }; -+}; -+ -+&epdc { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_epdc_0>; -+ VCOM-supply = <&VCOM_reg>; -+ DISPLAY-supply = <&DISPLAY_reg>; -+ TMST-supply = <&TMST_reg>; -+ status = "okay"; -+}; -+ -+&gpc { -+ fsl,ldo-bypass = <1>; -+}; -+ -+®_arm { -+ vin-supply = <&sw1a_reg>; -+ regulator-allow-bypass; -+}; -+ -+®_soc { -+ vin-supply = <&sw1c_reg>; -+ regulator-allow-bypass; -+}; -+ -+®_pu { -+ vin-supply = <&sw1c_reg>; -+ regulator-allow-bypass; -+}; -+ -+&i2c1 { -+ clock-frequency = <100000>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_i2c1>; -+ status = "okay"; -+ -+ battery: bq27441@55 { -+ reg = <0x55>; -+ compatible = "ti,bq27441"; -+ /*power-supplies = <&usb_charger>;*/ -+ /*charger-supply = <&charger_regulator>;*/ -+ /*interrupt-parent = <&gpio3>; -+ interrupts = <31 IRQ_TYPE_LEVEL_HIGH>;*/ -+ ti,resistor-sense = <10>; -+ }; -+ -+ pmic: pfuze100@8 { -+ compatible = "fsl,pfuze100"; -+ reg = <0x08>; -+ -+ regulators { -+ sw1a_reg: sw1ab { -+ regulator-min-microvolt = <300000>; -+ regulator-max-microvolt = <1875000>; -+ regulator-boot-on; -+ regulator-always-on; -+ regulator-ramp-delay = <6250>; -+ }; -+ -+ sw1c_reg: sw1c { -+ regulator-min-microvolt = <300000>; -+ regulator-max-microvolt = <1875000>; -+ regulator-boot-on; -+ regulator-always-on; -+ regulator-ramp-delay = <6250>; -+ }; -+ -+ sw2_reg: sw2 { -+ regulator-min-microvolt = <400000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ sw3a_reg: sw3a { -+ regulator-min-microvolt = <400000>; -+ regulator-max-microvolt = <1975000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ sw3b_reg: sw3b { -+ regulator-min-microvolt = <400000>; -+ regulator-max-microvolt = <1975000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ sw4_reg: sw4 { -+ regulator-min-microvolt = <800000>; -+ regulator-max-microvolt = <3300000>; -+ }; -+ -+ swbst_reg: swbst { -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5150000>; -+ }; -+ -+ snvs_reg: vsnvs { -+ regulator-min-microvolt = <1000000>; -+ regulator-max-microvolt = <3000000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ vref_reg: vrefddr { -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ vgen1_reg: vgen1 { -+ regulator-min-microvolt = <800000>; -+ regulator-max-microvolt = <1550000>; -+ regulator-always-on; -+ }; -+ -+ vgen2_reg: vgen2 { -+ regulator-min-microvolt = <800000>; -+ regulator-max-microvolt = <1550000>; -+ }; -+ -+ vgen3_reg: vgen3 { -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ }; -+ -+ vgen4_reg: vgen4 { -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-always-on; -+ }; -+ -+ vgen5_reg: vgen5 { -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-always-on; -+ }; -+ -+ vgen6_reg: vgen6 { -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-always-on; -+ }; -+ }; -+ }; -+ -+ max17135@48 { -+ compatible = "maxim,max17135"; -+ reg = <0x48>; -+ pass_num = <2>; -+ gvee_pwrup = <0>; /* ms */ -+ vneg_pwrup = <3>; -+ vpos_pwrup = <6>; -+ gvdd_pwrup = <3>; -+ -+ gvdd_pwrdn = <1>; -+ vpos_pwrdn = <2>; -+ vneg_pwrdn = <6>; -+ gvee_pwrdn = <50>; -+ /* These are only for passnum 1, we use i2c */ -+ gpio_pmic_pwrgood = <&gpio2 13 0>; -+ gpio_pmic_vcom_ctrl = <&gpio2 3 0>; -+ gpio_pmic_wakeup = <&gpio2 14 0>; -+ gpio_pmic_v3p3 = <&gpio2 7 0>; -+ gpio_pmic_intr = <&gpio2 12 0>; -+ -+ regulators { -+ DISPLAY_reg: DISPLAY { -+ regulator-name = "DISPLAY"; -+ }; -+ -+ GVDD_reg: GVDD { -+ /* 20v */ -+ regulator-name = "GVDD"; -+ }; -+ -+ GVEE_reg: GVEE { -+ /* -22v */ -+ regulator-name = "GVEE"; -+ }; -+ -+ HVINN_reg: HVINN { -+ /* -22v */ -+ regulator-name = "HVINN"; -+ }; -+ -+ HVINP_reg: HVINP { -+ /* 20v */ -+ regulator-name = "HVINP"; -+ }; -+ -+ VCOM_reg: VCOM { -+ regulator-name = "VCOM"; -+ /* Real max value: -500000 */ -+ regulator-max-microvolt = <4325000>; -+ /* Real min value: -4325000 */ -+ regulator-min-microvolt = <500000>; -+ }; -+ -+ VNEG_reg: VNEG { -+ /* -15v */ -+ regulator-name = "VNEG"; -+ }; -+ -+ VPOS_reg: VPOS { -+ /* 15v */ -+ regulator-name = "VPOS"; -+ }; -+ -+ TMST_reg: TMST { -+ regulator-name = "TMST"; -+ /* 2's-compliment, -127 */ -+ regulator-min-microvolt = <0xffffff81>; -+ /* 2's-compliment, +127 */ -+ regulator-max-microvolt = <0x0000007f>; -+ }; -+ }; -+ }; -+ -+}; -+ -+&i2c2 { -+ clock-frequency = <100000>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_i2c2>; -+ status = "okay"; -+ -+ digitizer: wacom-i2c@9 { -+ compatible = "wacom,wacom-i2c"; -+ reg = <0x09>; -+ interrupt-parent = <&gpio2>; -+ interrupts = <10 2>; -+ resets = <&wacom_reset>; -+ }; -+}; -+ -+&i2c3 { -+ clock-frequency = <100000>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_i2c3>; -+ status = "okay"; -+ -+ tsc@24 { -+ compatible = "cy,cyttsp5_i2c_adapter"; -+ reg = <0x24>; -+ interrupt-parent = <&gpio4>; -+ interrupts = <3 2>; -+ cy,adapter_id = "cyttsp5_i2c_adapter"; -+ status = "okay"; -+ -+ cy,core { -+ cy,name = "cyttsp5_core"; -+ -+ cy,irq_gpio = <&gpio4 3 0>; -+ cy,rst_gpio = <&gpio4 5 0>; -+ cy,hid_desc_register = <1>; -+ /* CY_CORE_FLAG_RESTORE_PARAMETERS */ -+ cy,flags = <4>; -+ /* CY_CORE_EWG_NONE */ -+ cy,easy_wakeup_gesture = <0>; -+ cy,btn_keys = <172 /* KEY_HOMEPAGE */ -+ /* previously was KEY_HOME, new Android versions use KEY_HOMEPAGE */ -+ 139 /* KEY_MENU */ -+ 158 /* KEY_BACK */ -+ 217 /* KEY_SEARCH */ -+ 114 /* KEY_VOLUMEDOWN */ -+ 115 /* KEY_VOLUMEUP */ -+ 212 /* KEY_CAMERA */ -+ 116>; /* KEY_POWER */ -+ cy,btn_keys-tag = <0>; -+ -+ cy,mt { -+ cy,name = "cyttsp5_mt"; -+ -+ cy,inp_dev_name = "cyttsp5_mt"; -+ cy,flags = <0>; -+ cy,abs = -+ /* ABS_MT_POSITION_X, CY_ABS_MIN_X, CY_ABS_MAX_X, 0, 0 */ -+ <0x35 0 880 0 0 -+ /* ABS_MT_POSITION_Y, CY_ABS_MIN_Y, CY_ABS_MAX_Y, 0, 0 */ -+ 0x36 0 1280 0 0 -+ /* ABS_MT_PRESSURE, CY_ABS_MIN_P, CY_ABS_MAX_P, 0, 0 */ -+ 0x3a 0 255 0 0 -+ /* CY_IGNORE_VALUE, CY_ABS_MIN_W, CY_ABS_MAX_W, 0, 0 */ -+ 0xffff 0 255 0 0 -+ /* ABS_MT_TRACKING_ID, CY_ABS_MIN_T, CY_ABS_MAX_T, 0, 0 */ -+ 0x39 0 15 0 0 -+ /* ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0 */ -+ 0x30 0 255 0 0 -+ /* ABS_MT_TOUCH_MINOR, 0, 255, 0, 0 */ -+ 0x31 0 255 0 0 -+ /* ABS_MT_ORIENTATION, -127, 127, 0, 0 */ -+ 0x34 0xffffff81 127 0 0 -+ /* ABS_MT_TOOL_TYPE, 0, MT_TOOL_MAX, 0, 0 */ -+ 0x37 0 1 0 0 -+ /* ABS_DISTANCE, 0, 255, 0, 0 */ -+ 0x19 0 255 0 0>; -+ -+ cy,vkeys_x = <720>; -+ cy,vkeys_y = <1280>; -+ -+ cy,virtual_keys = /* KeyCode CenterX CenterY Width Height */ -+ /* KEY_BACK */ -+ <158 1360 90 160 180 -+ /* KEY_MENU */ -+ 139 1360 270 160 180 -+ /* KEY_HOMEPAGE */ -+ 172 1360 450 160 180 -+ /* KEY SEARCH */ -+ 217 1360 630 160 180>; -+ }; -+ }; -+ }; -+}; -+ -+&iomuxc { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_hog>; -+ -+ zero-gravitas { -+ pinctrl_hog: hoggrp { -+ fsl,pins = < -+ /* MAX17135 pwrgood */ -+ MX6SL_PAD_EPDC_PWRSTAT__GPIO2_IO13 PAD_CTL_NONE -+ /* MAX17135 vcom ctrl */ -+ MX6SL_PAD_EPDC_VCOM0__GPIO2_IO03 PAD_CTL_NONE -+ /* MAX17135 wakeup */ -+ MX6SL_PAD_EPDC_PWRWAKEUP__GPIO2_IO14 PAD_CTL_NONE -+ /* MAX17135 v3p3 */ -+ MX6SL_PAD_EPDC_PWRCTRL0__GPIO2_IO07 PAD_CTL_NONE -+ /* MAX17135 intr */ -+ MX6SL_PAD_EPDC_PWRINT__GPIO2_IO12 PAD_CTL_NONE -+ -+ /* BQ27441 low power */ -+ MX6SL_PAD_KEY_ROW3__GPIO3_IO31 0x17000 -+ -+ /* Wacom interrupt */ -+ MX6SL_PAD_EPDC_PWRCTRL3__GPIO2_IO10 0x17000 -+ /* Wacom reset */ -+ MX6SL_PAD_KEY_COL6__GPIO4_IO04 0x110b0 -+ -+ /* CYTTSP interrupt */ -+ MX6SL_PAD_KEY_ROW5__GPIO4_IO03 0x17000 -+ /* CYTTSP reset */ -+ MX6SL_PAD_KEY_ROW6__GPIO4_IO05 0x110b0 -+ -+ /* USB OTG1 voltage control */ -+ /*MX6SL_PAD_ECSPI2_SS0__GPIO4_IO15 0x17000*/ -+ /*MX6SL_PAD_ECSPI2_SS0__GPIO4_IO15 0x000b0*/ -+ MX6SL_PAD_ECSPI2_SS0__GPIO4_IO15 PAD_CTL_NONE -+ /*MX6SL_PAD_ECSPI2_SS0__USB_OTG1_PWR 0x17000*/ -+ /* USB OTG1 over current detection */ -+ MX6SL_PAD_ECSPI2_MISO__USB_OTG1_OC 0x1b0b0 -+ -+ /* Charger control */ -+ MX6SL_PAD_KEY_ROW1__GPIO3_IO27 0x110b0 -+ /* Charger status */ -+ MX6SL_PAD_KEY_ROW4__GPIO4_IO01 PAD_CTL_NONE -+ -+ /* USDHC1 card detect */ -+ MX6SL_PAD_KEY_ROW7__GPIO4_IO07 0x17059 -+ -+ /* CHIP_WAKE_HOST */ -+ MX6SL_PAD_KEY_COL5__GPIO4_IO02 PAD_CTL_NONE -+ /* POWER_WIFI: WiFi external power control */ -+ MX6SL_PAD_KEY_COL3__GPIO3_IO30 PAD_CTL_NONE -+ /* WL_DIS: WiFi internal power control */ -+ MX6SL_PAD_KEY_COL4__GPIO4_IO00 PAD_CTL_NONE -+ -+ /* 32Khz clock from i.MX6 to WiFi for power saving */ -+ MX6SL_PAD_REF_CLK_32K__XTALOSC_REF_CLK_32K 0x1b0b0 -+ >; -+ }; -+ -+ pinctrl_epdc_0: epdcgrp-0 { -+ fsl,pins = < -+ MX6SL_PAD_EPDC_D0__EPDC_DATA00 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D1__EPDC_DATA01 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D2__EPDC_DATA02 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D3__EPDC_DATA03 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D4__EPDC_DATA04 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D5__EPDC_DATA05 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D6__EPDC_DATA06 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D7__EPDC_DATA07 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D8__EPDC_DATA08 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D9__EPDC_DATA09 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D10__EPDC_DATA10 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D11__EPDC_DATA11 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D12__EPDC_DATA12 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D13__EPDC_DATA13 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D14__EPDC_DATA14 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_D15__EPDC_DATA15 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_GDCLK__EPDC_GDCLK PAD_CTL_NONE -+ MX6SL_PAD_EPDC_GDOE__EPDC_GDOE PAD_CTL_NONE -+ MX6SL_PAD_EPDC_GDSP__EPDC_GDSP PAD_CTL_NONE -+ MX6SL_PAD_EPDC_SDCE0__EPDC_SDCE0 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_SDCLK__EPDC_SDCLK_P PAD_CTL_NONE -+ MX6SL_PAD_EPDC_SDLE__EPDC_SDLE PAD_CTL_NONE -+ MX6SL_PAD_EPDC_SDOE__EPDC_SDOE PAD_CTL_NONE -+ MX6SL_PAD_EPDC_BDR0__EPDC_BDR0 PAD_CTL_NONE -+ MX6SL_PAD_EPDC_BDR1__EPDC_BDR1 PAD_CTL_NONE -+ >; -+ }; -+ -+ pinctrl_i2c1: i2c1grp { -+ fsl,pins = < -+ MX6SL_PAD_I2C1_SCL__I2C1_SCL 0x4001b8b1 -+ MX6SL_PAD_I2C1_SDA__I2C1_SDA 0x4001b8b1 -+ >; -+ }; -+ -+ -+ pinctrl_i2c2: i2c2grp { -+ fsl,pins = < -+ MX6SL_PAD_I2C2_SCL__I2C2_SCL 0x4001b8b1 -+ MX6SL_PAD_I2C2_SDA__I2C2_SDA 0x4001b8b1 -+ >; -+ }; -+ -+ pinctrl_i2c3: i2c3grp { -+ fsl,pins = < -+ MX6SL_PAD_AUD_RXFS__I2C3_SCL 0x4001b8b1 -+ MX6SL_PAD_AUD_RXC__I2C3_SDA 0x4001b8b1 -+ >; -+ }; -+ -+ pinctrl_keys: keygrp { -+ fsl,pins = < -+ MX6SL_PAD_ECSPI1_MOSI__GPIO4_IO09 0x100b1 -+ MX6SL_PAD_KEY_COL0__GPIO3_IO24 0x100b1 -+ MX6SL_PAD_KEY_COL1__GPIO3_IO26 0x100b1 -+ MX6SL_PAD_KEY_COL2__GPIO3_IO28 0x100b1 -+ >; -+ }; -+ -+ pinctrl_uart1: uart1grp { -+ fsl,pins = < -+ MX6SL_PAD_UART1_RXD__UART1_RX_DATA 0x1b0b1 -+ MX6SL_PAD_UART1_TXD__UART1_TX_DATA 0x1b0b1 -+ >; -+ }; -+ -+ pinctrl_usbotg1: usbotg1grp { -+ fsl,pins = < -+ MX6SL_PAD_EPDC_PWRCOM__USB_OTG1_ID 0x17059 -+ >; -+ }; -+ -+ pinctrl_usdhc1: usdhc1grp { -+ fsl,pins = < -+ MX6SL_PAD_SD1_CMD__SD1_CMD PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD1_CLK__SD1_CLK PAD_CTL_USDHC_CLK_DEFAULT -+ MX6SL_PAD_SD1_DAT0__SD1_DATA0 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD1_DAT1__SD1_DATA1 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD1_DAT2__SD1_DATA2 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD1_DAT3__SD1_DATA3 PAD_CTL_USDHC_DEFAULT -+ >; -+ }; -+ -+ pinctrl_usdhc1_100mhz: usdhc1grp100mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD1_CMD__SD1_CMD PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD1_CLK__SD1_CLK PAD_CTL_USDHC_CLK_100MHZ -+ MX6SL_PAD_SD1_DAT0__SD1_DATA0 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD1_DAT1__SD1_DATA1 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD1_DAT2__SD1_DATA2 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD1_DAT3__SD1_DATA3 PAD_CTL_USDHC_100MHZ -+ >; -+ }; -+ -+ pinctrl_usdhc1_200mhz: usdhc1grp200mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD1_CMD__SD1_CMD PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD1_CLK__SD1_CLK PAD_CTL_USDHC_CLK_200MHZ -+ MX6SL_PAD_SD1_DAT0__SD1_DATA0 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD1_DAT1__SD1_DATA1 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD1_DAT2__SD1_DATA2 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD1_DAT3__SD1_DATA3 PAD_CTL_USDHC_200MHZ -+ >; -+ }; -+ -+ pinctrl_usdhc2: usdhc2grp { -+ fsl,pins = < -+ MX6SL_PAD_SD2_CMD__SD2_CMD PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_CLK__SD2_CLK PAD_CTL_USDHC_CLK_DEFAULT -+ MX6SL_PAD_SD2_DAT0__SD2_DATA0 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT1__SD2_DATA1 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT2__SD2_DATA2 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT3__SD2_DATA3 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT4__SD2_DATA4 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT5__SD2_DATA5 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT6__SD2_DATA6 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_DAT7__SD2_DATA7 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD2_RST__SD2_RESET PAD_CTL_USDHC_CLK_DEFAULT -+ >; -+ }; -+ -+ pinctrl_usdhc2_100mhz: usdhc2grp100mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD2_CMD__SD2_CMD PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_CLK__SD2_CLK PAD_CTL_USDHC_CLK_100MHZ -+ MX6SL_PAD_SD2_DAT0__SD2_DATA0 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT1__SD2_DATA1 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT2__SD2_DATA2 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT3__SD2_DATA3 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT4__SD2_DATA4 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT5__SD2_DATA5 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT6__SD2_DATA6 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_DAT7__SD2_DATA7 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD2_RST__SD2_RESET PAD_CTL_USDHC_CLK_DEFAULT -+ >; -+ }; -+ -+ pinctrl_usdhc2_200mhz: usdhc2grp200mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD2_CMD__SD2_CMD PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_CLK__SD2_CLK PAD_CTL_USDHC_CLK_200MHZ -+ MX6SL_PAD_SD2_DAT0__SD2_DATA0 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT1__SD2_DATA1 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT2__SD2_DATA2 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT3__SD2_DATA3 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT4__SD2_DATA4 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT5__SD2_DATA5 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT6__SD2_DATA6 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_DAT7__SD2_DATA7 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD2_RST__SD2_RESET PAD_CTL_USDHC_CLK_DEFAULT -+ >; -+ }; -+ -+ pinctrl_usdhc3: usdhc3grp { -+ fsl,pins = < -+ MX6SL_PAD_SD3_CMD__SD3_CMD PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD3_CLK__SD3_CLK PAD_CTL_USDHC_CLK_DEFAULT -+ MX6SL_PAD_SD3_DAT0__SD3_DATA0 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD3_DAT1__SD3_DATA1 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD3_DAT2__SD3_DATA2 PAD_CTL_USDHC_DEFAULT -+ MX6SL_PAD_SD3_DAT3__SD3_DATA3 PAD_CTL_USDHC_DEFAULT -+ >; -+ }; -+ -+ pinctrl_usdhc3_100mhz: usdhc3grp100mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD3_CMD__SD3_CMD PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD3_CLK__SD3_CLK PAD_CTL_USDHC_CLK_100MHZ -+ MX6SL_PAD_SD3_DAT0__SD3_DATA0 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD3_DAT1__SD3_DATA1 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD3_DAT2__SD3_DATA2 PAD_CTL_USDHC_100MHZ -+ MX6SL_PAD_SD3_DAT3__SD3_DATA3 PAD_CTL_USDHC_100MHZ -+ >; -+ }; -+ -+ pinctrl_usdhc3_200mhz: usdhc3grp200mhz { -+ fsl,pins = < -+ MX6SL_PAD_SD3_CMD__SD3_CMD PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD3_CLK__SD3_CLK PAD_CTL_USDHC_CLK_200MHZ -+ MX6SL_PAD_SD3_DAT0__SD3_DATA0 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD3_DAT1__SD3_DATA1 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD3_DAT2__SD3_DATA2 PAD_CTL_USDHC_200MHZ -+ MX6SL_PAD_SD3_DAT3__SD3_DATA3 PAD_CTL_USDHC_200MHZ -+ >; -+ }; -+ }; -+}; -+ -+&pxp { -+ status = "okay"; -+}; -+ -+&snvs_poweroff { -+ status = "okay"; -+}; -+ -+&uart1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_uart1>; -+ status = "okay"; -+}; -+ -+/*&usbmisc { -+ vbus-wakeup-supply = <®_usb_otg1_vbus>; -+};*/ - - &usbotg1 { -- vbus-supply = <®_usb_otg1_vbus>; -+ /*vbus-supply = <®_usb_otg1_vbus>;*/ -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_usbotg1>; -+ disable-over-current; -+ /* This kills the speed */ -+ imx-usb-charger-detection; -+ srp-disable; -+ hnp-disable; -+ adp-disable; -+ status = "okay"; - }; - -+&usbotg2 { -+ dr_mode = "host"; -+ disable-over-current; -+ srp-disable; -+ hnp-disable; -+ adp-disable; -+ status = "disabled"; -+}; -+ -+ -+&usbphy1 { -+ tx-d-cal = <0x5>; -+}; -+ -+&usbphy2 { -+ tx-d-cal = <0x5>; -+ status = "disabled"; -+}; -+ -+&usdhc1 { -+ pinctrl-names = "default", "state_100mhz", "state_200mhz"; -+ pinctrl-0 = <&pinctrl_usdhc1>; -+ pinctrl-1 = <&pinctrl_usdhc1_100mhz>; -+ pinctrl-2 = <&pinctrl_usdhc1_200mhz>; -+ bus-width = <4>; -+ cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>; -+ disable-wp; -+ wp-controller; -+ keep-power-in-suspend; -+ enable-sdio-wakeup; -+ no-1-8-v; -+ status = "okay"; -+}; -+ -+&usdhc2 { -+ pinctrl-names = "default", "state_100mhz", "state_200mhz"; -+ pinctrl-0 = <&pinctrl_usdhc2>; -+ pinctrl-1 = <&pinctrl_usdhc2_100mhz>; -+ pinctrl-2 = <&pinctrl_usdhc2_200mhz>; -+ bus-width = <8>; -+ non-removable; -+ keep-power-in-suspend; -+ no-1-8-v; -+ disable-wp; -+ cap-mmc-highspeed; -+ status = "okay"; -+}; -+ -+&usdhc3 { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ pinctrl-names = "default", "state_100mhz", "state_200mhz"; -+ pinctrl-0 = <&pinctrl_usdhc3>; -+ pinctrl-1 = <&pinctrl_usdhc3_100mhz>; -+ pinctrl-2 = <&pinctrl_usdhc3_200mhz>; -+ mmc-pwrseq = <&wifi_pwrseq>; -+ bus-width = <4>; -+ enable-sdio-wakeup; -+ non-removable; -+ disable-wp; -+ no-1-8-v; -+ wifi-host; -+ keep-power-in-suspend; -+ status = "okay"; -+ -+ brcmf: bcrmf@1 { -+ reg = <1>; -+ compatible = "brcm,bcm4329-fmac"; -+ /*resets = <&wifi_reset>;*/ -+ }; -+}; From 494a4e9ebd58b500645ca49457f76e7e5fe1c345 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:20:03 -0400 Subject: [PATCH 178/313] user/linux-rm-headers: drop for pmos --- user/linux-rm-headers/APKBUILD | 40 ---------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 user/linux-rm-headers/APKBUILD diff --git a/user/linux-rm-headers/APKBUILD b/user/linux-rm-headers/APKBUILD deleted file mode 100644 index 0e34b2d..0000000 --- a/user/linux-rm-headers/APKBUILD +++ /dev/null @@ -1,40 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=linux-rm-headers -pkgver=5.4.70 -_rmver=1.3.4 -pkgrel=2 -pkgdesc="Linux kernel headers with reMarkable patches" -url=https://github.com/reMarkable/linux -provides="linux-headers=$pkgver-r$pkgrel" -makedepends="perl" -options="!check !dbg !strip !tracedeps" -builddir="$srcdir"/linux-RM1XX_${pkgver}_v$_rmver -source="https://github.com/reMarkable/linux/archive/refs/tags/RM1XX_${pkgver}_v$_rmver.tar.gz" -arch="noarch" -license="GPL-2.0" - -_carch=$CARCH -case "$CARCH" in - aarch64) _carch="arm64" ;; - arm*) _carch="arm" ;; -esac - -build() { - make headers ARCH="$_carch" -} - -package() { - mkdir -p "$pkgdir"/usr/ - cp -a usr/include/ "$pkgdir"/usr/include/ - - msg "purging non header files.." - find "$pkgdir"/usr/include/ ! -iname "*.h" -type f -exec rm -v {} \+ - - # provided by libdrm - rm -rf "$pkgdir"/usr/include/drm -} -sha512sums=" -0409c8443f5a705e8254858f966eed571b935f1be952f64c1d74b52a043d0638ba358370ca20f665d69b70aabe06f03e0bfa02ccd1a4a2a174d5b9579a10b44e RM1XX_5.4.70_v1.3.4.tar.gz -" From 0cfe53ed2cca9841120f153f081cbbacd3d4c6c2 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:24:25 -0400 Subject: [PATCH 179/313] user/xf86-video-fbdev-rm: drop for pmos --- user/xf86-video-fbdev-rm/APKBUILD | 40 ------ .../epdc_auto-update-patch.patch | 128 ------------------ user/xf86-video-fbdev-rm/fix-build.patch | 17 --- 3 files changed, 185 deletions(-) delete mode 100644 user/xf86-video-fbdev-rm/APKBUILD delete mode 100644 user/xf86-video-fbdev-rm/epdc_auto-update-patch.patch delete mode 100644 user/xf86-video-fbdev-rm/fix-build.patch diff --git a/user/xf86-video-fbdev-rm/APKBUILD b/user/xf86-video-fbdev-rm/APKBUILD deleted file mode 100644 index edfe76b..0000000 --- a/user/xf86-video-fbdev-rm/APKBUILD +++ /dev/null @@ -1,40 +0,0 @@ -# Maintainer: Natanael Copa -pkgname=xf86-video-fbdev-rm -pkgver=0.5.0 -pkgrel=3 -pkgdesc="Video driver for framebuffer device with rM patches" -url="https://www.x.org" -arch="all" -license="MIT" -subpackages="$pkgname-doc" -provides="xf86-video-fbdev=$pkgver-r$pkgrel" -makedepends="xorg-server-dev libxi-dev util-macros xorgproto linux-rm-headers" -builddir="$srcdir"/xf86-video-fbdev-$pkgver -source=" - https://www.x.org/releases/individual/driver/xf86-video-fbdev-$pkgver.tar.bz2 - epdc_auto-update-patch.patch - fix-build.patch - " - -build() { - export LDFLAGS="$LDFLAGS -Wl,-z,lazy" - ./configure \ - --build=$CBUILD \ - --host=$CHOST \ - --prefix=/usr - make -} - -check() { - make check -} - -package() { - make DESTDIR="$pkgdir" install -} - -sha512sums=" -c1217b943bbe3301b3c2a8649ed1004c3c67b02607bd56bbc14f6dfa05e7f0184332c81a6a19595514745501ed88526aee932e555779b7c3a8233646b0979448 xf86-video-fbdev-0.5.0.tar.bz2 -c211a2edf90b622d522a0513358431afa33c7b3b958b054221ff3a6e8ff72d1012b0141b073ea070f4bb2d2f9042d8e092434f14a91bea3bf8bf188c78c0bcb7 epdc_auto-update-patch.patch -19c6680d8e8b0ba3903fb76438b54f294a1715b93d50e1cb2ef95bb04770add5fdad1df4260ab7eb00bb26578baa79b7cfed3f7fa6cba70348611cc3797af3ee fix-build.patch -" diff --git a/user/xf86-video-fbdev-rm/epdc_auto-update-patch.patch b/user/xf86-video-fbdev-rm/epdc_auto-update-patch.patch deleted file mode 100644 index f54f524..0000000 --- a/user/xf86-video-fbdev-rm/epdc_auto-update-patch.patch +++ /dev/null @@ -1,128 +0,0 @@ -diff --git a/src/fbdev.c.orig b/src/fbdev.c -index f25ef72..46b3c8c 100644 ---- a/src/fbdev.c.orig -+++ b/src/fbdev.c -@@ -8,6 +8,8 @@ - #endif - - #include -+#include -+#include - - /* all driver need this */ - #include "xf86.h" -@@ -18,6 +20,7 @@ - #include "colormapst.h" - #include "xf86cmap.h" - #include "shadow.h" -+#include "os.h" - #include "dgaproc.h" - - /* for visuals */ -@@ -186,6 +189,9 @@ typedef struct { - int rotate; - Bool shadowFB; - Bool shadow24; -+ Bool timerActive; -+ OsTimerPtr timer; -+ RegionPtr region_queue; - void *shadow; - CloseScreenProcPtr CloseScreen; - CreateScreenResourcesProcPtr CreateScreenResources; -@@ -697,6 +703,87 @@ fbdevUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) - shadowUpdatePacked(pScreen, pBuf); - } - -+static CARD32 FBDevEPDUpdateWork(OsTimerPtr timer, -+ CARD32 time, -+ void *arg); -+ -+static void FBDevEPDUpdate(ScreenPtr pScreen, shadowBufPtr pBuf) -+{ -+ RegionPtr damage = DamageRegion(pBuf->pDamage); -+ -+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -+ FBDevPtr fPtr = FBDEVPTR(pScrn); -+ shadowUpdateProc update; -+ if (fPtr->shadow24) -+ update = fbdevUpdate32to24; -+ else if (fPtr->rotate) -+ update = fbdevUpdateRotatePacked; -+ else -+ update = fbdevUpdatePacked; -+ -+ update(pScreen, pBuf); -+ -+ if (fPtr->region_queue) { -+ RegionAppend(fPtr->region_queue, damage); -+ } else { -+ fPtr->region_queue = RegionDuplicate(damage); -+ } -+ -+ if (!fPtr->timerActive) { -+ FBDevEPDUpdateWork(fPtr->timer, GetTimeInMillis(), -+ pScreen); -+ } -+} -+ -+static CARD32 FBDevEPDUpdateWork(OsTimerPtr timer, -+ CARD32 time, -+ void *arg) -+{ -+ ScreenPtr pScreen = (void *)arg; -+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -+ FBDevPtr fPtr = FBDEVPTR(pScrn); -+ BoxPtr pbox; -+ Bool overlap; -+ int nbox; -+ int fd = fbdevHWGetFD(pScrn); -+ if (fPtr->region_queue == NULL) { -+ fPtr->timerActive = FALSE; -+ return 0; -+ } -+ -+ struct mxcfb_update_data upd_region; -+ RegionValidate(fPtr->region_queue, &overlap); -+ pbox = RegionRects(fPtr->region_queue); -+ nbox = RegionNumRects(fPtr->region_queue); -+ -+ while(nbox--) { -+ int x, y, w, h; -+ int ret; -+ x = pbox->x1; -+ y = pbox->y1; -+ w = (pbox->x2 - pbox->x1); -+ h = pbox->y2 - pbox->y1; -+ memset(&upd_region, 0, sizeof(upd_region)); -+ upd_region.update_region.left = x; -+ upd_region.update_region.top = y; -+ upd_region.update_region.width = w; -+ upd_region.update_region.height = h; -+ upd_region.waveform_mode = WAVEFORM_MODE_AUTO; -+ upd_region.temp = TEMP_USE_AMBIENT; -+ upd_region.update_mode = UPDATE_MODE_PARTIAL; -+ upd_region.flags = 0; -+ ret = ioctl(fd, MXCFB_SEND_UPDATE, &upd_region); -+ if (ret < 0) -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"update ioctl failed: %d\n", ret); -+ pbox++; -+ } -+ fPtr->timer = TimerSet(timer, 0, 50, FBDevEPDUpdateWork, pScreen); -+ fPtr->timerActive = TRUE; -+ RegionDestroy(fPtr->region_queue); -+ fPtr->region_queue = NULL; -+ return 0; -+} -+ - static Bool - FBDevCreateScreenResources(ScreenPtr pScreen) - { -@@ -722,7 +809,7 @@ FBDevCreateScreenResources(ScreenPtr pScreen) - else - update = fbdevUpdatePacked; - -- if (!shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate, -+ if (!shadowAdd(pScreen, pPixmap, FBDevEPDUpdate, FBDevWindowLinear, fPtr->rotate, - NULL)) { - return FALSE; - } diff --git a/user/xf86-video-fbdev-rm/fix-build.patch b/user/xf86-video-fbdev-rm/fix-build.patch deleted file mode 100644 index f1ca165..0000000 --- a/user/xf86-video-fbdev-rm/fix-build.patch +++ /dev/null @@ -1,17 +0,0 @@ -Upstream: no (too lazy) -Reason: fixes build by getting rid of old cpp macro - -diff --git a/src/fbdev.c b/src/fbdev.c -index f25ef72..02a2b7a 100644 ---- a/src/fbdev.c -+++ b/src/fbdev.c -@@ -1010,7 +1010,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) - fPtr->CloseScreen = pScreen->CloseScreen; - pScreen->CloseScreen = FBDevCloseScreen; - --#if XV -+#if defined(XV) - { - XF86VideoAdaptorPtr *ptr; - - From 39823fcb316a0eb117c425cbf133387d233661d9 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:26:34 -0400 Subject: [PATCH 180/313] user/uvicorn: new aport --- .../2540_add-websocketssansioprotocol.patch | 1194 +++++++++++++++++ .../2541_bump-wesockets-on-requirements.patch | 559 ++++++++ user/uvicorn/APKBUILD | 55 + user/uvicorn/test_multiprocess.patch | 14 + 4 files changed, 1822 insertions(+) create mode 100644 user/uvicorn/2540_add-websocketssansioprotocol.patch create mode 100644 user/uvicorn/2541_bump-wesockets-on-requirements.patch create mode 100644 user/uvicorn/APKBUILD create mode 100644 user/uvicorn/test_multiprocess.patch diff --git a/user/uvicorn/2540_add-websocketssansioprotocol.patch b/user/uvicorn/2540_add-websocketssansioprotocol.patch new file mode 100644 index 0000000..a1fe5bf --- /dev/null +++ b/user/uvicorn/2540_add-websocketssansioprotocol.patch @@ -0,0 +1,1194 @@ +From d79d86eee1ad8cdcc9668de3237b0c6203257992 Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sat, 14 Dec 2024 13:44:22 +0100 +Subject: [PATCH 1/7] Add WebSocketsSansIOProtocol + +--- + docs/deployment.md | 2 +- + docs/index.md | 2 +- + pyproject.toml | 3 + + requirements.txt | 2 +- + tests/conftest.py | 4 +- + tests/middleware/test_logging.py | 11 +- + tests/middleware/test_proxy_headers.py | 5 +- + uvicorn/config.py | 3 +- + .../websockets/websockets_sansio_impl.py | 386 ++++++++++++++++++ + uvicorn/server.py | 3 +- + 10 files changed, 408 insertions(+), 13 deletions(-) + create mode 100644 uvicorn/protocols/websockets/websockets_sansio_impl.py + +diff --git a/pyproject.toml b/pyproject.toml +index 6f809030e..3e30b658c 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -93,6 +93,9 @@ filterwarnings = [ + "ignore:Uvicorn's native WSGI implementation is deprecated.*:DeprecationWarning", + "ignore: 'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning", + "ignore: remove second argument of ws_handler:DeprecationWarning:websockets", ++ "ignore: websockets.legacy is deprecated.*:DeprecationWarning", ++ "ignore: websockets.server.WebSocketServerProtocol is deprecated.*:DeprecationWarning", ++ "ignore: websockets.client.connect is deprecated.*:DeprecationWarning", + ] + + [tool.coverage.run] +diff --git a/requirements.txt b/requirements.txt +index b3a464c0b..fd2334d02 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -7,7 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master + # Explicit optionals + a2wsgi==1.10.7 + wsproto==1.2.0 +-websockets==13.1 ++websockets==14.1 + + # Packaging + build==1.2.2.post1 +diff --git a/tests/conftest.py b/tests/conftest.py +index 1b0c0e84e..84bda4dc2 100644 +--- a/tests/conftest.py ++++ b/tests/conftest.py +@@ -233,9 +233,9 @@ def unused_tcp_port() -> int: + marks=pytest.mark.skipif(not importlib.util.find_spec("wsproto"), reason="wsproto not installed."), + id="wsproto", + ), ++ pytest.param("uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", id="websockets"), + pytest.param( +- "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", +- id="websockets", ++ "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", id="websockets-sansio" + ), + ] + ) +diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py +index f27633aa5..c8126f9e6 100644 +--- a/tests/middleware/test_logging.py ++++ b/tests/middleware/test_logging.py +@@ -49,7 +49,9 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable + await send({"type": "http.response.body", "body": b"", "more_body": False}) + + +-async def test_trace_logging(caplog: pytest.LogCaptureFixture, logging_config, unused_tcp_port: int): ++async def test_trace_logging( ++ caplog: pytest.LogCaptureFixture, logging_config: dict[str, typing.Any], unused_tcp_port: int ++): + config = Config( + app=app, + log_level="trace", +@@ -89,10 +91,11 @@ async def test_trace_logging_on_http_protocol(http_protocol_cls, caplog, logging + assert any(" - HTTP connection lost" in message for message in messages) + + ++@pytest.mark.skip() + async def test_trace_logging_on_ws_protocol( + ws_protocol_cls: WSProtocol, +- caplog, +- logging_config, ++ caplog: pytest.LogCaptureFixture, ++ logging_config: dict[str, typing.Any], + unused_tcp_port: int, + ): + async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): +@@ -104,7 +107,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe + elif message["type"] == "websocket.disconnect": + break + +- async def open_connection(url): ++ async def open_connection(url: str): + async with websockets.client.connect(url) as websocket: + return websocket.open + +diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py +index 0ade97450..4b5f195f6 100644 +--- a/tests/middleware/test_proxy_headers.py ++++ b/tests/middleware/test_proxy_headers.py +@@ -5,7 +5,7 @@ + import httpx + import httpx._transports.asgi + import pytest +-import websockets.client ++from websockets.asyncio.client import connect + + from tests.response import Response + from tests.utils import run_server +@@ -465,6 +465,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe + host, port = scope["client"] + await send({"type": "websocket.accept"}) + await send({"type": "websocket.send", "text": f"{scheme}://{host}:{port}"}) ++ await send({"type": "websocket.close"}) + + app_with_middleware = ProxyHeadersMiddleware(websocket_app, trusted_hosts="*") + config = Config( +@@ -478,7 +479,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe + async with run_server(config): + url = f"ws://127.0.0.1:{unused_tcp_port}" + headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} +- async with websockets.client.connect(url, extra_headers=headers) as websocket: ++ async with connect(url, additional_headers=headers) as websocket: + data = await websocket.recv() + assert data == expected + +diff --git a/uvicorn/config.py b/uvicorn/config.py +index b08a8426b..3480b5392 100644 +--- a/uvicorn/config.py ++++ b/uvicorn/config.py +@@ -24,7 +24,7 @@ + from uvicorn.middleware.wsgi import WSGIMiddleware + + HTTPProtocolType = Literal["auto", "h11", "httptools"] +-WSProtocolType = Literal["auto", "none", "websockets", "wsproto"] ++WSProtocolType = Literal["auto", "none", "websockets", "websockets-sansio", "wsproto"] + LifespanType = Literal["auto", "on", "off"] + LoopSetupType = Literal["none", "auto", "asyncio", "uvloop"] + InterfaceType = Literal["auto", "asgi3", "asgi2", "wsgi"] +@@ -46,6 +46,7 @@ + "auto": "uvicorn.protocols.websockets.auto:AutoWebSocketsProtocol", + "none": None, + "websockets": "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", ++ "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", + "wsproto": "uvicorn.protocols.websockets.wsproto_impl:WSProtocol", + } + LIFESPAN: dict[LifespanType, str] = { +diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py +new file mode 100644 +index 000000000..49e8a71a1 +--- /dev/null ++++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py +@@ -0,0 +1,386 @@ ++from __future__ import annotations ++ ++import asyncio ++import logging ++from asyncio.transports import BaseTransport, Transport ++from http import HTTPStatus ++from typing import Any, Literal, cast ++from urllib.parse import unquote ++ ++from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory ++from websockets.frames import Frame, Opcode ++from websockets.http11 import Request ++from websockets.server import ServerProtocol ++ ++from uvicorn._types import ( ++ ASGIReceiveEvent, ++ ASGISendEvent, ++ WebSocketAcceptEvent, ++ WebSocketCloseEvent, ++ WebSocketDisconnectEvent, ++ WebSocketReceiveEvent, ++ WebSocketResponseBodyEvent, ++ WebSocketResponseStartEvent, ++ WebSocketScope, ++ WebSocketSendEvent, ++) ++from uvicorn.config import Config ++from uvicorn.logging import TRACE_LOG_LEVEL ++from uvicorn.protocols.utils import get_local_addr, get_path_with_query_string, get_remote_addr, is_ssl ++from uvicorn.server import ServerState ++ ++ ++class WebSocketSansIOProtocol(asyncio.Protocol): ++ def __init__( ++ self, ++ config: Config, ++ server_state: ServerState, ++ app_state: dict[str, Any], ++ _loop: asyncio.AbstractEventLoop | None = None, ++ ) -> None: ++ if not config.loaded: ++ config.load() # pragma: no cover ++ ++ self.config = config ++ self.app = config.loaded_app ++ self.loop = _loop or asyncio.get_event_loop() ++ self.logger = logging.getLogger("uvicorn.error") ++ self.root_path = config.root_path ++ self.app_state = app_state ++ ++ # Shared server state ++ self.connections = server_state.connections ++ self.tasks = server_state.tasks ++ self.default_headers = server_state.default_headers ++ ++ # Connection state ++ self.transport: asyncio.Transport = None # type: ignore[assignment] ++ self.server: tuple[str, int] | None = None ++ self.client: tuple[str, int] | None = None ++ self.scheme: Literal["wss", "ws"] = None # type: ignore[assignment] ++ ++ # WebSocket state ++ self.queue: asyncio.Queue[ASGIReceiveEvent] = asyncio.Queue() ++ self.handshake_initiated = False ++ self.handshake_complete = False ++ self.close_sent = False ++ self.initial_response: tuple[int, list[tuple[str, str]], bytes] | None = None ++ ++ extensions = [] ++ if self.config.ws_per_message_deflate: ++ extensions = [ServerPerMessageDeflateFactory()] ++ self.conn = ServerProtocol( ++ extensions=extensions, ++ max_size=self.config.ws_max_size, ++ logger=logging.getLogger("uvicorn.error"), ++ ) ++ ++ self.read_paused = False ++ self.writable = asyncio.Event() ++ self.writable.set() ++ ++ # Buffers ++ self.bytes = b"" ++ ++ def connection_made(self, transport: BaseTransport) -> None: ++ """Called when a connection is made.""" ++ transport = cast(Transport, transport) ++ self.connections.add(self) ++ self.transport = transport ++ self.server = get_local_addr(transport) ++ self.client = get_remote_addr(transport) ++ self.scheme = "wss" if is_ssl(transport) else "ws" ++ ++ if self.logger.level <= TRACE_LOG_LEVEL: ++ prefix = "%s:%d - " % self.client if self.client else "" ++ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix) ++ ++ def connection_lost(self, exc: Exception | None) -> None: ++ self.connections.remove(self) ++ if self.logger.level <= TRACE_LOG_LEVEL: ++ prefix = "%s:%d - " % self.client if self.client else "" ++ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection lost", prefix) ++ if self.handshake_initiated and not self.close_sent: ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) ++ ++ def shutdown(self) -> None: ++ if not self.transport.is_closing(): ++ if self.handshake_complete: ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) ++ self.close_sent = True ++ self.conn.send_close(1012) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ elif self.handshake_initiated: ++ self.send_500_response() ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) ++ self.transport.close() ++ ++ def data_received(self, data: bytes) -> None: ++ self.conn.receive_data(data) ++ parser_exc = self.conn.parser_exc ++ if parser_exc is not None: ++ self.handle_parser_exception() ++ return ++ self.handle_events() ++ ++ def handle_events(self) -> None: ++ for event in self.conn.events_received(): ++ if isinstance(event, Request): ++ self.handle_connect(event) ++ if isinstance(event, Frame): ++ if event.opcode == Opcode.CONT: ++ self.handle_cont(event) ++ elif event.opcode == Opcode.TEXT: ++ self.handle_text(event) ++ elif event.opcode == Opcode.BINARY: ++ self.handle_bytes(event) ++ elif event.opcode == Opcode.PING: ++ self.handle_ping(event) ++ elif event.opcode == Opcode.CLOSE: ++ self.handle_close(event) ++ ++ # Event handlers ++ ++ def handle_connect(self, event: Request) -> None: ++ self.request = event ++ self.response = self.conn.accept(event) ++ self.handshake_initiated = True ++ # if status_code is not 101 return response ++ if self.response.status_code != 101: ++ self.handshake_complete = True ++ self.close_sent = True ++ self.conn.send_response(self.response) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ self.transport.close() ++ return ++ ++ headers = [ ++ (key.encode("ascii"), value.encode("ascii", errors="surrogateescape")) ++ for key, value in event.headers.raw_items() ++ ] ++ raw_path, _, query_string = event.path.partition("?") ++ self.scope: WebSocketScope = { ++ "type": "websocket", ++ "asgi": {"version": self.config.asgi_version, "spec_version": "2.3"}, ++ "http_version": "1.1", ++ "scheme": self.scheme, ++ "server": self.server, ++ "client": self.client, ++ "root_path": self.root_path, ++ "path": unquote(raw_path), ++ "raw_path": raw_path.encode("ascii"), ++ "query_string": query_string.encode("ascii"), ++ "headers": headers, ++ "subprotocols": event.headers.get_all("Sec-WebSocket-Protocol"), ++ "state": self.app_state.copy(), ++ "extensions": {"websocket.http.response": {}}, ++ } ++ self.queue.put_nowait({"type": "websocket.connect"}) ++ task = self.loop.create_task(self.run_asgi()) ++ task.add_done_callback(self.on_task_complete) ++ self.tasks.add(task) ++ ++ def handle_cont(self, event: Frame) -> None: ++ self.bytes += event.data ++ if event.fin: ++ self.send_receive_event_to_app() ++ ++ def handle_text(self, event: Frame) -> None: ++ self.bytes = event.data ++ self.curr_msg_data_type: Literal["text", "bytes"] = "text" ++ if event.fin: ++ self.send_receive_event_to_app() ++ ++ def handle_bytes(self, event: Frame) -> None: ++ self.bytes = event.data ++ self.curr_msg_data_type = "bytes" ++ if event.fin: ++ self.send_receive_event_to_app() ++ ++ def send_receive_event_to_app(self) -> None: ++ data_type = self.curr_msg_data_type ++ msg: WebSocketReceiveEvent ++ if data_type == "text": ++ msg = {"type": "websocket.receive", data_type: self.bytes.decode()} ++ else: ++ msg = {"type": "websocket.receive", data_type: self.bytes} ++ self.queue.put_nowait(msg) ++ if not self.read_paused: ++ self.read_paused = True ++ self.transport.pause_reading() ++ ++ def handle_ping(self, event: Frame) -> None: ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ ++ def handle_close(self, event: Frame) -> None: ++ if not self.close_sent and self.conn.close_rcvd and not self.transport.is_closing(): ++ disconnect_event: WebSocketDisconnectEvent = { ++ "type": "websocket.disconnect", ++ "code": self.conn.close_rcvd.code, ++ "reason": self.conn.close_rcvd.reason, ++ } ++ self.queue.put_nowait(disconnect_event) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ self.close_sent = True ++ self.transport.close() ++ ++ def handle_parser_exception(self) -> None: ++ disconnect_event: WebSocketDisconnectEvent = { ++ "type": "websocket.disconnect", ++ "code": self.conn.close_sent.code if self.conn.close_sent else 1006, ++ } ++ self.queue.put_nowait(disconnect_event) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ self.close_sent = True ++ self.transport.close() ++ ++ def on_task_complete(self, task: asyncio.Task[None]) -> None: ++ self.tasks.discard(task) ++ ++ async def run_asgi(self) -> None: ++ try: ++ result = await self.app(self.scope, self.receive, self.send) ++ except BaseException: ++ self.logger.exception("Exception in ASGI application\n") ++ if not self.handshake_complete: ++ self.send_500_response() ++ self.transport.close() ++ else: ++ if not self.handshake_complete: ++ msg = "ASGI callable returned without completing handshake." ++ self.logger.error(msg) ++ self.send_500_response() ++ self.transport.close() ++ elif result is not None: ++ msg = "ASGI callable should return None, but returned '%s'." ++ self.logger.error(msg, result) ++ self.transport.close() ++ ++ def send_500_response(self) -> None: ++ response = self.conn.reject(500, "Internal Server Error") ++ self.conn.send_response(response) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ ++ async def send(self, message: ASGISendEvent) -> None: ++ await self.writable.wait() ++ ++ message_type = message["type"] ++ ++ if not self.handshake_complete and self.initial_response is None: ++ if message_type == "websocket.accept": ++ message = cast(WebSocketAcceptEvent, message) ++ self.logger.info( ++ '%s - "WebSocket %s" [accepted]', ++ self.scope["client"], ++ get_path_with_query_string(self.scope), ++ ) ++ headers = [ ++ (name.decode("latin-1").lower(), value.decode("latin-1").lower()) ++ for name, value in (self.default_headers + list(message.get("headers", []))) ++ ] ++ accepted_subprotocol = message.get("subprotocol") ++ if accepted_subprotocol: ++ headers.append(("Sec-WebSocket-Protocol", accepted_subprotocol)) ++ self.response.headers.update(headers) ++ ++ if not self.transport.is_closing(): ++ self.handshake_complete = True ++ self.conn.send_response(self.response) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ ++ elif message_type == "websocket.close": ++ message = cast(WebSocketCloseEvent, message) ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) ++ self.logger.info( ++ '%s - "WebSocket %s" 403', ++ self.scope["client"], ++ get_path_with_query_string(self.scope), ++ ) ++ response = self.conn.reject(HTTPStatus.FORBIDDEN, "") ++ self.conn.send_response(response) ++ output = self.conn.data_to_send() ++ self.close_sent = True ++ self.handshake_complete = True ++ self.transport.writelines(output) ++ self.transport.close() ++ elif message_type == "websocket.http.response.start": ++ message = cast(WebSocketResponseStartEvent, message) ++ self.logger.info( ++ '%s - "WebSocket %s" %d', ++ self.scope["client"], ++ get_path_with_query_string(self.scope), ++ message["status"], ++ ) ++ headers = [ ++ (name.decode("latin-1"), value.decode("latin-1")) ++ for name, value in list(message.get("headers", [])) ++ ] ++ self.initial_response = (message["status"], headers, b"") ++ else: ++ msg = ( ++ "Expected ASGI message 'websocket.accept', 'websocket.close' " ++ "or 'websocket.http.response.start' " ++ "but got '%s'." ++ ) ++ print(message) ++ raise RuntimeError(msg % message_type) ++ ++ elif not self.close_sent and self.initial_response is None: ++ if message_type == "websocket.send" and not self.transport.is_closing(): ++ message = cast(WebSocketSendEvent, message) ++ bytes_data = message.get("bytes") ++ text_data = message.get("text") ++ if text_data: ++ self.conn.send_text(text_data.encode()) ++ elif bytes_data: ++ self.conn.send_binary(bytes_data) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ ++ elif message_type == "websocket.close" and not self.transport.is_closing(): ++ message = cast(WebSocketCloseEvent, message) ++ code = message.get("code", 1000) ++ reason = message.get("reason", "") or "" ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) ++ self.conn.send_close(code, reason) ++ output = self.conn.data_to_send() ++ self.transport.writelines(output) ++ self.close_sent = True ++ self.transport.close() ++ else: ++ msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." ++ raise RuntimeError(msg % message_type) ++ elif self.initial_response is not None: ++ if message_type == "websocket.http.response.body": ++ message = cast(WebSocketResponseBodyEvent, message) ++ body = self.initial_response[2] + message["body"] ++ self.initial_response = self.initial_response[:2] + (body,) ++ if not message.get("more_body", False): ++ response = self.conn.reject(self.initial_response[0], body.decode()) ++ response.headers.update(self.initial_response[1]) ++ self.conn.send_response(response) ++ output = self.conn.data_to_send() ++ self.close_sent = True ++ self.transport.writelines(output) ++ self.transport.close() ++ else: ++ msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." ++ raise RuntimeError(msg % message_type) ++ ++ else: ++ msg = "Unexpected ASGI message '%s', after sending 'websocket.close'." ++ raise RuntimeError(msg % message_type) ++ ++ async def receive(self) -> ASGIReceiveEvent: ++ message = await self.queue.get() ++ if self.read_paused and self.queue.empty(): ++ self.read_paused = False ++ self.transport.resume_reading() ++ return message +diff --git a/uvicorn/server.py b/uvicorn/server.py +index f14026f16..2250e2dc7 100644 +--- a/uvicorn/server.py ++++ b/uvicorn/server.py +@@ -22,9 +22,10 @@ + from uvicorn.protocols.http.h11_impl import H11Protocol + from uvicorn.protocols.http.httptools_impl import HttpToolsProtocol + from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol ++ from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketSansIOProtocol + from uvicorn.protocols.websockets.wsproto_impl import WSProtocol + +- Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol] ++ Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketSansIOProtocol] + + HANDLED_SIGNALS = ( + signal.SIGINT, # Unix signal 2. Sent by Ctrl+C. + +From 7ee1e15a850d78754b757849886abb2011dd2e55 Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sat, 14 Dec 2024 17:54:55 +0100 +Subject: [PATCH 2/7] Add WebSocketsSansIOProtocol + +--- + tests/conftest.py | 2 +- + tests/middleware/test_logging.py | 1 - + tests/middleware/test_proxy_headers.py | 4 +- + tests/protocols/test_websocket.py | 35 +++--- + uvicorn/config.py | 2 +- + .../websockets/websockets_sansio_impl.py | 117 +++++++++++------- + uvicorn/server.py | 4 +- + 7 files changed, 96 insertions(+), 69 deletions(-) + +diff --git a/tests/conftest.py b/tests/conftest.py +index 84bda4dc2..7061a143b 100644 +--- a/tests/conftest.py ++++ b/tests/conftest.py +@@ -235,7 +235,7 @@ def unused_tcp_port() -> int: + ), + pytest.param("uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", id="websockets"), + pytest.param( +- "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", id="websockets-sansio" ++ "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol", id="websockets-sansio" + ), + ] + ) +diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py +index c8126f9e6..63d7daf83 100644 +--- a/tests/middleware/test_logging.py ++++ b/tests/middleware/test_logging.py +@@ -91,7 +91,6 @@ async def test_trace_logging_on_http_protocol(http_protocol_cls, caplog, logging + assert any(" - HTTP connection lost" in message for message in messages) + + +-@pytest.mark.skip() + async def test_trace_logging_on_ws_protocol( + ws_protocol_cls: WSProtocol, + caplog: pytest.LogCaptureFixture, +diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py +index 4b5f195f6..62a51ab20 100644 +--- a/tests/middleware/test_proxy_headers.py ++++ b/tests/middleware/test_proxy_headers.py +@@ -5,8 +5,8 @@ + import httpx + import httpx._transports.asgi + import pytest +-from websockets.asyncio.client import connect + ++import websockets.client + from tests.response import Response + from tests.utils import run_server + from uvicorn._types import ASGIReceiveCallable, ASGISendCallable, Scope +@@ -479,7 +479,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe + async with run_server(config): + url = f"ws://127.0.0.1:{unused_tcp_port}" + headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} +- async with connect(url, additional_headers=headers) as websocket: ++ async with websockets.client.connect(url, extra_headers=headers) as websocket: + data = await websocket.recv() + assert data == expected + +diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py +index 15ccfdd7d..8971a7d97 100644 +--- a/tests/protocols/test_websocket.py ++++ b/tests/protocols/test_websocket.py +@@ -601,20 +601,20 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable + await send_accept_task.wait() + disconnect_message = await receive() # type: ignore + +- response: httpx.Response | None = None +- + async def websocket_session(uri: str): +- nonlocal response + async with httpx.AsyncClient() as client: +- response = await client.get( +- f"http://127.0.0.1:{unused_tcp_port}", +- headers={ +- "upgrade": "websocket", +- "connection": "upgrade", +- "sec-websocket-version": "13", +- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", +- }, +- ) ++ try: ++ await client.get( ++ f"http://127.0.0.1:{unused_tcp_port}", ++ headers={ ++ "upgrade": "websocket", ++ "connection": "upgrade", ++ "sec-websocket-version": "13", ++ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", ++ }, ++ ) ++ except httpx.RemoteProtocolError: ++ pass # pragma: no cover + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -623,9 +623,6 @@ async def websocket_session(uri: str): + send_accept_task.set() + await asyncio.sleep(0.1) + +- assert response is not None +- assert response.status_code == 500, response.text +- assert response.text == "Internal Server Error" + assert disconnect_message == {"type": "websocket.disconnect", "code": 1006} + await task + +@@ -920,6 +917,9 @@ async def websocket_session(url: str): + async def test_server_reject_connection_with_invalid_msg( + ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int + ): ++ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": ++ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") ++ + async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): + assert scope["type"] == "websocket" + assert "extensions" in scope and "websocket.http.response" in scope["extensions"] +@@ -951,6 +951,9 @@ async def websocket_session(url: str): + async def test_server_reject_connection_with_missing_body( + ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int + ): ++ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": ++ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") ++ + async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): + assert scope["type"] == "websocket" + assert "extensions" in scope and "websocket.http.response" in scope["extensions"] +@@ -986,6 +989,8 @@ async def test_server_multiple_websocket_http_response_start_events( + The server should raise an exception if it sends multiple + websocket.http.response.start events. + """ ++ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": ++ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") + exception_message: str | None = None + + async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): +diff --git a/uvicorn/config.py b/uvicorn/config.py +index 3480b5392..187b94972 100644 +--- a/uvicorn/config.py ++++ b/uvicorn/config.py +@@ -46,7 +46,7 @@ + "auto": "uvicorn.protocols.websockets.auto:AutoWebSocketsProtocol", + "none": None, + "websockets": "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", +- "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", ++ "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol", + "wsproto": "uvicorn.protocols.websockets.wsproto_impl:WSProtocol", + } + LIFESPAN: dict[LifespanType, str] = { +diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py +index 49e8a71a1..ea70236b2 100644 +--- a/uvicorn/protocols/websockets/websockets_sansio_impl.py ++++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py +@@ -7,6 +7,7 @@ + from typing import Any, Literal, cast + from urllib.parse import unquote + ++from websockets import InvalidState + from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory + from websockets.frames import Frame, Opcode + from websockets.http11 import Request +@@ -26,11 +27,17 @@ + ) + from uvicorn.config import Config + from uvicorn.logging import TRACE_LOG_LEVEL +-from uvicorn.protocols.utils import get_local_addr, get_path_with_query_string, get_remote_addr, is_ssl ++from uvicorn.protocols.utils import ( ++ ClientDisconnected, ++ get_local_addr, ++ get_path_with_query_string, ++ get_remote_addr, ++ is_ssl, ++) + from uvicorn.server import ServerState + + +-class WebSocketSansIOProtocol(asyncio.Protocol): ++class WebSocketsSansIOProtocol(asyncio.Protocol): + def __init__( + self, + config: Config, +@@ -96,12 +103,20 @@ def connection_made(self, transport: BaseTransport) -> None: + self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix) + + def connection_lost(self, exc: Exception | None) -> None: ++ code = 1005 if self.handshake_complete else 1006 ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) + self.connections.remove(self) ++ + if self.logger.level <= TRACE_LOG_LEVEL: + prefix = "%s:%d - " % self.client if self.client else "" + self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection lost", prefix) +- if self.handshake_initiated and not self.close_sent: +- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) ++ ++ self.handshake_complete = True ++ if exc is None: ++ self.transport.close() ++ ++ def eof_received(self) -> None: ++ pass + + def shutdown(self) -> None: + if not self.transport.is_closing(): +@@ -110,8 +125,8 @@ def shutdown(self) -> None: + self.close_sent = True + self.conn.send_close(1012) + output = self.conn.data_to_send() +- self.transport.writelines(output) +- elif self.handshake_initiated: ++ self.transport.write(b"".join(output)) ++ elif not self.handshake_initiated: + self.send_500_response() + self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) + self.transport.close() +@@ -152,7 +167,7 @@ def handle_connect(self, event: Request) -> None: + self.close_sent = True + self.conn.send_response(self.response) + output = self.conn.data_to_send() +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + self.transport.close() + return + +@@ -213,29 +228,29 @@ def send_receive_event_to_app(self) -> None: + + def handle_ping(self, event: Frame) -> None: + output = self.conn.data_to_send() +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + + def handle_close(self, event: Frame) -> None: +- if not self.close_sent and self.conn.close_rcvd and not self.transport.is_closing(): ++ if not self.close_sent and not self.transport.is_closing(): + disconnect_event: WebSocketDisconnectEvent = { + "type": "websocket.disconnect", +- "code": self.conn.close_rcvd.code, +- "reason": self.conn.close_rcvd.reason, ++ "code": self.conn.close_rcvd.code, # type: ignore[union-attr] ++ "reason": self.conn.close_rcvd.reason, # type: ignore[union-attr] + } + self.queue.put_nowait(disconnect_event) + output = self.conn.data_to_send() +- self.transport.writelines(output) +- self.close_sent = True ++ self.transport.write(b"".join(output)) + self.transport.close() + + def handle_parser_exception(self) -> None: + disconnect_event: WebSocketDisconnectEvent = { + "type": "websocket.disconnect", +- "code": self.conn.close_sent.code if self.conn.close_sent else 1006, ++ "code": self.conn.close_sent.code, # type: ignore[union-attr] ++ "reason": self.conn.close_sent.reason, # type: ignore[union-attr] + } + self.queue.put_nowait(disconnect_event) + output = self.conn.data_to_send() +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + self.close_sent = True + self.transport.close() + +@@ -245,10 +260,11 @@ def on_task_complete(self, task: asyncio.Task[None]) -> None: + async def run_asgi(self) -> None: + try: + result = await self.app(self.scope, self.receive, self.send) ++ except ClientDisconnected: ++ self.transport.close() + except BaseException: + self.logger.exception("Exception in ASGI application\n") +- if not self.handshake_complete: +- self.send_500_response() ++ self.send_500_response() + self.transport.close() + else: + if not self.handshake_complete: +@@ -262,10 +278,12 @@ async def run_asgi(self) -> None: + self.transport.close() + + def send_500_response(self) -> None: ++ if self.initial_response or self.handshake_complete: ++ return + response = self.conn.reject(500, "Internal Server Error") + self.conn.send_response(response) + output = self.conn.data_to_send() +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + + async def send(self, message: ASGISendEvent) -> None: + await self.writable.wait() +@@ -293,7 +311,7 @@ async def send(self, message: ASGISendEvent) -> None: + self.handshake_complete = True + self.conn.send_response(self.response) + output = self.conn.data_to_send() +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + + elif message_type == "websocket.close": + message = cast(WebSocketCloseEvent, message) +@@ -308,10 +326,12 @@ async def send(self, message: ASGISendEvent) -> None: + output = self.conn.data_to_send() + self.close_sent = True + self.handshake_complete = True +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + self.transport.close() +- elif message_type == "websocket.http.response.start": ++ elif message_type == "websocket.http.response.start" and self.initial_response is None: + message = cast(WebSocketResponseStartEvent, message) ++ if not (100 <= message["status"] < 600): ++ raise RuntimeError("Invalid HTTP status code '%d' in response." % message["status"]) + self.logger.info( + '%s - "WebSocket %s" %d', + self.scope["client"], +@@ -329,34 +349,36 @@ async def send(self, message: ASGISendEvent) -> None: + "or 'websocket.http.response.start' " + "but got '%s'." + ) +- print(message) + raise RuntimeError(msg % message_type) + + elif not self.close_sent and self.initial_response is None: +- if message_type == "websocket.send" and not self.transport.is_closing(): +- message = cast(WebSocketSendEvent, message) +- bytes_data = message.get("bytes") +- text_data = message.get("text") +- if text_data: +- self.conn.send_text(text_data.encode()) +- elif bytes_data: +- self.conn.send_binary(bytes_data) +- output = self.conn.data_to_send() +- self.transport.writelines(output) +- +- elif message_type == "websocket.close" and not self.transport.is_closing(): +- message = cast(WebSocketCloseEvent, message) +- code = message.get("code", 1000) +- reason = message.get("reason", "") or "" +- self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) +- self.conn.send_close(code, reason) +- output = self.conn.data_to_send() +- self.transport.writelines(output) +- self.close_sent = True +- self.transport.close() +- else: +- msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." +- raise RuntimeError(msg % message_type) ++ try: ++ if message_type == "websocket.send": ++ message = cast(WebSocketSendEvent, message) ++ bytes_data = message.get("bytes") ++ text_data = message.get("text") ++ if text_data: ++ self.conn.send_text(text_data.encode()) ++ elif bytes_data: ++ self.conn.send_binary(bytes_data) ++ output = self.conn.data_to_send() ++ self.transport.write(b"".join(output)) ++ ++ elif message_type == "websocket.close" and not self.transport.is_closing(): ++ message = cast(WebSocketCloseEvent, message) ++ code = message.get("code", 1000) ++ reason = message.get("reason", "") or "" ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) ++ self.conn.send_close(code, reason) ++ output = self.conn.data_to_send() ++ self.transport.write(b"".join(output)) ++ self.close_sent = True ++ self.transport.close() ++ else: ++ msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." ++ raise RuntimeError(msg % message_type) ++ except InvalidState: ++ raise ClientDisconnected() + elif self.initial_response is not None: + if message_type == "websocket.http.response.body": + message = cast(WebSocketResponseBodyEvent, message) +@@ -365,10 +387,11 @@ async def send(self, message: ASGISendEvent) -> None: + if not message.get("more_body", False): + response = self.conn.reject(self.initial_response[0], body.decode()) + response.headers.update(self.initial_response[1]) ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) + self.conn.send_response(response) + output = self.conn.data_to_send() + self.close_sent = True +- self.transport.writelines(output) ++ self.transport.write(b"".join(output)) + self.transport.close() + else: + msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." +diff --git a/uvicorn/server.py b/uvicorn/server.py +index 2250e2dc7..e33716fd4 100644 +--- a/uvicorn/server.py ++++ b/uvicorn/server.py +@@ -22,10 +22,10 @@ + from uvicorn.protocols.http.h11_impl import H11Protocol + from uvicorn.protocols.http.httptools_impl import HttpToolsProtocol + from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol +- from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketSansIOProtocol ++ from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketsSansIOProtocol + from uvicorn.protocols.websockets.wsproto_impl import WSProtocol + +- Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketSansIOProtocol] ++ Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketsSansIOProtocol] + + HANDLED_SIGNALS = ( + signal.SIGINT, # Unix signal 2. Sent by Ctrl+C. + +From 035e7c38e98dbdbe81eae19f63ee8e1bfa1d1e4c Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sat, 14 Dec 2024 17:55:28 +0100 +Subject: [PATCH 3/7] lint + +--- + tests/middleware/test_proxy_headers.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py +index 62a51ab20..d300c45f8 100644 +--- a/tests/middleware/test_proxy_headers.py ++++ b/tests/middleware/test_proxy_headers.py +@@ -5,8 +5,8 @@ + import httpx + import httpx._transports.asgi + import pytest +- + import websockets.client ++ + from tests.response import Response + from tests.utils import run_server + from uvicorn._types import ASGIReceiveCallable, ASGISendCallable, Scope + +From eac77b7d86edb6a2ebcf9e2f380db18bb46fe684 Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sat, 14 Dec 2024 17:57:33 +0100 +Subject: [PATCH 4/7] pin python versions + +--- + requirements.txt | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/requirements.txt b/requirements.txt +index fd2334d02..366a0963a 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -7,7 +7,8 @@ h11 @ git+https://github.com/python-hyper/h11.git@master + # Explicit optionals + a2wsgi==1.10.7 + wsproto==1.2.0 +-websockets==14.1 ++websockets==13.1; python_version < '3.9' ++websockets==14.1; python_version >= '3.9' + + # Packaging + build==1.2.2.post1 + +From 032c00c5a13167deb638a1a5e13c9ccee091598a Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sun, 15 Dec 2024 13:18:34 +0100 +Subject: [PATCH 5/7] Update requirements.txt + +--- + requirements.txt | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/requirements.txt b/requirements.txt +index 366a0963a..b3a464c0b 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -7,8 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master + # Explicit optionals + a2wsgi==1.10.7 + wsproto==1.2.0 +-websockets==13.1; python_version < '3.9' +-websockets==14.1; python_version >= '3.9' ++websockets==13.1 + + # Packaging + build==1.2.2.post1 + +From c523508d5b5959bba65ebe1da2b4d3550e3c6674 Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sun, 15 Dec 2024 14:27:48 +0100 +Subject: [PATCH 6/7] Add a bit more coverage + +--- + tests/protocols/test_websocket.py | 23 +++++++++---------- + .../websockets/websockets_sansio_impl.py | 20 +++++++--------- + 2 files changed, 19 insertions(+), 24 deletions(-) + +diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py +index 8971a7d97..e7285449c 100644 +--- a/tests/protocols/test_websocket.py ++++ b/tests/protocols/test_websocket.py +@@ -7,6 +7,8 @@ + import httpx + import pytest + import websockets ++import websockets.asyncio ++import websockets.asyncio.client + import websockets.client + import websockets.exceptions + from typing_extensions import TypedDict +@@ -603,18 +605,15 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable + + async def websocket_session(uri: str): + async with httpx.AsyncClient() as client: +- try: +- await client.get( +- f"http://127.0.0.1:{unused_tcp_port}", +- headers={ +- "upgrade": "websocket", +- "connection": "upgrade", +- "sec-websocket-version": "13", +- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", +- }, +- ) +- except httpx.RemoteProtocolError: +- pass # pragma: no cover ++ await client.get( ++ f"http://127.0.0.1:{unused_tcp_port}", ++ headers={ ++ "upgrade": "websocket", ++ "connection": "upgrade", ++ "sec-websocket-version": "13", ++ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", ++ }, ++ ) + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py +index ea70236b2..994af07e7 100644 +--- a/uvicorn/protocols/websockets/websockets_sansio_impl.py ++++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py +@@ -119,17 +119,14 @@ def eof_received(self) -> None: + pass + + def shutdown(self) -> None: +- if not self.transport.is_closing(): +- if self.handshake_complete: +- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) +- self.close_sent = True +- self.conn.send_close(1012) +- output = self.conn.data_to_send() +- self.transport.write(b"".join(output)) +- elif not self.handshake_initiated: +- self.send_500_response() +- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) +- self.transport.close() ++ if self.handshake_complete: ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) ++ self.conn.send_close(1012) ++ output = self.conn.data_to_send() ++ self.transport.write(b"".join(output)) ++ else: ++ self.send_500_response() ++ self.transport.close() + + def data_received(self, data: bytes) -> None: + self.conn.receive_data(data) +@@ -161,7 +158,6 @@ def handle_connect(self, event: Request) -> None: + self.request = event + self.response = self.conn.accept(event) + self.handshake_initiated = True +- # if status_code is not 101 return response + if self.response.status_code != 101: + self.handshake_complete = True + self.close_sent = True + +From f774f2fcb04b3cfe0f3046cdd9298b04b55daf9a Mon Sep 17 00:00:00 2001 +From: Marcelo Trylesinski +Date: Sat, 19 Apr 2025 15:45:45 +0200 +Subject: [PATCH 7/7] Apply comments + +--- + tests/middleware/test_logging.py | 3 ++- + uvicorn/protocols/websockets/websockets_sansio_impl.py | 6 +++--- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py +index 63d7daf83..1b8b4fbb1 100644 +--- a/tests/middleware/test_logging.py ++++ b/tests/middleware/test_logging.py +@@ -10,6 +10,7 @@ + import pytest + import websockets + import websockets.client ++from websockets.protocol import State + + from tests.utils import run_server + from uvicorn import Config +@@ -108,7 +109,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe + + async def open_connection(url: str): + async with websockets.client.connect(url) as websocket: +- return websocket.open ++ return websocket.state is State.OPEN + + config = Config( + app=websocket_app, +diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py +index 994af07e7..b518c8407 100644 +--- a/uvicorn/protocols/websockets/websockets_sansio_impl.py ++++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py +@@ -7,7 +7,7 @@ + from typing import Any, Literal, cast + from urllib.parse import unquote + +-from websockets import InvalidState ++from websockets.exceptions import InvalidState + from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory + from websockets.frames import Frame, Opcode + from websockets.http11 import Request +@@ -371,7 +371,7 @@ async def send(self, message: ASGISendEvent) -> None: + self.close_sent = True + self.transport.close() + else: +- msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." ++ msg = "Expected ASGI message 'websocket.send' or 'websocket.close', but got '%s'." + raise RuntimeError(msg % message_type) + except InvalidState: + raise ClientDisconnected() +@@ -390,7 +390,7 @@ async def send(self, message: ASGISendEvent) -> None: + self.transport.write(b"".join(output)) + self.transport.close() + else: +- msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." ++ msg = "Expected ASGI message 'websocket.http.response.body' but got '%s'." + raise RuntimeError(msg % message_type) + + else: diff --git a/user/uvicorn/2541_bump-wesockets-on-requirements.patch b/user/uvicorn/2541_bump-wesockets-on-requirements.patch new file mode 100644 index 0000000..6b9f671 --- /dev/null +++ b/user/uvicorn/2541_bump-wesockets-on-requirements.patch @@ -0,0 +1,559 @@ +diff --git a/requirements.txt b/requirements.txt +index e26e6b3..b16569f 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -7,7 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master + # Explicit optionals + a2wsgi==1.10.7 + wsproto==1.2.0 +-websockets==13.1 ++websockets==14.1 + + # Packaging + build==1.2.2.post1 +diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py +index d300c45..4b5f195 100644 +--- a/tests/middleware/test_proxy_headers.py ++++ b/tests/middleware/test_proxy_headers.py +@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING + import httpx + import httpx._transports.asgi + import pytest +-import websockets.client ++from websockets.asyncio.client import connect + + from tests.response import Response + from tests.utils import run_server +@@ -479,7 +479,7 @@ async def test_proxy_headers_websocket_x_forwarded_proto( + async with run_server(config): + url = f"ws://127.0.0.1:{unused_tcp_port}" + headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} +- async with websockets.client.connect(url, extra_headers=headers) as websocket: ++ async with connect(url, additional_headers=headers) as websocket: + data = await websocket.recv() + assert data == expected + +diff --git a/uvicorn/protocols/websockets/websockets_impl.py b/uvicorn/protocols/websockets/websockets_impl.py +index cd6c54f..685d6b6 100644 +--- a/uvicorn/protocols/websockets/websockets_impl.py ++++ b/uvicorn/protocols/websockets/websockets_impl.py +@@ -13,8 +13,7 @@ from websockets.datastructures import Headers + from websockets.exceptions import ConnectionClosed + from websockets.extensions.base import ServerExtensionFactory + from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory +-from websockets.legacy.server import HTTPResponse +-from websockets.server import WebSocketServerProtocol ++from websockets.legacy.server import HTTPResponse, WebSocketServerProtocol + from websockets.typing import Subprotocol + + from uvicorn._types import ( +diff --git a/uvicorn/protocols/websockets/wsproto_impl.py b/uvicorn/protocols/websockets/wsproto_impl.py +index 828afe5..5d84bff 100644 +--- a/uvicorn/protocols/websockets/wsproto_impl.py ++++ b/uvicorn/protocols/websockets/wsproto_impl.py +@@ -149,12 +149,13 @@ class WSProtocol(asyncio.Protocol): + self.writable.set() # pragma: full coverage + + def shutdown(self) -> None: +- if self.handshake_complete: +- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) +- output = self.conn.send(wsproto.events.CloseConnection(code=1012)) +- self.transport.write(output) +- else: +- self.send_500_response() ++ if not self.response_started: ++ if self.handshake_complete: ++ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) ++ output = self.conn.send(wsproto.events.CloseConnection(code=1012)) ++ self.transport.write(output) ++ else: ++ self.send_500_response() + self.transport.close() + + def on_task_complete(self, task: asyncio.Task[None]) -> None: +@@ -221,13 +222,15 @@ class WSProtocol(asyncio.Protocol): + def send_500_response(self) -> None: + if self.response_started or self.handshake_complete: + return # we cannot send responses anymore ++ reject_data = b"Internal Server Error" + headers: list[tuple[bytes, bytes]] = [ + (b"content-type", b"text/plain; charset=utf-8"), ++ (b"content-length", str(len(reject_data)).encode()), + (b"connection", b"close"), + (b"content-length", b"21"), + ] + output = self.conn.send(wsproto.events.RejectConnection(status_code=500, headers=headers, has_body=True)) +- output += self.conn.send(wsproto.events.RejectData(data=b"Internal Server Error")) ++ output += self.conn.send(wsproto.events.RejectData(data=reject_data)) + self.transport.write(output) + + async def run_asgi(self) -> None: +diff --git a/tests/middleware/test_logging.py.orig b/tests/middleware/test_logging.py +index 1b8b4fbb108..a8a74ee8ca0 100644 +--- a/tests/middleware/test_logging.py.orig ++++ b/tests/middleware/test_logging.py +@@ -8,8 +8,7 @@ import typing + + import httpx + import pytest +-import websockets +-import websockets.client ++from websockets.asyncio.client import connect + from websockets.protocol import State + + from tests.utils import run_server +@@ -108,8 +107,8 @@ async def test_trace_logging_on_ws_protocol( + break + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.state is State.OPEN ++ async with connect(url): ++ return True + + config = Config( + app=websocket_app, +diff --git a/tests/protocols/test_websocket.py.orig b/tests/protocols/test_websocket.py +index 399769b6395..9971f4bbecd 100644 +--- a/tests/protocols/test_websocket.py.orig ++++ b/tests/protocols/test_websocket.py +@@ -11,6 +11,8 @@ import websockets.asyncio + import websockets.asyncio.client + import websockets.client + import websockets.exceptions ++from websockets.asyncio.client import ClientConnection, connect ++from websockets.exceptions import ConnectionClosed, ConnectionClosedError, InvalidHandshake, InvalidStatus + from websockets.extensions.permessage_deflate import ClientPerMessageDeflateFactory + from websockets.typing import Subprotocol + +@@ -126,8 +128,8 @@ async def test_accept_connection(ws_protocol_cls: WSProtocol, http_protocol_cls: + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.open ++ async with connect(url): ++ return True + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -142,7 +144,7 @@ async def test_shutdown(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProt + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config) as server: +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}"): ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}"): + # Attempt shutdown while connection is still open + await server.shutdown() + +@@ -156,8 +158,8 @@ async def test_supports_permessage_deflate_extension( + + async def open_connection(url: str): + extension_factories = [ClientPerMessageDeflateFactory()] +- async with websockets.client.connect(url, extensions=extension_factories) as websocket: +- return [extension.name for extension in websocket.extensions] ++ async with connect(url, extensions=extension_factories) as websocket: ++ return [extension.name for extension in websocket.protocol.extensions] + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -176,8 +178,8 @@ async def test_can_disable_permessage_deflate_extension( + # enable per-message deflate on the client, so that we can check the server + # won't support it when it's disabled. + extension_factories = [ClientPerMessageDeflateFactory()] +- async with websockets.client.connect(url, extensions=extension_factories) as websocket: +- return [extension.name for extension in websocket.extensions] ++ async with connect(url, extensions=extension_factories) as websocket: ++ return [extension.name for extension in websocket.protocol.extensions] + + config = Config( + app=App, +@@ -199,8 +201,8 @@ async def test_close_connection(ws_protocol_cls: WSProtocol, http_protocol_cls: + + async def open_connection(url: str): + try: +- await websockets.client.connect(url) +- except websockets.exceptions.InvalidHandshake: ++ await connect(url) ++ except InvalidHandshake: + return False + return True # pragma: no cover + +@@ -220,8 +222,8 @@ async def test_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProto + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url, extra_headers=[("username", "abraão")]) as websocket: +- return websocket.open ++ async with connect(url, additional_headers=[("username", "abraão")]): ++ return True + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -235,8 +237,9 @@ async def test_extra_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTT + await self.send({"type": "websocket.accept", "headers": [(b"extra", b"header")]}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.response_headers ++ async with connect(url) as websocket: ++ assert websocket.response ++ return websocket.response.headers + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -254,8 +257,8 @@ async def test_path_and_raw_path(ws_protocol_cls: WSProtocol, http_protocol_cls: + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.open ++ async with connect(url): ++ return True + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -272,7 +275,7 @@ async def test_send_text_data_to_client( + await self.send({"type": "websocket.send", "text": "123"}) + + async def get_data(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + return await websocket.recv() + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) +@@ -290,7 +293,7 @@ async def test_send_binary_data_to_client( + await self.send({"type": "websocket.send", "bytes": b"123"}) + + async def get_data(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + return await websocket.recv() + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) +@@ -309,7 +312,7 @@ async def test_send_and_close_connection( + await self.send({"type": "websocket.close"}) + + async def get_data(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + data = await websocket.recv() + is_open = True + try: +@@ -338,7 +341,7 @@ async def test_send_text_data_to_server( + await self.send({"type": "websocket.send", "text": _text}) + + async def send_text(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + await websocket.send("abc") + return await websocket.recv() + +@@ -361,7 +364,7 @@ async def test_send_binary_data_to_server( + await self.send({"type": "websocket.send", "bytes": _bytes}) + + async def send_text(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + await websocket.send(b"abc") + return await websocket.recv() + +@@ -383,7 +386,7 @@ async def test_send_after_protocol_close( + await self.send({"type": "websocket.send", "text": "123"}) + + async def get_data(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + data = await websocket.recv() + is_open = True + try: +@@ -403,14 +406,14 @@ async def test_missing_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls: + async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): + pass + +- async def connect(url: str): +- await websockets.client.connect(url) ++ async def open_connection(url: str): ++ await connect(url) + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- await connect(f"ws://127.0.0.1:{unused_tcp_port}") +- assert exc_info.value.status_code == 500 ++ with pytest.raises(InvalidStatus) as exc_info: ++ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}") ++ assert exc_info.value.response.status_code == 500 + + + async def test_send_before_handshake( +@@ -419,14 +422,14 @@ async def test_send_before_handshake( + async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): + await send({"type": "websocket.send", "text": "123"}) + +- async def connect(url: str): +- await websockets.client.connect(url) ++ async def open_connection(url: str): ++ await connect(url) + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- await connect(f"ws://127.0.0.1:{unused_tcp_port}") +- assert exc_info.value.status_code == 500 ++ with pytest.raises(InvalidStatus) as exc_info: ++ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}") ++ assert exc_info.value.response.status_code == 500 + + + async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): +@@ -436,10 +439,10 @@ async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cl + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: +- with pytest.raises(websockets.exceptions.ConnectionClosed): ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: ++ with pytest.raises(ConnectionClosed): + _ = await websocket.recv() +- assert websocket.close_code == 1006 ++ assert websocket.protocol.close_code == 1006 + + + async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): +@@ -454,10 +457,10 @@ async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls: + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: +- with pytest.raises(websockets.exceptions.ConnectionClosed): ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: ++ with pytest.raises(ConnectionClosed): + _ = await websocket.recv() +- assert websocket.close_code == 1006 ++ assert websocket.protocol.close_code == 1006 + + + @pytest.mark.parametrize("code", [None, 1000, 1001]) +@@ -489,13 +492,13 @@ async def test_app_close( + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: + await websocket.ping() + await websocket.send("abc") +- with pytest.raises(websockets.exceptions.ConnectionClosed): ++ with pytest.raises(ConnectionClosed): + await websocket.recv() +- assert websocket.close_code == (code or 1000) +- assert websocket.close_reason == (reason or "") ++ assert websocket.protocol.close_code == (code or 1000) ++ assert websocket.protocol.close_reason == (reason or "") + + + async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): +@@ -514,7 +517,7 @@ async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTP + break + + async def websocket_session(url: str): +- async with websockets.client.connect(url) as websocket: ++ async with connect(url) as websocket: + await websocket.ping() + await websocket.send("abc") + await websocket.close(code=1001, reason="custom reason") +@@ -551,7 +554,7 @@ async def test_client_connection_lost( + port=unused_tcp_port, + ) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: + websocket.transport.close() + await asyncio.sleep(0.1) + got_disconnect_event_before_shutdown = got_disconnect_event +@@ -579,7 +582,7 @@ async def test_client_connection_lost_on_send( + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): + url = f"ws://127.0.0.1:{unused_tcp_port}" +- async with websockets.client.connect(url): ++ async with connect(url): + await asyncio.sleep(0.1) + disconnect.set() + +@@ -638,11 +641,11 @@ async def test_send_close_on_server_shutdown( + disconnect_message = message + break + +- websocket: websockets.client.WebSocketClientProtocol | None = None ++ websocket: ClientConnection | None = None + + async def websocket_session(uri: str): + nonlocal websocket +- async with websockets.client.connect(uri) as ws_connection: ++ async with connect(uri) as ws_connection: + websocket = ws_connection + await server_shutdown_event.wait() + +@@ -672,9 +675,7 @@ async def test_subprotocols( + await self.send({"type": "websocket.accept", "subprotocol": subprotocol}) + + async def get_subprotocol(url: str): +- async with websockets.client.connect( +- url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")] +- ) as websocket: ++ async with connect(url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")]) as websocket: + return websocket.subprotocol + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) +@@ -684,7 +685,7 @@ async def test_subprotocols( + + + MAX_WS_BYTES = 1024 * 1024 * 16 +-MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 1 ++MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 10 + + + @pytest.mark.parametrize( +@@ -727,15 +728,15 @@ async def test_send_binary_data_to_server_bigger_than_default_on_websockets( + port=unused_tcp_port, + ) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws: ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws: + await ws.send(b"\x01" * client_size_sent) + if expected_result == 0: + data = await ws.recv() + assert data == b"\x01" * client_size_sent + else: +- with pytest.raises(websockets.exceptions.ConnectionClosedError): ++ with pytest.raises(ConnectionClosedError): + await ws.recv() +- assert ws.close_code == expected_result ++ assert ws.protocol.close_code == expected_result + + + async def test_server_reject_connection( +@@ -760,10 +761,10 @@ async def test_server_reject_connection( + disconnected_message = await receive() + + async def websocket_session(url: str): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- async with websockets.client.connect(url): ++ with pytest.raises(InvalidStatus) as exc_info: ++ async with connect(url): + pass # pragma: no cover +- assert exc_info.value.status_code == 403 ++ assert exc_info.value.response.status_code == 403 + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -933,10 +934,10 @@ async def test_server_reject_connection_with_invalid_msg( + await send(message) + + async def websocket_session(url: str): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- async with websockets.client.connect(url): ++ with pytest.raises(InvalidStatus) as exc_info: ++ async with connect(url): + pass # pragma: no cover +- assert exc_info.value.status_code == 404 ++ assert exc_info.value.response.status_code == 404 + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -967,10 +968,10 @@ async def test_server_reject_connection_with_missing_body( + # no further message + + async def websocket_session(url: str): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- async with websockets.client.connect(url): ++ with pytest.raises(InvalidStatus) as exc_info: ++ async with connect(url): + pass # pragma: no cover +- assert exc_info.value.status_code == 404 ++ assert exc_info.value.response.status_code == 404 + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -1010,10 +1011,10 @@ async def test_server_multiple_websocket_http_response_start_events( + exception_message = str(exc) + + async def websocket_session(url: str): +- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: +- async with websockets.client.connect(url): ++ with pytest.raises(InvalidStatus) as exc_info: ++ async with connect(url): + pass # pragma: no cover +- assert exc_info.value.status_code == 404 ++ assert exc_info.value.response.status_code == 404 + + config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -1049,7 +1050,7 @@ async def test_server_can_read_messages_in_buffer_after_close( + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: ++ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: + await websocket.send(b"abc") + await websocket.send(b"abc") + await websocket.send(b"abc") +@@ -1066,8 +1067,9 @@ async def test_default_server_headers( + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.response_headers ++ async with connect(url) as websocket: ++ assert websocket.response ++ return websocket.response.headers + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -1081,8 +1083,9 @@ async def test_no_server_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.response_headers ++ async with connect(url) as websocket: ++ assert websocket.response ++ return websocket.response.headers + + config = Config( + app=App, +@@ -1104,8 +1107,9 @@ async def test_no_date_header_on_wsproto(http_protocol_cls: HTTPProtocol, unused + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.response_headers ++ async with connect(url) as websocket: ++ assert websocket.response ++ return websocket.response.headers + + config = Config( + app=App, +@@ -1136,8 +1140,9 @@ async def test_multiple_server_header( + ) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.response_headers ++ async with connect(url) as websocket: ++ assert websocket.response ++ return websocket.response.headers + + config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) + async with run_server(config): +@@ -1172,8 +1177,8 @@ async def test_lifespan_state(ws_protocol_cls: WSProtocol, http_protocol_cls: HT + await self.send({"type": "websocket.accept"}) + + async def open_connection(url: str): +- async with websockets.client.connect(url) as websocket: +- return websocket.open ++ async with connect(url): ++ return True + + async def app_wrapper(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): + if scope["type"] == "lifespan": diff --git a/user/uvicorn/APKBUILD b/user/uvicorn/APKBUILD new file mode 100644 index 0000000..62d0a4c --- /dev/null +++ b/user/uvicorn/APKBUILD @@ -0,0 +1,55 @@ +maintainer="Michał Polański " +pkgname=uvicorn +pkgver=0.34.2 +pkgrel=0 +pkgdesc="Lightning-fast ASGI server" +url="https://www.uvicorn.org/" +license="BSD-3-Clause" +arch="noarch" +depends="py3-click py3-h11" +makedepends="py3-gpep517 py3-hatchling" +checkdepends=" + py3-a2wsgi + py3-dotenv + py3-httptools + py3-httpx + py3-pytest + py3-pytest-mock + py3-pytest-xdist + py3-trustme + py3-typing-extensions + py3-watchfiles + py3-websockets + py3-wsproto + py3-yaml + " +subpackages="$pkgname-pyc" +source="https://github.com/encode/uvicorn/archive/$pkgver/uvicorn-$pkgver.tar.gz + test_multiprocess.patch + 2540_add-websocketssansioprotocol.patch + 2541_bump-wesockets-on-requirements.patch + " + +build() { + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 +} + +check() { + python3 -m venv --clear --without-pip --system-site-packages .testenv + .testenv/bin/python3 -m installer .dist/*.whl + .testenv/bin/python3 -m pytest -v +} + +package() { + python3 -m installer -d "$pkgdir" \ + .dist/uvicorn-$pkgver-py3-none-any.whl +} + +sha512sums=" +e8d4dbf182a47431ab9485a8f1072b327c2adb97e4489dcad08835d2759241539971192781cffe4cbb12ff68e70b040e07ad60fe274aa1d62320ad0d63278e64 uvicorn-0.34.2.tar.gz +cfad91dd84f8974362f52d754d7a29f09d07927a46acaa0eb490b6115a5729d84d6df94fead10ccd4cce7f5ea376f1348b0f59daede661dd8373a3851c313c46 test_multiprocess.patch +a3850f030b936c219041266c9ff9050614a5ac6252ff56462c73f2a6114502da460684c10c86f0c5b5054677e89798602ee84cf39c132be6f8bf9946e41f1e79 2540_add-websocketssansioprotocol.patch +b4ef7e63f3fe9e3b499b5a57bb368fcde98c084f5cca42683188c1047d109bdac158e06eeb5a7fb3e61075a1918761c8b0a59a8f7856704bba9234222529de7d 2541_bump-wesockets-on-requirements.patch +" diff --git a/user/uvicorn/test_multiprocess.patch b/user/uvicorn/test_multiprocess.patch new file mode 100644 index 0000000..231526e --- /dev/null +++ b/user/uvicorn/test_multiprocess.patch @@ -0,0 +1,14 @@ +Wait a bit longer, otherwise the workers might +not have time to finish restarting. + +--- a/tests/supervisors/test_multiprocess.py ++++ b/tests/supervisors/test_multiprocess.py +@@ -132,7 +132,7 @@ def test_multiprocess_sighup() -> None: + time.sleep(1) + pids = [p.pid for p in supervisor.processes] + supervisor.signal_queue.append(signal.SIGHUP) +- time.sleep(1) ++ time.sleep(3) + assert pids != [p.pid for p in supervisor.processes] + supervisor.signal_queue.append(signal.SIGINT) + supervisor.join_all() From 39b8c7c45d82481d8dcc9a33c7263ab754082707 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:27:01 -0400 Subject: [PATCH 181/313] user/paperless-ngx: re-enable --- user/paperless-ngx/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/paperless-ngx/APKBUILD b/user/paperless-ngx/APKBUILD index 9a6e7ab..01ea699 100644 --- a/user/paperless-ngx/APKBUILD +++ b/user/paperless-ngx/APKBUILD @@ -9,7 +9,7 @@ license="GPL-3.0-only" # s390x: ocrmypdf py3-joblib py3-scikit-learn py3-watchfiles # armhf / ppc64le: py3-uvloop # all: uvicorn doesn't yet work with websockets 14 -# arch="noarch !s390x !armhf !ppc64le" +arch="noarch !s390x !armhf !ppc64le" install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install" depends=" file From a6c26bc587dd9f2f4b0f6cc7bcb3528adccd3bac Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:27:43 -0400 Subject: [PATCH 182/313] user/tandoor-recipes: enable build --- user/tandoor-recipes/APKBUILD | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user/tandoor-recipes/APKBUILD b/user/tandoor-recipes/APKBUILD index 6ae8824..75ecd85 100644 --- a/user/tandoor-recipes/APKBUILD +++ b/user/tandoor-recipes/APKBUILD @@ -4,8 +4,7 @@ pkgname=tandoor-recipes pkgver=1.5.12 pkgrel=1 pkgdesc="Application for managing recipes, planning meals, building shopping lists, etc." -# FTBFS -# arch="noarch" +arch="noarch" url="https://github.com/TandoorRecipes/recipes" license="AGPL-3.0-only" depends=" From 41cd4ce83b8cd1febd72121966bff9afb2040435 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 19:28:27 -0400 Subject: [PATCH 183/313] user/xochitl-bin: drop due to pmos --- user/xochitl-bin/APKBUILD | 50 ------------------------------------- user/xochitl-bin/xochitl.sh | 12 --------- 2 files changed, 62 deletions(-) delete mode 100644 user/xochitl-bin/APKBUILD delete mode 100755 user/xochitl-bin/xochitl.sh diff --git a/user/xochitl-bin/APKBUILD b/user/xochitl-bin/APKBUILD deleted file mode 100644 index 4ea4dfa..0000000 --- a/user/xochitl-bin/APKBUILD +++ /dev/null @@ -1,50 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=xochitl-bin -pkgver=2.15.1.1189 -_pkgprefix=Xdvv3lBmE4 -pkgrel=1 -pkgdesc="Image extractor for reMarkable firmware files" -arch="armv7" -url="https://archive.org/download/rm110/RM110/" -license="MIT" -makedepends="rm-extractor p7zip" -options="!check !strip !tracedeps" # No testsuite -subpackages="$pkgname-rm1 $pkgname-rm2" -builddir="$srcdir" -source=" - $pkgname-rm1-$pkgver.signed::https://archive.org/download/rm110/RM110/2.15.1.1189_reMarkable-Xdvv3lBmE4-.signed - $pkgname-rm2-$pkgver.signed::https://archive.org/download/rm110/RM110/2.15.1.1189_reMarkable2-wVbHkgKisg-.signed - xochitl.sh -" -package() { - install -vdm755 "$pkgdir"/var/lib/$pkgname - install -vDm755 "$srcdir"/xochitl.sh "$pkgdir"/usr/bin/xochitl -} - -rm1() { - depends="$pkgname" - - mkdir -p "$subpkgdir"/usr/lib/$pkgname - cd "$subpkgdir"/usr/lib/$pkgname - rm-extractor "$builddir"/$pkgname-rm1-$pkgver.signed - 7z x out || true - rm out -} - -rm2() { - depends="$pkgname" - - mkdir -p "$subpkgdir"/usr/lib/$pkgname - cd "$subpkgdir"/usr/lib/$pkgname - rm-extractor "$builddir"/$pkgname-rm1-$pkgver.signed - 7z x out || true - rm out -} - -sha512sums=" -294a5dccebb11366ad4e9a39d15829f310f575044f6e4db2747364ae61ef984cf3e0a8f09f3a33f157365b637d0217f34a01000eff3f92dd177afd011c7b2c9f xochitl-bin-rm1-2.15.1.1189.signed -6b2baac5c970ddfbf84f376fbfd22dab0a72979160b6889352bb2464f46f9d85d0fdc9f5754dbcb431b3629df833e64913c81aa7838f636cce11b00413d8506e xochitl-bin-rm2-2.15.1.1189.signed -e0f7ce6a5a29f98929339f55a2073b251ce76802c244473677be35eeef82e0e840edddfdfe56f8dc16fe80865d22e8dd35f3815f716903966768c3d9300831f2 xochitl.sh -" diff --git a/user/xochitl-bin/xochitl.sh b/user/xochitl-bin/xochitl.sh deleted file mode 100755 index 1e02b34..0000000 --- a/user/xochitl-bin/xochitl.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# we chroot into codex root, thus need to bind mount -mount -o bind /dev /usr/lib/xochitl-bin/dev -mount -o bind /proc /usr/lib/xochitl-bin/proc -mount -o bind /sys /usr/lib/xochitl-bin/sys - -# xochitl expects home to be mounted -mount -o bind /var/lib/xochitl-bin /usr/lib/xochitl-bin/home/root - -# start xochitl -chroot /usr/lib/xochitl-bin /usr/bin/xochitl From 20281faaf5e5ae13ae35597318014c70358174b1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:37:42 -0400 Subject: [PATCH 184/313] backports/airsonic-advanced: drop for lack of need --- backports/airsonic-advanced/APKBUILD | 48 ------------------- .../airsonic-advanced/airsonic-advanced.initd | 14 ------ .../airsonic-advanced.pre-install | 6 --- backports/airsonic-advanced/maven.patch | 8 ---- 4 files changed, 76 deletions(-) delete mode 100644 backports/airsonic-advanced/APKBUILD delete mode 100644 backports/airsonic-advanced/airsonic-advanced.initd delete mode 100644 backports/airsonic-advanced/airsonic-advanced.pre-install delete mode 100644 backports/airsonic-advanced/maven.patch diff --git a/backports/airsonic-advanced/APKBUILD b/backports/airsonic-advanced/APKBUILD deleted file mode 100644 index ec5e7c1..0000000 --- a/backports/airsonic-advanced/APKBUILD +++ /dev/null @@ -1,48 +0,0 @@ -# Contributor: Kay Thomas -# Maintainer: Kay Thomas -pkgname=airsonic-advanced -_sha=1397446f979b1cdea283eec89ce4f0eae7d63450 -pkgver=11.0.0_git20230217 -pkgrel=0 -pkgdesc="Modern implementation of the Airsonic fork with several key performance and feature enhancements" -url="https://github.com/airsonic-advanced/airsonic-advanced" -# inconsistent test and build failures on other arches -arch="x86_64" -license="GPL-3.0-or-later" -depends="openjdk11" -makedepends="maven" -subpackages="$pkgname-openrc" -pkgusers="airsonic-advanced" -pkggroups="airsonic-advanced" -install="$pkgname.pre-install" -source="$pkgname-$pkgver.tar.gz::https://github.com/airsonic-advanced/airsonic-advanced/archive/$_sha.tar.gz - maven.patch - airsonic-advanced.initd - " -builddir="$srcdir/$pkgname-$_sha" - -build() { - mvn clean package -DskipTests -} - -check() { - mvn test -} - -package() { - install -dm755 -o airsonic-advanced -g airsonic-advanced \ - "$pkgdir"/var/airsonic - - install -m755 -o airsonic-advanced -g airsonic-advanced \ - "$builddir"/airsonic-main/target/airsonic.war \ - "$pkgdir"/var/airsonic/airsonic.war - - install -Dm755 "$srcdir"/$pkgname.initd \ - "$pkgdir"/etc/init.d/$pkgname -} - -sha512sums=" -f415620bdbed9fb3874afbf30d9362e68b1e9e8e90dbbed4ca3206b643cad97ca0558e64ec5b4440382f0ec908c3325e321ea3631c38ff9a2109163c8f0cfe0b airsonic-advanced-11.0.0_git20230217.tar.gz -6cb52fee19815fcdf2596e55d97d3e750321b1df7a4fec36fc9bc2a57d4be979a3905a42d3aa9dbeb2bf0d4f56edbf344f13551219b8e4d2ca583abd4bb5c8f9 maven.patch -ca87e6a7199950e6ac52aeb076a03f831d60ee9d4ceed47366bbd78443765d205796d895ebb244051d8033e5b2e9ccd648d20434039c854b8b50e766cc5cd10d airsonic-advanced.initd -" diff --git a/backports/airsonic-advanced/airsonic-advanced.initd b/backports/airsonic-advanced/airsonic-advanced.initd deleted file mode 100644 index c1ce9bd..0000000 --- a/backports/airsonic-advanced/airsonic-advanced.initd +++ /dev/null @@ -1,14 +0,0 @@ -#!/sbin/openrc-run - -supervisor=supervise-daemon -name="airsonic-advanced" -command="/usr/lib/jvm/java-11-openjdk/jre/bin/java" -command_args="-jar airsonic.war" -command_user="airsonic-advanced:airsonic-advanced" -directory="/var/airsonic" -pidfile="/run/airsonic-advanced.pid" - -depend() { - need net localmount - after firewall -} diff --git a/backports/airsonic-advanced/airsonic-advanced.pre-install b/backports/airsonic-advanced/airsonic-advanced.pre-install deleted file mode 100644 index 373b896..0000000 --- a/backports/airsonic-advanced/airsonic-advanced.pre-install +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -addgroup -S airsonic-advanced 2>/dev/null -adduser -S -D -H -s /sbin/nologin -G airsonic-advanced -g airsonic-advanced airsonic-advanced 2>/dev/null - -exit 0 diff --git a/backports/airsonic-advanced/maven.patch b/backports/airsonic-advanced/maven.patch deleted file mode 100644 index 56594b6..0000000 --- a/backports/airsonic-advanced/maven.patch +++ /dev/null @@ -1,8 +0,0 @@ -fixes maven 3.9 breaking change -https://maven.apache.org/docs/3.9.0/release-notes.html#potentially-breaking-core-changes ---- airsonic-advanced-1397446f979b1cdea283eec89ce4f0eae7d63450/.mvn/maven.config -+++ airsonic-advanced-1397446f979b1cdea283eec89ce4f0eae7d63450/.mvn/maven.config -@@ -1 +1,2 @@ ----settings ./.mvn/settings.xml -+--settings -+./.mvn/settings.xml From 012a294f6db18b2e5545cf601a3e44527303d4f0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:38:39 -0400 Subject: [PATCH 185/313] backports/perl-math-random-isaac-xs: drop for lack of need --- backports/perl-math-random-isaac-xs/APKBUILD | 39 -------------------- 1 file changed, 39 deletions(-) delete mode 100644 backports/perl-math-random-isaac-xs/APKBUILD diff --git a/backports/perl-math-random-isaac-xs/APKBUILD b/backports/perl-math-random-isaac-xs/APKBUILD deleted file mode 100644 index 8cb2f95..0000000 --- a/backports/perl-math-random-isaac-xs/APKBUILD +++ /dev/null @@ -1,39 +0,0 @@ -# Automatically generated by apkbuild-cpan, template 4 -# Contributor: Timo Teräs -# Maintainer: Celeste -maintainer="Celeste " -pkgname=perl-math-random-isaac-xs -pkgver=1.004 -pkgrel=8 -#_pkgreal is used by apkbuild-cpan to find modules at MetaCpan -_pkgreal=Math-Random-ISAAC-XS -pkgdesc="C implementation of the ISAAC PRNG algorithm" -url="https://metacpan.org/release/Math-Random-ISAAC-XS/" -arch="all" -license="Public-Domain" -depends="perl" -makedepends="perl-dev perl-module-build" -checkdepends="perl-test-nowarnings" -subpackages="$pkgname-doc" -source="https://cpan.metacpan.org/authors/id/J/JA/JAWNSY/Math-Random-ISAAC-XS-$pkgver.tar.gz" -builddir="$srcdir/$_pkgreal-$pkgver" - -build() { - export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}') - perl Build.PL \ - --installdirs=vendor \ - --create_packlist=0 - ./Build -} - -check() { - ./Build test -} - -package() { - ./Build install --destdir="$pkgdir" -} - -sha512sums=" -40c46b5f247f585a407ef9f36b5874d9cf03ec05963a9d92d988ebd63daf1e37b1b51308845d4596f47b5ad7203953bcb7fbb421c905b526dbe99b246ccb4d87 Math-Random-ISAAC-XS-1.004.tar.gz -" From 166b95251601ceb3d0cde812f5d26a69b3a5eb58 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:39:26 -0400 Subject: [PATCH 186/313] unmaintained/rstudio-desktop: move from user --- .../rstudio-desktop/12317_support-system-yaml-cpp.patch | 0 {user => unmaintained}/rstudio-desktop/APKBUILD | 0 {user => unmaintained}/rstudio-desktop/cran_multithread.patch | 0 .../rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch | 0 {user => unmaintained}/rstudio-desktop/filepath-use-unistd.patch | 0 {user => unmaintained}/rstudio-desktop/nodejs-external.patch | 0 {user => unmaintained}/rstudio-desktop/qt.conf | 0 .../rstudio-desktop/sessionhistoryarchive-use-ctime.patch | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/rstudio-desktop/12317_support-system-yaml-cpp.patch (100%) rename {user => unmaintained}/rstudio-desktop/APKBUILD (100%) rename {user => unmaintained}/rstudio-desktop/cran_multithread.patch (100%) rename {user => unmaintained}/rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch (100%) rename {user => unmaintained}/rstudio-desktop/filepath-use-unistd.patch (100%) rename {user => unmaintained}/rstudio-desktop/nodejs-external.patch (100%) rename {user => unmaintained}/rstudio-desktop/qt.conf (100%) rename {user => unmaintained}/rstudio-desktop/sessionhistoryarchive-use-ctime.patch (100%) diff --git a/user/rstudio-desktop/12317_support-system-yaml-cpp.patch b/unmaintained/rstudio-desktop/12317_support-system-yaml-cpp.patch similarity index 100% rename from user/rstudio-desktop/12317_support-system-yaml-cpp.patch rename to unmaintained/rstudio-desktop/12317_support-system-yaml-cpp.patch diff --git a/user/rstudio-desktop/APKBUILD b/unmaintained/rstudio-desktop/APKBUILD similarity index 100% rename from user/rstudio-desktop/APKBUILD rename to unmaintained/rstudio-desktop/APKBUILD diff --git a/user/rstudio-desktop/cran_multithread.patch b/unmaintained/rstudio-desktop/cran_multithread.patch similarity index 100% rename from user/rstudio-desktop/cran_multithread.patch rename to unmaintained/rstudio-desktop/cran_multithread.patch diff --git a/user/rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch b/unmaintained/rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch similarity index 100% rename from user/rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch rename to unmaintained/rstudio-desktop/desktop-main-skip-nosandbox-on-musl.patch diff --git a/user/rstudio-desktop/filepath-use-unistd.patch b/unmaintained/rstudio-desktop/filepath-use-unistd.patch similarity index 100% rename from user/rstudio-desktop/filepath-use-unistd.patch rename to unmaintained/rstudio-desktop/filepath-use-unistd.patch diff --git a/user/rstudio-desktop/nodejs-external.patch b/unmaintained/rstudio-desktop/nodejs-external.patch similarity index 100% rename from user/rstudio-desktop/nodejs-external.patch rename to unmaintained/rstudio-desktop/nodejs-external.patch diff --git a/user/rstudio-desktop/qt.conf b/unmaintained/rstudio-desktop/qt.conf similarity index 100% rename from user/rstudio-desktop/qt.conf rename to unmaintained/rstudio-desktop/qt.conf diff --git a/user/rstudio-desktop/sessionhistoryarchive-use-ctime.patch b/unmaintained/rstudio-desktop/sessionhistoryarchive-use-ctime.patch similarity index 100% rename from user/rstudio-desktop/sessionhistoryarchive-use-ctime.patch rename to unmaintained/rstudio-desktop/sessionhistoryarchive-use-ctime.patch From 27e1275d13b8e21e42944f37de53908ebc599415 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:40:30 -0400 Subject: [PATCH 187/313] unmaintained/mathjax2: move from user --- unmaintained/mathjax2/APKBUILD | 53 ++++++++++++++++++---------------- user/mathjax2/APKBUILD | 38 ------------------------ 2 files changed, 28 insertions(+), 63 deletions(-) delete mode 100644 user/mathjax2/APKBUILD diff --git a/unmaintained/mathjax2/APKBUILD b/unmaintained/mathjax2/APKBUILD index 3075ca1..ceb2b15 100644 --- a/unmaintained/mathjax2/APKBUILD +++ b/unmaintained/mathjax2/APKBUILD @@ -1,35 +1,38 @@ -# $Id: PKGBUILD 362427 2018-07-19 17:42:59Z arojas $ -# Maintainer: Antonio Rojas -# Contributor: Kevin Dodd -# Contributor: Tianjiao Yin +# Maintainer: Antoine Martin (ayakael) +# Contributor: Antoine Martin (ayakael) pkgname=mathjax2 pkgver=2.7.9 -pkgrel=0 -pkgdesc='An open source JavaScript display engine for mathematics that works in all modern browsers' -url='https://www.mathjax.org/' +pkgrel=1 +pkgdesc="An open source JavaScript display engine for mathematics that works in all modern browsers" +url="https://www.mathjax.org/" arch=noarch -license=Apache +license="Apache-2.0" source="$pkgname-$pkgver.tar.gz::https://github.com/mathjax/MathJax/archive/$pkgver.tar.gz" -options=!check +builddir="$srcdir"/MathJax-$pkgver +options="!check" # No testsuite -prepare() { - cd $srcdir/MathJax-$pkgver - -# Remove unneeded stuff, see https://github.com/mathjax/MathJax-docs/wiki/Guide%3A-reducing-size-of-a-mathjax-installation - rm -r docs test unpacked - rm -r fonts/HTML-CSS/TeX/png - for _format in eot otf svg ; do - find . -type d -name "$_format" -prune -exec rm -rf {} \; - done +build() { + # Remove unneeded stuff, see https://github.com/mathjax/MathJax-docs/wiki/Guide%3A-reducing-size-of-a-mathjax-installation + for i in docs test unpacked fonts/HTML-CSS/TeX/png; do + rm -r $i + done + for _format in eot otf svg ; do + find . -type d -name "$_format" -prune -exec rm -rf {} \; + done } package() { - cd ${srcdir} - mkdir -p "$pkgdir"/usr/share/fonts "$pkgdir"/usr/share/licenses/mathjax2 - cp -a MathJax-$pkgver "$pkgdir"/usr/share/mathjax2 - mv "$pkgdir"/usr/share/mathjax2/fonts "$pkgdir"/usr/share/fonts/mathjax2 - ln -s /usr/share/fonts/mathjax2 "$pkgdir"/usr/share/mathjax2/fonts - mv "$pkgdir"/usr/share/mathjax2/LICENSE "$pkgdir"/usr/share/licenses/mathjax2/ + mkdir -p \ + "$pkgdir"/usr/share/fonts \ + "$pkgdir"/usr/share/licenses/mathjax2 + + cp -a "$builddir" "$pkgdir"/usr/share/mathjax2 + + mv "$pkgdir"/usr/share/mathjax2/fonts "$pkgdir"/usr/share/fonts/mathjax2 + ln -s /usr/share/fonts/mathjax2 "$pkgdir"/usr/share/mathjax2/fonts + mv "$pkgdir"/usr/share/mathjax2/LICENSE "$pkgdir"/usr/share/licenses/mathjax2/ } -sha512sums="ac7b2dfc6064148e941e5ee05361467514e5f28449dbb697ff1df556968ccb71f501c4021ade285cbbb995983513669c14d9c06886a7b83a5c75fa30504fa8ab mathjax2-2.7.9.tar.gz" +sha512sums=" +ac7b2dfc6064148e941e5ee05361467514e5f28449dbb697ff1df556968ccb71f501c4021ade285cbbb995983513669c14d9c06886a7b83a5c75fa30504fa8ab mathjax2-2.7.9.tar.gz +" diff --git a/user/mathjax2/APKBUILD b/user/mathjax2/APKBUILD deleted file mode 100644 index ceb2b15..0000000 --- a/user/mathjax2/APKBUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Maintainer: Antoine Martin (ayakael) -# Contributor: Antoine Martin (ayakael) - -pkgname=mathjax2 -pkgver=2.7.9 -pkgrel=1 -pkgdesc="An open source JavaScript display engine for mathematics that works in all modern browsers" -url="https://www.mathjax.org/" -arch=noarch -license="Apache-2.0" -source="$pkgname-$pkgver.tar.gz::https://github.com/mathjax/MathJax/archive/$pkgver.tar.gz" -builddir="$srcdir"/MathJax-$pkgver -options="!check" # No testsuite - -build() { - # Remove unneeded stuff, see https://github.com/mathjax/MathJax-docs/wiki/Guide%3A-reducing-size-of-a-mathjax-installation - for i in docs test unpacked fonts/HTML-CSS/TeX/png; do - rm -r $i - done - for _format in eot otf svg ; do - find . -type d -name "$_format" -prune -exec rm -rf {} \; - done -} - -package() { - mkdir -p \ - "$pkgdir"/usr/share/fonts \ - "$pkgdir"/usr/share/licenses/mathjax2 - - cp -a "$builddir" "$pkgdir"/usr/share/mathjax2 - - mv "$pkgdir"/usr/share/mathjax2/fonts "$pkgdir"/usr/share/fonts/mathjax2 - ln -s /usr/share/fonts/mathjax2 "$pkgdir"/usr/share/mathjax2/fonts - mv "$pkgdir"/usr/share/mathjax2/LICENSE "$pkgdir"/usr/share/licenses/mathjax2/ -} -sha512sums=" -ac7b2dfc6064148e941e5ee05361467514e5f28449dbb697ff1df556968ccb71f501c4021ade285cbbb995983513669c14d9c06886a7b83a5c75fa30504fa8ab mathjax2-2.7.9.tar.gz -" From 9a735111c74bd45d449b0fb1b21f434be099f906 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:42:05 -0400 Subject: [PATCH 188/313] backports/cura: drop due to unmaintained --- backports/cura/APKBUILD | 76 ----------------------- backports/cura/AppDesktopData.patch | 58 ------------------ backports/cura/CuraVersion.patch | 16 ----- backports/cura/cmake-helpers.patch | 95 ----------------------------- backports/cura/cmake.patch | 85 -------------------------- 5 files changed, 330 deletions(-) delete mode 100644 backports/cura/APKBUILD delete mode 100644 backports/cura/AppDesktopData.patch delete mode 100644 backports/cura/CuraVersion.patch delete mode 100644 backports/cura/cmake-helpers.patch delete mode 100644 backports/cura/cmake.patch diff --git a/backports/cura/APKBUILD b/backports/cura/APKBUILD deleted file mode 100644 index 7c669be..0000000 --- a/backports/cura/APKBUILD +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Anjandev Momi -pkgname=cura -# uranium and curaengine packages must be updated in sync with this verion number -# py3-pynest2d and fdm-materials should be checked as well, but their versions are not always in sync -pkgver=5.2.2 -pkgrel=1 -pkgdesc="3D printer / slicing GUI built on top of the Uranium framework" -url="https://ultimaker.com/software/ultimaker-cura" -# ppc64le: no py3-keyring -# x86: no curaengine -# armhf: no uranium, qt5-qtquickcontrols, qt5-qtquickcontrols2, qt5-qtgraphicaleffects -# riscv64: no uranium -# s390x: no py3-trimesh, no py3-numpy-stl -# armv7: no py3-trimesh -arch="noarch !ppc64le !x86 !armhf !riscv64 !s390x !armv7" -license="LGPL-3.0-or-later" -# add cura-binary-data to depends when packaged -depends=" - curaengine - fdm-materials - uranium - py3-arcus - py3-keyring - py3-numpy-stl - py3-pyclipper - py3-pynest2d - py3-pyserial - py3-qt6 - py3-requests - py3-trimesh - py3-zeroconf - " -makedepends="samurai cmake gettext gettext-dev" # needs msginit from gettext -checkdepends="py3-pytest" -subpackages="$pkgname-lang" -source="$pkgname-$pkgver.tar.gz::https://github.com/Ultimaker/Cura/archive/refs/tags/$pkgver.tar.gz - AppDesktopData.patch - CuraVersion.patch - cmake-helpers.patch - cmake.patch" -builddir="$srcdir/Cura-$pkgver" -options="!check" # tests broken after v5.x - -build() { - local pyver="$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')" - cmake -B build -G Ninja \ - -DCURA_VERSION=$pkgver \ - -DPython_VERSION=$pyver \ - -DURANIUM_DIR=/usr/share/uranium \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DGETTEXT_MSGINIT_EXECUTABLE=msginit \ - -DCURA_BINARY_DATA_DIRECTORY=/usr/share/cura \ - -DCMAKE_BUILD_TYPE=minsizerel - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build - mv $pkgdir/usr/bin/cura_app.py $pkgdir/usr/bin/cura - - # don't ever send any user or print info through the internet to Ultimaker - rm -rf "$pkgdir/usr/lib/cura/plugins/SliceInfoPlugin" - - install -d "$pkgdir"/usr/share/locale - mv "$pkgdir"/usr/share/cura/resources/i18n/* "$pkgdir"/usr/share/locale/ -} - -sha512sums=" -5d4e0fdc740d0c048905e2b87cc8c73eedea59b54766b74760505902007b365582d22b46b1cfdcd6914828840865c10a3beb0ef6a1f04ea181c81d44f42434bc cura-5.2.2.tar.gz -214e373f6cab7e3ccac12c96d1b5ca636d8d1e9ecdadaae84fc28fb429969c7c2d6055ce2a01b6db3ad85ab6cbc8d135cf2c26c77d7cfe13a73eb81aa5e85f11 AppDesktopData.patch -e3bb302db70ca195b2ce9831e71302c8ee2a51955fecc7264a495d7d4fc9c107cfd48811aa5865f16671e7b1ae126f95d3d7bbb6a70f367f7f91a2b32bce377b CuraVersion.patch -0db4ff97e7f82ae1a9dbc9c330d08c3e46249feeb3fb630f7c4e2de73749327337ec041680c39a07e0b5034c1b3f3656d75614ab4dc2f39861c8e27bdb2a58ef cmake-helpers.patch -05a73f892700ff6279230385b04180873a62b7413fa7f7d55ae150f1bcee57ef05eda0bd7fe444fe660ab66a044c958f42badd33b743fca81033ae8f19dd3805 cmake.patch -" diff --git a/backports/cura/AppDesktopData.patch b/backports/cura/AppDesktopData.patch deleted file mode 100644 index 9e2134f..0000000 --- a/backports/cura/AppDesktopData.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- /dev/null -+++ ./com.ultimaker.cura.appdata.xml -@@ -0,0 +1,33 @@ -+ -+ -+ -+ com.ultimaker.cura.desktop -+ CC0-1.0 -+ LGPL-3.0 and CC-BY-SA-4.0 -+ Cura -+

The world's most advanced 3d printer software -+ -+

-+ Cura creates a seamless integration between hardware, software and -+ materials for the best 3D printing experience around. -+ Cura supports the 3MF, OBJ and STL file formats and is available on -+ Windows, Mac and Linux. -+

-+
    -+
  • Novices can start printing right away
  • -+
  • Experts are able to customize 300 settings to achieve the best results
  • -+
  • Optimized profiles for Ultimaker materials
  • -+
  • Supported by a global network of Ultimaker certified service partners
  • -+
  • Print multiple objects at once with different settings for each object
  • -+
  • Cura supports STL, 3MF and OBJ file formats
  • -+
  • Open source and completely free
  • -+
-+
-+ -+ -+ https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png -+ -+ -+ https://ultimaker.com/software/ultimaker-cura?utm_source=cura&utm_medium=software&utm_campaign=cura-update-linux -+ Cura -+ ---- /dev/null -+++ ./com.ultimaker.cura.desktop.in -@@ -0,0 +1,19 @@ -+[Desktop Entry] -+Name=Ultimaker Cura -+Name[de]=Ultimaker Cura -+Name[nl]=Ultimaker Cura -+GenericName=3D Printing Software -+GenericName[de]=3D-Druck-Software -+GenericName[nl]=3D-printsoftware -+Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great. -+Comment[de]=Cura wandelt 3D-Modelle in Pfade für einen 3D-Drucker um. Es bereitet Ihren Druck für maximale Genauigkeit, minimale Druckzeit und guter Zuverlässigkeit mit vielen zusätzlichen Funktionen vor, damit Ihr Druck großartig wird. -+Comment[nl]=Cura converteert 3D-modellen naar paden voor een 3D printer. Het bereidt je print voor om zeer precies, snel en betrouwbaar te kunnen printen, met veel extra functionaliteit om je print er goed uit te laten komen. -+Exec=@CMAKE_INSTALL_FULL_BINDIR@/cura %F -+TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura -+Icon=cura-icon -+Terminal=false -+Type=Application -+MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip; -+Categories=Graphics; -+Keywords=3D;Printing;Slicer; -+StartupWMClass=cura.real diff --git a/backports/cura/CuraVersion.patch b/backports/cura/CuraVersion.patch deleted file mode 100644 index 916225d..0000000 --- a/backports/cura/CuraVersion.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- /dev/null -+++ ./cura/CuraVersion.py.in -@@ -0,0 +1,13 @@ -+# Copyright (c) 2020 Ultimaker B.V. -+# Cura is released under the terms of the LGPLv3 or higher. -+ -+CuraAppName = "@CURA_APP_NAME@" -+CuraAppDisplayName = "@CURA_APP_DISPLAY_NAME@" -+CuraVersion = "@CURA_VERSION@" -+CuraBuildType = "@CURA_BUILDTYPE@" -+CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False -+CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@" -+CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@" -+CuraCloudAccountAPIRoot = "@CURA_CLOUD_ACCOUNT_API_ROOT@" -+CuraMarketplaceRoot = "@CURA_MARKETPLACE_ROOT@" -+CuraDigitalFactoryURL = "@CURA_DIGITAL_FACTORY_URL@" diff --git a/backports/cura/cmake-helpers.patch b/backports/cura/cmake-helpers.patch deleted file mode 100644 index 6204aaa..0000000 --- a/backports/cura/cmake-helpers.patch +++ /dev/null @@ -1,95 +0,0 @@ ---- /dev/null -+++ ./cmake/CuraPluginInstall.cmake -@@ -0,0 +1,92 @@ -+# Copyright (c) 2022 Ultimaker B.V. -+# CuraPluginInstall.cmake is released under the terms of the LGPLv3 or higher. -+ -+# -+# This module detects all plugins that need to be installed and adds them using the CMake install() command. -+# It detects all plugin folder in the path "plugins/*" where there's a "plugin.json" in it. -+# -+# Plugins can be configured to NOT BE INSTALLED via the variable "CURA_NO_INSTALL_PLUGINS" as a list of string in the -+# form of "a;b;c" or "a,b,c". By default all plugins will be installed. -+# -+ -+option(PRINT_PLUGIN_LIST "Should the list of plugins that are installed be printed?" ON) -+ -+# Options or configuration variables -+set(CURA_NO_INSTALL_PLUGINS "" CACHE STRING "A list of plugins that should not be installed, separated with ';' or ','.") -+ -+file(GLOB_RECURSE _plugin_json_list ${CMAKE_SOURCE_DIR}/plugins/*/plugin.json) -+list(LENGTH _plugin_json_list _plugin_json_list_len) -+ -+# Sort the lists alphabetically so we can handle cases like this: -+# - plugins/my_plugin/plugin.json -+# - plugins/my_plugin/my_module/plugin.json -+# In this case, only "plugins/my_plugin" should be added via install(). -+set(_no_install_plugin_list ${CURA_NO_INSTALL_PLUGINS}) -+# Sanitize the string so the comparison will be case-insensitive. -+string(STRIP "${_no_install_plugin_list}" _no_install_plugin_list) -+string(TOLOWER "${_no_install_plugin_list}" _no_install_plugin_list) -+ -+# WORKAROUND counterpart of what's in cura-build. -+string(REPLACE "," ";" _no_install_plugin_list "${_no_install_plugin_list}") -+ -+list(LENGTH _no_install_plugin_list _no_install_plugin_list_len) -+ -+if(_no_install_plugin_list_len GREATER 0) -+ list(SORT _no_install_plugin_list) -+endif() -+if(_plugin_json_list_len GREATER 0) -+ list(SORT _plugin_json_list) -+endif() -+ -+# Check all plugin directories and add them via install() if needed. -+set(_install_plugin_list "") -+foreach(_plugin_json_path ${_plugin_json_list}) -+ get_filename_component(_plugin_dir ${_plugin_json_path} DIRECTORY) -+ file(RELATIVE_PATH _rel_plugin_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dir}) -+ get_filename_component(_plugin_dir_name ${_plugin_dir} NAME) -+ -+ # Make plugin name comparison case-insensitive -+ string(TOLOWER "${_plugin_dir_name}" _plugin_dir_name_lowercase) -+ -+ # Check if this plugin needs to be skipped for installation -+ set(_add_plugin ON) # Indicates if this plugin should be added to the build or not. -+ set(_is_no_install_plugin OFF) # If this plugin will not be added, this indicates if it's because the plugin is -+ # specified in the NO_INSTALL_PLUGINS list. -+ if(_no_install_plugin_list) -+ if("${_plugin_dir_name_lowercase}" IN_LIST _no_install_plugin_list) -+ set(_add_plugin OFF) -+ set(_is_no_install_plugin ON) -+ endif() -+ endif() -+ -+ # Make sure this is not a subdirectory in a plugin that's already in the install list -+ if(_add_plugin) -+ foreach(_known_install_plugin_dir ${_install_plugin_list}) -+ if(_plugin_dir MATCHES "${_known_install_plugin_dir}.+") -+ set(_add_plugin OFF) -+ break() -+ endif() -+ endforeach() -+ endif() -+ -+ if(_add_plugin) -+ if(${PRINT_PLUGIN_LIST}) -+ message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}") -+ endif() -+ get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY) -+ install(DIRECTORY ${_rel_plugin_dir} -+ DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir} -+ PATTERN "__pycache__" EXCLUDE -+ PATTERN "*.qmlc" EXCLUDE -+ ) -+ list(APPEND _install_plugin_list ${_plugin_dir}) -+ elseif(_is_no_install_plugin) -+ if(${PRINT_PLUGIN_LIST}) -+ message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}") -+ endif() -+ execute_process(COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py -+ -d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages -+ ${_plugin_dir_name} -+ RESULT_VARIABLE _mod_json_result) -+ endif() -+endforeach() diff --git a/backports/cura/cmake.patch b/backports/cura/cmake.patch deleted file mode 100644 index a74477f..0000000 --- a/backports/cura/cmake.patch +++ /dev/null @@ -1,85 +0,0 @@ ---- ./CMakeLists.txt.orig -+++ ./CMakeLists.txt -@@ -1,10 +1,6 @@ - # Copyright (c) 2022 Ultimaker B.V. - # Cura is released under the terms of the LGPLv3 or higher. - --# NOTE: This is only being used for translation scripts. -- --# For MSVC flags, will be ignored on non-Windows OS's and this project in general. Only needed for cura-build-environment. --cmake_policy(SET CMP0091 NEW) - project(cura) - cmake_minimum_required(VERSION 3.18) - -@@ -15,8 +11,44 @@ - set(URANIUM_DIR "${CMAKE_SOURCE_DIR}/../Uranium" CACHE PATH "The location of the Uranium repository") - set(URANIUM_SCRIPTS_DIR "${URANIUM_DIR}/scripts" CACHE PATH "The location of the scripts directory of the Uranium repository") - -+option(CURA_DEBUGMODE "Enable debug dialog and other debug features" OFF) -+if(CURA_DEBUGMODE) -+ set(_cura_debugmode "ON") -+endif() -+ - option(GENERATE_TRANSLATIONS "Should the translations be generated?" ON) - -+set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder") -+set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura") -+set(CURA_VERSION "master" CACHE STRING "Version name of Cura") -+set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") -+set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root") -+set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version") -+set(CURA_CLOUD_ACCOUNT_API_ROOT "" CACHE STRING "Alternative Cura cloud account API version") -+set(CURA_MARKETPLACE_ROOT "" CACHE STRING "Alternative Marketplace location") -+set(CURA_DIGITAL_FACTORY_URL "" CACHE STRING "Alternative Digital Factory location") -+ -+configure_file(${CMAKE_SOURCE_DIR}/com.ultimaker.cura.desktop.in ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop @ONLY) -+ -+configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY) -+ -+if(NOT DEFINED Python_VERSION) -+ set(Python_VERSION -+ 3.11 -+ CACHE STRING "Python Version" FORCE) -+ message(STATUS "Setting Python version to ${Python_VERSION}. Set Python_VERSION if you want to compile against an other version.") -+endif() -+if(APPLE) -+ set(Python_FIND_FRAMEWORK NEVER) -+endif() -+find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter) -+message(STATUS "Linking and building ${project_name} against Python ${Python_VERSION}") -+if(NOT DEFINED Python_SITELIB_LOCAL) -+ set(Python_SITELIB_LOCAL -+ "${Python_SITELIB}" -+ CACHE PATH "Local alternative site-package location to install Cura" FORCE) -+endif() -+ - if(NOT ${URANIUM_DIR} STREQUAL "") - set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake") - endif() -@@ -29,4 +61,24 @@ - if(${GENERATE_TRANSLATIONS}) - CREATE_TRANSLATION_TARGETS() - endif() --endif() -\ No newline at end of file -+endif() -+ -+install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) -+ -+include(CuraPluginInstall) -+ -+install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} -+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) -+install(DIRECTORY cura DESTINATION "${Python_SITELIB_LOCAL}") -+install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION "${Python_SITELIB_LOCAL}/cura/") -+if(NOT APPLE AND NOT WIN32) -+ install(FILES ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop -+ DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) -+ install(FILES ${CMAKE_SOURCE_DIR}/resources/images/cura-icon.png -+ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/) -+ install(FILES com.ultimaker.cura.appdata.xml -+ DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) -+ install(FILES cura.sharedmimeinfo -+ DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/ -+ RENAME cura.xml ) -+endif() From b4b4877fd3fb62c8f37dbf65066ae755363ee9a8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:42:18 -0400 Subject: [PATCH 189/313] backports/py3-arcus: drop due to unmaintained --- backports/py3-arcus/APKBUILD | 42 ---- backports/py3-arcus/cmake-helpers.patch | 254 ------------------------ backports/py3-arcus/cmake.patch | 32 --- backports/py3-arcus/pyproject.patch | 20 -- 4 files changed, 348 deletions(-) delete mode 100644 backports/py3-arcus/APKBUILD delete mode 100644 backports/py3-arcus/cmake-helpers.patch delete mode 100644 backports/py3-arcus/cmake.patch delete mode 100644 backports/py3-arcus/pyproject.patch diff --git a/backports/py3-arcus/APKBUILD b/backports/py3-arcus/APKBUILD deleted file mode 100644 index d3643d7..0000000 --- a/backports/py3-arcus/APKBUILD +++ /dev/null @@ -1,42 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=py3-arcus -# Needs to be upgraded in sync with libarcus -pkgver=5.3.0 -pkgrel=4 -pkgdesc="Python bindings for libarcus" -url="https://github.com/Ultimaker/pyArcus" -arch="all" -license="LGPL-3.0-only" -makedepends=" - cmake - libarcus-dev - protobuf-dev - py3-sip - python3-dev - samurai - " -options="!check" # package doesn't provide any tests -source="$pkgname-$pkgver.tar.gz::https://github.com/Ultimaker/pyArcus/archive/refs/tags/$pkgver.tar.gz - cmake.patch - cmake-helpers.patch - pyproject.patch" -builddir="$srcdir/pyArcus-$pkgver" - -build() { - cmake -G Ninja -B build \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_BUILD_TYPE=Release - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -d4a114994fa3e3156eae95dde58df13237b8bb0571a1219d6dee6b6338fd65f911f27887d6ab32b7a3cb32bc45ca6c25147e7c2d246cb0707326b88246abfbcd py3-arcus-5.3.0.tar.gz -f14e55cd31c13051981f26364e34da8c94e8eb5227b1cfd6fe44b9f97b5a4dcf6142a1751fa62eb0514a47583e6ec2d51dc253f23cf72c3fe6a1cb5dca136f21 cmake.patch -de75b985607feae0a9c511742915814e9c3d4bc467183f010ccc334ce4d0d952b6ff86020360b78558c4738cc03cf62c386b44ed76bcec12075c4a93dd03eeb7 cmake-helpers.patch -ef593230d5c78da8ba0fc6ea83225c4543857de1837d3151c45e59ffd7c98063b8f97f25d01c15b6a8f90c26c919206f9f7fa26c9650117f4ce7be49ebca876f pyproject.patch -" diff --git a/backports/py3-arcus/cmake-helpers.patch b/backports/py3-arcus/cmake-helpers.patch deleted file mode 100644 index c556985..0000000 --- a/backports/py3-arcus/cmake-helpers.patch +++ /dev/null @@ -1,254 +0,0 @@ ---- /dev/null -+++ ./cmake/CMakeBuilder.py -@@ -0,0 +1,13 @@ -+from sipbuild import SetuptoolsBuilder -+ -+ -+class CMakeBuilder(SetuptoolsBuilder): -+ def __init__(self, project, **kwargs): -+ print("Using the CMake builder") -+ super().__init__(project, **kwargs) -+ -+ def build(self): -+ """ Only Generate the source files """ -+ print("Generating the source files") -+ self._generate_bindings() -+ self._generate_scripts() ---- /dev/null -+++ ./cmake/FindSIP.cmake -@@ -0,0 +1,65 @@ -+# Find SIP -+# ~~~~~~~~ -+# -+# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php -+# -+# Find the installed version of SIP. FindSIP should be called after Python -+# has been found. -+# -+# This file defines the following variables: -+# -+# SIP_VERSION - The version of SIP found expressed as a 6 digit hex number -+# suitable for comparison as a string. -+# -+# SIP_VERSION_STR - The version of SIP found as a human readable string. -+# -+# SIP_BINARY_PATH - Path and filename of the SIP command line executable. -+# -+# SIP_INCLUDE_DIR - Directory holding the SIP C++ header file. -+# -+# SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed -+# into. -+ -+# Copyright (c) 2007, Simon Edwards -+# Redistribution and use is allowed according to the terms of the BSD license. -+# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -+ -+ -+ -+IF(SIP_VERSION OR SIP_BUILD_EXECUTABLE) -+ # Already in cache, be silent -+ SET(SIP_FOUND TRUE) -+ELSE() -+ -+ FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH) -+ -+ EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_sip_py} OUTPUT_VARIABLE sip_config) -+ IF(sip_config) -+ STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_version_num:([^\n]+).*$" "\\1" SIP_VERSION_NUM ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config}) -+ STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) -+ IF(${SIP_VERSION_STR} VERSION_LESS 5) -+ STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_BINARY_PATH ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_module_dir:([^\n]+).*$" "\\1" SIP_MODULE_DIR ${sip_config}) -+ ELSE(${SIP_VERSION_STR} VERSION_LESS 5) -+ FIND_PROGRAM(SIP_BUILD_EXECUTABLE sip-build) -+ ENDIF(${SIP_VERSION_STR} VERSION_LESS 5) -+ SET(SIP_FOUND TRUE) -+ ENDIF(sip_config) -+ -+ IF(SIP_FOUND) -+ IF(NOT SIP_FIND_QUIETLY) -+ MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}") -+ ENDIF(NOT SIP_FIND_QUIETLY) -+ ELSE(SIP_FOUND) -+ IF(SIP_FIND_REQUIRED) -+ MESSAGE(FATAL_ERROR "Could not find SIP") -+ ENDIF(SIP_FIND_REQUIRED) -+ ENDIF(SIP_FOUND) -+ -+ENDIF() -+ -+include(${CMAKE_SOURCE_DIR}/cmake/SIPMacros.cmake) -+ADD_DEFINITIONS(-DSIP_VERSION=0x${SIP_VERSION}) ---- /dev/null -+++ ./cmake/FindSIP.py -@@ -0,0 +1,57 @@ -+# -*- coding: utf-8 -*- -+# -+# Copyright (c) 2007, Simon Edwards -+# All rights reserved. -+# -+# Redistribution and use in source and binary forms, with or without -+# modification, are permitted provided that the following conditions are met: -+# * Redistributions of source code must retain the above copyright -+# notice, this list of conditions and the following disclaimer. -+# * Redistributions in binary form must reproduce the above copyright -+# notice, this list of conditions and the following disclaimer in the -+# documentation and/or other materials provided with the distribution. -+# * Neither the name of the Simon Edwards nor the -+# names of its contributors may be used to endorse or promote products -+# derived from this software without specific prior written permission. -+# -+# THIS SOFTWARE IS PROVIDED BY Simon Edwards ''AS IS'' AND ANY -+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+# DISCLAIMED. IN NO EVENT SHALL Simon Edwards BE LIABLE FOR ANY -+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+# -+# FindSIP.py -+# Copyright (c) 2007, Simon Edwards -+# Redistribution and use is allowed according to the terms of the BSD license. -+# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -+ -+try: -+ import sipbuild -+ -+ print("sip_version:%06.0x" % sipbuild.version.SIP_VERSION) -+ print("sip_version_num:%d" % sipbuild.version.SIP_VERSION) -+ print("sip_version_str:%s" % sipbuild.version.SIP_VERSION_STR) -+ -+ from distutils.sysconfig import get_python_lib -+ python_modules_dir = get_python_lib(plat_specific=1) -+ print("default_sip_dir:%s" % python_modules_dir) -+except ImportError: # Code for SIP v4 -+ import sipconfig -+ -+ sipcfg = sipconfig.Configuration() -+ print("sip_version:%06.0x" % sipcfg.sip_version) -+ print("sip_version_num:%d" % sipcfg.sip_version) -+ print("sip_version_str:%s" % sipcfg.sip_version_str) -+ print("sip_bin:%s" % sipcfg.sip_bin) -+ print("default_sip_dir:%s" % sipcfg.default_sip_dir) -+ print("sip_inc_dir:%s" % sipcfg.sip_inc_dir) -+ # SIP 4.19.10+ has new sipcfg.sip_module_dir -+ if hasattr(sipcfg, "sip_module_dir"): -+ print("sip_module_dir:%s" % sipcfg.sip_module_dir) -+ else: -+ print("sip_module_dir:%s" % sipcfg.sip_mod_dir) ---- /dev/null -+++ ./cmake/SIPMacros.cmake -@@ -0,0 +1,107 @@ -+ -+ -+# Macros for SIP -+# ~~~~~~~~~~~~~~ -+ -+set(SIP_ARGS --pep484-pyi --no-protected-is-public) -+ -+function(add_sip_module MODULE_TARGET) -+ if(NOT SIP_BUILD_EXECUTABLE) -+ set(SIP_BUILD_EXECUTABLE ${CMAKE_PREFIX_PATH}/Scripts/sip-build) -+ endif() -+ -+ message(STATUS "SIP: Generating pyproject.toml") -+ configure_file(${CMAKE_SOURCE_DIR}/pyproject.toml.in ${CMAKE_CURRENT_BINARY_DIR}/pyproject.toml) -+ configure_file(${CMAKE_SOURCE_DIR}/cmake/CMakeBuilder.py ${CMAKE_CURRENT_BINARY_DIR}/CMakeBuilder.py) -+ if(WIN32) -+ set(ext .pyd) -+ set(env_path_sep ";") -+ else() -+ set(ext .so) -+ set(env_path_sep ":") -+ endif() -+ -+ message(STATUS "SIP: Generating source files") -+ execute_process( -+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS} -+ COMMAND_ECHO STDOUT -+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ -+ ) -+ # This will generate the source-files during the configuration step in CMake. Needed to obtain the sources -+ -+ # Touch the generated files (8 in total) to make them dirty and force them to rebuild -+ message(STATUS "SIP: Touching the source files") -+ set(_sip_output_files) -+ list(LENGTH SIP_FILES _no_outputfiles) -+ foreach(_concat_file_nr RANGE 0 ${_no_outputfiles}) -+ if(${_concat_file_nr} LESS 8) -+ list(APPEND _sip_output_files "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/sip${MODULE_TARGET}part${_concat_file_nr}.cpp") -+ endif() -+ endforeach() -+ -+ # Find the generated source files -+ message(STATUS "SIP: Collecting the generated source files") -+ file(GLOB sip_c "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.c") -+ file(GLOB sip_cpp "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.cpp") -+ file(GLOB sip_hdr "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.h") -+ -+ # Add the user specified source files -+ message(STATUS "SIP: Collecting the user specified source files") -+ get_target_property(usr_src ${MODULE_TARGET} SOURCES) -+ -+ # create the target library and link all the files (generated and user specified -+ message(STATUS "SIP: Linking the interface target against the shared library") -+ set(sip_sources "${sip_c}" "${sip_cpp}" "${usr_src}") -+ -+ if (BUILD_SHARED_LIBS) -+ add_library("sip_${MODULE_TARGET}" SHARED ${sip_sources}) -+ else() -+ add_library("sip_${MODULE_TARGET}" STATIC ${sip_sources}) -+ endif() -+ -+ # Make sure that the library name of the target is the same as the MODULE_TARGET with the appropriate extension -+ target_link_libraries("sip_${MODULE_TARGET}" PRIVATE "${MODULE_TARGET}") -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES PREFIX "") -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES SUFFIX ${ext}) -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES OUTPUT_NAME "${MODULE_TARGET}") -+ -+ # Add the custom command to (re-)generate the files and mark them as dirty. This allows the user to actually work -+ # on the sip definition files without having to reconfigure the complete project. -+ if (NOT DEFINED PYTHONPATH) -+ set(PYTHONPATH "") -+ endif () -+ add_custom_command( -+ TARGET "sip_${MODULE_TARGET}" -+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS} -+ COMMAND ${CMAKE_COMMAND} -E touch ${_sip_output_files} -+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ -+ MAIN_DEPENDENCY ${MODULE_SIP} -+ DEPENDS ${sip_sources} -+ VERBATIM -+ ) -+ -+ set_target_properties("sip_${MODULE_TARGET}" -+ PROPERTIES -+ RESOURCE "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/${MODULE_TARGET}.pyi") -+endfunction() -+ -+function(install_sip_module MODULE_TARGET) -+ if(DEFINED ARGV1) -+ set(_install_path ${ARGV1}) -+ else() -+ if(DEFINED Python_SITEARCH) -+ set(_install_path ${Python_SITEARCH}) -+ elseif(DEFINED Python_SITELIB) -+ set(_install_path ${Python_SITELIB}) -+ else() -+ message(FATAL_ERROR "SIP: Specify the site-packages location") -+ endif() -+ endif() -+ message(STATUS "SIP: Installing Python module and PEP 484 file in ${_install_path}") -+ install(TARGETS "sip_${MODULE_TARGET}" -+ ARCHIVE DESTINATION ${_install_path} -+ LIBRARY DESTINATION ${_install_path} -+ RUNTIME DESTINATION ${_install_path} -+ RESOURCE DESTINATION ${_install_path} -+ ) -+endfunction() diff --git a/backports/py3-arcus/cmake.patch b/backports/py3-arcus/cmake.patch deleted file mode 100644 index e7390e0..0000000 --- a/backports/py3-arcus/cmake.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ./CMakeLists.txt.orig -+++ ./CMakeLists.txt -@@ -2,22 +2,22 @@ - project(pyarcus) - cmake_minimum_required(VERSION 3.20) - --find_package(protobuf REQUIRED) --find_package(cpython REQUIRED) --find_package(arcus REQUIRED) -+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) - --find_package(standardprojectsettings REQUIRED) --find_package(sipbuildtool REQUIRED) -+find_package(Protobuf REQUIRED) -+find_package(Python REQUIRED COMPONENTS Interpreter Development) -+find_package(Arcus REQUIRED) - -+find_package(SIP 6.5.0 REQUIRED) -+ - add_library(pyArcus INTERFACE src/PythonMessage.cpp) --use_threads(pyArcus) - - target_include_directories(pyArcus - INTERFACE - $ - $ - ) --target_link_libraries(pyArcus INTERFACE arcus::arcus protobuf::libprotobuf cpython::cpython) -+target_link_libraries(pyArcus INTERFACE Arcus protobuf::libprotobuf Python::Python) - add_sip_module(pyArcus) - install_sip_module(pyArcus) - diff --git a/backports/py3-arcus/pyproject.patch b/backports/py3-arcus/pyproject.patch deleted file mode 100644 index 3dd7f3a..0000000 --- a/backports/py3-arcus/pyproject.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- /dev/null -+++ ./pyproject.toml.in -@@ -0,0 +1,17 @@ -+[build-system] -+requires = ["sip >=6, <7"] -+build-backend = "sipbuild.api" -+ -+[tool.sip.metadata] -+name = "pyArcus" -+ -+[tool.sip.project] -+builder-factory = "CMakeBuilder" -+sip-files-dir = "${CMAKE_CURRENT_SOURCE_DIR}/python/" -+sip-include-dirs = ["CMAKE_CURRENT_SOURCE_DIR/python/"] -+build-dir = "${CMAKE_CURRENT_BINARY_DIR}/pyArcus/" -+ -+[tool.sip.bindings.pyArcus] -+exceptions = true -+release-gil = true -+concatenate = 8 From 9e839bd17b0f12f5580b8ac6edd0df534b4689f7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:42:58 -0400 Subject: [PATCH 190/313] unmaintained/py3-html5-parser: drop for in backports --- unmaintained/py3-html5-parser/APKBUILD | 33 -------------------------- 1 file changed, 33 deletions(-) delete mode 100644 unmaintained/py3-html5-parser/APKBUILD diff --git a/unmaintained/py3-html5-parser/APKBUILD b/unmaintained/py3-html5-parser/APKBUILD deleted file mode 100644 index 160a9ee..0000000 --- a/unmaintained/py3-html5-parser/APKBUILD +++ /dev/null @@ -1,33 +0,0 @@ -# Maintainer: Antoine Martin - -_pkgname="html5-parser" -pkgname='py3-html5-parser' -pkgver=0.4.9 -pkgrel=0 -pkgdesc="Fast C based HTML 5 parsing for python" -arch='x86_64' -url="https://github.com/kovidgoyal/${_pkgname}" -license='Apache' -checkdepends='py3-beautifulsoup4' -makedepends='py3-chardet py3-lxml py3-setuptools libxml2-dev python3-dev' -source="${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz" - -build() { - cd "${srcdir}"/${_pkgname}-${pkgver} - - python3 setup.py build -} - -check() { - cd "${srcdir}"/${_pkgname}-${pkgver} - - python3 setup.py test -} - -package() { - cd "${srcdir}"/${_pkgname}-${pkgver} - python3 setup.py install --root="${pkgdir}" --optimize=1 --skip-build -} - - -sha512sums="31d0499e690c1cfe86fcaabddf4a5842b504706f6d95268dfad4ce80a8b91df6ba779c27dd4fe877232f6664142ed04b9d2af0aff601aa1855f91d9720adf512 py3-html5-parser-0.4.9.tar.gz" From 6abdbe7e50afa44051f81f1dd53f972be5c85761 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:43:44 -0400 Subject: [PATCH 191/313] backports/py3-mapbox-eacut: drop due to not needed --- backports/py3-mapbox-earcut/APKBUILD | 35 ---------------------------- 1 file changed, 35 deletions(-) delete mode 100644 backports/py3-mapbox-earcut/APKBUILD diff --git a/backports/py3-mapbox-earcut/APKBUILD b/backports/py3-mapbox-earcut/APKBUILD deleted file mode 100644 index fe17670..0000000 --- a/backports/py3-mapbox-earcut/APKBUILD +++ /dev/null @@ -1,35 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=py3-mapbox-earcut -pkgver=1.0.1 -pkgrel=2 -pkgdesc="Python bindings for the mapbox earcut c++ library" -url="https://github.com/skogler/mapbox_earcut_python" -arch="all" -license="ISC" -depends="py3-numpy" -makedepends="py3-setuptools py3-pybind11-dev python3-dev py3-gpep517" -checkdepends="py3-pytest" -source="$pkgname-$pkgver.tar.gz::https://github.com/skogler/mapbox_earcut_python/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/mapbox_earcut_python-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -cdb32585cbaf74c15e59af0ae70d983dd2f9bc9cfe1b59b3eadc4d442f7d962241854b589a035deae67cacd9334833b911d0981f0d417fe587348fc7d24f0c0a py3-mapbox-earcut-1.0.1.tar.gz -" From 59283db32af088273ac45376f9f0fba6881ceabc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:44:08 -0400 Subject: [PATCH 192/313] backports/py3-trimesh: drop due to not needed --- backports/py3-trimesh/APKBUILD | 65 ---------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 backports/py3-trimesh/APKBUILD diff --git a/backports/py3-trimesh/APKBUILD b/backports/py3-trimesh/APKBUILD deleted file mode 100644 index 7087c8d..0000000 --- a/backports/py3-trimesh/APKBUILD +++ /dev/null @@ -1,65 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=py3-trimesh -pkgver=3.22.1 -pkgrel=2 -pkgdesc="Python library for working with triangular meshes" -url="https://github.com/mikedh/trimesh" -# x86, armhf, armv7 Tests fail on int64 to int32 casts on these arches -# s390x, no py3-rtree -# riscv64, no py3-shapely -arch="noarch !x86 !armhf !armv7 !s390x !riscv64" -# TODO: investigate why checks stall -options="!check" -license="MIT" -depends=" - py3-colorlog - py3-jsonschema - py3-lxml - py3-mapbox-earcut - py3-msgpack - py3-networkx - py3-numpy - py3-pillow - py3-requests - py3-rtree - py3-scipy - py3-shapely - py3-svgpath - python3 - " -makedepends=" - py3-gpep517 - py3-setuptools - py3-wheel - " -checkdepends="py3-pytest py3-pytest-xdist py3-pyinstrument" -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/mikedh/trimesh/archive/refs/tags/$pkgver.tar.gz" -builddir="$srcdir/trimesh-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - # test_obj.py: no format zae, probably needs more investigation - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 -m pytest -n auto \ - --deselect tests/test_dae.py::DAETest::test_material_round \ - --deselect tests/test_dae.py::DAETest::test_obj_roundtrip \ - --deselect tests/test_light.py::LightTests::test_scene \ - --deselect tests/test_obj.py::OBJTest::test_multi_nodupe -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -27952e0d29ccd110d4087b4144e0923706bed3cd0734e7a17d7f55738c6322849c5dad04ab4ecfe0638bc16d65d1e647d08905a396dd6ebd1f78c833a8b95636 py3-trimesh-3.22.1.tar.gz -" From e73030be6b7fb071e17d92f9118849c4ea100bca Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:44:34 -0400 Subject: [PATCH 193/313] backports/py3-numpy-stl: drop due to not needed --- backports/py3-numpy-stl/APKBUILD | 39 -------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 backports/py3-numpy-stl/APKBUILD diff --git a/backports/py3-numpy-stl/APKBUILD b/backports/py3-numpy-stl/APKBUILD deleted file mode 100644 index 1191396..0000000 --- a/backports/py3-numpy-stl/APKBUILD +++ /dev/null @@ -1,39 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=py3-numpy-stl -pkgver=3.2.0 -pkgrel=0 -pkgdesc="Library for working with STLs" -url="https://github.com/WoLpH/numpy-stl" -# s390x: no py3-utils -arch="noarch !s390x" -license="BSD-3-Clause" -depends="python3 py3-utils py3-numpy" -makedepends="py3-setuptools py3-gpep517" -checkdepends="py3-pytest py3-pytest-cov py3-pygments" -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/wolph/numpy-stl/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/numpy-stl-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - # deselected test needs xvfb-run and fails - .testenv/bin/python3 -m pytest \ - --deselect tests/test_ascii.py::test_use_with_qt_with_custom_locale_decimal_delimeter -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -a08053ed264dbfd629229af3db9c38deed2932b28feced56e2d4c20476f1ba85ddc80881fb82330ea3f4fff9a3f91da20db7447050da5c75f1c04455a67538dc py3-numpy-stl-3.2.0.tar.gz -" From d09e18a9dab11c66028f0dd20ba56aea7c9ec7ec Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:45:18 -0400 Subject: [PATCH 194/313] backports/py3-pyinstrument: drop due to not needed --- backports/py3-pyinstrument/APKBUILD | 50 ----------------------------- 1 file changed, 50 deletions(-) delete mode 100644 backports/py3-pyinstrument/APKBUILD diff --git a/backports/py3-pyinstrument/APKBUILD b/backports/py3-pyinstrument/APKBUILD deleted file mode 100644 index 6070e94..0000000 --- a/backports/py3-pyinstrument/APKBUILD +++ /dev/null @@ -1,50 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: Celeste -maintainer="Celeste " -pkgname=py3-pyinstrument -pkgver=5.0.2 -pkgrel=0 -pkgdesc="Call stack profiler for Python" -url="https://github.com/joerick/pyinstrument" -arch="all" -license="BSD-3-Clause" -makedepends=" - py3-gpep517 - py3-setuptools - py3-wheel - python3-dev - " -checkdepends=" - py3-flaky - py3-greenlet - py3-pytest - py3-pytest-asyncio - py3-trio - " -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/joerick/pyinstrument/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/pyinstrument-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - [ -d "pyinstrument" ] && mv -v pyinstrument pyinstrument.src - - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - - # test_cmdline.py tries to run "pyinstrument" executable - PATH="$builddir/.testenv/bin:$PATH" .testenv/bin/python3 -m pytest -} - -package() { - python3 -m installer -d "$pkgdir" .dist/*.whl -} - -sha512sums=" -7eeb0e05ceb31eab6b4cfcfae7095e7fe9399a7292a12ea427c6ce4f343b1f85be60496c071c2a983b9d0b40f76e18140a836b77a6df0765e40779758212d4cf py3-pyinstrument-5.0.2.tar.gz -" From b72d6e62e430f2e86d0b733ee09282639e192e28 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:45:38 -0400 Subject: [PATCH 195/313] backports/py3-pynest2d: drop due to not needed --- backports/py3-pynest2d/APKBUILD | 49 ---- backports/py3-pynest2d/cmake-helpers.patch | 253 --------------------- backports/py3-pynest2d/cmake.patch | 34 --- backports/py3-pynest2d/pyproject.patch | 21 -- 4 files changed, 357 deletions(-) delete mode 100644 backports/py3-pynest2d/APKBUILD delete mode 100644 backports/py3-pynest2d/cmake-helpers.patch delete mode 100644 backports/py3-pynest2d/cmake.patch delete mode 100644 backports/py3-pynest2d/pyproject.patch diff --git a/backports/py3-pynest2d/APKBUILD b/backports/py3-pynest2d/APKBUILD deleted file mode 100644 index 503b762..0000000 --- a/backports/py3-pynest2d/APKBUILD +++ /dev/null @@ -1,49 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Anjandev Momi -pkgname=py3-pynest2d -pkgver=5.2.2 -pkgrel=5 -pkgdesc="Python bindings for libnest2d" -url="https://github.com/Ultimaker/pynest2d" -arch="all" -license="LGPL-3.0-or-later" -makedepends="samurai cmake libnest2d-dev clipper-dev py3-sip nlopt-dev boost-dev python3-dev" -source="$pkgname-$pkgver.tar.gz::https://github.com/Ultimaker/pynest2d/archive/refs/tags/$pkgver.tar.gz - cmake.patch - cmake-helpers.patch - pyproject.patch" -builddir="$srcdir/pynest2d-$pkgver" -options="!check" # doesn't seem like tests are packaged anymore - -prepare() { - mv ./python ./src - default_prepare -} - -build() { - if [ "$CBUILD" != "$CHOST" ]; then - CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" - fi - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DBUILD_SHARED_LIBS=True \ - -DCMAKE_BUILD_TYPE=Release \ - $CMAKE_CROSSOPTS - cmake --build build -} - -check() { - cd build - ctest -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -f5d701e431c81f8d2da7b14ca5677d3303064cf7910e80d289d7ff8fe99117fb9c470242f25f21fa8e1f064c63accf5349f4956981e316b09b14342223f79b61 py3-pynest2d-5.2.2.tar.gz -c8133d221a2fd8ed5fb32933a69f992dab2e83cdb9db30dcb715ebdfe6d403be3e94df393a921f506b63ef9d8b30a107f26b57cd39810faa9bee461afe5e1afd cmake.patch -dbf6609a21e39ae87fa89f2faf9c98a011f287cb383c5b74f92f41e3a350b487e69643c94110f7fcc25e9e25921a698cc20d9ee021d36ff908d03c0d5ca88a46 cmake-helpers.patch -f1b710509d97b5a2a4d021747e73884d27ae00fd93a04c90be01f123cdcc59be4757b4a73dff9c9921b7794551e531cf6729e4211144c60294d107b92a928b51 pyproject.patch -" diff --git a/backports/py3-pynest2d/cmake-helpers.patch b/backports/py3-pynest2d/cmake-helpers.patch deleted file mode 100644 index 288df07..0000000 --- a/backports/py3-pynest2d/cmake-helpers.patch +++ /dev/null @@ -1,253 +0,0 @@ ---- /dev/null -+++ ./cmake/CMakeBuilder.py -@@ -0,0 +1,13 @@ -+from sipbuild import SetuptoolsBuilder -+ -+ -+class CMakeBuilder(SetuptoolsBuilder): -+ def __init__(self, project, **kwargs): -+ print("Using the CMake builder") -+ super().__init__(project, **kwargs) -+ -+ def build(self): -+ """ Only Generate the source files """ -+ print("Generating the source files") -+ self._generate_bindings() -+ self._generate_scripts() -\ No newline at end of file ---- /dev/null -+++ ./cmake/FindSIP.py -@@ -0,0 +1,57 @@ -+# -*- coding: utf-8 -*- -+# -+# Copyright (c) 2007, Simon Edwards -+# All rights reserved. -+# -+# Redistribution and use in source and binary forms, with or without -+# modification, are permitted provided that the following conditions are met: -+# * Redistributions of source code must retain the above copyright -+# notice, this list of conditions and the following disclaimer. -+# * Redistributions in binary form must reproduce the above copyright -+# notice, this list of conditions and the following disclaimer in the -+# documentation and/or other materials provided with the distribution. -+# * Neither the name of the Simon Edwards nor the -+# names of its contributors may be used to endorse or promote products -+# derived from this software without specific prior written permission. -+# -+# THIS SOFTWARE IS PROVIDED BY Simon Edwards ''AS IS'' AND ANY -+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+# DISCLAIMED. IN NO EVENT SHALL Simon Edwards BE LIABLE FOR ANY -+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+# -+# FindSIP.py -+# Copyright (c) 2007, Simon Edwards -+# Redistribution and use is allowed according to the terms of the BSD license. -+# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -+ -+try: -+ import sipbuild -+ -+ print("sip_version:%06.0x" % sipbuild.version.SIP_VERSION) -+ print("sip_version_num:%d" % sipbuild.version.SIP_VERSION) -+ print("sip_version_str:%s" % sipbuild.version.SIP_VERSION_STR) -+ -+ from distutils.sysconfig import get_python_lib -+ python_modules_dir = get_python_lib(plat_specific=1) -+ print("default_sip_dir:%s" % python_modules_dir) -+except ImportError: # Code for SIP v4 -+ import sipconfig -+ -+ sipcfg = sipconfig.Configuration() -+ print("sip_version:%06.0x" % sipcfg.sip_version) -+ print("sip_version_num:%d" % sipcfg.sip_version) -+ print("sip_version_str:%s" % sipcfg.sip_version_str) -+ print("sip_bin:%s" % sipcfg.sip_bin) -+ print("default_sip_dir:%s" % sipcfg.default_sip_dir) -+ print("sip_inc_dir:%s" % sipcfg.sip_inc_dir) -+ # SIP 4.19.10+ has new sipcfg.sip_module_dir -+ if hasattr(sipcfg, "sip_module_dir"): -+ print("sip_module_dir:%s" % sipcfg.sip_module_dir) -+ else: -+ print("sip_module_dir:%s" % sipcfg.sip_mod_dir) ---- /dev/null -+++ ./cmake/FindSIP.cmake -@@ -0,0 +1,65 @@ -+# Find SIP -+# ~~~~~~~~ -+# -+# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php -+# -+# Find the installed version of SIP. FindSIP should be called after Python -+# has been found. -+# -+# This file defines the following variables: -+# -+# SIP_VERSION - The version of SIP found expressed as a 6 digit hex number -+# suitable for comparison as a string. -+# -+# SIP_VERSION_STR - The version of SIP found as a human readable string. -+# -+# SIP_BINARY_PATH - Path and filename of the SIP command line executable. -+# -+# SIP_INCLUDE_DIR - Directory holding the SIP C++ header file. -+# -+# SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed -+# into. -+ -+# Copyright (c) 2007, Simon Edwards -+# Redistribution and use is allowed according to the terms of the BSD license. -+# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -+ -+ -+ -+IF(SIP_VERSION OR SIP_BUILD_EXECUTABLE) -+ # Already in cache, be silent -+ SET(SIP_FOUND TRUE) -+ELSE() -+ -+ FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH) -+ -+ EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_sip_py} OUTPUT_VARIABLE sip_config) -+ IF(sip_config) -+ STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_version_num:([^\n]+).*$" "\\1" SIP_VERSION_NUM ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config}) -+ STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) -+ IF(${SIP_VERSION_STR} VERSION_LESS 5) -+ STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_BINARY_PATH ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) -+ STRING(REGEX REPLACE ".*\nsip_module_dir:([^\n]+).*$" "\\1" SIP_MODULE_DIR ${sip_config}) -+ ELSE(${SIP_VERSION_STR} VERSION_LESS 5) -+ FIND_PROGRAM(SIP_BUILD_EXECUTABLE sip-build) -+ ENDIF(${SIP_VERSION_STR} VERSION_LESS 5) -+ SET(SIP_FOUND TRUE) -+ ENDIF(sip_config) -+ -+ IF(SIP_FOUND) -+ IF(NOT SIP_FIND_QUIETLY) -+ MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}") -+ ENDIF(NOT SIP_FIND_QUIETLY) -+ ELSE(SIP_FOUND) -+ IF(SIP_FIND_REQUIRED) -+ MESSAGE(FATAL_ERROR "Could not find SIP") -+ ENDIF(SIP_FIND_REQUIRED) -+ ENDIF(SIP_FOUND) -+ -+ENDIF() -+ -+include(${CMAKE_SOURCE_DIR}/cmake/SIPMacros.cmake) -+ADD_DEFINITIONS(-DSIP_VERSION=0x${SIP_VERSION}) ---- /dev/null -+++ ./cmake/SIPMacros.cmake -@@ -0,0 +1,105 @@ -+# Macros for SIP -+# ~~~~~~~~~~~~~~ -+ -+set(SIP_ARGS --pep484-pyi --no-protected-is-public) -+ -+function(add_sip_module MODULE_TARGET) -+ if(NOT SIP_BUILD_EXECUTABLE) -+ set(SIP_BUILD_EXECUTABLE ${CMAKE_PREFIX_PATH}/Scripts/sip-build) -+ endif() -+ -+ message(STATUS "SIP: Generating pyproject.toml") -+ configure_file(${CMAKE_SOURCE_DIR}/pyproject.toml.in ${CMAKE_CURRENT_BINARY_DIR}/pyproject.toml) -+ configure_file(${CMAKE_SOURCE_DIR}/cmake/CMakeBuilder.py ${CMAKE_CURRENT_BINARY_DIR}/CMakeBuilder.py) -+ if(WIN32) -+ set(ext .pyd) -+ set(env_path_sep ";") -+ else() -+ set(ext .so) -+ set(env_path_sep ":") -+ endif() -+ -+ message(STATUS "SIP: Generating source files") -+ execute_process( -+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS} -+ COMMAND_ECHO STDOUT -+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ -+ ) -+ # This will generate the source-files during the configuration step in CMake. Needed to obtain the sources -+ -+ # Touch the generated files (8 in total) to make them dirty and force them to rebuild -+ message(STATUS "SIP: Touching the source files") -+ set(_sip_output_files) -+ list(LENGTH SIP_FILES _no_outputfiles) -+ foreach(_concat_file_nr RANGE 0 ${_no_outputfiles}) -+ if(${_concat_file_nr} LESS 8) -+ list(APPEND _sip_output_files "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/sip${MODULE_TARGET}part${_concat_file_nr}.cpp") -+ endif() -+ endforeach() -+ -+ # Find the generated source files -+ message(STATUS "SIP: Collecting the generated source files") -+ file(GLOB sip_c "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.c") -+ file(GLOB sip_cpp "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.cpp") -+ file(GLOB sip_hdr "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.h") -+ -+ # Add the user specified source files -+ message(STATUS "SIP: Collecting the user specified source files") -+ get_target_property(usr_src ${MODULE_TARGET} SOURCES) -+ -+ # create the target library and link all the files (generated and user specified -+ message(STATUS "SIP: Linking the interface target against the shared library") -+ set(sip_sources "${sip_c}" "${sip_cpp}") -+ if(${usr_src}) -+ list(APPEND sip_sources "${usr_src}") -+ endif() -+ -+ if (BUILD_SHARED_LIBS) -+ add_library("sip_${MODULE_TARGET}" SHARED ${sip_sources}) -+ else() -+ add_library("sip_${MODULE_TARGET}" STATIC ${sip_sources}) -+ endif() -+ -+ # Make sure that the library name of the target is the same as the MODULE_TARGET with the appropriate extension -+ target_link_libraries("sip_${MODULE_TARGET}" PRIVATE "${MODULE_TARGET}") -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES PREFIX "") -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES SUFFIX ${ext}) -+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES OUTPUT_NAME "${MODULE_TARGET}") -+ -+ # Add the custom command to (re-)generate the files and mark them as dirty. This allows the user to actually work -+ # on the sip definition files without having to reconfigure the complete project. -+ add_custom_command( -+ TARGET "sip_${MODULE_TARGET}" -+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS} -+ COMMAND ${CMAKE_COMMAND} -E touch ${_sip_output_files} -+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ -+ MAIN_DEPENDENCY ${MODULE_SIP} -+ DEPENDS ${sip_sources} -+ VERBATIM -+ ) -+ -+ set_target_properties("sip_${MODULE_TARGET}" -+ PROPERTIES -+ RESOURCE "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/${MODULE_TARGET}.pyi") -+endfunction() -+ -+function(install_sip_module MODULE_TARGET) -+ if(DEFINED ARGV1) -+ set(_install_path ${ARGV1}) -+ else() -+ if(DEFINED Python_SITEARCH) -+ set(_install_path ${Python_SITEARCH}) -+ elseif(DEFINED Python_SITELIB) -+ set(_install_path ${Python_SITELIB}) -+ else() -+ message(FATAL_ERROR "SIP: Specify the site-packages location") -+ endif() -+ endif() -+ message(STATUS "SIP: Installing Python module and PEP 484 file in ${_install_path}") -+ install(TARGETS "sip_${MODULE_TARGET}" -+ ARCHIVE DESTINATION ${_install_path} -+ LIBRARY DESTINATION ${_install_path} -+ RUNTIME DESTINATION ${_install_path} -+ RESOURCE DESTINATION ${_install_path} -+ ) -+endfunction() diff --git a/backports/py3-pynest2d/cmake.patch b/backports/py3-pynest2d/cmake.patch deleted file mode 100644 index c2ac24e..0000000 --- a/backports/py3-pynest2d/cmake.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- ./CMakeLists.txt.orig -+++ ./CMakeLists.txt -@@ -2,16 +2,25 @@ - project(pynest2d) - cmake_minimum_required(VERSION 3.20) - --find_package(nest2d REQUIRED) --find_package(cpython REQUIRED) -+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) - --find_package(standardprojectsettings REQUIRED) --find_package(sipbuildtool REQUIRED) -+find_package(Libnest2D REQUIRED) - -+find_package(Python REQUIRED COMPONENTS Interpreter Development) -+find_package(SIP REQUIRED 6.5.0) -+ - add_library(pynest2d INTERFACE) --use_threads(pynest2d) - --target_link_libraries(pynest2d INTERFACE nest2d::nest2d cpython::cpython) -+target_include_directories(pynest2d -+ INTERFACE -+ $ -+ $ -+ ) -+ -+find_package(Threads REQUIRED) -+find_package(Boost REQUIRED) -+target_link_libraries(pynest2d INTERFACE Libnest2D::libnest2d Python::Python Threads::Threads Boost::boost) -+ - add_sip_module(pynest2d) - install_sip_module(pynest2d) - diff --git a/backports/py3-pynest2d/pyproject.patch b/backports/py3-pynest2d/pyproject.patch deleted file mode 100644 index 3c74389..0000000 --- a/backports/py3-pynest2d/pyproject.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- /dev/null -+++ ./pyproject.toml.in -@@ -0,0 +1,17 @@ -+[build-system] -+requires = ["sip >=6, <7"] -+build-backend = "sipbuild.api" -+ -+[tool.sip.metadata] -+name = "pynest2d" -+ -+[tool.sip.project] -+builder-factory = "CMakeBuilder" -+sip-files-dir = "${CMAKE_CURRENT_SOURCE_DIR}/src/" -+sip-include-dirs = ["CMAKE_CURRENT_SOURCE_DIR/src/"] -+build-dir = "${CMAKE_CURRENT_BINARY_DIR}/pynest2d/" -+ -+[tool.sip.bindings.pynest2d] -+exceptions = true -+release-gil = true -+concatenate = 8 -\ No newline at end of file From 6a037b09a692047293fbaa347cfb52c55e9d13d7 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:46:17 -0400 Subject: [PATCH 196/313] backports/py3-rtree: drop due to not needed --- backports/py3-rtree/APKBUILD | 39 ------------------------------------ 1 file changed, 39 deletions(-) delete mode 100644 backports/py3-rtree/APKBUILD diff --git a/backports/py3-rtree/APKBUILD b/backports/py3-rtree/APKBUILD deleted file mode 100644 index f42ccfc..0000000 --- a/backports/py3-rtree/APKBUILD +++ /dev/null @@ -1,39 +0,0 @@ -# Contributor: Alex Yam -# Maintainer: Celeste -maintainer="Celeste " -pkgname=py3-rtree -pkgver=1.4.0 -pkgrel=1 -pkgdesc="Python3 library for r-tree spatial index (wrapper for libspatialindex)" -url="https://pypi.org/project/Rtree/" -# s390x: Test failed: IndexSerialization::test_interleaving - AssertionError -# s390x: Test failed: IndexStream::test_stream_input - AssertionError -arch="noarch !s390x" -license="MIT" -depends="python3 libspatialindex-dev" -makedepends="py3-setuptools py3-wheel py3-gpep517" -checkdepends="py3-pytest py3-numpy" -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/Toblerity/rtree/archive/$pkgver.tar.gz" -builddir="$srcdir/rtree-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest -v --doctest-modules rtree tests -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -9f253a4e4bce1e9210943d1a7b211895baf0478927c58a576235492f2705f4ff61df5fff46db382d6b7c04bde058f046ea0a408a4b504bd1a9bde37c8b1c277c py3-rtree-1.4.0.tar.gz -" From 26821abb534e5e24a7b73bb7cd011bbf896c23ab Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:46:39 -0400 Subject: [PATCH 197/313] backports/py3-svgpath: drop due to not needed --- .../105_use-better-than-nothing-font.patch | 300 ------------------ backports/py3-svgpath/APKBUILD | 41 --- backports/py3-svgpath/no-install-tests.patch | 15 - 3 files changed, 356 deletions(-) delete mode 100644 backports/py3-svgpath/105_use-better-than-nothing-font.patch delete mode 100644 backports/py3-svgpath/APKBUILD delete mode 100644 backports/py3-svgpath/no-install-tests.patch diff --git a/backports/py3-svgpath/105_use-better-than-nothing-font.patch b/backports/py3-svgpath/105_use-better-than-nothing-font.patch deleted file mode 100644 index 7e3d18d..0000000 --- a/backports/py3-svgpath/105_use-better-than-nothing-font.patch +++ /dev/null @@ -1,300 +0,0 @@ -From a17ed35e490a99a7dfab9833f6f3be86f004f699 Mon Sep 17 00:00:00 2001 -From: Benjamin Drung -Date: Fri, 15 Dec 2023 15:32:16 +0100 -Subject: [PATCH] tests: Use better than nothing font -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Pillow 10.1.0 uses a version of Aileron Regular instead of the previous -“better than nothing” default font (in case FreeType support is -available). This font change changes the resulting bitmap. - -Use the "better than nothing" font to keep the expected result -identical. The proper solution is either to use one specific font in -svg.path or make pillow support loading the “better than nothing” -default font. - -Bug-Debian: https://bugs.debian.org/1055159 ---- - tests/font.py | 145 ++++++++++++++++++++++++++++++++ - tests/test_boundingbox_image.py | 18 ++-- - tests/test_image.py | 18 +++- - 3 files changed, 170 insertions(+), 11 deletions(-) - create mode 100644 tests/font.py - -diff --git a/tests/font.py b/tests/font.py -new file mode 100644 -index 0000000..d375f49 ---- /dev/null -+++ b/tests/font.py -@@ -0,0 +1,145 @@ -+# Code taken from https://github.com/python-pillow/Pillow/blob/main/src/PIL/ImageFont.py -+# -+# License: the open source HPND License -+# Copyright (c) 1997-2003 by Secret Labs AB -+# Copyright (c) 1996-2003 by Fredrik Lundh -+ -+from PIL import Image, ImageFont -+from io import BytesIO -+import base64 -+ -+ -+def get_better_than_nothing_font(): -+ font = ImageFont.ImageFont() -+ font._load_pilfont_data( -+ # courB08 -+ BytesIO( -+ base64.b64decode( -+ b""" -+UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -+BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -+AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -+AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -+ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -+BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -+//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -+AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -+AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -+ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -+AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -+/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -+AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -+AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -+AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -+BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -+AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -+2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -+AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -+////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -+BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -+AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -+AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -+AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -+BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -+//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -+AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -+AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -+mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -+AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -+AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -+AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -+Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -+//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -+AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -+AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -+DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -+AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -+AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -+///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -+AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -+BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -+Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -+eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -+AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -+////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -+BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -+AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -+AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -+Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -+Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -+//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -+AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -+AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -+LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -+AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -+AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -+AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -+AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -+AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -+EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -+AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -+pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -+AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -++QAGAAIAzgAKANUAEw== -+""" -+ ) -+ ), -+ Image.open( -+ BytesIO( -+ base64.b64decode( -+ b""" -+iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -+Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -+M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -+LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -+IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -+Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -+NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -+in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -+SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -+AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -+y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -+ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -+lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -+/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -+AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -+c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -+/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -+pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -+oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -+evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -+AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -+Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -+w7IkEbzhVQAAAABJRU5ErkJggg== -+""" -+ ) -+ ) -+ ), -+ ) -+ return font -diff --git a/tests/test_boundingbox_image.py b/tests/test_boundingbox_image.py -index 21f19a7..414f0b1 100644 ---- a/tests/test_boundingbox_image.py -+++ b/tests/test_boundingbox_image.py -@@ -5,6 +5,7 @@ - - from PIL import Image, ImageDraw, ImageColor, ImageChops - from svg.path.path import CubicBezier, QuadraticBezier, Line, Arc -+from .font import get_better_than_nothing_font - - - RED = ImageColor.getcolor("red", mode="RGB") -@@ -57,17 +58,15 @@ def draw_boundingbox(self, path): - sys.platform != "linux", reason="Different platforms have different fonts" - ) - def test_image(self): -- self.draw.text((10, 10), "This is an SVG line:") -- self.draw.text( -- (10, 100), -- "The red line is a bounding box.", -- ) -+ font = get_better_than_nothing_font() -+ self.draw.text((10, 10), "This is an SVG line:", font=font) -+ self.draw.text((10, 100), "The red line is a bounding box.", font=font) - - line1 = Line(40 + 60j, 200 + 80j) - self.draw_path(line1) - self.draw_boundingbox(line1) - -- self.draw.text((10, 140), "These are Arc segments:") -+ self.draw.text((10, 140), "These are Arc segments:", font=font) - arc1 = Arc(260 + 320j, 100 + 100j, 0, 1, 1, 260 + 319j) - self.draw_path(arc1) - self.draw_boundingbox(arc1) -@@ -83,6 +82,7 @@ def test_image(self): - self.draw.text( - (10, 500), - "Next we have a quadratic bezier curve, with one tangent:", -+ font=font, - ) - start = 30 + 600j - control = 400 + 540j -@@ -95,12 +95,16 @@ def test_image(self): - self.draw.text( - (10, 670), - "The white dot is the control point, and the cyan lines are ", -+ font=font, -+ ) -+ self.draw.text( -+ (10, 690), "illustrating the how the control point works.", font=font - ) -- self.draw.text((10, 690), "illustrating the how the control point works.") - - self.draw.text( - (10, 730), - "Lastly is a cubic bezier, with 2 tangents, and 2 control points:", -+ font=font, - ) - - start = 200 + 800j -diff --git a/tests/test_image.py b/tests/test_image.py -index 49967ea..ae3a357 100644 ---- a/tests/test_image.py -+++ b/tests/test_image.py -@@ -4,6 +4,7 @@ - from math import sqrt - - from svg.path.path import CubicBezier, QuadraticBezier, Line, Arc -+from .font import get_better_than_nothing_font - - - RED = ImageColor.getcolor("red", mode="RGB") -@@ -57,25 +58,30 @@ def draw_tangents(self, path, count): - self.draw.line([c2t(p), c2t(tt + p)], fill=YELLOW, width=1) - - def test_image(self): -- self.draw.text((10, 10), "This is an SVG line:") -+ font = get_better_than_nothing_font() -+ self.draw.text((10, 10), "This is an SVG line:", font=font) - self.draw.text( - (10, 100), - "The red line is a tangent, and the yellow is 90 degrees from that.", -+ font=font, - ) - - line1 = Line(40 + 60j, 200 + 80j) - self.draw_path(line1) - self.draw_tangents(line1, 1) - -- self.draw.text((10, 140), "This is an Arc segment, almost a whole circle:") -+ self.draw.text( -+ (10, 140), "This is an Arc segment, almost a whole circle:", font=font -+ ) - arc1 = Arc(260 + 320j, 100 + 100j, 0, 1, 1, 260 + 319j) - self.draw_path(arc1) - self.draw_tangents(arc1, 5) -- self.draw.text((10, 460), "With five tangents.") -+ self.draw.text((10, 460), "With five tangents.", font=font) - - self.draw.text( - (10, 500), - "Next we have a quadratic bezier curve, with one tangent:", -+ font=font, - ) - start = 30 + 600j - control = 400 + 540j -@@ -88,12 +94,16 @@ def test_image(self): - self.draw.text( - (10, 670), - "The white dot is the control point, and the cyan lines are ", -+ font=font, -+ ) -+ self.draw.text( -+ (10, 690), "illustrating the how the control point works.", font=font - ) -- self.draw.text((10, 690), "illustrating the how the control point works.") - - self.draw.text( - (10, 730), - "Lastly is a cubic bezier, with 2 tangents, and 2 control points:", -+ font=font, - ) - - start = 30 + 800j diff --git a/backports/py3-svgpath/APKBUILD b/backports/py3-svgpath/APKBUILD deleted file mode 100644 index 3cfbc91..0000000 --- a/backports/py3-svgpath/APKBUILD +++ /dev/null @@ -1,41 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: Celeste -maintainer="Celeste " -pkgname=py3-svgpath -pkgver=6.3 -pkgrel=3 -pkgdesc="SVG path and object parser" -url="https://github.com/regebro/svg.path" -arch="noarch" -license="MIT" -makedepends="py3-setuptools py3-gpep517 py3-wheel" -checkdepends="py3-pytest py3-pillow" -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/regebro/svg.path/archive/refs/tags/$pkgver.tar.gz - 105_use-better-than-nothing-font.patch - no-install-tests.patch - " -builddir="$srcdir/svg.path-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 -m pytest -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -fd9dd9e1e603be5e212e3eb247c9f3778203f5285397a4cdde4c038c3f31f7bc2b8904491c208256996e2fbd39b4e5f7ea58d964bd5d22bc09c57e4bc2c70317 py3-svgpath-6.3.tar.gz -d12d32b0f6b075ee8602a7eee5dd1ddaa8f097fe3d471f2941fac0bba335641111eb2c0e2819dffea822f895833ffafa35baac80085cf759ca1ed8f7a6b92773 105_use-better-than-nothing-font.patch -62ab1e0980c7fb797f74b81c937a68b6af1112fff293e6ddec6389a8e490a08e181c37217408b58ce3a2ae2afda7813bb3bbe57d5414cfc18e4e53e6d2f2ea5a no-install-tests.patch -" diff --git a/backports/py3-svgpath/no-install-tests.patch b/backports/py3-svgpath/no-install-tests.patch deleted file mode 100644 index 994ce3c..0000000 --- a/backports/py3-svgpath/no-install-tests.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- ./setup.py.orig -+++ ./setup.py -@@ -1,3 +1,3 @@ --from setuptools import setup -+from setuptools import setup, find_packages - --setup() -+setup(packages=find_packages("src", exclude=["*tests"])) ---- ./MANIFEST.in.orig -+++ ./MANIFEST.in -@@ -3,3 +3,4 @@ - - recursive-include src *.png - -+global-exclude tests/* From 73b064ed374506e1287a575cf93b84c065fc3013 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:47:05 -0400 Subject: [PATCH 198/313] backports/uranium: drop due to not needed --- ...ix-simplebutton-use-of-um-colorimage.patch | 34 ------- backports/uranium/APKBUILD | 61 ------------ backports/uranium/cmake-helpers.patch | 89 ----------------- backports/uranium/cmake.patch | 16 ---- .../fix-logger-used-but-not-imported.patch | 14 --- .../uranium/qt-try-ints-then-bytes.patch | 96 ------------------- 6 files changed, 310 deletions(-) delete mode 100644 backports/uranium/874_fix-simplebutton-use-of-um-colorimage.patch delete mode 100644 backports/uranium/APKBUILD delete mode 100644 backports/uranium/cmake-helpers.patch delete mode 100644 backports/uranium/cmake.patch delete mode 100644 backports/uranium/fix-logger-used-but-not-imported.patch delete mode 100644 backports/uranium/qt-try-ints-then-bytes.patch diff --git a/backports/uranium/874_fix-simplebutton-use-of-um-colorimage.patch b/backports/uranium/874_fix-simplebutton-use-of-um-colorimage.patch deleted file mode 100644 index 3112c9c..0000000 --- a/backports/uranium/874_fix-simplebutton-use-of-um-colorimage.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 88fd460a63263d66173f1e0127b0f208577d7f4e Mon Sep 17 00:00:00 2001 -Patch-Source: https://github.com/Ultimaker/Uranium/pull/874 -From: fieldOfView -Date: Sat, 20 May 2023 21:14:36 +0200 -Subject: [PATCH] Fix SimpleButton use of UM.ColorImage - -Fixes https://github.com/Ultimaker/Cura/issues/15524 ---- - UM/Qt/qml/UM/SimpleButton.qml | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/UM/Qt/qml/UM/SimpleButton.qml b/UM/Qt/qml/UM/SimpleButton.qml -index d3d398753c..d3bd0e8e14 100644 ---- a/UM/Qt/qml/UM/SimpleButton.qml -+++ b/UM/Qt/qml/UM/SimpleButton.qml -@@ -1,7 +1,8 @@ --// Copyright (c) 2018 Ultimaker B.V. -+// Copyright (c) 2023 Ultimaker B.V. - // Uranium is released under the terms of the LGPLv3 or higher. - - import QtQuick 2.1 -+import UM 1.5 as UM - - MouseArea - { -@@ -27,7 +28,7 @@ MouseArea - radius: 0 - } - -- ColorImage -+ UM.ColorImage - { - id: image - diff --git a/backports/uranium/APKBUILD b/backports/uranium/APKBUILD deleted file mode 100644 index e896971..0000000 --- a/backports/uranium/APKBUILD +++ /dev/null @@ -1,61 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Anjandev Momi -pkgname=uranium -pkgver=5.2.2 -pkgrel=3 -pkgdesc="A Python framework for building Desktop applications" -url="https://github.com/Ultimaker/Uranium" -arch="noarch !armhf !riscv64" # armhf: no py3-qt5, rv64: no py3-shapely -license="LGPL-3.0-or-later" -depends=" - py3-cryptography - py3-numpy - py3-qt6 - py3-scipy - python3 - " -# add cura-binary-data to makedepends when packaged -makedepends="samurai cmake doxygen gettext-dev graphviz" -checkdepends="py3-pytest py3-pytest-benchmark py3-twisted" -options="!check" # checks broken from 5.x onward -source="$pkgname-$pkgver.tar.gz::https://github.com/Ultimaker/Uranium/archive/refs/tags/$pkgver.tar.gz - cmake.patch - 874_fix-simplebutton-use-of-um-colorimage.patch - fix-logger-used-but-not-imported.patch - qt-try-ints-then-bytes.patch - cmake-helpers.patch" -builddir="$srcdir/Uranium-$pkgver" - -build() { - if [ "$CBUILD" != "$CHOST" ]; then - CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" - fi - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DCMAKE_BUILD_TYPE=MinSizeRel \ - -DGETTEXT_MSGINIT_EXECUTABLE=msginit \ - -DCURA_BINARY_DATA_DIRECTORY=/usr/share/cura \ - $CMAKE_CROSSOPTS - cmake --build build -} - -check() { - # useless code style test with another dependency - ctest -T Test -} - -package() { - DESTDIR="$pkgdir" cmake --install build - mkdir "$pkgdir"/usr/share/uranium/cmake - mv "$pkgdir"/usr/share/cmake-*/Modules/* "$pkgdir"/usr/share/uranium/cmake/ -} - -sha512sums=" -a9c222400022e05b5c42c72843b024204a58f5d233805bdffa610a2d9cbd1873773868b049aabbe52c6e859f235ca5428fcdfdbb86651f428483999060611e10 uranium-5.2.2.tar.gz -196a04164de288f5bffeebb73ace9390059dcffebaf40395368f413d1af2e2c668d85dd4c761ad226732540d41598235c2c368152cc157d2e89445ce27738c9b cmake.patch -c50b37a3a44c4d4f66d115e72a430b82a8125efa49ce51271d5cad7fac15b2941a6a82b71fd07cef751b159296b64d783b348cebe7dfd865f0121815d2cf41f4 874_fix-simplebutton-use-of-um-colorimage.patch -78e1415133bc4135f93633375bdb71a9e04b9cd128067d223985d0878f0e3de3ed1d336117fc527f0804b99878bd56817e3eb7a5aa545cc877b9f43386e17e78 fix-logger-used-but-not-imported.patch -26489638fcf80822d16b0a295aee21a8973c23a023b1daf7f2cf5f7be7c56e72a15edd87ac6993f8a2ad09086d7d1a8b7d32247522c9429183625e3a0b63f2ae qt-try-ints-then-bytes.patch -aa185ce3592036f045e3386266015cc08443c2e4f9b9a4c03c77c13525af98d68eaa3360e8858e0561417a826c73bf8a2b209bcad91d2cc16cce32fb0231fcf8 cmake-helpers.patch -" diff --git a/backports/uranium/cmake-helpers.patch b/backports/uranium/cmake-helpers.patch deleted file mode 100644 index 3c5d1f3..0000000 --- a/backports/uranium/cmake-helpers.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- /dev/null -+++ ./cmake/UraniumPluginInstall.cmake -@@ -0,0 +1,86 @@ -+# Copyright (c) 2022 Ultimaker B.V. -+# UraniumPluginInstall.cmake is released under the terms of the LGPLv3 or higher. -+ -+# -+# This module detects all plugins that need to be installed and adds them using the CMake install() command. -+# It detects all plugin folder in the path "plugins/*" where there's a "plugin.json" in it. -+# -+# Plugins can be configured to NOT BE INSTALLED via the variable "UM_NO_INSTALL_PLUGINS" as a list of string in the -+# form of "a;b;c" or "a,b,c". By default all plugins will be installed. -+# -+ -+# Options or configuration variables -+set(UM_NO_INSTALL_PLUGINS "" CACHE STRING "A list of plugins that should not be installed, separated with ';' or ','.") -+ -+file(GLOB_RECURSE _plugin_json_list ${CMAKE_SOURCE_DIR}/plugins/*/plugin.json) -+list(LENGTH _plugin_json_list _plugin_json_list_len) -+ -+# Sort the lists alphabetically so we can handle cases like this: -+# - plugins/my_plugin/plugin.json -+# - plugins/my_plugin/my_module/plugin.json -+# In this case, only "plugins/my_plugin" should be added via install(). -+set(_no_install_plugin_list ${UM_NO_INSTALL_PLUGINS}) -+# Sanitize the string so the comparison will be case-insensitive. -+string(STRIP "${_no_install_plugin_list}" _no_install_plugin_list) -+string(TOLOWER "${_no_install_plugin_list}" _no_install_plugin_list) -+ -+# WORKAROUND counterpart of what's in cura-build. -+string(REPLACE "," ";" _no_install_plugin_list "${_no_install_plugin_list}") -+ -+list(LENGTH _no_install_plugin_list _no_install_plugin_list_len) -+ -+if(_no_install_plugin_list_len GREATER 0) -+ list(SORT _no_install_plugin_list) -+endif() -+if(_plugin_json_list_len GREATER 0) -+ list(SORT _plugin_json_list) -+endif() -+ -+# Check all plugin directories and add them via install() if needed. -+set(_install_plugin_list "") -+foreach(_plugin_json_path ${_plugin_json_list}) -+ get_filename_component(_plugin_dir ${_plugin_json_path} DIRECTORY) -+ file(RELATIVE_PATH _rel_plugin_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dir}) -+ get_filename_component(_plugin_dir_name ${_plugin_dir} NAME) -+ -+ # Make plugin name comparison case-insensitive -+ string(TOLOWER "${_plugin_dir_name}" _plugin_dir_name_lowercase) -+ -+ # Check if this plugin needs to be skipped for installation -+ set(_add_plugin ON) # Indicates if this plugin should be added to the build or not. -+ set(_is_no_install_plugin OFF) # If this plugin will not be added, this indicates if it's because the plugin is -+ # specified in the NO_INSTALL_PLUGINS list. -+ if(_no_install_plugin_list) -+ if("${_plugin_dir_name_lowercase}" IN_LIST _no_install_plugin_list) -+ set(_add_plugin OFF) -+ set(_is_no_install_plugin ON) -+ endif() -+ endif() -+ -+ # Make sure this is not a subdirectory in a plugin that's already in the install list -+ if(_add_plugin) -+ foreach(_known_install_plugin_dir ${_install_plugin_list}) -+ if(_plugin_dir MATCHES "${_known_install_plugin_dir}.+") -+ set(_add_plugin OFF) -+ break() -+ endif() -+ endforeach() -+ endif() -+ -+ if(_add_plugin) -+ message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}") -+ get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY) -+ install(DIRECTORY ${_rel_plugin_dir} -+ DESTINATION lib${LIB_SUFFIX}/uranium/${_rel_plugin_parent_dir} -+ PATTERN "__pycache__" EXCLUDE -+ PATTERN "*.qmlc" EXCLUDE -+ ) -+ list(APPEND _install_plugin_list ${_plugin_dir}) -+ elseif(_is_no_install_plugin) -+ message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}") -+ execute_process(COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py -+ -d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages -+ ${_plugin_dir_name} -+ RESULT_VARIABLE _mod_json_result) -+ endif() -+endforeach() diff --git a/backports/uranium/cmake.patch b/backports/uranium/cmake.patch deleted file mode 100644 index b1a888b..0000000 --- a/backports/uranium/cmake.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- ./CMakeLists.txt.orig -+++ ./CMakeLists.txt -@@ -19,9 +19,12 @@ - # Build Translations - CREATE_TRANSLATION_TARGETS() - -+find_package(Python REQUIRED COMPONENTS Interpreter) - --install(DIRECTORY UM DESTINATION "${Python_SITELIB_LOCAL}") -+install(DIRECTORY UM DESTINATION "${Python_SITELIB}") - - install(FILES ${CMAKE_SOURCE_DIR}/cmake/UraniumTranslationTools.cmake - DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake-${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}/Modules/ ) - install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/uranium) -+ -+include(UraniumPluginInstall) diff --git a/backports/uranium/fix-logger-used-but-not-imported.patch b/backports/uranium/fix-logger-used-but-not-imported.patch deleted file mode 100644 index 151893c..0000000 --- a/backports/uranium/fix-logger-used-but-not-imported.patch +++ /dev/null @@ -1,14 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/python-uranium/blob/rawhide/f/Uranium-5.3.0-qt-try-ints-then-bytes-for-gl-mask-functions.patch - -diff --git a/UM/View/SelectionPass.py.orig b/UM/View/SelectionPass.py -index 945b789..ef042a5 100644 ---- a/UM/View/SelectionPass.py.orig -+++ b/UM/View/SelectionPass.py -@@ -5,6 +5,7 @@ import enum - import random - from typing import TYPE_CHECKING - -+from UM.Logger import Logger - from UM.Resources import Resources - from UM.Application import Application - diff --git a/backports/uranium/qt-try-ints-then-bytes.patch b/backports/uranium/qt-try-ints-then-bytes.patch deleted file mode 100644 index 8f7d6db..0000000 --- a/backports/uranium/qt-try-ints-then-bytes.patch +++ /dev/null @@ -1,96 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/python-uranium/blob/rawhide/f/Uranium-5.3.0-qt-try-ints-then-bytes-for-gl-mask-functions.patch - -diff --git a/UM/View/RenderBatch.py.orig b/UM/View/RenderBatch.py -index 6deeeb1..5f1eda5 100644 ---- a/UM/View/RenderBatch.py.orig -+++ b/UM/View/RenderBatch.py -@@ -186,10 +186,24 @@ class RenderBatch: - - if self._render_type == self.RenderType.Solid: - self._gl.glEnable(self._gl.GL_DEPTH_TEST) -- self._gl.glDepthMask(self._gl.GL_TRUE) -+ try: -+ self._gl.glDepthMask(self._gl.GL_TRUE) -+ except: -+ Logger.log("w", "glDepthMask does not like ints, trying bytes...") -+ try: -+ self._gl.glDepthMask(b'1') -+ except: -+ Logger.log("e", "glDepthMask does not like ints or bytes, no idea what it wants") - elif self._render_type == self.RenderType.Transparent: - self._gl.glEnable(self._gl.GL_DEPTH_TEST) -- self._gl.glDepthMask(self._gl.GL_FALSE) -+ try: -+ self._gl.glDepthMask(self._gl.GL_FALSE) -+ except: -+ Logger.log("w", "glDepthMask does not like ints, trying bytes...") -+ try: -+ self._gl.glDepthMask(b'1') -+ except: -+ Logger.log("e", "glDepthMask does not like ints or bytes, no idea what it wants") - elif self._render_type == self.RenderType.Overlay: - self._gl.glDisable(self._gl.GL_DEPTH_TEST) - -diff --git a/UM/View/RenderPass.py.orig b/UM/View/RenderPass.py -index 8068ddf..8cb4f67 100644 ---- a/UM/View/RenderPass.py.orig -+++ b/UM/View/RenderPass.py -@@ -93,8 +93,22 @@ class RenderPass: - self._fbo.bind() - - # Ensure we can actually write to the relevant FBO components. -- self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE,self._gl.GL_TRUE, self._gl.GL_TRUE) -- self._gl.glDepthMask(self._gl.GL_TRUE) -+ try: -+ self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE,self._gl.GL_TRUE, self._gl.GL_TRUE) -+ except: -+ Logger.log("w", "glColorMask does not like ints, trying bytes...") -+ try: -+ self._gl.glColorMask(b'1', b'1',b'1', b'1') -+ except: -+ Logger.log("e", "glColorMask does not like ints or bytes, no idea what it wants") -+ try: -+ self._gl.glDepthMask(self._gl.GL_TRUE) -+ except: -+ Logger.log("w", "glDepthMask does not like ints, trying bytes...") -+ try: -+ self._gl.glDepthMask(b'1') -+ except: -+ Logger.log("e", "glDepthMask does not like ints or bytes, no idea what it wants") - - self._gl.glClear(self._gl.GL_COLOR_BUFFER_BIT | self._gl.GL_DEPTH_BUFFER_BIT) - -diff --git a/UM/View/SelectionPass.py.orig b/UM/View/SelectionPass.py -index ef042a5..c28fe4f 100644 ---- a/UM/View/SelectionPass.py.orig -+++ b/UM/View/SelectionPass.py -@@ -110,13 +110,27 @@ class SelectionPass(RenderPass): - if selectable_objects: - batch.render(self._scene.getActiveCamera()) - -- self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_FALSE) -+ try: -+ self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_FALSE) -+ except: -+ Logger.log("w", "glColorMask does not like ints, trying bytes...") -+ try: -+ self._gl.glColorMask(b'1', b'1', b'1', b'0') -+ except: -+ Logger.log("e", "glColorMask does not like ints or bytes, no idea what it wants") - self._gl.glDisable(self._gl.GL_DEPTH_TEST) - - tool_handle.render(self._scene.getActiveCamera()) - - self._gl.glEnable(self._gl.GL_DEPTH_TEST) -- self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE) -+ try: -+ self._gl.glColorMask(self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE, self._gl.GL_TRUE) -+ except: -+ Logger.log("w", "glColorMask does not like ints, trying bytes...") -+ try: -+ self._gl.glColorMask(b'1', b'1', b'1', b'1') -+ except: -+ Logger.log("e", "glColorMask does not like ints or bytes, no idea what it wants") - - self.release() - From 024544f4df3782212ebb0ab38accc67b009811d6 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:47:41 -0400 Subject: [PATCH 199/313] backports/libnest2d: drop due to not needed --- backports/libnest2d/APKBUILD | 40 ------ .../libnest2d/allow-disallowed-area.patch | 124 ------------------ 2 files changed, 164 deletions(-) delete mode 100644 backports/libnest2d/APKBUILD delete mode 100644 backports/libnest2d/allow-disallowed-area.patch diff --git a/backports/libnest2d/APKBUILD b/backports/libnest2d/APKBUILD deleted file mode 100644 index c0e8dd5..0000000 --- a/backports/libnest2d/APKBUILD +++ /dev/null @@ -1,40 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Anjandev Momi -pkgname=libnest2d -pkgver=0.4 -pkgrel=7 -pkgdesc="2D irregular bin packaging and nesting library written in modern C++" -url="https://github.com/tamasmeszaros/libnest2d" -arch="noarch" -license="LGPL-3.0-only" -makedepends="samurai cmake clipper-dev boost-dev nlopt-dev" -subpackages="$pkgname-dev" -source="$pkgname-$pkgver.tar.gz::https://github.com/tamasmeszaros/libnest2d/archive/refs/tags/$pkgver.tar.gz - allow-disallowed-area.patch" - -build() { - if [ "$CBUILD" != "$CHOST" ]; then - CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" - fi - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_SHARED_LIBS=True \ - -DCMAKE_BUILD_TYPE=minsizerel \ - $CMAKE_CROSSOPTS . - cmake --build build -} - -check() { - cd build - ctest -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -fadce18986b844eed13a581f84055df909a17407a0980deb6c7c24248a969a537a8840650bcfc673e61973810ce9a008acb599e3b8e00c9bff6b566ca41cd62c libnest2d-0.4.tar.gz -2e8cd3343c72c576ecb54960d7ad9f4f2322f822b19ac41850b3b28da95e97c2cefe7c67de6c97627df08cd5cdc1660ce4dfa95fe51f88e0ff5c066c8d785458 allow-disallowed-area.patch -" diff --git a/backports/libnest2d/allow-disallowed-area.patch b/backports/libnest2d/allow-disallowed-area.patch deleted file mode 100644 index 479b9c4..0000000 --- a/backports/libnest2d/allow-disallowed-area.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 2e91be2679b5efa0773292d9d0a2ae72255bb271 Mon Sep 17 00:00:00 2001 -From: Ghostkeeper -Date: Tue, 6 Oct 2020 16:13:15 +0200 -Subject: [PATCH 1/3] Allow for an item to be a disallowed area - -url: https://github.com/tamasmeszaros/libnest2d/pull/18 - -Disallowed areas have slightly different behaviour from fixed items: Other items won't get packed closely around them. Implementation of that pending. - -Contributes to issue CURA-7754. ---- - include/libnest2d/nester.hpp | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/include/libnest2d/nester.hpp b/include/libnest2d/nester.hpp -index 2f207d5..932a060 100644 ---- a/include/libnest2d/nester.hpp -+++ b/include/libnest2d/nester.hpp -@@ -71,6 +71,15 @@ class _Item { - int binid_{BIN_ID_UNSET}, priority_{0}; - bool fixed_{false}; - -+ /** -+ * \brief If this is a fixed area, indicates whether it is a disallowed area -+ * or a previously placed item. -+ * -+ * If this is a disallowed area, other objects will not get packed close -+ * together with this item. It only blocks other items in its area. -+ */ -+ bool disallowed_{false}; -+ - public: - - /// The type of the shape which was handed over as the template argument. -@@ -129,11 +138,18 @@ class _Item { - sh_(sl::create(std::move(contour), std::move(holes))) {} - - inline bool isFixed() const noexcept { return fixed_; } -+ inline bool isDisallowedArea() const noexcept { return disallowed_; } - inline void markAsFixedInBin(int binid) - { - fixed_ = binid >= 0; - binid_ = binid; - } -+ inline void markAsDisallowedAreaInBin(int binid) -+ { -+ fixed_ = binid >= 0; -+ binid_ = binid; -+ disallowed_ = true; -+ } - - inline void binId(int idx) { binid_ = idx; } - inline int binId() const noexcept { return binid_; } - -From ff61049e59d3151462bca7ff2e2268c2b32731e7 Mon Sep 17 00:00:00 2001 -From: Ghostkeeper -Date: Tue, 6 Oct 2020 16:14:36 +0200 -Subject: [PATCH 2/3] Allow unsetting of being a disallowed area - -If you set the bin to -1 or set the item to be a simple fixed item afterwards, it'll no longer be a disallowed area. - -Contributes to issue CURA-7754. ---- - include/libnest2d/nester.hpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/include/libnest2d/nester.hpp b/include/libnest2d/nester.hpp -index 932a060..54761a6 100644 ---- a/include/libnest2d/nester.hpp -+++ b/include/libnest2d/nester.hpp -@@ -143,12 +143,13 @@ class _Item { - { - fixed_ = binid >= 0; - binid_ = binid; -+ disallowed_ = false; - } - inline void markAsDisallowedAreaInBin(int binid) - { - fixed_ = binid >= 0; - binid_ = binid; -- disallowed_ = true; -+ disallowed_ = fixed_; - } - - inline void binId(int idx) { binid_ = idx; } - -From 31391fd173249ad9b906390058e13b09238fadc8 Mon Sep 17 00:00:00 2001 -From: Ghostkeeper -Date: Thu, 8 Oct 2020 11:06:58 +0200 -Subject: [PATCH 3/3] Align items to their starting position if all placed - items are disallowed - -We shouldn't align items to disallowed areas. So place them in the starting position according to the alignment property. - -Lot of work to investigate. But very little code changes! - -Contributes to issue CURA-7754. ---- - include/libnest2d/placers/nfpplacer.hpp | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/include/libnest2d/placers/nfpplacer.hpp b/include/libnest2d/placers/nfpplacer.hpp -index 96a8cff..b0ebb15 100644 ---- a/include/libnest2d/placers/nfpplacer.hpp -+++ b/include/libnest2d/placers/nfpplacer.hpp -@@ -101,7 +101,7 @@ struct NfpPConfig { - * alignment with the candidate item or do anything else. - * - * \param remaining A container with the remaining items waiting to be -- * placed. You can use some features about the remaining items to alter to -+ * placed. You can use some features about the remaining items to alter the - * score of the current placement. If you know that you have to leave place - * for other items as well, that might influence your decision about where - * the current candidate should be placed. E.g. imagine three big circles -@@ -735,7 +735,8 @@ class _NofitPolyPlacer: public PlacerBoilerplate<_NofitPolyPlacer Date: Mon, 26 May 2025 20:48:05 -0400 Subject: [PATCH 200/313] backports/nlopt: drop due to not needed --- backports/nlopt/APKBUILD | 72 ---------------------------------------- 1 file changed, 72 deletions(-) delete mode 100644 backports/nlopt/APKBUILD diff --git a/backports/nlopt/APKBUILD b/backports/nlopt/APKBUILD deleted file mode 100644 index 66aea68..0000000 --- a/backports/nlopt/APKBUILD +++ /dev/null @@ -1,72 +0,0 @@ -# Contributor: Anjandev Momi -# Maintainer: Celeste -maintainer="Celeste " -pkgname=nlopt -pkgver=2.10.0 -pkgrel=0 -pkgdesc="Library for nonlinear optimization" -url="https://github.com/stevengj/nlopt" -arch="all" -license="LGPL-2.1-or-later" -makedepends=" - cmake - guile-dev - python3-dev - samurai - swig - " -subpackages=" - $pkgname-dev - $pkgname-doc - $pkgname-guile - " -source="$pkgname-$pkgver.tar.gz::https://github.com/stevengj/nlopt/archive/refs/tags/v$pkgver.tar.gz" - -case "$CARCH" in -# octave unavailable on these 3 archs -s390x|riscv64|ppc64le) ;; -*) - makedepends="$makedepends octave-dev" - subpackages="$subpackages $pkgname-octave" - ;; -esac - -build() { - if [ "$CBUILD" != "$CHOST" ]; then - local crossopts="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" - fi - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_BUILD_TYPE=MinSizeRel \ - -DNLOPT_TESTS="$(want_check && echo ON || echo OFF)" \ - $crossopts - cmake --build build -} - -check() { - ctest --test-dir build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -guile() { - pkgdesc="$pkgdesc (Guile bindings)" - depends="$pkgname=$pkgver-r$pkgrel guile" - - amove usr/lib/guile usr/share/guile -} - -octave() { - pkgdesc="$pkgdesc (Octave bindings)" - depends="$pkgname=$pkgver-r$pkgrel octave" - - amove usr/lib/octave usr/share/octave -} - -sha512sums=" -7668db6997ba141ee1759f222bad23a7854aa17962470653ddb5824c25100b50f52c462441f0cc12a62e2322ff084c7f7b7fab09471b0acb13a861d7f7575655 nlopt-2.10.0.tar.gz -" From 0df5b0abb671fed50c07f30ae01f0dcc76df8d00 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:48:28 -0400 Subject: [PATCH 201/313] backports/nibspatialindex: drop due to not needed --- backports/libspatialindex/APKBUILD | 36 ------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 backports/libspatialindex/APKBUILD diff --git a/backports/libspatialindex/APKBUILD b/backports/libspatialindex/APKBUILD deleted file mode 100644 index 4ef768c..0000000 --- a/backports/libspatialindex/APKBUILD +++ /dev/null @@ -1,36 +0,0 @@ -# Contributor: Alex Yam -# Maintainer: Celeste -maintainer="Celeste " -pkgname=libspatialindex -pkgver=0_git20210205 -_commit=8ee223632f95c81f49f5eb2d547ad973475c4601 -pkgrel=2 -pkgdesc="Extensible framework for robust spatial indexing methods" -url="https://libspatialindex.org/" -arch="all" -license="MIT" -makedepends="cmake samurai" -subpackages="$pkgname-dev" -source="$pkgname-$_commit.tar.gz::https://github.com/libspatialindex/libspatialindex/archive/$_commit.tar.gz" -builddir="$srcdir/$pkgname-$_commit" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=MinSizeRel \ - -DCMAKE_PREFIX_PATH=/usr \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DBUILD_TESTING="$(want_check && echo ON || echo OFF)" - cmake --build build -} - -check() { - ctest --test-dir build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -caf91aac77b75445e4fc4d0baedcd10c619b2097dfd841b00339d9ddd4b73db05b99de1d84be88f1083f4713a936cf110d5851523491f5a74c6f96e1d5795dbb libspatialindex-8ee223632f95c81f49f5eb2d547ad973475c4601.tar.gz -" From a04e0ca17b7e63b3f96b18ba0cab9e3ed89a3952 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 20:49:05 -0400 Subject: [PATCH 202/313] backports/fdm-materials: drop due to not needed --- backports/fdm-materials/APKBUILD | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 backports/fdm-materials/APKBUILD diff --git a/backports/fdm-materials/APKBUILD b/backports/fdm-materials/APKBUILD deleted file mode 100644 index 5780f02..0000000 --- a/backports/fdm-materials/APKBUILD +++ /dev/null @@ -1,27 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=fdm-materials -pkgver=5.2.2 -pkgrel=1 -pkgdesc="FDM Material Database" -url="https://github.com/Ultimaker/fdm_materials" -arch="noarch" -license="CC0-1.0" -makedepends="cmake samurai" -options="!check" # no checks provided -source="$pkgname-$pkgver.tar.gz::https://github.com/Ultimaker/fdm_materials/archive/refs/tags/$pkgver.tar.gz" -builddir="$srcdir/fdm_materials-$pkgver" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -73eefec8b7b88af73afc578ffba583480bda30309945b1720d7a1a075bd7ab3279599d53fe83f4c96695f294a5a3e11297abc334ca6cc9db163d4eb0fbdaf0f9 fdm-materials-5.2.2.tar.gz -" From d55be2f427e165d4a9aaf8b3c93ea365a5ffb4a0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 22:09:21 -0400 Subject: [PATCH 203/313] backports/electron: add rust 1.87 patches --- ...l_allocator-to-provide-Rust-allocato.patch | 730 ++++++++++++++++++ ...default-allocator-directly-from-Rust.patch | 319 ++++++++ ...7b43542838f0a4a6cfdb17fbeadf45002042.patch | 102 +++ .../electron/0004-Drop-remap_alloc-dep.patch | 44 ++ ...ild-rust-allocator-after-a-Rust-tool.patch | 354 +++++++++ backports/electron/APKBUILD | 14 + 6 files changed, 1563 insertions(+) create mode 100644 backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch create mode 100644 backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch create mode 100644 backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch create mode 100644 backports/electron/0004-Drop-remap_alloc-dep.patch create mode 100644 backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch diff --git a/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch b/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch new file mode 100644 index 0000000..580323c --- /dev/null +++ b/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch @@ -0,0 +1,730 @@ +From c854a92a215d0cf39c704bbadd3611e552073d5f Mon Sep 17 00:00:00 2001 +From: Collin Baker +Date: Fri, 4 Apr 2025 14:08:18 -0700 +Subject: [PATCH] Reland "Use #[global_allocator] to provide Rust allocator + implementation" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is a reland of commit cfa3beef52625e03ba6ce2b2ac98e1b89dde5cdb + +Original was reverted due to a cronet gn2bp failure. The script +filtered out GN rules in //build/rust/std, but this caused an exception +when //build/rust/std:allocator was referenced later. + +Moving the rules to //build/rust/allocator sidesteps the issue. + +Original change's description: +> Use #[global_allocator] to provide Rust allocator implementation +> +> The allocator shim hack we have been using no longer works with +> upstream Rust. Replace it with a less-unsupported method: provide a +> https://github.com/rust-lang/rust/issues/123015, which still requires +> us to provide a few symbol definitions. +> +> Bug: 408221149, 407024458 +> Change-Id: If1808ca24b12dc80ead35a25521313a3d2e148d5 +> +> Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel +> Change-Id: If1808ca24b12dc80ead35a25521313a3d2e148d5 +> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6427855 +> Reviewed-by: Alan Zhao +> Reviewed-by: Lei Zhang +> Reviewed-by: Łukasz Anforowicz +> Commit-Queue: Collin Baker +> Auto-Submit: Collin Baker +> Cr-Commit-Position: refs/heads/main@{#1442472} + +Bug: 408221149, 407024458 +Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel +Change-Id: I36fef217297bfe64ae81519be24b8c653f6fdfa1 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6432410 +Reviewed-by: Mohannad Farrag +Reviewed-by: Łukasz Anforowicz +Auto-Submit: Collin Baker +Commit-Queue: Łukasz Anforowicz +Cr-Commit-Position: refs/heads/main@{#1442922} +--- + build/rust/allocator/BUILD.gn | 90 ++++++++++++++++ + build/rust/{std => allocator}/alias.cc | 4 +- + build/rust/{std => allocator}/alias.h | 6 +- + .../allocator_impls.cc} | 100 ++++++++---------- + build/rust/allocator/allocator_impls.h | 25 +++++ + .../allocator/allocator_shim_definitions.cc | 30 ++++++ + .../{std => allocator}/compiler_specific.h | 6 +- + .../rust/{std => allocator}/immediate_crash.h | 6 +- + build/rust/allocator/lib.rs | 48 +++++++++ + build/rust/cargo_crate.gni | 9 ++ + build/rust/rust_macro.gni | 3 + + build/rust/rust_target.gni | 4 + + build/rust/std/BUILD.gn | 41 ------- + components/cronet/android/dependencies.txt | 1 + + third_party/breakpad/BUILD.gn | 10 +- + 15 files changed, 272 insertions(+), 111 deletions(-) + create mode 100644 build/rust/allocator/BUILD.gn + rename build/rust/{std => allocator}/alias.cc (87%) + rename build/rust/{std => allocator}/alias.h (91%) + rename build/rust/{std/remap_alloc.cc => allocator/allocator_impls.cc} (67%) + create mode 100644 build/rust/allocator/allocator_impls.h + create mode 100644 build/rust/allocator/allocator_shim_definitions.cc + rename build/rust/{std => allocator}/compiler_specific.h (87%) + rename build/rust/{std => allocator}/immediate_crash.h (97%) + create mode 100644 build/rust/allocator/lib.rs + +diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn +new file mode 100644 +index 0000000000000..06aa47f097c9c +--- /dev/null ++++ b/build/rust/allocator/BUILD.gn +@@ -0,0 +1,90 @@ ++# Copyright 2025 The Chromium Authors ++# Use of this source code is governed by a BSD-style license that can be ++# found in the LICENSE file. ++ ++import("//build/buildflag_header.gni") ++import("//build/config/rust.gni") ++import("//build/rust/rust_static_library.gni") ++ ++rust_allocator_uses_partition_alloc = false ++if (build_with_chromium) { ++ import("//base/allocator/partition_allocator/partition_alloc.gni") ++ rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc ++} ++ ++buildflag_header("buildflags") { ++ header = "buildflags.h" ++ flags = [ ++ "RUST_ALLOCATOR_USES_PARTITION_ALLOC=$rust_allocator_uses_partition_alloc", ++ ] ++ visibility = [ ":*" ] ++} ++ ++if (toolchain_has_rust) { ++ # All targets which depend on Rust code but are not linked by rustc must ++ # depend on this. Usually, this dependency will come from the rust_target() GN ++ # template. However, cargo_crate() does *not* include this dependency so any ++ # C++ targets which directly depend on a cargo_crate() must depend on this. ++ rust_static_library("allocator") { ++ sources = [ "lib.rs" ] ++ crate_root = "lib.rs" ++ cxx_bindings = [ "lib.rs" ] ++ ++ deps = [ ++ ":allocator_impls", ++ ":allocator_shim_definitions", ++ ] ++ ++ no_chromium_prelude = true ++ no_allocator_crate = true ++ allow_unsafe = true ++ } ++ ++ static_library("allocator_impls") { ++ public_deps = [] ++ if (rust_allocator_uses_partition_alloc) { ++ public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] ++ } ++ ++ sources = [ ++ "allocator_impls.cc", ++ "allocator_impls.h", ++ ] ++ ++ deps = [ ++ ":allocator_cpp_shared", ++ ":buildflags", ++ ++ # TODO(crbug.com/408221149): remove the C++ -> Rust dependency for the ++ # default allocator. ++ "//build/rust/std", ++ ] ++ ++ visibility = [ ":*" ] ++ } ++ ++ source_set("allocator_shim_definitions") { ++ sources = [ "allocator_shim_definitions.cc" ] ++ ++ deps = [ ":allocator_cpp_shared" ] ++ ++ visibility = [ ":*" ] ++ } ++ ++ source_set("allocator_cpp_shared") { ++ sources = [ ++ # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been ++ # copied from `//base`. ++ # TODO(crbug.com/40279749): Avoid duplication / reuse code. ++ "alias.cc", ++ "alias.h", ++ "compiler_specific.h", ++ "immediate_crash.h", ++ ] ++ ++ visibility = [ ++ ":allocator_impls", ++ ":allocator_shim_definitions", ++ ] ++ } ++} +diff --git a/build/rust/std/alias.cc b/build/rust/allocator/alias.cc +similarity index 87% +rename from build/rust/std/alias.cc +rename to build/rust/allocator/alias.cc +index 42febac3ed1fc..ca20986f8ed49 100644 +--- a/build/rust/std/alias.cc ++++ b/build/rust/allocator/alias.cc +@@ -7,9 +7,9 @@ + // + // TODO(crbug.com/40279749): Avoid code duplication / reuse code. + +-#include "build/rust/std/alias.h" ++#include "build/rust/allocator/alias.h" + +-#include "build/rust/std/compiler_specific.h" ++#include "build/rust/allocator/compiler_specific.h" + + namespace build_rust_std { + namespace debug { +diff --git a/build/rust/std/alias.h b/build/rust/allocator/alias.h +similarity index 91% +rename from build/rust/std/alias.h +rename to build/rust/allocator/alias.h +index 0eaba6766148f..80995ecfb045e 100644 +--- a/build/rust/std/alias.h ++++ b/build/rust/allocator/alias.h +@@ -8,8 +8,8 @@ + // + // TODO(crbug.com/40279749): Avoid code duplication / reuse code. + +-#ifndef BUILD_RUST_STD_ALIAS_H_ +-#define BUILD_RUST_STD_ALIAS_H_ ++#ifndef BUILD_RUST_ALLOCATOR_ALIAS_H_ ++#define BUILD_RUST_ALLOCATOR_ALIAS_H_ + + #include + +@@ -34,4 +34,4 @@ void Alias(const void* var); + const int line_number = __LINE__; \ + build_rust_std::debug::Alias(&line_number) + +-#endif // BUILD_RUST_STD_ALIAS_H_ ++#endif // BUILD_RUST_ALLOCATOR_ALIAS_H_ +diff --git a/build/rust/std/remap_alloc.cc b/build/rust/allocator/allocator_impls.cc +similarity index 67% +rename from build/rust/std/remap_alloc.cc +rename to build/rust/allocator/allocator_impls.cc +index a443b11ec513d..1fde98f23cd12 100644 +--- a/build/rust/std/remap_alloc.cc ++++ b/build/rust/allocator/allocator_impls.cc +@@ -2,6 +2,8 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + ++#include "build/rust/allocator/allocator_impls.h" ++ + #ifdef UNSAFE_BUFFERS_BUILD + // TODO(crbug.com/390223051): Remove C-library calls to fix the errors. + #pragma allow_unsafe_libc_calls +@@ -11,9 +13,9 @@ + #include + + #include "build/build_config.h" +-#include "build/rust/std/alias.h" +-#include "build/rust/std/buildflags.h" +-#include "build/rust/std/immediate_crash.h" ++#include "build/rust/allocator/alias.h" ++#include "build/rust/allocator/buildflags.h" ++#include "build/rust/allocator/immediate_crash.h" + + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) + #include "partition_alloc/partition_alloc_constants.h" // nogncheck +@@ -22,6 +24,11 @@ + #include + #endif + ++// NOTE: this documentation is outdated. ++// ++// TODO(crbug.com/408221149): update this documentation, or replace it with docs ++// in the Rust allocator implementation. ++// + // When linking a final binary, rustc has to pick between either: + // * The default Rust allocator + // * Any #[global_allocator] defined in *any rlib in its dependency tree* +@@ -87,19 +94,6 @@ + // enabling it breaks Win32 APIs like CreateProcess: + // https://issues.chromium.org/u/1/issues/368070343#comment29 + +-extern "C" { +- +-#ifdef COMPONENT_BUILD +-#if BUILDFLAG(IS_WIN) +-#define REMAP_ALLOC_ATTRIBUTES __declspec(dllexport) __attribute__((weak)) +-#else +-#define REMAP_ALLOC_ATTRIBUTES \ +- __attribute__((visibility("default"))) __attribute__((weak)) +-#endif +-#else +-#define REMAP_ALLOC_ATTRIBUTES __attribute__((weak)) +-#endif // COMPONENT_BUILD +- + #if !BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) && BUILDFLAG(IS_WIN) && \ + defined(ADDRESS_SANITIZER) + #define USE_WIN_ALIGNED_MALLOC 1 +@@ -107,17 +101,19 @@ extern "C" { + #define USE_WIN_ALIGNED_MALLOC 0 + #endif + +-// This must exist as the stdlib depends on it to prove that we know the +-// alloc shims below are unstable. In the future we may be required to replace +-// them with a #[global_allocator] crate (see file comment above for more). +-// +-// Marked as weak as when Rust drives linking it includes this symbol itself, +-// and we don't want a collision due to C++ being in the same link target, where +-// C++ causes us to explicitly link in the stdlib and this symbol here. +-[[maybe_unused]] +-__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; ++// The default allocator functions provided by the Rust standard library. ++extern "C" void* __rdl_alloc(size_t size, size_t align); ++extern "C" void __rdl_dealloc(void* p, size_t size, size_t align); ++extern "C" void* __rdl_realloc(void* p, ++ size_t old_size, ++ size_t align, ++ size_t new_size); ++ ++extern "C" void* __rdl_alloc_zeroed(size_t size, size_t align); ++ ++namespace rust_allocator_internal { + +-REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { ++unsigned char* alloc(size_t size, size_t align) { + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) + // PartitionAlloc will crash if given an alignment larger than this. + if (align > partition_alloc::internal::kMaxSupportedAlignment) { +@@ -125,19 +121,19 @@ REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { + } + + if (align <= alignof(std::max_align_t)) { +- return allocator_shim::UncheckedAlloc(size); ++ return static_cast(allocator_shim::UncheckedAlloc(size)); + } else { +- return allocator_shim::UncheckedAlignedAlloc(size, align); ++ return static_cast( ++ allocator_shim::UncheckedAlignedAlloc(size, align)); + } + #elif USE_WIN_ALIGNED_MALLOC +- return _aligned_malloc(size, align); ++ return static_cast(_aligned_malloc(size, align)); + #else +- extern void* __rdl_alloc(size_t size, size_t align); +- return __rdl_alloc(size, align); ++ return static_cast(__rdl_alloc(size, align)); + #endif + } + +-REMAP_ALLOC_ATTRIBUTES void __rust_dealloc(void* p, size_t size, size_t align) { ++void dealloc(unsigned char* p, size_t size, size_t align) { + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) + if (align <= alignof(std::max_align_t)) { + allocator_shim::UncheckedFree(p); +@@ -147,54 +143,44 @@ REMAP_ALLOC_ATTRIBUTES void __rust_dealloc(void* p, size_t size, size_t align) { + #elif USE_WIN_ALIGNED_MALLOC + return _aligned_free(p); + #else +- extern void __rdl_dealloc(void* p, size_t size, size_t align); + __rdl_dealloc(p, size, align); + #endif + } + +-REMAP_ALLOC_ATTRIBUTES void* __rust_realloc(void* p, +- size_t old_size, +- size_t align, +- size_t new_size) { ++unsigned char* realloc(unsigned char* p, ++ size_t old_size, ++ size_t align, ++ size_t new_size) { + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) + if (align <= alignof(std::max_align_t)) { +- return allocator_shim::UncheckedRealloc(p, new_size); ++ return static_cast( ++ allocator_shim::UncheckedRealloc(p, new_size)); + } else { +- return allocator_shim::UncheckedAlignedRealloc(p, new_size, align); ++ return static_cast( ++ allocator_shim::UncheckedAlignedRealloc(p, new_size, align)); + } + #elif USE_WIN_ALIGNED_MALLOC +- return _aligned_realloc(p, new_size, align); ++ return static_cast(_aligned_realloc(p, new_size, align)); + #else +- extern void* __rdl_realloc(void* p, size_t old_size, size_t align, +- size_t new_size); +- return __rdl_realloc(p, old_size, align, new_size); ++ return static_cast( ++ __rdl_realloc(p, old_size, align, new_size)); + #endif + } + +-REMAP_ALLOC_ATTRIBUTES void* __rust_alloc_zeroed(size_t size, size_t align) { ++unsigned char* alloc_zeroed(size_t size, size_t align) { + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) || USE_WIN_ALIGNED_MALLOC + // TODO(danakj): When RUST_ALLOCATOR_USES_PARTITION_ALLOC is true, it's + // possible that a partition_alloc::UncheckedAllocZeroed() call would perform + // better than partition_alloc::UncheckedAlloc() + memset. But there is no + // such API today. See b/342251590. +- void* p = __rust_alloc(size, align); ++ unsigned char* p = alloc(size, align); + if (p) { + memset(p, 0, size); + } + return p; + #else +- extern void* __rdl_alloc_zeroed(size_t size, size_t align); +- return __rdl_alloc_zeroed(size, align); ++ return static_cast(__rdl_alloc_zeroed(size, align)); + #endif + } + +-REMAP_ALLOC_ATTRIBUTES void __rust_alloc_error_handler(size_t size, +- size_t align) { +- NO_CODE_FOLDING(); +- IMMEDIATE_CRASH(); +-} +- +-REMAP_ALLOC_ATTRIBUTES extern const unsigned char +- __rust_alloc_error_handler_should_panic = 0; +- +-} // extern "C" ++} // namespace rust_allocator_internal +diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h +new file mode 100644 +index 0000000000000..afb335412faf9 +--- /dev/null ++++ b/build/rust/allocator/allocator_impls.h +@@ -0,0 +1,25 @@ ++// Copyright 2025 The Chromium Authors ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++#ifndef BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ ++#define BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ ++ ++#include ++ ++#include "build/build_config.h" ++#include "build/rust/allocator/buildflags.h" ++ ++namespace rust_allocator_internal { ++ ++unsigned char* alloc(size_t size, size_t align); ++void dealloc(unsigned char* p, size_t size, size_t align); ++unsigned char* realloc(unsigned char* p, ++ size_t old_size, ++ size_t align, ++ size_t new_size); ++unsigned char* alloc_zeroed(size_t size, size_t align); ++ ++} // namespace rust_allocator_internal ++ ++#endif // BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ +diff --git a/build/rust/allocator/allocator_shim_definitions.cc b/build/rust/allocator/allocator_shim_definitions.cc +new file mode 100644 +index 0000000000000..a4d1bd77b7016 +--- /dev/null ++++ b/build/rust/allocator/allocator_shim_definitions.cc +@@ -0,0 +1,30 @@ ++// Copyright 2025 The Chromium Authors ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++#include ++ ++#include "build/rust/allocator/alias.h" ++#include "build/rust/allocator/immediate_crash.h" ++ ++extern "C" { ++ ++// As part of rustc's contract for using `#[global_allocator]` without ++// rustc-generated shims we must define this symbol, since we are opting in to ++// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 ++// ++// Mark it weak since rustc will generate it when it drives linking. ++[[maybe_unused]] ++__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; ++ ++__attribute__((weak)) void __rust_alloc_error_handler(size_t size, ++ size_t align) { ++ NO_CODE_FOLDING(); ++ IMMEDIATE_CRASH(); ++} ++ ++__attribute__(( ++ weak)) extern const unsigned char __rust_alloc_error_handler_should_panic = ++ 0; ++ ++} // extern "C" +diff --git a/build/rust/std/compiler_specific.h b/build/rust/allocator/compiler_specific.h +similarity index 87% +rename from build/rust/std/compiler_specific.h +rename to build/rust/allocator/compiler_specific.h +index ea79a7a8dc284..f9079679a3e9a 100644 +--- a/build/rust/std/compiler_specific.h ++++ b/build/rust/allocator/compiler_specific.h +@@ -7,8 +7,8 @@ + // + // TODO(crbug.com/40279749): Avoid code duplication / reuse code. + +-#ifndef BUILD_RUST_STD_COMPILER_SPECIFIC_H_ +-#define BUILD_RUST_STD_COMPILER_SPECIFIC_H_ ++#ifndef BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ ++#define BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ + + #include "build/build_config.h" + +@@ -35,4 +35,4 @@ + #define NOINLINE + #endif + +-#endif // BUILD_RUST_STD_COMPILER_SPECIFIC_H_ ++#endif // BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ +diff --git a/build/rust/std/immediate_crash.h b/build/rust/allocator/immediate_crash.h +similarity index 97% +rename from build/rust/std/immediate_crash.h +rename to build/rust/allocator/immediate_crash.h +index e4fd5a09d9379..9cbf9fd65f3e0 100644 +--- a/build/rust/std/immediate_crash.h ++++ b/build/rust/allocator/immediate_crash.h +@@ -5,8 +5,8 @@ + // This file has been copied from //base/immediate_crash.h. + // TODO(crbug.com/40279749): Avoid code duplication / reuse code. + +-#ifndef BUILD_RUST_STD_IMMEDIATE_CRASH_H_ +-#define BUILD_RUST_STD_IMMEDIATE_CRASH_H_ ++#ifndef BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ ++#define BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ + + #include "build/build_config.h" + +@@ -168,4 +168,4 @@ + + #endif // defined(__clang__) || defined(COMPILER_GCC) + +-#endif // BUILD_RUST_STD_IMMEDIATE_CRASH_H_ ++#endif // BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ +diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs +new file mode 100644 +index 0000000000000..7f4a0fc245694 +--- /dev/null ++++ b/build/rust/allocator/lib.rs +@@ -0,0 +1,48 @@ ++// Copyright 2025 The Chromium Authors ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++//! Define the allocator that Rust code in Chrome should use. ++//! ++//! Any final artifact that depends on this crate, even transitively, will use ++//! the allocator defined here. Currently this is a thin wrapper around ++//! allocator_impls.cc's functions; see the documentation there. ++ ++use std::alloc::{GlobalAlloc, Layout}; ++ ++struct Allocator; ++ ++unsafe impl GlobalAlloc for Allocator { ++ unsafe fn alloc(&self, layout: Layout) -> *mut u8 { ++ unsafe { ffi::alloc(layout.size(), layout.align()) } ++ } ++ ++ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { ++ unsafe { ++ ffi::dealloc(ptr, layout.size(), layout.align()); ++ } ++ } ++ ++ unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { ++ unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } ++ } ++ ++ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { ++ unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } ++ } ++} ++ ++#[global_allocator] ++static GLOBAL: Allocator = Allocator; ++ ++#[cxx::bridge(namespace = "rust_allocator_internal")] ++mod ffi { ++ extern "C++" { ++ include!("build/rust/allocator/allocator_impls.h"); ++ ++ unsafe fn alloc(size: usize, align: usize) -> *mut u8; ++ unsafe fn dealloc(p: *mut u8, size: usize, align: usize); ++ unsafe fn realloc(p: *mut u8, old_size: usize, align: usize, new_size: usize) -> *mut u8; ++ unsafe fn alloc_zeroed(size: usize, align: usize) -> *mut u8; ++ } ++} +diff --git a/build/rust/cargo_crate.gni b/build/rust/cargo_crate.gni +index 6d11c538bf4d5..d9912722b4ecd 100644 +--- a/build/rust/cargo_crate.gni ++++ b/build/rust/cargo_crate.gni +@@ -259,6 +259,12 @@ template("cargo_crate") { + # Don't import the `chromium` crate into third-party code. + no_chromium_prelude = true + ++ # Don't depend on the chrome-specific #[global_allocator] crate from ++ # third-party code. This avoids some dependency cycle issues. The allocator ++ # crate will still be used if it exists anywhere in the dependency graph for ++ # a given linked artifact. ++ no_allocator_crate = true ++ + rustc_metadata = _rustc_metadata + + # TODO(crbug.com/40259764): don't default to true. This requires changes to +@@ -483,6 +489,9 @@ template("cargo_crate") { + # Don't import the `chromium` crate into third-party code. + no_chromium_prelude = true + ++ # Build scripts do not need to link to chrome's allocator. ++ no_allocator_crate = true ++ + # The ${_build_script_name}_output target looks for the exe in this + # location. Due to how the Windows component build works, this has to + # be $root_out_dir for all EXEs. In component build, C++ links to the +diff --git a/build/rust/rust_macro.gni b/build/rust/rust_macro.gni +index bcbb30ed44111..41d857632ccdc 100644 +--- a/build/rust/rust_macro.gni ++++ b/build/rust/rust_macro.gni +@@ -16,6 +16,9 @@ template("rust_macro") { + forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) + proc_macro_configs = invoker.configs + target_type = "rust_proc_macro" ++ ++ # Macros are loaded by rustc and shouldn't use chrome's allocation routines. ++ no_allocator_crate = true + } + } + +diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni +index 1a2f96337d436..1003a7b678352 100644 +--- a/build/rust/rust_target.gni ++++ b/build/rust/rust_target.gni +@@ -339,6 +339,10 @@ template("rust_target") { + _rust_deps += [ "//build/rust/std" ] + } + ++ if (!defined(invoker.no_allocator_crate) || !invoker.no_allocator_crate) { ++ _rust_deps += [ "//build/rust/allocator" ] ++ } ++ + if (_build_unit_tests) { + _unit_test_target = "${_target_name}_unittests" + if (defined(invoker.unit_test_target)) { +diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn +index 6b996aa1fe386..25db126076b2f 100644 +--- a/build/rust/std/BUILD.gn ++++ b/build/rust/std/BUILD.gn +@@ -15,51 +15,12 @@ + # allocator functions to PartitionAlloc when `use_partition_alloc_as_malloc` is + # true, so that Rust and C++ use the same allocator backend. + +-import("//build/buildflag_header.gni") + import("//build/config/compiler/compiler.gni") + import("//build/config/coverage/coverage.gni") + import("//build/config/rust.gni") + import("//build/config/sanitizers/sanitizers.gni") + +-rust_allocator_uses_partition_alloc = false +-if (build_with_chromium) { +- import("//base/allocator/partition_allocator/partition_alloc.gni") +- rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc +-} +- +-buildflag_header("buildflags") { +- header = "buildflags.h" +- flags = [ +- "RUST_ALLOCATOR_USES_PARTITION_ALLOC=$rust_allocator_uses_partition_alloc", +- ] +- visibility = [ ":*" ] +-} +- + if (toolchain_has_rust) { +- # If clang performs the link step, we need to provide the allocator symbols +- # that are normally injected by rustc during linking. +- # +- # We also "happen to" use this to redirect allocations to PartitionAlloc, +- # though that would be better done through a #[global_allocator] crate (see +- # above). +- source_set("remap_alloc") { +- public_deps = [] +- if (rust_allocator_uses_partition_alloc) { +- public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] +- } +- deps = [ ":buildflags" ] +- sources = [ +- # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been +- # copied from `//base`. +- # TODO(crbug.com/40279749): Avoid duplication / reuse code. +- "alias.cc", +- "alias.h", +- "compiler_specific.h", +- "immediate_crash.h", +- "remap_alloc.cc", +- ] +- } +- + # List of Rust stdlib rlibs which are present in the official Rust toolchain + # we are using from the Android team. This is usually a version or two behind + # nightly. Generally this matches the toolchain we build ourselves, but if +@@ -269,8 +230,6 @@ if (toolchain_has_rust) { + foreach(libname, stdlib_files + skip_stdlib_files) { + deps += [ "rules:$libname" ] + } +- +- public_deps = [ ":remap_alloc" ] + } + } else { + action("find_stdlib") { +diff --git a/components/cronet/android/dependencies.txt b/components/cronet/android/dependencies.txt +index bf56bc45ed41f..c0e41ef7c6766 100644 +--- a/components/cronet/android/dependencies.txt ++++ b/components/cronet/android/dependencies.txt +@@ -14,6 +14,7 @@ + //build/config + //build/config/compiler + //build/rust ++//build/rust/allocator + //build/rust/chromium_prelude + //build/rust/std + //build/rust/std/rules +diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn +index 007fdff16e92e..00da4fa484998 100644 +--- a/third_party/breakpad/BUILD.gn ++++ b/third_party/breakpad/BUILD.gn +@@ -495,7 +495,10 @@ if (is_mac) { + defines = [ "HAVE_MACH_O_NLIST_H" ] + + # Rust demangle support. +- deps = [ "//third_party/rust/rustc_demangle_capi/v0_1:lib" ] ++ deps = [ ++ "//build/rust/allocator", ++ "//third_party/rust/rustc_demangle_capi/v0_1:lib", ++ ] + defines += [ "HAVE_RUSTC_DEMANGLE" ] + include_dirs += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include" ] + sources += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include/rustc_demangle.h" ] +@@ -743,7 +746,10 @@ if (is_linux || is_chromeos || is_android) { + include_dirs = [ "breakpad/src" ] + + # Rust demangle support. +- deps = [ "//third_party/rust/rustc_demangle_capi/v0_1:lib" ] ++ deps = [ ++ "//build/rust/allocator", ++ "//third_party/rust/rustc_demangle_capi/v0_1:lib", ++ ] + defines += [ "HAVE_RUSTC_DEMANGLE" ] + include_dirs += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include" ] + sources += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include/rustc_demangle.h" ] diff --git a/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch b/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch new file mode 100644 index 0000000..12b3aaa --- /dev/null +++ b/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch @@ -0,0 +1,319 @@ +From 5032162442c5f2f3093cd7646f3a06f826d7f7a8 Mon Sep 17 00:00:00 2001 +From: Collin Baker +Date: Mon, 7 Apr 2025 12:48:17 -0700 +Subject: [PATCH] Call Rust default allocator directly from Rust +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The Chromium `#[global_allocator] crate forwarded calls to the C++ +implementation, which in turn called into the Rust standard library +implementations in some build configurations. + +This Rust -> C++ -> Rust round trip is unnecessary, and the references +to these symbols is blocking a toolchain update: upstream, these +symbol names are now mangled. + +Instead, use Rust conditional compilation to choose between the +Chromium and the libstd-provided allocators. + +Additionally, the remaining internal symbols defined in C++ are moved +to Rust. + +Bug: 408221149, 407024458 +Change-Id: I78f8c90d51a36a73099aa7d333091d7b8aded3c0 + +Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel +Change-Id: I78f8c90d51a36a73099aa7d333091d7b8aded3c0 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6434355 +Reviewed-by: Łukasz Anforowicz +Commit-Queue: Collin Baker +Cr-Commit-Position: refs/heads/main@{#1443703} +--- + build/rust/allocator/BUILD.gn | 54 +++++++------------ + build/rust/allocator/allocator_impls.cc | 28 +++++----- + build/rust/allocator/allocator_impls.h | 2 + + .../allocator/allocator_shim_definitions.cc | 30 ----------- + build/rust/allocator/lib.rs | 38 +++++++++++++ + 5 files changed, 73 insertions(+), 79 deletions(-) + delete mode 100644 build/rust/allocator/allocator_shim_definitions.cc + +diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn +index 06aa47f097c9c..f09314afc8158 100644 +--- a/build/rust/allocator/BUILD.gn ++++ b/build/rust/allocator/BUILD.gn +@@ -12,6 +12,9 @@ if (build_with_chromium) { + rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc + } + ++use_cpp_allocator_impls = ++ rust_allocator_uses_partition_alloc || (is_win && is_asan) ++ + buildflag_header("buildflags") { + header = "buildflags.h" + flags = [ +@@ -30,61 +33,44 @@ if (toolchain_has_rust) { + crate_root = "lib.rs" + cxx_bindings = [ "lib.rs" ] + +- deps = [ +- ":allocator_impls", +- ":allocator_shim_definitions", +- ] ++ deps = [ ":allocator_impls" ] + + no_chromium_prelude = true + no_allocator_crate = true + allow_unsafe = true ++ ++ if (use_cpp_allocator_impls) { ++ rustflags = [ ++ "--cfg", ++ "use_cpp_allocator_impls", ++ ] ++ } ++ ++ configs -= [ "//build/config/compiler:disallow_unstable_features" ] + } + ++ # TODO(crbug.com/408221149): don't build this when `use_cpp_allocator_impls` ++ # is false. + static_library("allocator_impls") { + public_deps = [] + if (rust_allocator_uses_partition_alloc) { + public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] + } + +- sources = [ +- "allocator_impls.cc", +- "allocator_impls.h", +- ] +- +- deps = [ +- ":allocator_cpp_shared", +- ":buildflags", +- +- # TODO(crbug.com/408221149): remove the C++ -> Rust dependency for the +- # default allocator. +- "//build/rust/std", +- ] +- +- visibility = [ ":*" ] +- } +- +- source_set("allocator_shim_definitions") { +- sources = [ "allocator_shim_definitions.cc" ] +- +- deps = [ ":allocator_cpp_shared" ] +- +- visibility = [ ":*" ] +- } +- +- source_set("allocator_cpp_shared") { + sources = [ + # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been + # copied from `//base`. + # TODO(crbug.com/40279749): Avoid duplication / reuse code. + "alias.cc", + "alias.h", ++ "allocator_impls.cc", ++ "allocator_impls.h", + "compiler_specific.h", + "immediate_crash.h", + ] + +- visibility = [ +- ":allocator_impls", +- ":allocator_shim_definitions", +- ] ++ deps = [ ":buildflags" ] ++ ++ visibility = [ ":*" ] + } + } +diff --git a/build/rust/allocator/allocator_impls.cc b/build/rust/allocator/allocator_impls.cc +index 1fde98f23cd12..bf3c2a301adf5 100644 +--- a/build/rust/allocator/allocator_impls.cc ++++ b/build/rust/allocator/allocator_impls.cc +@@ -101,16 +101,6 @@ + #define USE_WIN_ALIGNED_MALLOC 0 + #endif + +-// The default allocator functions provided by the Rust standard library. +-extern "C" void* __rdl_alloc(size_t size, size_t align); +-extern "C" void __rdl_dealloc(void* p, size_t size, size_t align); +-extern "C" void* __rdl_realloc(void* p, +- size_t old_size, +- size_t align, +- size_t new_size); +- +-extern "C" void* __rdl_alloc_zeroed(size_t size, size_t align); +- + namespace rust_allocator_internal { + + unsigned char* alloc(size_t size, size_t align) { +@@ -129,7 +119,8 @@ unsigned char* alloc(size_t size, size_t align) { + #elif USE_WIN_ALIGNED_MALLOC + return static_cast(_aligned_malloc(size, align)); + #else +- return static_cast(__rdl_alloc(size, align)); ++ // TODO(crbug.com/408221149): don't build this file in this case. ++ IMMEDIATE_CRASH(); + #endif + } + +@@ -143,7 +134,8 @@ void dealloc(unsigned char* p, size_t size, size_t align) { + #elif USE_WIN_ALIGNED_MALLOC + return _aligned_free(p); + #else +- __rdl_dealloc(p, size, align); ++ // TODO(crbug.com/408221149): don't build this file in this case. ++ IMMEDIATE_CRASH(); + #endif + } + +@@ -162,8 +154,8 @@ unsigned char* realloc(unsigned char* p, + #elif USE_WIN_ALIGNED_MALLOC + return static_cast(_aligned_realloc(p, new_size, align)); + #else +- return static_cast( +- __rdl_realloc(p, old_size, align, new_size)); ++ // TODO(crbug.com/408221149): don't build this file in this case. ++ IMMEDIATE_CRASH(); + #endif + } + +@@ -179,8 +171,14 @@ unsigned char* alloc_zeroed(size_t size, size_t align) { + } + return p; + #else +- return static_cast(__rdl_alloc_zeroed(size, align)); ++ // TODO(crbug.com/408221149): don't build this file in this case. ++ IMMEDIATE_CRASH(); + #endif + } + ++void crash_immediately() { ++ NO_CODE_FOLDING(); ++ IMMEDIATE_CRASH(); ++} ++ + } // namespace rust_allocator_internal +diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h +index afb335412faf9..e90ab7cd422c1 100644 +--- a/build/rust/allocator/allocator_impls.h ++++ b/build/rust/allocator/allocator_impls.h +@@ -20,6 +20,8 @@ unsigned char* realloc(unsigned char* p, + size_t new_size); + unsigned char* alloc_zeroed(size_t size, size_t align); + ++void crash_immediately(); ++ + } // namespace rust_allocator_internal + + #endif // BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ +diff --git a/build/rust/allocator/allocator_shim_definitions.cc b/build/rust/allocator/allocator_shim_definitions.cc +deleted file mode 100644 +index a4d1bd77b7016..0000000000000 +--- a/build/rust/allocator/allocator_shim_definitions.cc ++++ /dev/null +@@ -1,30 +0,0 @@ +-// Copyright 2025 The Chromium Authors +-// Use of this source code is governed by a BSD-style license that can be +-// found in the LICENSE file. +- +-#include +- +-#include "build/rust/allocator/alias.h" +-#include "build/rust/allocator/immediate_crash.h" +- +-extern "C" { +- +-// As part of rustc's contract for using `#[global_allocator]` without +-// rustc-generated shims we must define this symbol, since we are opting in to +-// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 +-// +-// Mark it weak since rustc will generate it when it drives linking. +-[[maybe_unused]] +-__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; +- +-__attribute__((weak)) void __rust_alloc_error_handler(size_t size, +- size_t align) { +- NO_CODE_FOLDING(); +- IMMEDIATE_CRASH(); +-} +- +-__attribute__(( +- weak)) extern const unsigned char __rust_alloc_error_handler_should_panic = +- 0; +- +-} // extern "C" +diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs +index 7f4a0fc245694..b8b67d9c6c649 100644 +--- a/build/rust/allocator/lib.rs ++++ b/build/rust/allocator/lib.rs +@@ -8,10 +8,20 @@ + //! the allocator defined here. Currently this is a thin wrapper around + //! allocator_impls.cc's functions; see the documentation there. + ++// Required to apply weak linkage to symbols. ++#![feature(linkage)] ++// Required to apply `#[rustc_std_internal_symbol]` to our alloc error handler ++// so the name is correctly mangled as rustc expects. ++#![cfg_attr(mangle_alloc_error_handler, allow(internal_features))] ++#![cfg_attr(mangle_alloc_error_handler, feature(rustc_attrs))] ++ ++#[cfg(use_cpp_allocator_impls)] + use std::alloc::{GlobalAlloc, Layout}; + ++#[cfg(use_cpp_allocator_impls)] + struct Allocator; + ++#[cfg(use_cpp_allocator_impls)] + unsafe impl GlobalAlloc for Allocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + unsafe { ffi::alloc(layout.size(), layout.align()) } +@@ -32,9 +42,36 @@ unsafe impl GlobalAlloc for Allocator { + } + } + ++#[cfg(use_cpp_allocator_impls)] + #[global_allocator] + static GLOBAL: Allocator = Allocator; + ++#[cfg(not(use_cpp_allocator_impls))] ++#[global_allocator] ++static GLOBAL: std::alloc::System = std::alloc::System; ++ ++// As part of rustc's contract for using `#[global_allocator]` without ++// rustc-generated shims we must define this symbol, since we are opting in to ++// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 ++#[no_mangle] ++#[linkage = "weak"] ++static __rust_no_alloc_shim_is_unstable: u8 = 0; ++ ++#[no_mangle] ++#[linkage = "weak"] ++static __rust_alloc_error_handler_should_panic: u8 = 0; ++ ++// Mangle the symbol name as rustc expects. ++#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] ++#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] ++#[linkage = "weak"] ++fn __rust_alloc_error_handler(_size: usize, _align: usize) { ++ unsafe { ffi::crash_immediately() } ++} ++ ++// TODO(crbug.com/408221149): conditionally include the FFI glue based on ++// `use_cpp_allocator_impls` ++#[allow(dead_code)] + #[cxx::bridge(namespace = "rust_allocator_internal")] + mod ffi { + extern "C++" { +@@ -44,5 +81,6 @@ mod ffi { + unsafe fn dealloc(p: *mut u8, size: usize, align: usize); + unsafe fn realloc(p: *mut u8, old_size: usize, align: usize, new_size: usize) -> *mut u8; + unsafe fn alloc_zeroed(size: usize, align: usize) -> *mut u8; ++ unsafe fn crash_immediately(); + } + } diff --git a/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch b/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch new file mode 100644 index 0000000..1cfa07f --- /dev/null +++ b/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch @@ -0,0 +1,102 @@ +reduced -lnl + +From e201e2d467b0daad6cdbbfcd5b0e34760e4099c1 Mon Sep 17 00:00:00 2001 +From: Alan Zhao +Date: Mon, 7 Apr 2025 18:15:01 -0700 +Subject: [PATCH] Roll rust *only* f7b43542838f0a4a6cfdb17fbeadf45002042a77-1 : + 3f690c2257b7080cd3a8cce64e082fc972148990-1 + +https://chromium.googlesource.com/external/github.com/rust-lang/rust/+log/f7b43542838f..3f690c2257b7 + +Ran: ./tools/clang/scripts/upload_revision.py 5b36835df010c5813808d34e45428c624fb52ff1 + +Additionally, add fixes to the rust allocator to address https://crbug.com/407024458. + +Bug: 404285928,407024458 +Disable-Rts: True +Cq-Include-Trybots: chromium/try:chromeos-amd64-generic-cfi-thin-lto-rel +Cq-Include-Trybots: chromium/try:dawn-win10-x86-deps-rel +Cq-Include-Trybots: chromium/try:linux-chromeos-dbg +Cq-Include-Trybots: chromium/try:linux_chromium_cfi_rel_ng +Cq-Include-Trybots: chromium/try:linux_chromium_chromeos_msan_rel_ng +Cq-Include-Trybots: chromium/try:linux_chromium_msan_rel_ng +Cq-Include-Trybots: chromium/try:mac11-arm64-rel,mac_chromium_asan_rel_ng +Cq-Include-Trybots: chromium/try:ios-catalyst,win-asan,android-official +Cq-Include-Trybots: chromium/try:fuchsia-arm64-cast-receiver-rel +Cq-Include-Trybots: chromium/try:mac-official,linux-official +Cq-Include-Trybots: chromium/try:win-official,win32-official +Cq-Include-Trybots: chromium/try:win-swangle-try-x86 +Cq-Include-Trybots: chromium/try:android-cronet-riscv64-dbg +Cq-Include-Trybots: chromium/try:android-cronet-riscv64-rel +Cq-Include-Trybots: chrome/try:iphone-device +Cq-Include-Trybots: chrome/try:linux-chromeos-chrome +Cq-Include-Trybots: chrome/try:win-chrome,win64-chrome,linux-chrome,mac-chrome +Cq-Include-Trybots: chrome/try:linux-pgo,mac-pgo,win32-pgo,win64-pgo +Cq-Include-Trybots: luci.chromium.try:linux-cast-x64-rel +Cq-Include-Trybots: chromium/try:android-rust-arm32-rel +Cq-Include-Trybots: chromium/try:android-rust-arm64-dbg +Cq-Include-Trybots: chromium/try:android-rust-arm64-rel +Cq-Include-Trybots: chromium/try:linux-rust-x64-dbg +Cq-Include-Trybots: chromium/try:linux-rust-x64-rel +Cq-Include-Trybots: chromium/try:mac-rust-x64-dbg +Cq-Include-Trybots: chromium/try:win-rust-x64-dbg +Cq-Include-Trybots: chromium/try:win-rust-x64-rel +Change-Id: Iec99681a89deaf3f2c79c76f9c4d1c2b2b7d6fe1 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6439711 +Reviewed-by: Collin Baker +Commit-Queue: Alan Zhao +Cr-Commit-Position: refs/heads/main@{#1443873} +--- + build/rust/allocator/BUILD.gn | 6 +- + build/rust/allocator/lib.rs | 6 +- + build/rust/std/rules/BUILD.gn | 476 +++++++++++++++++----------------- + tools/rust/update_rust.py | 2 +- + 4 files changed, 251 insertions(+), 239 deletions(-) + +diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn +index f09314afc8158..ca581630c76c9 100644 +--- a/build/rust/allocator/BUILD.gn ++++ b/build/rust/allocator/BUILD.gn +@@ -32,6 +32,10 @@ if (toolchain_has_rust) { + sources = [ "lib.rs" ] + crate_root = "lib.rs" + cxx_bindings = [ "lib.rs" ] ++ rustflags = [ ++ "--cfg", ++ "mangle_alloc_error_handler", ++ ] + + deps = [ ":allocator_impls" ] + +@@ -40,7 +44,7 @@ if (toolchain_has_rust) { + allow_unsafe = true + + if (use_cpp_allocator_impls) { +- rustflags = [ ++ rustflags += [ + "--cfg", + "use_cpp_allocator_impls", + ] +diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs +index b8b67d9c6c649..4e2dad3d542a8 100644 +--- a/build/rust/allocator/lib.rs ++++ b/build/rust/allocator/lib.rs +@@ -57,13 +57,17 @@ static GLOBAL: std::alloc::System = std::alloc::System; + #[linkage = "weak"] + static __rust_no_alloc_shim_is_unstable: u8 = 0; + +-#[no_mangle] ++// Mangle the symbol name as rustc expects. ++#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] ++#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] ++#[allow(non_upper_case_globals)] + #[linkage = "weak"] + static __rust_alloc_error_handler_should_panic: u8 = 0; + + // Mangle the symbol name as rustc expects. + #[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] + #[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] ++#[allow(non_upper_case_globals)] + #[linkage = "weak"] + fn __rust_alloc_error_handler(_size: usize, _align: usize) { + unsafe { ffi::crash_immediately() } diff --git a/backports/electron/0004-Drop-remap_alloc-dep.patch b/backports/electron/0004-Drop-remap_alloc-dep.patch new file mode 100644 index 0000000..c6762a4 --- /dev/null +++ b/backports/electron/0004-Drop-remap_alloc-dep.patch @@ -0,0 +1,44 @@ +From 4a0377f0b847af505915b0e0a6c4178d4e7c3244 Mon Sep 17 00:00:00 2001 +From: Matt Jolly +Date: Mon, 14 Apr 2025 20:16:46 -0700 +Subject: [PATCH] Drop `remap_alloc` dep +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +commit e3a1797dbab3eaa1c808d53215b32c8759d27ac7 dropped the source set +that this refers to, in favour of a more modern, crate-based solution. + +This seems to have been overlooked, possibly as it only appears to +be called if using the unbundle toolchain. + +Bug: 408221149 +Signed-off-by: Matt Jolly +Change-Id: I1703d8e1e456161aa2b736169eec407235847099 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6456604 +Reviewed-by: Andrew Grieve +Reviewed-by: Lei Zhang +Commit-Queue: Łukasz Anforowicz +Reviewed-by: Łukasz Anforowicz +Cr-Commit-Position: refs/heads/main@{#1446912} +--- + build/rust/std/BUILD.gn | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn +index 25db126076b2f..bb2c9884520b3 100644 +--- a/build/rust/std/BUILD.gn ++++ b/build/rust/std/BUILD.gn +@@ -355,12 +355,6 @@ if (toolchain_has_rust) { + ":stdlib_public_dependent_libs", + ] + deps = [ ":prebuilt_rustc_copy_to_sysroot" ] +- +- # The host builds tools toolchain supports Rust only and does not use +- # the allocator remapping to point it to PartitionAlloc. +- if (!toolchain_for_rust_host_build_tools) { +- deps += [ ":remap_alloc" ] +- } + } + } + } diff --git a/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch b/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch new file mode 100644 index 0000000..5ba4d83 --- /dev/null +++ b/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch @@ -0,0 +1,354 @@ +From e65cb388e5da56d1236607e0db9cadf89e50eded Mon Sep 17 00:00:00 2001 +From: Lukasz Anforowicz +Date: Tue, 15 Apr 2025 11:10:19 -0700 +Subject: [PATCH] [rust] Clean up `//build/rust/allocator` after a Rust + toolchain roll. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This CL makes minor tweaks and changes under `//build/rust/allocator`: + +* Thanks to the Rust toolchain roll, we no longer need to keep two + implementations, picking between them using the + `mangle_alloc_error_handler` configuration knob. +* The `#[cfg(use_cpp_allocator_impls)]` vs + `#[cfg(not(use_cpp_allocator_impls))]` choices have been deduplicated + by putting the related/conditional stuff under `mod cpp_allocator` and + `rust_allocator`. +* Closes a minor gap missed in https://crrev.com/c/6432410: + - Moving `DEPS` file to the new source location + +Bug: 408221149 +Change-Id: Id541797e03da113a5271b02a5f60eb2be08254a9 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6454872 +Reviewed-by: Alan Zhao +Commit-Queue: Łukasz Anforowicz +Cr-Commit-Position: refs/heads/main@{#1447241} +--- + build/rust/allocator/BUILD.gn | 11 +- + build/rust/{std => allocator}/DEPS | 2 +- + build/rust/allocator/allocator_impls.cc | 65 ++---------- + build/rust/allocator/allocator_impls.h | 2 + + build/rust/allocator/lib.rs | 132 +++++++++++++++--------- + 5 files changed, 97 insertions(+), 115 deletions(-) + rename build/rust/{std => allocator}/DEPS (76%) + +diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn +index ca581630c76c9..434a61e11bdbb 100644 +--- a/build/rust/allocator/BUILD.gn ++++ b/build/rust/allocator/BUILD.gn +@@ -32,10 +32,6 @@ if (toolchain_has_rust) { + sources = [ "lib.rs" ] + crate_root = "lib.rs" + cxx_bindings = [ "lib.rs" ] +- rustflags = [ +- "--cfg", +- "mangle_alloc_error_handler", +- ] + + deps = [ ":allocator_impls" ] + +@@ -43,13 +39,12 @@ if (toolchain_has_rust) { + no_allocator_crate = true + allow_unsafe = true + ++ rustflags = [] + if (use_cpp_allocator_impls) { +- rustflags += [ +- "--cfg", +- "use_cpp_allocator_impls", +- ] ++ rustflags += [ "--cfg=use_cpp_allocator_impls" ] + } + ++ # TODO(https://crbug.com/410596442): Stop using unstable features here. + configs -= [ "//build/config/compiler:disallow_unstable_features" ] + } + +diff --git a/build/rust/std/DEPS b/build/rust/allocator/DEPS +similarity index 76% +rename from build/rust/std/DEPS +rename to build/rust/allocator/DEPS +index eb524c0a06acd..923a2e07c80f4 100644 +--- a/build/rust/std/DEPS ++++ b/build/rust/allocator/DEPS +@@ -3,7 +3,7 @@ include_rules = [ + ] + + specific_include_rules = { +- "remap_alloc.cc" : [ ++ "allocator_impls.cc" : [ + "+partition_alloc" + ] + } +diff --git a/build/rust/allocator/allocator_impls.cc b/build/rust/allocator/allocator_impls.cc +index bf3c2a301adf5..8887752f3dfad 100644 +--- a/build/rust/allocator/allocator_impls.cc ++++ b/build/rust/allocator/allocator_impls.cc +@@ -24,62 +24,6 @@ + #include + #endif + +-// NOTE: this documentation is outdated. +-// +-// TODO(crbug.com/408221149): update this documentation, or replace it with docs +-// in the Rust allocator implementation. +-// +-// When linking a final binary, rustc has to pick between either: +-// * The default Rust allocator +-// * Any #[global_allocator] defined in *any rlib in its dependency tree* +-// (https://doc.rust-lang.org/edition-guide/rust-2018/platform-and-target-support/global-allocators.html) +-// +-// In this latter case, this fact will be recorded in some of the metadata +-// within the .rlib file. (An .rlib file is just a .a file, but does have +-// additional metadata for use by rustc. This is, as far as I know, the only +-// such metadata we would ideally care about.) +-// +-// In all the linked rlibs, +-// * If 0 crates define a #[global_allocator], rustc uses its default allocator +-// * If 1 crate defines a #[global_allocator], rustc uses that +-// * If >1 crates define a #[global_allocator], rustc bombs out. +-// +-// Because rustc does these checks, it doesn't just have the __rust_alloc +-// symbols defined anywhere (neither in the stdlib nor in any of these +-// crates which have a #[global_allocator] defined.) +-// +-// Instead: +-// Rust's final linking stage invokes dynamic LLVM codegen to create symbols +-// for the basic heap allocation operations. It literally creates a +-// __rust_alloc symbol at link time. Unless any crate has specified a +-// #[global_allocator], it simply calls from __rust_alloc into +-// __rdl_alloc, which is the default Rust allocator. The same applies to a +-// few other symbols. +-// +-// We're not (always) using rustc for final linking. For cases where we're not +-// Rustc as the final linker, we'll define those symbols here instead. This +-// allows us to redirect allocation to PartitionAlloc if clang is doing the +-// link. +-// +-// We use unchecked allocation paths in PartitionAlloc rather than going through +-// its shims in `malloc()` etc so that we can support fallible allocation paths +-// such as Vec::try_reserve without crashing on allocation failure. +-// +-// In future, we should build a crate with a #[global_allocator] and +-// redirect these symbols back to Rust in order to use to that crate instead. +-// This would allow Rust-linked executables to: +-// 1. Use PartitionAlloc on Windows. The stdlib uses Windows heap functions +-// directly that PartitionAlloc can not intercept. +-// 2. Have `Vec::try_reserve` to fail at runtime on Linux instead of crashing in +-// malloc() where PartitionAlloc replaces that function. +-// +-// They're weak symbols, because this file will sometimes end up in targets +-// which are linked by rustc, and thus we would otherwise get duplicate +-// definitions. The following definitions will therefore only end up being +-// used in targets which are linked by our C++ toolchain. +-// +-// # On Windows ASAN +-// + // In ASAN builds, PartitionAlloc-Everywhere is disabled, meaning malloc() and + // friends in C++ do not go to PartitionAlloc. So we also don't point the Rust + // allocation functions at PartitionAlloc. Generally, this means we just direct +@@ -93,7 +37,6 @@ + // Note that there is a runtime option to make ASAN hook HeapAlloc() but + // enabling it breaks Win32 APIs like CreateProcess: + // https://issues.chromium.org/u/1/issues/368070343#comment29 +- + #if !BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) && BUILDFLAG(IS_WIN) && \ + defined(ADDRESS_SANITIZER) + #define USE_WIN_ALIGNED_MALLOC 1 +@@ -110,6 +53,10 @@ unsigned char* alloc(size_t size, size_t align) { + return nullptr; + } + ++ // We use unchecked allocation paths in PartitionAlloc rather than going ++ // through its shims in `malloc()` etc so that we can support fallible ++ // allocation paths such as Vec::try_reserve without crashing on allocation ++ // failure. + if (align <= alignof(std::max_align_t)) { + return static_cast(allocator_shim::UncheckedAlloc(size)); + } else { +@@ -144,6 +91,10 @@ unsigned char* realloc(unsigned char* p, + size_t align, + size_t new_size) { + #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) ++ // We use unchecked allocation paths in PartitionAlloc rather than going ++ // through its shims in `malloc()` etc so that we can support fallible ++ // allocation paths such as Vec::try_reserve without crashing on allocation ++ // failure. + if (align <= alignof(std::max_align_t)) { + return static_cast( + allocator_shim::UncheckedRealloc(p, new_size)); +diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h +index e90ab7cd422c1..e562a877d886e 100644 +--- a/build/rust/allocator/allocator_impls.h ++++ b/build/rust/allocator/allocator_impls.h +@@ -10,6 +10,8 @@ + #include "build/build_config.h" + #include "build/rust/allocator/buildflags.h" + ++// This header exposes PartitionAlloc to Rust ++// (most APIs below are called from `impl GlobalAlloc` in `lib.rs`). + namespace rust_allocator_internal { + + unsigned char* alloc(size_t size, size_t align); +diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs +index 4e2dad3d542a8..a4f898f9b107f 100644 +--- a/build/rust/allocator/lib.rs ++++ b/build/rust/allocator/lib.rs +@@ -5,72 +5,106 @@ + //! Define the allocator that Rust code in Chrome should use. + //! + //! Any final artifact that depends on this crate, even transitively, will use +-//! the allocator defined here. Currently this is a thin wrapper around +-//! allocator_impls.cc's functions; see the documentation there. ++//! the allocator defined here. ++//! ++//! List of known issues: ++//! ++//! 1. We'd like to use PartitionAlloc on Windows, but the stdlib uses Windows ++//! heap functions directly that PartitionAlloc can not intercept. ++//! 2. We'd like `Vec::try_reserve` to fail at runtime on Linux instead of ++//! crashing in malloc() where PartitionAlloc replaces that function. + + // Required to apply weak linkage to symbols. ++// ++// TODO(https://crbug.com/410596442): Stop using unstable features here. ++// https://github.com/rust-lang/rust/issues/29603 tracks stabilization of the `linkage` feature. + #![feature(linkage)] + // Required to apply `#[rustc_std_internal_symbol]` to our alloc error handler + // so the name is correctly mangled as rustc expects. +-#![cfg_attr(mangle_alloc_error_handler, allow(internal_features))] +-#![cfg_attr(mangle_alloc_error_handler, feature(rustc_attrs))] ++// ++// TODO(https://crbug.com/410596442): Stop using internal features here. ++#![allow(internal_features)] ++#![feature(rustc_attrs)] + ++/// Module that provides `#[global_allocator]` / `GlobalAlloc` interface for ++/// using an allocator from C++. + #[cfg(use_cpp_allocator_impls)] +-use std::alloc::{GlobalAlloc, Layout}; ++mod cpp_allocator { ++ use super::ffi; ++ use std::alloc::{GlobalAlloc, Layout}; + +-#[cfg(use_cpp_allocator_impls)] +-struct Allocator; ++ struct Allocator; + +-#[cfg(use_cpp_allocator_impls)] +-unsafe impl GlobalAlloc for Allocator { +- unsafe fn alloc(&self, layout: Layout) -> *mut u8 { +- unsafe { ffi::alloc(layout.size(), layout.align()) } +- } ++ unsafe impl GlobalAlloc for Allocator { ++ unsafe fn alloc(&self, layout: Layout) -> *mut u8 { ++ unsafe { ffi::alloc(layout.size(), layout.align()) } ++ } + +- unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { +- unsafe { +- ffi::dealloc(ptr, layout.size(), layout.align()); ++ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { ++ unsafe { ++ ffi::dealloc(ptr, layout.size(), layout.align()); ++ } + } +- } + +- unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { +- unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } +- } ++ unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { ++ unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } ++ } + +- unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { +- unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } ++ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { ++ unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } ++ } + } +-} + +-#[cfg(use_cpp_allocator_impls)] +-#[global_allocator] +-static GLOBAL: Allocator = Allocator; ++ #[global_allocator] ++ static GLOBAL: Allocator = Allocator; ++} + ++/// Module that provides `#[global_allocator]` / `GlobalAlloc` interface for ++/// using the default Rust allocator. + #[cfg(not(use_cpp_allocator_impls))] +-#[global_allocator] +-static GLOBAL: std::alloc::System = std::alloc::System; +- +-// As part of rustc's contract for using `#[global_allocator]` without +-// rustc-generated shims we must define this symbol, since we are opting in to +-// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 +-#[no_mangle] +-#[linkage = "weak"] +-static __rust_no_alloc_shim_is_unstable: u8 = 0; +- +-// Mangle the symbol name as rustc expects. +-#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] +-#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] +-#[allow(non_upper_case_globals)] +-#[linkage = "weak"] +-static __rust_alloc_error_handler_should_panic: u8 = 0; +- +-// Mangle the symbol name as rustc expects. +-#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] +-#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] +-#[allow(non_upper_case_globals)] +-#[linkage = "weak"] +-fn __rust_alloc_error_handler(_size: usize, _align: usize) { +- unsafe { ffi::crash_immediately() } ++mod rust_allocator { ++ #[global_allocator] ++ static GLOBAL: std::alloc::System = std::alloc::System; ++} ++ ++/// Module that provides global symbols that are needed both by `cpp_allocator` ++/// and `rust_allocator`. ++/// ++/// When `rustc` drives linking, then it will define the symbols below. But ++/// Chromium only uses `rustc` to link Rust-only executables (e.g. `build.rs` ++/// scripts) and otherwise uses a non-Rust linker. This is why we have to ++/// manually define a few symbols below. We define those symbols ++/// as "weak" symbols, so that Rust-provided symbols "win" in case where Rust ++/// actually does drive the linking. This hack works (not only for Chromium, ++/// but also for google3 and other projects), but isn't officially supported by ++/// `rustc`. ++/// ++/// TODO(https://crbug.com/410596442): Stop using internal features here. ++mod both_allocators { ++ use super::ffi; ++ ++ /// As part of rustc's contract for using `#[global_allocator]` without ++ /// rustc-generated shims we must define this symbol, since we are opting in ++ /// to unstable functionality. See https://github.com/rust-lang/rust/issues/123015 ++ #[no_mangle] ++ #[linkage = "weak"] ++ static __rust_no_alloc_shim_is_unstable: u8 = 0; ++ ++ // Mangle the symbol name as rustc expects. ++ #[rustc_std_internal_symbol] ++ #[allow(non_upper_case_globals)] ++ #[linkage = "weak"] ++ static __rust_alloc_error_handler_should_panic: u8 = 0; ++ ++ // Mangle the symbol name as rustc expects. ++ #[rustc_std_internal_symbol] ++ #[allow(non_upper_case_globals)] ++ #[linkage = "weak"] ++ fn __rust_alloc_error_handler(_size: usize, _align: usize) { ++ // TODO(lukasza): Investigate if we can just call `std::process::abort()` here. ++ // (Not really _needed_, but it could simplify code a little bit.) ++ unsafe { ffi::crash_immediately() } ++ } + } + + // TODO(crbug.com/408221149): conditionally include the FFI glue based on diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 6721e7c..c95f43a 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -137,6 +137,11 @@ source=" temp-failure-retry.patch pipewire-1.4.patch gperf-3.2-fix.patch + 0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch + 0002-Call-Rust-default-allocator-directly-from-Rust.patch + 0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch + 0004-Drop-remap_alloc-dep.patch + 0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch electron_icon.patch electron_python-jinja-3.10.patch @@ -184,6 +189,10 @@ esac # breaks chromium-based stuff export CXXFLAGS="${CXXFLAGS/-D_GLIBCXX_ASSERTIONS=1}" +# workaround to error: undefined symbol: __rustc::__rust_dealloc +# with 000*.patch patches +export RUSTC_BOOTSTRAP=1 + # creates a dist tarball that does not need to git clone everything at build time. _distbucket="sakamoto/lnl-aports-snapshots/" snapshot() { @@ -565,6 +574,11 @@ f2b08538ff57c50b3772a07ca91845f9d45f4a5112f608b6192d4fb5d7be48f478c0c36194d95ab7 e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb temp-failure-retry.patch 1814096bc611e7f56cc5c570214dae715a4cda1fba96a6b585a73a1abc8b9161efaa799dc83887dac531dbafe9479bbe235cabe1a61cb3081e268c53a6144908 pipewire-1.4.patch 4bc087a1e5acbb0f8f884756b40c127df88699ecd6eb42c4aff6691b87239bb6915dd102e9ef2544502a12bff011859ad497206940473e6b0a0fd75afb562a4c gperf-3.2-fix.patch +858f8e3c544abf3ffe0f54ba303713e9b4058e15996c8dc10bab7c999d82e1960756325a41d6bebb3a00404efb8e51c299f61f60de4feaac6b621757ab85d329 0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch +077497c1598c7db9f4c23e000e9b86e1833de4866479fd921313543ad599e141427bf38ae687f84c3da59af68f09a776265c2a569e1a7abfa80440231baef10a 0002-Call-Rust-default-allocator-directly-from-Rust.patch +5002aa73eb19b87c702eef5b087ecb3a2679142c28cd95a5a9571aeffe24e6944497e862058ed1d609317a723cdec1678f84543235fb93f12653a92b92309efe 0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch +d2e414135d2b046dd9efe277f88062bcb0a94749a17a014309260b1469305d55059931b9531572713c8e516897e30fd2f5317948ece1581ffe9b7b6c01078a6d 0004-Drop-remap_alloc-dep.patch +fe66228c0eefe3d08e2a7955b11e6a46f58f477befceba1628765fb016f30eb0bb02723aeedcabdb1ea3b84c42b5ea65073998e0a64f5ce082120fc7e65dee9a 0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch 465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch 2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch From 9a93d206fb9763ac042f76c8fc95af737f529090 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 22:36:58 -0400 Subject: [PATCH 204/313] ci: skip dotnet6* on testing --- .forgejo/workflows/check-testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index 1c3abe9..2137944 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -14,6 +14,7 @@ jobs: downstream: https://dl-cdn.alpinelinux.org/alpine/edge/testing ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 4 + skip_package: dotnet6-stage dotnet6-build steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 234904618e6d0bf718c717584ec1d43a677b6568 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 23:00:12 -0400 Subject: [PATCH 205/313] backports/libmedc: upgrade to 5.0.0 --- backports/libmedc/APKBUILD | 34 +++++-- backports/libmedc/hdf5-1.14.patch | 119 +++++++++++++++++++++++++ backports/libmedc/hdf5.patch | 94 ------------------- backports/libmedc/med-py3.13.patch | 26 ++++++ backports/libmedc/med-swig-4.3.0.patch | 59 ++++++++++++ 5 files changed, 229 insertions(+), 103 deletions(-) create mode 100644 backports/libmedc/hdf5-1.14.patch delete mode 100644 backports/libmedc/hdf5.patch create mode 100644 backports/libmedc/med-py3.13.patch create mode 100644 backports/libmedc/med-swig-4.3.0.patch diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD index 8976805..0bf52fc 100644 --- a/backports/libmedc/APKBUILD +++ b/backports/libmedc/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Aiden Grossman # Maintainer: pkgname=libmedc -pkgver=4.1.1 -pkgrel=4 +pkgver=5.0.0 +pkgrel=0 pkgdesc="Open source library for numerical simulation" url="https://www.salome-platform.org/" arch="all" @@ -10,22 +10,36 @@ license="GPL-3.0-or-later" makedepends="cmake hdf5-dev swig python3-dev samurai" options="!check" #test suite is nonfunctional with python bindings subpackages="$pkgname-dev $pkgname-doc $pkgname-python-pyc $pkgname-python:_py" +# Upstream disappeared: +# https://www.salome-platform.org/downloads +# https://files.salome-platform.org/Salome/other/med-4.1.1.tar.gz +# +# Using a fork on GitHub by one of the FreeCAD developers instead. +# source=" - https://files.salome-platform.org/Salome/medfile/med-$pkgver.tar.gz - hdf5.patch + $pkgname-$pkgver.tar.gz::https://github.com/chennes/med/archive/refs/tags/v$pkgver.tar.gz cmake-config-dir.patch + hdf5-1.14.patch + med-swig-4.3.0.patch + med-py3.13.patch " builddir="$srcdir/med-$pkgver" build() { cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=None \ + -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ - -DMEDFILE_BUILD_TESTS=OFF \ - -DMEDFILE_BUILD_PYTHON=ON + -DCMAKE_SKIP_RPATH=ON \ + -DMEDFILE_BUILD_PYTHON=ON \ + -DMEDFILE_BUILD_TESTS=OFF cmake --build build } +check() { + cd build + HDF5_DISABLE_VERSION_CHECK=1 LD_LIBRARY_PATH="$srcdir"/build/src ctest -E '._Python' --output-on-failure +} + package() { DESTDIR="$pkgdir" cmake --install build } @@ -37,7 +51,9 @@ _py() { } sha512sums=" -f211fa82750a7cc935baa3a50a55d16e40117a0f2254b482492ba8396d82781ca84960995da7a16b2b5be0b93ce76368bf4b311bb8af0e5f0243e7051c9c554c med-4.1.1.tar.gz -68d9291e73a68d674081314028c0fce7bbd4a7b78b93b7e5078117ce62f2d07318bc33ec95091ce677148ec3926c1ce653d0760c34e74b29257a7be59210f040 hdf5.patch +6ebb06bf403dbe32512a42179a42de3da6f264034fcc143fcb2b780c5d564527656d3ef28ebf25d7bde93a9d2a44df0d10a09d60e6f4720ba9d25719a4e30d37 libmedc-5.0.0.tar.gz 8d0f58cd67d205fbacaff0e6da76e2ee5473457b478ede13a551ebe5853c0716c7406b74c3792e1ace33a34d352fccca8dd2940f063a7c060a12529d060a991a cmake-config-dir.patch +78bfbd17a052c039244ce314d53b0d5e5e6ba6773fe7a836999bf7ddf4b6d732dfda95c58681dd9d7e9586e4d36d3dfe7cca15d45fa7d3d453aef72423fcd5c0 hdf5-1.14.patch +833187253fcbebb13f239f1f559333db6a7d3ef87c4f7b896f64970a3e553735ed01a82d6d4a368a2261e33e364b05ea3abbff3fd58c8221515aa72aa52684a7 med-swig-4.3.0.patch +6c993d924257a01b8bce1952ecc34346ab654a103f4374d514c3616cd6cdf94373b2a4d04b91a68933cd5acbc4fc54becab6bd58f32762973bbee8255c5d7a3d med-py3.13.patch " diff --git a/backports/libmedc/hdf5-1.14.patch b/backports/libmedc/hdf5-1.14.patch new file mode 100644 index 0000000..6202f74 --- /dev/null +++ b/backports/libmedc/hdf5-1.14.patch @@ -0,0 +1,119 @@ +Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/hdf5-1.14.patch + +diff -rupN --no-dereference med-5.0.0/config/cmake_files/medMacros.cmake med-5.0.0-new/config/cmake_files/medMacros.cmake +--- med-5.0.0/config/cmake_files/medMacros.cmake 2025-01-24 00:28:04.460898497 +0100 ++++ med-5.0.0-new/config/cmake_files/medMacros.cmake 2025-01-24 00:28:04.857640862 +0100 +@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5) + ## + ## Requires 1.12.x version + ## +- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 12 OR NOT HDF_VERSION_RELEASE_REF GREATER 0) ++ IF (HDF5_VERSION VERSION_LESS 1.12.1) + MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.12.1 are supported.") + ENDIF() + ## +diff -rupN --no-dereference med-5.0.0/src/ci/MEDfileCompatibility.c med-5.0.0-new/src/ci/MEDfileCompatibility.c +--- med-5.0.0/src/ci/MEDfileCompatibility.c 2023-06-05 14:14:44.000000000 +0200 ++++ med-5.0.0-new/src/ci/MEDfileCompatibility.c 2025-01-24 00:28:04.858068408 +0100 +@@ -116,7 +116,7 @@ MEDfileCompatibility(const char* const f + #if MED_NUM_MAJEUR != 5 + #error "Don't forget to update the test version here when you change the major version of the library !" + #endif +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !" + #error "Cf. _MEDfileCreate ..." + #endif +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileCreate.c med-5.0.0-new/src/hdfi/_MEDfileCreate.c +--- med-5.0.0/src/hdfi/_MEDfileCreate.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDfileCreate.c 2025-01-24 00:28:04.858334666 +0100 +@@ -189,7 +189,7 @@ med_idt _MEDfileCreate(const char * cons + * Cette ligne est censée obliger HDF à ne pas utiliser un modèle interne différent de 1.10.z + * Un test autoconf permet de fixer un intervalle de version HDF à MED. + */ +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileOpen.c med-5.0.0-new/src/hdfi/_MEDfileOpen.c +--- med-5.0.0/src/hdfi/_MEDfileOpen.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDfileOpen.c 2025-01-24 00:28:04.858574380 +0100 +@@ -113,7 +113,7 @@ med_idt _MEDfileOpen(const char * const + has been set in the group creation property list (see H5Pset_link_creation_order). + */ + +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + /* L'avantage de bloquer le modèle interne HDF5 +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileOpenForImport.c med-5.0.0-new/src/hdfi/_MEDfileOpenForImport.c +--- med-5.0.0/src/hdfi/_MEDfileOpenForImport.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDfileOpenForImport.c 2025-01-24 00:28:04.858834390 +0100 +@@ -53,7 +53,7 @@ med_idt _MEDfileOpenForImport(const cha + } + + +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + /* L'avantage de bloquer le modèle interne HDF5 +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDmemFileOpen.c med-5.0.0-new/src/hdfi/_MEDmemFileOpen.c +--- med-5.0.0/src/hdfi/_MEDmemFileOpen.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDmemFileOpen.c 2025-01-24 00:28:04.859128966 +0100 +@@ -439,7 +439,7 @@ med_idt _MEDmemFileOpen(const char * con + goto ERROR; + } + +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_V112, H5F_LIBVER_V112 ) ) { +@@ -506,7 +506,7 @@ med_idt _MEDmemFileOpen(const char * con + goto ERROR; + } + _fversionMM = 100*_fmajor+10*_fminor; +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + if ( _fversionMM < 500 ) { /*100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR*/ +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDparFileCreate.c med-5.0.0-new/src/hdfi/_MEDparFileCreate.c +--- med-5.0.0/src/hdfi/_MEDparFileCreate.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDparFileCreate.c 2025-01-24 00:28:04.859422685 +0100 +@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c + * En HDF5-1.10.0p1 cela n'a aucun effet ! + * Un test autoconf permet de fixer un intervalle de version HDF à MED. + */ +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + +diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDparFileOpen.c med-5.0.0-new/src/hdfi/_MEDparFileOpen.c +--- med-5.0.0/src/hdfi/_MEDparFileOpen.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/hdfi/_MEDparFileOpen.c 2025-01-24 00:28:04.859632596 +0100 +@@ -86,7 +86,7 @@ med_idt _MEDparFileOpen(const char * con + } + _fversionMM = 100*_fmajor+10*_fminor; + +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + if ( _fversionMM < 500 ) { /*100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR*/ +diff -rupN --no-dereference med-5.0.0/src/misc/MEDversionedApi3C.c med-5.0.0-new/src/misc/MEDversionedApi3C.c +--- med-5.0.0/src/misc/MEDversionedApi3C.c 2023-06-05 14:14:45.000000000 +0200 ++++ med-5.0.0-new/src/misc/MEDversionedApi3C.c 2025-01-24 00:28:04.859890990 +0100 +@@ -114,7 +114,7 @@ MedFuncType _MEDversionedApi3( const cha + /* (_fversionMM <= (100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR) ) */ + /* ) { */ + +-#if H5_VERS_MINOR > 12 ++#if H5_VERS_MINOR > 14 + #error "Don't forget to change the compatibility version of the library !" + #endif + diff --git a/backports/libmedc/hdf5.patch b/backports/libmedc/hdf5.patch deleted file mode 100644 index bc4764b..0000000 --- a/backports/libmedc/hdf5.patch +++ /dev/null @@ -1,94 +0,0 @@ -Originally from https://gist.github.com/jedbrown/527ef81ff59a0dccf833da40fdd15a47 -diff -rupN med-4.1.0/config/cmake_files/medMacros.cmake med-4.1.0-new/config/cmake_files/medMacros.cmake ---- med-4.1.0/config/cmake_files/medMacros.cmake 2021-12-03 09:35:30.675827163 +0100 -+++ med-4.1.0-new/config/cmake_files/medMacros.cmake 2021-12-03 09:32:31.894994147 +0100 -@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5) - ## - ## Requires 1.10.x version - ## -- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 10 OR NOT HDF_VERSION_RELEASE_REF GREATER 1) -+ IF (HDF5_VERSION VERSION_LESS 1.10.2) - MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.10.2 are supported.") - ENDIF() - ## -diff -rupN med-4.1.0/src/ci/MEDfileCompatibility.c med-4.1.0-new/src/ci/MEDfileCompatibility.c ---- med-4.1.0/src/ci/MEDfileCompatibility.c 2021-12-03 09:35:30.676827162 +0100 -+++ med-4.1.0-new/src/ci/MEDfileCompatibility.c 2021-12-03 09:33:26.292942149 +0100 -@@ -71,7 +71,7 @@ MEDfileCompatibility(const char* const f - _hversionMMR=10000*_hmajeur+100*_hmineur+_hrelease; - /* ISCRUTE(_hversionMMR); */ - /* ISCRUTE(HDF_VERSION_NUM_REF); */ -- if ( (_hversionMMR >= HDF_VERSION_NUM_REF) && (_hmineur == HDF_VERSION_MINOR_REF) ) *hdfok = MED_TRUE; -+ if (_hversionMMR >= HDF_VERSION_NUM_REF) *hdfok = MED_TRUE; - - /* TODO : Vérifier si la version mineure HDF du fichier est supérieure - à la version mineure de la bibliothèque HDF utilisée : -@@ -113,7 +113,7 @@ MEDfileCompatibility(const char* const f - #if MED_NUM_MAJEUR != 4 - #error "Don't forget to update the test version here when you change the major version of the library !" - #endif --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !" - #error "Cf. _MEDfileCreate ..." - #endif -diff -rupN med-4.1.0/src/hdfi/_MEDfileCreate.c med-4.1.0-new/src/hdfi/_MEDfileCreate.c ---- med-4.1.0/src/hdfi/_MEDfileCreate.c 2021-12-03 09:35:30.677827161 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDfileCreate.c 2021-12-03 09:32:31.894994147 +0100 -@@ -159,7 +159,7 @@ med_idt _MEDfileCreate(const char * cons - * En HDF5-1.10.0p1 cela n'a aucun effet ! - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN med-4.1.0/src/hdfi/_MEDfileOpen.c med-4.1.0-new/src/hdfi/_MEDfileOpen.c ---- med-4.1.0/src/hdfi/_MEDfileOpen.c 2021-12-03 09:35:30.677827161 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDfileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -72,7 +72,7 @@ med_idt _MEDfileOpen(const char * const - - • The creation order tracking property, H5P_CRT_ORDER_TRACKED, has been set in the group creation property list (see H5Pset_link_creation_order). - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - /* L'avantage de bloquer le modèle interne HDF5 -diff -rupN med-4.1.0/src/hdfi/_MEDmemFileOpen.c med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c ---- med-4.1.0/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:35:30.678827160 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -434,7 +434,7 @@ med_idt _MEDmemFileOpen(const char * con - goto ERROR; - } - --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18) ) { -diff -rupN med-4.1.0/src/hdfi/_MEDparFileCreate.c med-4.1.0-new/src/hdfi/_MEDparFileCreate.c ---- med-4.1.0/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:35:30.678827160 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:32:31.894994147 +0100 -@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c - * En HDF5-1.10.0p1 cela n'a aucun effet ! - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN med-4.1.0/src/hdfi/_MEDparFileOpen.c med-4.1.0-new/src/hdfi/_MEDparFileOpen.c ---- med-4.1.0/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:35:30.679827159 +0100 -+++ med-4.1.0-new/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:32:31.894994147 +0100 -@@ -55,7 +55,7 @@ med_idt _MEDparFileOpen(const char * con - MED_ERR_(_fid,MED_ERR_INIT,MED_ERR_PROPERTY,MED_ERR_PARALLEL_MSG); - goto ERROR; - } --#if H5_VERS_MINOR > 10 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18 ) ) { diff --git a/backports/libmedc/med-py3.13.patch b/backports/libmedc/med-py3.13.patch new file mode 100644 index 0000000..164daf0 --- /dev/null +++ b/backports/libmedc/med-py3.13.patch @@ -0,0 +1,26 @@ +Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/med-swig-4.3.0.patch + +diff -rupN --no-dereference med-5.0.0/python/med_enumtest_typemap.i med-5.0.0-new/python/med_enumtest_typemap.i +--- med-5.0.0/python/med_enumtest_typemap.i 2023-03-07 15:20:57.000000000 +0100 ++++ med-5.0.0-new/python/med_enumtest_typemap.i 2025-01-24 00:28:04.465816239 +0100 +@@ -128,7 +128,7 @@ public: + if (pclass == NULL) printf("%s\n","Can't get class $1_basetype"); + Py_DECREF(pmod); + pargs = Py_BuildValue("(i)",*$1); +- pinst = PyEval_CallObject(pclass, pargs); ++ pinst = PyObject_CallObject(pclass, pargs); + if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); + $result=SWIG_Python_AppendOutput($result, pinst); + } +diff -rupN --no-dereference med-5.0.0/python/med_enum_typemap.i med-5.0.0-new/python/med_enum_typemap.i +--- med-5.0.0/python/med_enum_typemap.i 2023-03-07 15:20:57.000000000 +0100 ++++ med-5.0.0-new/python/med_enum_typemap.i 2025-01-24 00:28:04.466146326 +0100 +@@ -109,7 +109,7 @@ Type.__repr__= lambda self: #Type +"("+s + if (pclass == NULL) printf("%s\n","Can't get class $1_basetype"); + Py_DECREF(pmod); + pargs = Py_BuildValue("(i)",*$1); +- pinst = PyEval_CallObject(pclass, pargs); ++ pinst = PyObject_CallObject(pclass, pargs); + if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); + $result=SWIG_Python_AppendOutput($result, pinst); + } diff --git a/backports/libmedc/med-swig-4.3.0.patch b/backports/libmedc/med-swig-4.3.0.patch new file mode 100644 index 0000000..e9dcb5e --- /dev/null +++ b/backports/libmedc/med-swig-4.3.0.patch @@ -0,0 +1,59 @@ +Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/med-py3.13.patch + +diff -rupN --no-dereference med-5.0.0/python/med_array_typemap.i med-5.0.0-new/python/med_array_typemap.i +--- med-5.0.0/python/med_array_typemap.i 2023-03-07 15:20:57.000000000 +0100 ++++ med-5.0.0-new/python/med_array_typemap.i 2025-01-24 00:28:05.257751237 +0100 +@@ -181,7 +181,7 @@ Type.__repr__= lambda self: #Type +"("+s + // TypeMed * const ParamName : OUT 2/4 (l'allocation Type est faite ds Python) + %typemap(freearg) TypeMed * const ParamName { + Py_INCREF(o$argnum); +- $result=SWIG_Python_AppendOutput($result, o$argnum); ++ $result=SWIG_AppendOutput($result, o$argnum); + } + // TypeMed * const (OUT) 3/4 + // pour ne pas activer un out du TypeMed * const (par sécurité) +@@ -290,7 +290,7 @@ Type.__repr__= lambda self: #Type +"("+s + // unsigned char * const : OUT 2/4 (l'allocation Type est faite ds Python) + %typemap(freearg) unsigned char * const { + Py_INCREF(o$argnum); +- $result=SWIG_Python_AppendOutput($result, o$argnum); ++ $result=SWIG_AppendOutput($result, o$argnum); + } + // unsigned char * const (OUT) 3/4 + // pour ne pas activer un out du unsigned char * const (par sécurité) +diff -rupN --no-dereference med-5.0.0/python/med_bool_typemap.i med-5.0.0-new/python/med_bool_typemap.i +--- med-5.0.0/python/med_bool_typemap.i 2023-03-07 15:20:57.000000000 +0100 ++++ med-5.0.0-new/python/med_bool_typemap.i 2025-01-24 00:28:05.257993234 +0100 +@@ -22,7 +22,7 @@ + /* Py_DECREF(o2); */ + /* Py_DECREF(o3); */ + /* } */ +- $result=SWIG_Python_AppendOutput($result, o); ++ $result=SWIG_AppendOutput($result, o); + } + + %typemap(in,numinputs=0) med_bool *(med_bool temp) { +diff -rupN --no-dereference med-5.0.0/python/med_enumtest_typemap.i med-5.0.0-new/python/med_enumtest_typemap.i +--- med-5.0.0/python/med_enumtest_typemap.i 2025-01-24 00:28:04.853403794 +0100 ++++ med-5.0.0-new/python/med_enumtest_typemap.i 2025-01-24 00:28:05.258210585 +0100 +@@ -130,7 +130,7 @@ public: + pargs = Py_BuildValue("(i)",*$1); + pinst = PyObject_CallObject(pclass, pargs); + if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); +- $result=SWIG_Python_AppendOutput($result, pinst); ++ $result=SWIG_AppendOutput($result, pinst); + } + + %typemap(in,numinputs=0) TypeEnum * (TypeEnum temp) { +diff -rupN --no-dereference med-5.0.0/python/med_enum_typemap.i med-5.0.0-new/python/med_enum_typemap.i +--- med-5.0.0/python/med_enum_typemap.i 2025-01-24 00:28:04.853741870 +0100 ++++ med-5.0.0-new/python/med_enum_typemap.i 2025-01-24 00:28:05.258385775 +0100 +@@ -111,7 +111,7 @@ Type.__repr__= lambda self: #Type +"("+s + pargs = Py_BuildValue("(i)",*$1); + pinst = PyObject_CallObject(pclass, pargs); + if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); +- $result=SWIG_Python_AppendOutput($result, pinst); ++ $result=SWIG_AppendOutput($result, pinst); + } + + %typemap(in,numinputs=0) TypeEnum * (TypeEnum temp) { From e287d269969e89ad83ff8a6d89c84470decc032c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 23:42:40 -0400 Subject: [PATCH 206/313] ci: add special case for zotero --- .forgejo/bin/check_ver.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index e931cb6..e281294 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -59,6 +59,16 @@ for pkg in $owned_by_you; do # special cases where package is not semantic case $pkg in + zotero) + commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') + downstream_fx_ver=$(curl --fail -X GET -s "https://gitlab.alpinelinux.org/alpine/aports/-/raw/$commit/community/zotero/APKBUILD" | awk -F '=' '{if($1=="_fxver"){print $2}}') + upstream_fx_ver=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/firefox-esr" | jq -r ".stable_versions.[] | match(\"${downstream_fx_ver/.*.*}.*\").string" | head -n1) + if [ "$upstream_fx_ver" != "$downstream_fx_ver" ]; then + echo "$pkg new Firefox $upstream_fx_ver version available" + echo "$pkg(fx_ver) $downstream_fx_ver $upstream_fx_ver $repo $release" >> out_of_date + fi + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) + ;; freetube) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; dotnet*sdk|dotnet*stage0) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | sed 's|-.*||' | head -n1);; electron) From 23c870f2c6aae462312195083ae6f01d9c7674df Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 26 May 2025 23:43:08 -0400 Subject: [PATCH 207/313] ci: fix special case for electron --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index e281294..6468ed7 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -77,7 +77,7 @@ for pkg in $owned_by_you; do # append version number to signal that this is not latest major version if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then echo "$pkg${latest_version/.*} major version available" - echo "$pkg${latest_version/.*} $downstream_version $latest_version $repo" >> out_of_date + echo "$pkg${latest_version/.*} $downstream_version $latest_version $repo $release" >> out_of_date pkg=$pkg${upstream_version/.*} fi ;; From 92c41ceef9fa0ddf480b44f38d8b305ddec949e1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 00:02:39 -0400 Subject: [PATCH 208/313] ci: update electron title --- .forgejo/bin/check_ver.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 6468ed7..3a0684e 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -76,9 +76,9 @@ for pkg in $owned_by_you; do latest_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) # append version number to signal that this is not latest major version if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then - echo "$pkg${latest_version/.*} major version available" - echo "$pkg${latest_version/.*} $downstream_version $latest_version $repo $release" >> out_of_date - pkg=$pkg${upstream_version/.*} + echo "$pkg(${latest_version/.*}) major version available" + echo "$pkg(${latest_version/.*}) $downstream_version $latest_version $repo $release" >> out_of_date + pkg="$pkg(${upstream_version/.*})" fi ;; arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; From 370d84dc77e4d3932d95b7e0e876531bf2da1914 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:15:55 -0400 Subject: [PATCH 209/313] user/openterface-qt: upgrade to 0.3.13 --- .../51-openterface-permissions.rules | 3 ++- user/openterface-qt/APKBUILD | 21 +++++++++---------- .../openterface-qt.post-install | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/user/openterface-qt/51-openterface-permissions.rules b/user/openterface-qt/51-openterface-permissions.rules index e8f2971..a74cfbd 100644 --- a/user/openterface-qt/51-openterface-permissions.rules +++ b/user/openterface-qt/51-openterface-permissions.rules @@ -1 +1,2 @@ -KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev" +SUBSYSTEM=="usb", ATTRS{idVendor}=="534d", ATTRS{idProduct}=="2109", MODE="0660", GROUP="plugdev" +SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="plugdev" diff --git a/user/openterface-qt/APKBUILD b/user/openterface-qt/APKBUILD index b0bb703..cf753a7 100644 --- a/user/openterface-qt/APKBUILD +++ b/user/openterface-qt/APKBUILD @@ -1,17 +1,17 @@ # Maintainer: Antoine Martin (ayakael) pkgname=openterface-qt -pkgver=0.1.0 +pkgver=0.3.13 pkgrel=0 pkgdesc="Openterface Mini-KVM Host Application" -arch='all' +arch="all !armhf" # missing qt6-qtmultimedia url="https://openterface.com/" -license='AGPL-3.0-only' -depends='qt6-qtmultimedia-ffmpeg hicolor-icon-theme' -makedepends='qt6-qtbase-dev qt6-qtmultimedia-dev qt6-qtserialport-dev qt6-qtsvg-dev qt6-qtmultimedia-dev libusb-dev' +license="AGPL-3.0-only" +depends="qt6-qtmultimedia-ffmpeg hicolor-icon-theme" +makedepends="qt6-qtbase-dev qt6-qtmultimedia-dev qt6-qtserialport-dev qt6-qtsvg-dev qt6-qtmultimedia-dev libusb-dev" install="$pkgname.post-install" builddir="$srcdir"/Openterface_QT-$pkgver source=" - $pkgname-$pkgver.tar.gz::https://github.com/TechxArtisanStudio/Openterface_QT/archive/v$pkgver.tar.gz + $pkgname-$pkgver.tar.gz::https://github.com/TechxArtisanStudio/Openterface_QT/archive/$pkgver.tar.gz openterfaceQT.desktop 51-openterface-permissions.rules " @@ -19,12 +19,11 @@ source=" prepare() { default_prepare mkdir build && cd build - qmake6 .. + qmake6 .. } build() { - cd build - make + make -C build } package() { @@ -36,7 +35,7 @@ package() { install -Dm644 "$builddir"/images/icon_128.png "$pkgdir"/usr/share/icons/hicolor/128x128/apps/openterfaceQT.png } sha512sums=" -2aff3b5b92d5d12d1d748726e2565f5d410611b242b4fac04289b6b057eb1d39b7c2c9bcf613b3b9636a74f17c3fb69ff52177ee889f4d34de7b5b5388e75964 openterface-qt-0.1.0.tar.gz +7261ce2875b1617d27945de591c72779d2305889b7f53bb6758cb5e1d4dc01c969fef1638726d868f75e995c44a8e2c453cac45c90cfb3d140b8120523c4038d openterface-qt-0.3.13.tar.gz e39cfa04cbcb59e8ba54110a28eff41854f73fa7c4baeeed5433907c79781946f12bd3a731763caa1d591e664eab0650bdbd2a844954baa12bb96a76a17c6e4f openterfaceQT.desktop -aed752c03acfb5e7d3dc206fd342c1eed6b56353801e54b925e5d3a3e673bf604e0e94424e5e8fddb31c21d3acfbda351f1ea6e8ddc8057f7354ec86a4c74a5e 51-openterface-permissions.rules +f50d721a6a2d1e0183c81e99230e91e127ee6c6f3243af1cff3e3cb78e2913ebab3346ec8b461a4710220d1ce2e12a7cc960ded6e0dc2def539375c6e737b647 51-openterface-permissions.rules " diff --git a/user/openterface-qt/openterface-qt.post-install b/user/openterface-qt/openterface-qt.post-install index 09d267b..b853907 100755 --- a/user/openterface-qt/openterface-qt.post-install +++ b/user/openterface-qt/openterface-qt.post-install @@ -1,3 +1,3 @@ -#!/bin/bash +#!/bin/sh echo "Setup the dialout permission for Serial port." echo "Run: sudo usermod -a -G video,plugdev \$USER" From 6b7279026db646a79187c5afbb2886dbb0c25f4f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:18:25 -0400 Subject: [PATCH 210/313] user/rmfakecloud: upgrade to 0.0.24 --- user/rmfakecloud/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/rmfakecloud/APKBUILD b/user/rmfakecloud/APKBUILD index 4bc816e..d9402ab 100644 --- a/user/rmfakecloud/APKBUILD +++ b/user/rmfakecloud/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) pkgname=rmfakecloud -pkgver=0.0.19 +pkgver=0.0.24 _gittag=v$pkgver pkgrel=0 pkgdesc="A selfhosted cloud for the Remarkable Tablet" @@ -37,7 +37,7 @@ package() { install -Dm755 "$srcdir"/rmfakecloud.openrc "$pkgdir"/etc/init.d/rmfakecloud } sha512sums=" -55948ede5f8a4cc9e74c9c68f83d14dec4950f23da5ef053f3ae708edf2643f64e5736abfe63cbf6700e5277adff7167ce0f228a8241169261f4ce59e2815a35 rmfakecloud-0.0.19.tar.gz +c0c96cb9168b8152da3842fac095a6bd33e74b5f7a5cefe72e44853f4059c966336e98cd4c62235f7a2fe625acdd93452f718c19a1bf65f5dd7dbd8bb5cd1f8c rmfakecloud-0.0.24.tar.gz d5677cef282085cd6642a034dd258ffa294862aeb0ce81d6485a524a15564849bc4eb90a9d1fa4dbcf4eab69dcd893302aa06493fc8fad74d69200c2bdf246c0 rmfakecloud.conf 891d0945886796132f951293e081046334857563b4ebae28a3aa5b6bc37768767c49ce102de645ed8340af2518de606be8bf6ecafeb6d189dd937970aa3e6498 rmfakecloud.openrc " From 56f0391fd1296acc5ee8aa0c6530c3b148bbb420 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:19:49 -0400 Subject: [PATCH 211/313] user/scantopl: upgrade to 1.0.0 --- user/scantopl/APKBUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/scantopl/APKBUILD b/user/scantopl/APKBUILD index 725e413..dea4f1e 100644 --- a/user/scantopl/APKBUILD +++ b/user/scantopl/APKBUILD @@ -2,10 +2,10 @@ # Contributor: Antoine Martin (ayakael) pkgname=scantopl -pkgver=0.0.1 +pkgver=1.0.0 pkgrel=0 pkgdesc="Automatically send scanservjs scanned document to paperless-ng" -_gittag="5c5d71a9e1cf8985d374453c866c1711692334e2" +_gittag="v$pkgver" url="https://github.com/Celedhrim/scantopl" arch="all" license="WTFPL" @@ -16,7 +16,7 @@ source=" scantopl.initd scantopl.conf " -builddir="$srcdir/$pkgname-$_gittag" +builddir="$srcdir/$pkgname-${_gittag/v}" options="!check" # No testsuite build() { @@ -31,7 +31,7 @@ package() { install -Dm644 "$srcdir"/scantopl.conf "$pkgdir"/etc/conf.d/scantopl } sha512sums=" -f47823ffdea68de71ce9f3a347f31eee3556aae2087f68d2cf4078b9694894d06fc8de94e806ad34358e0ec636ace6dc5d97273c3102192584cb540ede3bd288 scantopl-0.0.1.tar.gz +d4eca1adc326f1e730ae195bd44f1cf05d404488ce20fd612467c572ea7fa718034bb7b16d3e007976349f6852e83569aa17727dcc61f9e7ab1934995b3bc3e6 scantopl-1.0.0.tar.gz 8238411fe8881be6690a583a6bfc71e52f3131320f5d92bb36f8af61802980265a8cf5250eb699d9214f7c6c168d14c39867a09587fb07841a8504a6a28db74b scantopl.initd ee2e631901b1d88c0dede6587318e44884255a7c82e090371f017dbb91563c16f0567c0d45b3183d0a8abb3ee4b71a33f3d79258ad2b2f6d8930a5bc7625070a scantopl.conf " From 5d9d856a6c399ec27e57af08006709271cbdd456 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:39:06 -0400 Subject: [PATCH 212/313] backports/thelounge: disable tests --- backports/thelounge/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/thelounge/APKBUILD b/backports/thelounge/APKBUILD index bc0de04..0e84a6e 100644 --- a/backports/thelounge/APKBUILD +++ b/backports/thelounge/APKBUILD @@ -3,7 +3,7 @@ # Maintainer: Fabricio Silva pkgname=thelounge pkgver=4.4.3 -pkgrel=0 +pkgrel=1 pkgdesc="Modern, responsive, cross-platform, self-hosted web IRC client" url="https://thelounge.chat" arch="all !riscv64" # riscv64 gets SIGILL @@ -17,7 +17,7 @@ source=" thelounge.initd thelounge.confd " -options="net" # net for npm +options="!check net" # net for npm case $CARCH in # loongarch64: 2 tests failed on the builder From 2fb7a3cd257d7210f17a301d2f4768507698110a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:41:29 -0400 Subject: [PATCH 213/313] user/firefly-iii: disable due to FTBFS --- user/firefly-iii/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/firefly-iii/APKBUILD b/user/firefly-iii/APKBUILD index cc3f123..08f146b 100644 --- a/user/firefly-iii/APKBUILD +++ b/user/firefly-iii/APKBUILD @@ -5,7 +5,8 @@ pkgname=firefly-iii pkgver=5.7.18 pkgrel=0 pkgdesc="PHP personal finances manager" -arch="noarch" +# FTBFS +#arch="noarch" url="https://github.com/firefly-iii/firefly-iii" license="AGPL-3.0-only" options="!check" # No testsuite From ce94f901d0ee4553af3ff6ef9c01d35e9cd0f795 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:42:02 -0400 Subject: [PATCH 214/313] unmaintained/jellysub: move from user --- {user => unmaintained}/jellysub/APKBUILD | 0 {user => unmaintained}/jellysub/jellysub.conf | 0 {user => unmaintained}/jellysub/jellysub.openrc | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/jellysub/APKBUILD (100%) rename {user => unmaintained}/jellysub/jellysub.conf (100%) rename {user => unmaintained}/jellysub/jellysub.openrc (100%) diff --git a/user/jellysub/APKBUILD b/unmaintained/jellysub/APKBUILD similarity index 100% rename from user/jellysub/APKBUILD rename to unmaintained/jellysub/APKBUILD diff --git a/user/jellysub/jellysub.conf b/unmaintained/jellysub/jellysub.conf similarity index 100% rename from user/jellysub/jellysub.conf rename to unmaintained/jellysub/jellysub.conf diff --git a/user/jellysub/jellysub.openrc b/unmaintained/jellysub/jellysub.openrc similarity index 100% rename from user/jellysub/jellysub.openrc rename to unmaintained/jellysub/jellysub.openrc From 72e6999c8715ab6018e2c82942c427eeec464765 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 09:56:52 -0400 Subject: [PATCH 215/313] user/papermc: upgrade to 1.21.4 --- user/papermc/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/papermc/APKBUILD b/user/papermc/APKBUILD index 23930f7..ae99e5b 100644 --- a/user/papermc/APKBUILD +++ b/user/papermc/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) pkgname=papermc -pkgver=1.21.3 +pkgver=1.21.4 _gittag=${pkgver/.0} pkgrel=0 pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" @@ -43,7 +43,7 @@ package() { chmod g+ws "$pkgdir"/var/lib/$pkgname } sha512sums=" -630c0fafd53082bec3992234f7422c4714c30ad0fac240c6dc80091fc7d49b57bc2cb7365366ac015d2a9217c4fd561f0649f738cb0d90ea7a7b6355f9839ff6 papermc-1.21.3.tar.zst +5e815c4ee4f9d99ecb173d2b81131d0531359f1d2d48dee429476a7b39c37140fe2085d9a657435e347ca1bc5930402bac1a533692cd8387811b2577384c827b papermc-1.21.4.tar.zst c5d1bf85ceb74162aaaf2bcd2d06dc2e3dd2e37c39f0cee2be7c8dbff9970a6aff1e48a43e6d1e83e6a0ac610bd89f62b1279bf27b64afa88d9831a36aebbd3e papermc.initd 9b8e267428731ee9255f82a93f1e8674d7e917a0f154bd395cd2280a49aa248a4b8427520b08dbb4b3a74a5471dac0e439eedc8ab94bf2e53bb8d411d2d8a789 papermc.conf 943ba0d4c10173246bdc6497dcedd54da0788f966841c8d3381398711d79f8d5eb07a24ce28f519b6f24f59d99fa9e74bc6bb882059f343df4eeda5de3660ac7 papermc.sh From 762159a7e939d675db447a4895db255217508b32 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 10:14:42 -0400 Subject: [PATCH 216/313] user/papermc-plugin-worledit: upgrade to 7.3.13 --- user/papermc-plugin-worldedit/APKBUILD | 12 ++++++++---- .../papermc-fix-build.patch | 13 +++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 user/papermc-plugin-worldedit/papermc-fix-build.patch diff --git a/user/papermc-plugin-worldedit/APKBUILD b/user/papermc-plugin-worldedit/APKBUILD index 96e0215..6949ab5 100644 --- a/user/papermc-plugin-worldedit/APKBUILD +++ b/user/papermc-plugin-worldedit/APKBUILD @@ -1,16 +1,19 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=papermc-plugin-worldedit -pkgver=7.3.9 +pkgver=7.3.13 _pkgver=$pkgver -pkgrel=1 +pkgrel=0 pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" arch='noarch !aarch64' url="https://github.com/EngineHub/WorldEdit" license="GPL-3.0" depends="papermc>=1.13.2" makedepends="openjdk21-jdk" -source="$pkgname-$pkgver.tar.gz::https://github.com/EngineHub/WorldEdit/archive/refs/tags/$pkgver.tar.gz" +source=" + $pkgname-$pkgver.tar.gz::https://github.com/EngineHub/WorldEdit/archive/refs/tags/$pkgver.tar.gz + papermc-fix-build.patch + " builddir="$srcdir"/WorldEdit-$pkgver build() { @@ -25,5 +28,6 @@ package() { install -Dm644 "$builddir"/worldedit-bukkit/build/libs/worldedit-bukkit-$pkgver-dist.jar "$pkgdir/var/lib/papermc/plugins/WorldEdit.jar" } sha512sums=" -35eb83dfcd192884a86f9bec3cbe586af6141b8c10461937b2ef112bfb4d64f5f7c6e950108a7893dc5b1054f1d0206f74ec6b4702481c0da69bf89627dbfb06 papermc-plugin-worldedit-7.3.9.tar.gz +dbea1e2ff5b41ad25f8ddc5ae5456f9b7337d406cb4791fb3718b38bfbb94b0d8ba9fc7e2cd5c0d94c3c1845a35e68a87d89c0f147f9d988dd3fc3e375144198 papermc-plugin-worldedit-7.3.13.tar.gz +e36ac06da26e8817c7c666c972a09cbdba0fca8e0a511e53c5650d46ef1ee9a44d783900ed0afb39faab5dc718bf68e26d8c9b310ceedffa5d11bd15880aaa88 papermc-fix-build.patch " diff --git a/user/papermc-plugin-worldedit/papermc-fix-build.patch b/user/papermc-plugin-worldedit/papermc-fix-build.patch new file mode 100644 index 0000000..95710e9 --- /dev/null +++ b/user/papermc-plugin-worldedit/papermc-fix-build.patch @@ -0,0 +1,13 @@ +diff --git a/gradle/libs.versions.toml.orig b/gradle/libs.versions.toml +index 5f0e7da..ff0569b 100644 +--- a/gradle/libs.versions.toml.orig ++++ b/gradle/libs.versions.toml +@@ -77,7 +77,7 @@ mockito-junit-jupiter.module = "org.mockito:mockito-junit-jupiter" + commonsCli = "commons-cli:commons-cli:1.4" + + # https://repo.papermc.io/service/rest/repository/browse/maven-public/io/papermc/paper/paper-api/ +-paperApi = "io.papermc.paper:paper-api:1.21.5-R0.1-20250503.204036-71" ++paperApi = "io.papermc.paper:paper-api:1.21.5-R0.1-20250520.110141-3" + paperLib = "io.papermc:paperlib:1.0.8" + + dummypermscompat = "com.sk89q:dummypermscompat:1.10" From 352e518f8e22fef85069800fe6e59ba76e26b930 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 10:20:39 -0400 Subject: [PATCH 217/313] unmaintained/firefly-iii: move from user --- {user => unmaintained}/firefly-iii/APKBUILD | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/firefly-iii/APKBUILD (100%) diff --git a/user/firefly-iii/APKBUILD b/unmaintained/firefly-iii/APKBUILD similarity index 100% rename from user/firefly-iii/APKBUILD rename to unmaintained/firefly-iii/APKBUILD From 5503c80497c863267ede2b8b01790dcdfc2d326e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 10:36:08 -0400 Subject: [PATCH 218/313] unmaintained/calibre-web: move from user --- {user => unmaintained}/calibre-web/APKBUILD | 0 {user => unmaintained}/calibre-web/calibre-web.conf | 0 {user => unmaintained}/calibre-web/calibre-web.initd | 0 {user => unmaintained}/calibre-web/calibre-web.service | 0 {user => unmaintained}/calibre-web/calibre-web.sysusers | 0 {user => unmaintained}/calibre-web/calibre-web.tmpfiles | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/calibre-web/APKBUILD (100%) rename {user => unmaintained}/calibre-web/calibre-web.conf (100%) rename {user => unmaintained}/calibre-web/calibre-web.initd (100%) rename {user => unmaintained}/calibre-web/calibre-web.service (100%) rename {user => unmaintained}/calibre-web/calibre-web.sysusers (100%) rename {user => unmaintained}/calibre-web/calibre-web.tmpfiles (100%) diff --git a/user/calibre-web/APKBUILD b/unmaintained/calibre-web/APKBUILD similarity index 100% rename from user/calibre-web/APKBUILD rename to unmaintained/calibre-web/APKBUILD diff --git a/user/calibre-web/calibre-web.conf b/unmaintained/calibre-web/calibre-web.conf similarity index 100% rename from user/calibre-web/calibre-web.conf rename to unmaintained/calibre-web/calibre-web.conf diff --git a/user/calibre-web/calibre-web.initd b/unmaintained/calibre-web/calibre-web.initd similarity index 100% rename from user/calibre-web/calibre-web.initd rename to unmaintained/calibre-web/calibre-web.initd diff --git a/user/calibre-web/calibre-web.service b/unmaintained/calibre-web/calibre-web.service similarity index 100% rename from user/calibre-web/calibre-web.service rename to unmaintained/calibre-web/calibre-web.service diff --git a/user/calibre-web/calibre-web.sysusers b/unmaintained/calibre-web/calibre-web.sysusers similarity index 100% rename from user/calibre-web/calibre-web.sysusers rename to unmaintained/calibre-web/calibre-web.sysusers diff --git a/user/calibre-web/calibre-web.tmpfiles b/unmaintained/calibre-web/calibre-web.tmpfiles similarity index 100% rename from user/calibre-web/calibre-web.tmpfiles rename to unmaintained/calibre-web/calibre-web.tmpfiles From dfe9556b9d20f5d4581c5d279fd73309832d229f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 10:37:31 -0400 Subject: [PATCH 219/313] unmaintained/paperless-ngx: move from user --- .../1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch | 0 {user => unmaintained}/paperless-ngx/APKBUILD | 0 {user => unmaintained}/paperless-ngx/paperless-consumer.openrc | 0 {user => unmaintained}/paperless-ngx/paperless-ngx.post-install | 0 {user => unmaintained}/paperless-ngx/paperless-ngx.post-upgrade | 0 {user => unmaintained}/paperless-ngx/paperless-ngx.pre-install | 0 {user => unmaintained}/paperless-ngx/paperless-scheduler.openrc | 0 {user => unmaintained}/paperless-ngx/paperless-task-queue.openrc | 0 {user => unmaintained}/paperless-ngx/paperless-webserver.openrc | 0 {user => unmaintained}/paperless-ngx/paperless.conf | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename {user => unmaintained}/paperless-ngx/1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch (100%) rename {user => unmaintained}/paperless-ngx/APKBUILD (100%) rename {user => unmaintained}/paperless-ngx/paperless-consumer.openrc (100%) rename {user => unmaintained}/paperless-ngx/paperless-ngx.post-install (100%) rename {user => unmaintained}/paperless-ngx/paperless-ngx.post-upgrade (100%) rename {user => unmaintained}/paperless-ngx/paperless-ngx.pre-install (100%) rename {user => unmaintained}/paperless-ngx/paperless-scheduler.openrc (100%) rename {user => unmaintained}/paperless-ngx/paperless-task-queue.openrc (100%) rename {user => unmaintained}/paperless-ngx/paperless-webserver.openrc (100%) rename {user => unmaintained}/paperless-ngx/paperless.conf (100%) diff --git a/user/paperless-ngx/1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch b/unmaintained/paperless-ngx/1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch similarity index 100% rename from user/paperless-ngx/1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch rename to unmaintained/paperless-ngx/1746_add-OpenID-Connect-SSO-support-via-django-allauth.patch diff --git a/user/paperless-ngx/APKBUILD b/unmaintained/paperless-ngx/APKBUILD similarity index 100% rename from user/paperless-ngx/APKBUILD rename to unmaintained/paperless-ngx/APKBUILD diff --git a/user/paperless-ngx/paperless-consumer.openrc b/unmaintained/paperless-ngx/paperless-consumer.openrc similarity index 100% rename from user/paperless-ngx/paperless-consumer.openrc rename to unmaintained/paperless-ngx/paperless-consumer.openrc diff --git a/user/paperless-ngx/paperless-ngx.post-install b/unmaintained/paperless-ngx/paperless-ngx.post-install similarity index 100% rename from user/paperless-ngx/paperless-ngx.post-install rename to unmaintained/paperless-ngx/paperless-ngx.post-install diff --git a/user/paperless-ngx/paperless-ngx.post-upgrade b/unmaintained/paperless-ngx/paperless-ngx.post-upgrade similarity index 100% rename from user/paperless-ngx/paperless-ngx.post-upgrade rename to unmaintained/paperless-ngx/paperless-ngx.post-upgrade diff --git a/user/paperless-ngx/paperless-ngx.pre-install b/unmaintained/paperless-ngx/paperless-ngx.pre-install similarity index 100% rename from user/paperless-ngx/paperless-ngx.pre-install rename to unmaintained/paperless-ngx/paperless-ngx.pre-install diff --git a/user/paperless-ngx/paperless-scheduler.openrc b/unmaintained/paperless-ngx/paperless-scheduler.openrc similarity index 100% rename from user/paperless-ngx/paperless-scheduler.openrc rename to unmaintained/paperless-ngx/paperless-scheduler.openrc diff --git a/user/paperless-ngx/paperless-task-queue.openrc b/unmaintained/paperless-ngx/paperless-task-queue.openrc similarity index 100% rename from user/paperless-ngx/paperless-task-queue.openrc rename to unmaintained/paperless-ngx/paperless-task-queue.openrc diff --git a/user/paperless-ngx/paperless-webserver.openrc b/unmaintained/paperless-ngx/paperless-webserver.openrc similarity index 100% rename from user/paperless-ngx/paperless-webserver.openrc rename to unmaintained/paperless-ngx/paperless-webserver.openrc diff --git a/user/paperless-ngx/paperless.conf b/unmaintained/paperless-ngx/paperless.conf similarity index 100% rename from user/paperless-ngx/paperless.conf rename to unmaintained/paperless-ngx/paperless.conf From 106fe3e570db9b26798a9f2a69d9bca8f6a7622e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 11:18:17 -0400 Subject: [PATCH 220/313] user/papermc-plugin-essentialsx: upgrade to 2.21.1 --- user/papermc-plugin-essentialsx/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/papermc-plugin-essentialsx/APKBUILD b/user/papermc-plugin-essentialsx/APKBUILD index a815212..6abab9f 100644 --- a/user/papermc-plugin-essentialsx/APKBUILD +++ b/user/papermc-plugin-essentialsx/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=papermc-plugin-essentialsx -pkgver=2.21.0_pre151 -_gittag=f2af9528b0f99f2ff121dda2607e51d391a2a8bf +pkgver=2.21.1 +_gittag=$pkgver pkgrel=0 pkgdesc="EssentialsX is the essential plugin suite for Minecraft servers, with over 130 commands for servers of all size and scale." arch='noarch' @@ -75,5 +75,5 @@ xmpp() { } sha512sums=" -5fabf6b2091f7182ff23ca02e2f93ff22527668d55bbf60977ad414881c201bdc4608fe3618ca0d1312beb8fe8768f36cd792099817a0205f791ab2f9b212e04 papermc-plugin-essentialsx-f2af9528b0f99f2ff121dda2607e51d391a2a8bf.tar.gz +2634a909e4fced837acfd89e0972511da418a9ab3d648f4eb466688b779c7d4215aa25ed891504bc39805d292f1ebf72bb71077c0354117fdaf28ba032483262 papermc-plugin-essentialsx-2.21.1.tar.gz " From 378739e007b146c1b02befb028ecbb24f9a83180 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 11:21:16 -0400 Subject: [PATCH 221/313] user/papermc: fix jar install --- user/papermc/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/papermc/APKBUILD b/user/papermc/APKBUILD index ae99e5b..c93d3a2 100644 --- a/user/papermc/APKBUILD +++ b/user/papermc/APKBUILD @@ -31,7 +31,7 @@ package() { install -Dm644 "$srcdir"/$pkgname.conf "$pkgdir"/etc/conf.d/$pkgname install -Dm755 "$srcdir"/$pkgname.sh "$pkgdir"/usr/bin/$pkgname install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname - install -Dm644 "$builddir"/build/libs/paper*.jar "$pkgdir"/var/lib/$pkgname/$pkgver.jar + install -Dm644 "$builddir"/paper-server/build/libs/paper-server*.jar "$pkgdir"/var/lib/$pkgname/$pkgver.jar ln -s $pkgver.jar "$pkgdir"/var/lib/$pkgname/server.jar # Link the log files From f94e3afd3355b86bfa0d4e6a95d9e64417c69302 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 27 May 2025 17:31:53 -0400 Subject: [PATCH 222/313] user/looking-glass: drop due to in testing --- user/looking-glass/APKBUILD | 93 ------------------- .../looking-glass.post-deinstall | 2 - user/looking-glass/missing-includes.patch | 92 ------------------ .../module_1075-fix-build-linux64.patch | 25 ----- .../module_1124-fix-build-linux610.patch | 23 ----- user/looking-glass/obs-plugins-lib.patch | 12 --- user/looking-glass/werror.patch | 24 ----- 7 files changed, 271 deletions(-) delete mode 100644 user/looking-glass/APKBUILD delete mode 100644 user/looking-glass/looking-glass.post-deinstall delete mode 100644 user/looking-glass/missing-includes.patch delete mode 100644 user/looking-glass/module_1075-fix-build-linux64.patch delete mode 100644 user/looking-glass/module_1124-fix-build-linux610.patch delete mode 100644 user/looking-glass/obs-plugins-lib.patch delete mode 100644 user/looking-glass/werror.patch diff --git a/user/looking-glass/APKBUILD b/user/looking-glass/APKBUILD deleted file mode 100644 index fc66935..0000000 --- a/user/looking-glass/APKBUILD +++ /dev/null @@ -1,93 +0,0 @@ -# Contributor: Rogério da Silva Yokomizo -# Contributor: Antoine Martin (ayakael) -# Maintainer: Rogério da Silva Yokomizo -pkgname=looking-glass -_gittag=b7_git20240607 -pkgver=7b_git20240607 -pkgrel=0 -pkgdesc="Allows the use of a KVM configured for VGA PCI Pass-through without an attached physical monitor, keyboard or mouse" -url="https://looking-glass.io/" -arch="x86_64" -license="GPL-2.0-or-later" -makedepends=" - cmake - fontconfig-dev - libsamplerate-dev - libx11-dev - libxcursor-dev - libxfixes-dev - libxi-dev - libxinerama-dev - libxkbcommon-dev - libxpresent-dev - libxscrnsaver-dev - nettle-dev - obs-studio-dev - pipewire-dev - pulseaudio-dev - samurai - spice-dev - wayland-dev - wayland-protocols - " -source="$pkgname-$_gittag.tar.gz::https://lab.ilot.io/mirrors/looking-glass/-/releases/$_gittag/downloads/tarball/looking-glass-$_gittag.tar.gz - missing-includes.patch - obs-plugins-lib.patch - werror.patch - " -subpackages="$pkgname-obs $pkgname-module" -builddir="$srcdir/$pkgname-$_gittag" -options="!check" # There are no tests nor --version. - -build() { - cmake -S client -B build-client -G Ninja \ - -DENABLE_BACKTRACE=OFF \ - -DOPTIMIZE_FOR_NATIVE=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr - - cmake -S obs -B build-obs -G Ninja \ - -DENABLE_BACKTRACE=OFF \ - -DOPTIMIZE_FOR_NATIVE=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr - - cmake --build build-client - cmake --build build-obs -} - -package() { - DESTDIR="$pkgdir" cmake --install build-client - DESTDIR="$pkgdir" cmake --install build-obs -} - -module() { - pkgdesc="Looking Glass kernel module (AKMS)" - depends="akms" - install_if="looking-glass=$pkgver-r$pkgrel" - _modver=$(awk -F "=" '{if($1=="PACKAGE_VERSION"){print $2}}' src/looking-glass-B6/module/dkms.conf | tr -d '"') - - install -Dm644 "$builddir"/module/Makefile "$subpkgdir"/usr/src/looking-glass/Makefile - install -Dm644 "$builddir"/module/kvmfr* "$subpkgdir"/usr/src/looking-glass/. - - cat ->> "$subpkgdir"/usr/src/looking-glass/AKMBUILD < "$subpkgdir"/etc/udev/rules.d/99-kvmfr.rules - -} - -obs() { - pkgdesc="$pkgdesc (obs plugin)" - amove usr/lib/obs-plugins -} - -sha512sums=" -959f49c91dc7bb06dfae890547bfbd1c02bd4154f4ba1c898a12d15a3579658d65fcb9fc4b951c04180e17fc9151e551858e0fb60f20e3f1a72d19b86c7dc3db looking-glass-b7_git20240607.tar.gz -6d2449764a8316dd3c1b5cc0aa552671068f89ed2f95297f3c5256af8529b93e5ec7af8f979bd2e744fd09b11063e8a93f3ed26284f0e49294e467ca10f6e772 missing-includes.patch -33c5463412a16691f47d7833ebf81d7cf20c560a077dca141dcc9f02a5d6dfb676e483835f39a06012b114be9f509dda4614fe253bb1c72a0142e82dc265a5ca obs-plugins-lib.patch -b952d1fd284aed15bcfe7990f160dec3a4565fb5833ce339920f62de6bb46fbc09265a0a79fe80d212eecc6a1813614e1e193a8846c37e2afd18431dc3a89ca4 werror.patch -" diff --git a/user/looking-glass/looking-glass.post-deinstall b/user/looking-glass/looking-glass.post-deinstall deleted file mode 100644 index f193065..0000000 --- a/user/looking-glass/looking-glass.post-deinstall +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec /usr/sbin/akms uninstall kvmfr diff --git a/user/looking-glass/missing-includes.patch b/user/looking-glass/missing-includes.patch deleted file mode 100644 index 635752c..0000000 --- a/user/looking-glass/missing-includes.patch +++ /dev/null @@ -1,92 +0,0 @@ ---- a/repos/PureSpice/src/agent.c -+++ b/repos/PureSpice/src/agent.c -@@ -31,6 +31,7 @@ Place, Suite 330, Boston, MA 02111-1307 - #include - #include - #include -+#include - #include - - #include ---- a/repos/PureSpice/src/channel_cursor.c -+++ b/repos/PureSpice/src/channel_cursor.c -@@ -25,6 +25,7 @@ Place, Suite 330, Boston, MA 02111-1307 - #include "channel_cursor.h" - - #include -+#include - - #include "messages.h" - ---- a/repos/PureSpice/src/channel_display.c -+++ b/repos/PureSpice/src/channel_display.c -@@ -19,6 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 - - #include "purespice.h" - #include -+#include - - #include "ps.h" - #include "log.h" ---- a/repos/PureSpice/src/channel_inputs.c -+++ b/repos/PureSpice/src/channel_inputs.c -@@ -25,6 +25,7 @@ Place, Suite 330, Boston, MA 02111-1307 - #include "messages.h" - - #include -+#include - - const SpiceLinkHeader * channelInputs_getConnectPacket(void) - { ---- a/repos/PureSpice/src/channel_main.c -+++ b/repos/PureSpice/src/channel_main.c -@@ -24,6 +24,7 @@ Place, Suite 330, Boston, MA 02111-1307 - #include "messages.h" - - #include -+#include - - struct ChannelMain - { ---- a/repos/PureSpice/src/channel_playback.c -+++ b/repos/PureSpice/src/channel_playback.c -@@ -26,6 +26,8 @@ Place, Suite 330, Boston, MA 02111-1307 - - #include "messages.h" - -+#include -+ - const SpiceLinkHeader * channelPlayback_getConnectPacket(void) - { - typedef struct ---- a/repos/PureSpice/src/channel_record.c -+++ b/repos/PureSpice/src/channel_record.c -@@ -26,6 +26,8 @@ Place, Suite 330, Boston, MA 02111-1307 - - #include "messages.h" - -+#include -+ - const SpiceLinkHeader * channelRecord_getConnectPacket(void) - { - typedef struct ---- a/repos/PureSpice/src/log.c -+++ b/repos/PureSpice/src/log.c -@@ -25,6 +25,7 @@ Place, Suite 330, Boston, MA 02111-1307 - - #include - #include -+#include - - static void log_stdout(const char * file, unsigned int line, - const char * function, const char * format, ...) ---- a/repos/PureSpice/src/ps.c -+++ b/repos/PureSpice/src/ps.c -@@ -37,6 +37,7 @@ Place, Suite 330, Boston, MA 02111-1307 - #include - #include - #include -+#include - #include - #include - diff --git a/user/looking-glass/module_1075-fix-build-linux64.patch b/user/looking-glass/module_1075-fix-build-linux64.patch deleted file mode 100644 index bf594b5..0000000 --- a/user/looking-glass/module_1075-fix-build-linux64.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e32b292cc1ba089db6ed28e4d5eb0fc8cc4c2235 Mon Sep 17 00:00:00 2001 -From: esi -Date: Fri, 12 May 2023 16:28:01 -0400 -Subject: [PATCH] [module] Fix build on Linux 6.4 (fixes #1075) - ---- - module/dkms.conf | 2 +- - module/kvmfr.c | 4 ++++ - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/module/kvmfr.c b/module/kvmfr.c -index ca0cca685..c711e000e 100644 ---- a/module/kvmfr.c -+++ b/module/kvmfr.c -@@ -539,7 +539,11 @@ static int __init kvmfr_module_init(void) - if (kvmfr->major < 0) - goto out_free; - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) - kvmfr->pClass = class_create(THIS_MODULE, KVMFR_DEV_NAME); -+#else -+ kvmfr->pClass = class_create(KVMFR_DEV_NAME); -+#endif - if (IS_ERR(kvmfr->pClass)) - goto out_unreg; diff --git a/user/looking-glass/module_1124-fix-build-linux610.patch b/user/looking-glass/module_1124-fix-build-linux610.patch deleted file mode 100644 index c194c78..0000000 --- a/user/looking-glass/module_1124-fix-build-linux610.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 7305ce36af211220419eeab302ff28793d515df2 Mon Sep 17 00:00:00 2001 -From: Geoffrey McRae -Date: Fri, 7 Jun 2024 19:01:38 +1000 -Subject: [PATCH] [module] fix build on linux 6.10 - -Fixes #1124 - Thanks @pongo1231 ---- - module/dkms.conf | 2 +- - module/kvmfr.c | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/module/kvmfr.c b/module/kvmfr.c -index b5acd18de..c99a5d79c 100644 ---- a/module/kvmfr.c -+++ b/module/kvmfr.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - - #include - diff --git a/user/looking-glass/obs-plugins-lib.patch b/user/looking-glass/obs-plugins-lib.patch deleted file mode 100644 index 1390adb..0000000 --- a/user/looking-glass/obs-plugins-lib.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/obs/CMakeLists.txt -+++ b/obs/CMakeLists.txt -@@ -84,7 +84,8 @@ target_link_libraries(looking-glass-obs - ) - - install(TARGETS looking-glass-obs -- LIBRARY DESTINATION ${OBS_PLUGIN_PREFIX}/${CMAKE_PROJECT_NAME}/bin/${OBS_PLUGIN_DIR} -+ # LIBRARY DESTINATION ${OBS_PLUGIN_PREFIX}/${CMAKE_PROJECT_NAME}/bin/${OBS_PLUGIN_DIR} -+ LIBRARY DESTINATION /usr/lib/obs-plugins - ) - - feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES) diff --git a/user/looking-glass/werror.patch b/user/looking-glass/werror.patch deleted file mode 100644 index 436419f..0000000 --- a/user/looking-glass/werror.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt -index 836f814..7047365 100644 ---- a/client/CMakeLists.txt -+++ b/client/CMakeLists.txt -@@ -68,7 +68,6 @@ add_compile_options( - "-Wno-unused-parameter" - "$<$:-Wstrict-prototypes>" - "$<$:-Wimplicit-fallthrough=2>" -- "-Werror" - "-Wfatal-errors" - "-ffast-math" - "-fdata-sections" -diff --git a/obs/CMakeLists.txt b/obs/CMakeLists.txt -index 0491e65..60b37ff 100644 ---- a/obs/CMakeLists.txt -+++ b/obs/CMakeLists.txt -@@ -18,7 +18,6 @@ add_feature_info(ENABLE_BACKTRACE ENABLE_BACKTRACE "Backtrace support.") - - add_compile_options( - "-Wall" -- "-Werror" - "-Wfatal-errors" - "-ffast-math" - "-fdata-sections" From fd63d1544f87fd0f122ce073022e98e851eeaa21 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 28 May 2025 15:12:39 -0400 Subject: [PATCH 223/313] ci: add cross-gen workflow --- .forgejo/bin/build.sh | 2 +- .forgejo/bin/deploy.sh | 2 +- .forgejo/bin/generate-cross.sh | 54 ++++++++++++++++++++++++ .forgejo/workflows/build-aarch64.yaml | 1 + .forgejo/workflows/build-cross.yaml | 59 +++++++++++++++++++++++++++ .forgejo/workflows/build-x86_64.yaml | 1 + 6 files changed, 117 insertions(+), 2 deletions(-) create mode 100755 .forgejo/bin/generate-cross.sh create mode 100644 .forgejo/workflows/build-cross.yaml diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh index ad5e30c..445929f 100755 --- a/.forgejo/bin/build.sh +++ b/.forgejo/bin/build.sh @@ -201,7 +201,7 @@ setup_system || die "Failed to setup system" # git no longer allows to execute in repositories owned by different users doas chown -R buildozer: . -fetch_flags="-qn" +fetch_flags="-qnu" debugging && fetch_flags="-v" git fetch $fetch_flags "$CI_MERGE_REQUEST_PROJECT_URL" \ diff --git a/.forgejo/bin/deploy.sh b/.forgejo/bin/deploy.sh index 3138b69..57afd32 100755 --- a/.forgejo/bin/deploy.sh +++ b/.forgejo/bin/deploy.sh @@ -4,7 +4,7 @@ set -eu -o pipefail readonly REPOS="backports user" -readonly BASEBRANCH=$GITHUB_BASE_REF +readonly BASEBRANCH=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME readonly TARGET_REPO=$CI_ALPINE_REPO apkgs=$(find package -type f -name "*.apk") diff --git a/.forgejo/bin/generate-cross.sh b/.forgejo/bin/generate-cross.sh new file mode 100755 index 0000000..878b25f --- /dev/null +++ b/.forgejo/bin/generate-cross.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +TARGET_RELEASE=$1 +shift +TARGET_ARCH=$@ +CURRENT_ARCH=$(cat /etc/apk/arch) + +if [ -z "$TARGET_RELEASE" ]; then + echo ">>> No target release specified, assumming edge" + TARGET_RELEASE=edge +fi +[[ "$TARGET_RELEASE" == "edge" ]] && TARGET_BRANCH=master || TARGET_BRANCH="${TARGET_RELEASE/v}-stable" + +if [[ ! -d "aports-$TARGET_RELEASE" ]]; then + echo ">>> Fetching aports for $TARGET_RELEASE" + git init aports-$TARGET_RELEASE + git -C aports-$TARGET_RELEASE remote add origin https://gitlab.alpinelinux.org/alpine/aports + git -C aports-$TARGET_RELEASE fetch --depth 1 origin $TARGET_BRANCH + git -C aports-$TARGET_RELEASE checkout $TARGET_BRANCH + [[ $? -ne 0 ]] && { echo ">>> Git fetch failed, does your release exist?"; exit; } || true +fi + +if [ -z "$TARGET_ARCH" ]; then + echo ">>> No arch specified, assuming target to all arches supported by upstream for release $TARGET_RELEASE" + TARGET_ARCH=$(cat aports-$TARGET_RELEASE/scripts/mkimg.minirootfs.sh | tr -d "\t" | awk -F "=" '{if($1=="arch"){print $2}}' | tr -d \" | sed "s| $CURRENT_ARCH||") + if [ -z "$TARGET_ARCH" ]; then + echo ">>> Could not compute arches that are supported, does your release exist?" + exit + fi +fi + +. /usr/share/abuild/functions.sh + +for arch in $TARGET_ARCH; do + if [[ "$(arch_to_hostspec $arch)" == "unknown" ]]; then + echo ">>> $arch not valid arch, please chose among the following" + sed -n '/^arch_to_hostspec/,/esac$/ {s/esac//;p;}' /usr/share/abuild/functions.sh | sed -e '/unknown/d' -e '/arch/d' -e '/case/d' -e "/$CURRENT_ARCH/d" | awk '{print $1}' | tr -d ')' + exit + fi +done + +echo ">>> Targetting $TARGET_ARCH for cross generation" + +( + cd aports-$TARGET_RELEASE/scripts + # this stops bootstrap from building the whole base system + sed -i 's|^msg "Cross building base system"|exit; msg "Cross building base system"|' bootstrap.sh + for arch in $TARGET_ARCH; do + echo ">>> Building cross-compilers for $arch" + ./bootstrap.sh $arch + [[ $? -ne 0 ]] && { echo ">>> Cross-build failure"; exit; } || true + done + echo ">>> Building done" +) diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index 0b6d800..0ff5e7c 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -40,6 +40,7 @@ jobs: image: alpine:latest env: CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} steps: diff --git a/.forgejo/workflows/build-cross.yaml b/.forgejo/workflows/build-cross.yaml new file mode 100644 index 0000000..6d770f7 --- /dev/null +++ b/.forgejo/workflows/build-cross.yaml @@ -0,0 +1,59 @@ +on: + workflow_dispatch: + inputs: + target_arch: + description: 'target arch' + required: false + type: string + +jobs: + build-cross: + runs-on: x86_64 + container: + image: alpinelinux/alpine-gitlab-ci:latest + env: + CI_PROJECT_DIR: ${{ github.workspace }} + CI_DEBUG_BUILD: ${{ runner.debug }} + CI_MERGE_REQUEST_PROJECT_URL: ${{ github.server_url }}/${{ github.repository }} + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.ref_name }} + steps: + - name: Environment setup + run: | + doas apk upgrade -a + doas apk add nodejs git patch curl bash + cd /etc/apk/keys + doas curl -JO https://ayakael.net/api/packages/forge/alpine/key + - name: Repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 500 + - name: Package build + run: | + ${{ github.workspace }}/.forgejo/bin/build.sh + ${{ github.workspace }}/.forgejo/bin/generate-cross.sh ${{ github.ref_name }} ${{ inputs.target_arch }} + mv -v /home/buildozer/packages/main ${{ github.workspace }}/packages/cross + - name: Package upload + uses: forgejo/upload-artifact@v3 + with: + name: package + path: packages + + deploy-cross: + needs: [build-cross] + runs-on: x86_64 + container: + image: alpine:latest + env: + CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.ref_name }} + FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} + FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} + steps: + - name: Setting up environment + run: apk add nodejs curl findutils git gawk + - name: Repo pull + uses: actions/checkout@v4 + - name: Package download + uses: forgejo/download-artifact@v3 + - name: Package deployment + run: ${{ github.workspace }}/.forgejo/bin/deploy.sh diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index 90c516e..ad7abb3 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -40,6 +40,7 @@ jobs: image: alpine:latest env: CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} steps: From 614aa49d499be572a2d34cfc505f58bddf37fb41 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 28 May 2025 15:43:04 -0400 Subject: [PATCH 224/313] ci: add clear-repo workflow --- .forgejo/bin/clear-repo.sh | 21 +++++++++++++-------- .forgejo/workflows/clear-repo.yml | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 .forgejo/workflows/clear-repo.yml diff --git a/.forgejo/bin/clear-repo.sh b/.forgejo/bin/clear-repo.sh index 14110ea..486321b 100755 --- a/.forgejo/bin/clear-repo.sh +++ b/.forgejo/bin/clear-repo.sh @@ -1,17 +1,22 @@ #!/bin/sh TARGET_REPO=$1 -ARCH=$2 +ARCH="x86 x86_64 armhf armv7 aarch64 ppc64le s390x mips64 riscv64 loongarch64" +for arch in $ARCH; do + # check if repo exists + wget --spider $TARGET_REPO/$arch/APKINDEX.tar.gz -o /dev/null || continue + echo ">>> Clearing repo $TARGET_REPO/$arch" -curl --silent $TARGET_REPO/$ARCH/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX + curl --silent $TARGET_REPO/$arch/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX -pkgs=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) + pkgs=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) -for pkg in $pkgs; do - pkgvers=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') - for pkgver in $pkgvers; do - echo "Deleting $pkg-$pkgver of arch $ARCH from $TARGET_REPO" - curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN -X DELETE $TARGET_REPO/$ARCH/$pkg-$pkgver.apk + for pkg in $pkgs; do + pkgvers=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') + for pkgver in $pkgvers; do + echo "Deleting $pkg-$pkgver of arch $arch from $TARGET_REPO" + curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN -X DELETE $TARGET_REPO/$arch/$pkg-$pkgver.apk + done done done diff --git a/.forgejo/workflows/clear-repo.yml b/.forgejo/workflows/clear-repo.yml new file mode 100644 index 0000000..f60f5e7 --- /dev/null +++ b/.forgejo/workflows/clear-repo.yml @@ -0,0 +1,25 @@ +on: + workflow_dispatch: + inputs: + target_repo: + description: 'target repo' + default: 'edge/user' + required: true + type: string + +jobs: + clear-repo: + runs-on: x86_64 + container: + image: alpine:latest + env: + TARGET_REPO: 'https://ayakael.net/api/packages/forge/alpine/${{ inputs.target_repo }}' + FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} + FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} + steps: + - name: Setting up environment + run: apk add nodejs curl findutils git gawk + - name: Repo pull + uses: actions/checkout@v4 + - name: Clear repo + run: ${{ github.workspace }}/.forgejo/bin/clear-repo.sh $TARGET_REPO From 97a6234e8eabfc97abb03d2550c89d2ffee40b45 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 28 May 2025 16:01:14 -0400 Subject: [PATCH 225/313] backports/electron: upgrade to 35.5.0 --- backports/electron/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index c95f43a..92270b8 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,7 +1,7 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=35.4.0 +pkgver=35.5.0 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 _chromium=134.0.6998.205 @@ -551,7 +551,7 @@ lang() { } sha512sums=" -30a116328f9a5af05b16cf85e31672407c51aef895b29441220f439d66af947272daa8e2ac88d9e4b8f7a9e0bb883932c36d2f1642fd18c5da885931c1c97fe0 electron-v35.4.0-134.0.6998.205.tar.zst +a30c115f17f9811347f8713fa604b56244e39facbbab7b6b82cbc3049ed12b429b06f2faafa8a48dd727b655753848d099ba6720fae15c9bb00e6a427dc2758e electron-v35.5.0-134.0.6998.205.tar.zst c1857b5d6975650f915f3db552666f521822b857e39958ccfb54129f3878f272deaafc3dd446bc8441a5e84f075791feeeb62841b74bb555d8c546bfe231d164 copium-134.0.tar.gz 29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch d9cc4a37a0311d23ae315a8d8124f8dbf60db8cc4a3943818638174b20387f1d770d00871f6608957b246ad956abca43c22ea0b072724287f2947e1909e47323 compiler.patch From bff91156ded7cc619738fa56f041dae98262149d Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 29 May 2025 11:18:33 -0400 Subject: [PATCH 226/313] ci: add looking-glass special case to check_ver --- .forgejo/bin/check_ver.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 3a0684e..107aec2 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -59,6 +59,9 @@ for pkg in $owned_by_you; do # special cases where package is not semantic case $pkg in + # release-monitoring omits the extra B, while we keep it but put it after the version no. + looking-glass) upstream_version="${upstream_version/b}";; + # we want to track both Firefox security upgrades + Zotero upgrades zotero) commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') downstream_fx_ver=$(curl --fail -X GET -s "https://gitlab.alpinelinux.org/alpine/aports/-/raw/$commit/community/zotero/APKBUILD" | awk -F '=' '{if($1=="_fxver"){print $2}}') @@ -69,8 +72,11 @@ for pkg in $owned_by_you; do fi upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) ;; + # aports omits the -beta part of the version freetube) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; + # we only track x.x.1xx feature branches of SDK and stage0 dotnet*sdk|dotnet*stage0) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | sed 's|-.*||' | head -n1);; + # we want to track both current major version and upstream latest electron) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/projects/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_versions' | jq -r ".[] | match(\"${downstream_version/.*}.*\").string" | head -n 1) latest_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version' ) @@ -81,7 +87,8 @@ for pkg in $owned_by_you; do pkg="$pkg(${upstream_version/.*})" fi ;; - arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n1);; + # we want to track LTS rather than latest + arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then From 3f1fd192e5f54b96cfad8d92ad241c417dabd7da Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 31 May 2025 12:35:02 -0400 Subject: [PATCH 227/313] backports/{coin,libmedc,py3-pivy,soqt,freecad}: drop due to in community --- backports/coin/APKBUILD | 36 ------- backports/coin/TestSuitePatch.patch | 11 --- backports/freecad/APKBUILD | 80 --------------- backports/freecad/no-execinfo.patch | 54 ---------- backports/libmedc/APKBUILD | 59 ----------- backports/libmedc/cmake-config-dir.patch | 11 --- backports/libmedc/hdf5-1.14.patch | 119 ----------------------- backports/libmedc/med-py3.13.patch | 26 ----- backports/libmedc/med-swig-4.3.0.patch | 59 ----------- backports/py3-pivy/APKBUILD | 37 ------- backports/soqt/APKBUILD | 31 ------ 11 files changed, 523 deletions(-) delete mode 100644 backports/coin/APKBUILD delete mode 100644 backports/coin/TestSuitePatch.patch delete mode 100644 backports/freecad/APKBUILD delete mode 100644 backports/freecad/no-execinfo.patch delete mode 100644 backports/libmedc/APKBUILD delete mode 100644 backports/libmedc/cmake-config-dir.patch delete mode 100644 backports/libmedc/hdf5-1.14.patch delete mode 100644 backports/libmedc/med-py3.13.patch delete mode 100644 backports/libmedc/med-swig-4.3.0.patch delete mode 100644 backports/py3-pivy/APKBUILD delete mode 100644 backports/soqt/APKBUILD diff --git a/backports/coin/APKBUILD b/backports/coin/APKBUILD deleted file mode 100644 index e6068c3..0000000 --- a/backports/coin/APKBUILD +++ /dev/null @@ -1,36 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: Antoine Martin (ayakael) -pkgname=coin -pkgver=4.0.3 -pkgrel=0 -pkgdesc="OpenGL OpenInventor compatible graphics library" -url="https://github.com/coin3d/coin" -license="BSD-3-Clause" -arch="all" -makedepends="boost-dev cmake glu-dev graphviz samurai" -subpackages="$pkgname-dev" -source="https://github.com/coin3d/coin/releases/download/v$pkgver/coin-$pkgver-src.tar.gz - TestSuitePatch.patch - " -builddir="$srcdir/coin" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCOIN_BUILD_TESTS=ON - cmake --build build -} - -check() { - cmake --build build --target test -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -b661bf2124b0de1b46e76a6699b0975abb3aed4dc9019bf32531c535179dc84a90fe4e19def6f6cda7b175470636040d0e58812d532198cf207296d37c539915 coin-4.0.3-src.tar.gz -aab464244b13371badf0878e5bfbcce859a42756cf8c7657d1480318aa291d296eac2741219c346bae056f761c5f46857f8fd1ec1c4129f86bc10236d3869deb TestSuitePatch.patch -" diff --git a/backports/coin/TestSuitePatch.patch b/backports/coin/TestSuitePatch.patch deleted file mode 100644 index ce484e5..0000000 --- a/backports/coin/TestSuitePatch.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./testsuite/TestSuiteUtils.cpp -+++ ./testsuite/TestSuiteUtils.cpp -@@ -39,7 +39,7 @@ - #elif defined(_WIN32) - #define USE_WIN32 - #else //_WIN32 --#error Unknown system -+#define USE_POSIX - #endif //POSIX - - #include diff --git a/backports/freecad/APKBUILD b/backports/freecad/APKBUILD deleted file mode 100644 index 7b99447..0000000 --- a/backports/freecad/APKBUILD +++ /dev/null @@ -1,80 +0,0 @@ -# Contributor: Bryce Vandegrift -# Maintainer: Bryce Vandegrift -pkgname=freecad -pkgver=1.0.1 -_ondsel_ver="09d6175a2ba69e7016fcecc4f384946a2f84f92d" -_gsl_ver="2828399820ef4928cc89b65605dca5dc68efca6e" -pkgrel=0 -pkgdesc="Open-source parametric 3D modeler" -url="https://www.freecad.org/" -# armv7, armhf, and aarch64: GL_MULTISAMPLE not declared -# s390x: blocked by opencascade-dev, vtk-dev, and freeimage-dev -# riscv64: blocked by py3-pivy, py3-pyside6, pyside6-dev, and py3-shiboken6 -arch="all !aarch64 !armhf !armv7 !s390x !riscv64" -license="LGPL-2.0-or-later" -depends="py3-pivy py3-matplotlib py3-pyside6" -makedepends=" - cmake - ninja - boost-dev - doxygen - python3-dev - xerces-c-dev - opencascade-dev - glew-dev - gtest-dev - vtk-dev - libmedc-dev - eigen-dev - coin-dev - libspnav-dev - pyside6-dev - py3-shiboken6 - py3-pivy - py3-matplotlib - swig - jsoncpp-dev - freeimage-dev - qt6-qtbase-dev - qt6-qtsvg-dev - qt6-qttools-dev - yaml-cpp-dev" -subpackages="$pkgname-doc $pkgname-dev" -options="!check" -source="$pkgname-$pkgver.tar.gz::https://github.com/FreeCAD/FreeCAD/archive/$pkgver.tar.gz - OndselSolver-$_ondsel_ver.tar.gz::https://github.com/Ondsel-Development/OndselSolver/archive/$_ondsel_ver.tar.gz - GSL-$_gsl_ver.tar.gz::https://github.com/microsoft/GSL/archive/$_gsl_ver.tar.gz - no-execinfo.patch" -builddir="$srcdir/FreeCAD-$pkgver" - -prepare() { - default_prepare - - cp -r $srcdir/OndselSolver-$_ondsel_ver/* $builddir/src/3rdParty/OndselSolver - cp -r $srcdir/GSL-$_gsl_ver/* $builddir/src/3rdParty/GSL -} - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DFREECAD_QT_VERSION=6 \ - -DFREECAD_USE_EXTERNAL_PIVY=ON \ - -DBUILD_FLAT_MESH=ON \ - -DENABLE_DEVELOPER_TESTS=OFF \ - -DBUILD_TEST=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_DATAROOTDIR=/usr/share \ - -DCMAKE_INSTALL_DATADIR=/usr/share/$pkgname - ninja -C build -} - -package() { - DESTDIR="$pkgdir" ninja -C build install -} - -sha512sums=" -69a82c0af45137079b1ce184a4a3df475c005da66b4a4cab17371a1f62432b13f721e3da8b350b3ad50125c939cdfa5fed477e0605d52bd8fcee3c528931a185 freecad-1.0.1.tar.gz -7ad78da60320a686f0734da5196ce4cba49a2ff9ecf0bcd6016a56d65c8a8f7570f2898f84c2602a454bc9ccd8ac12fd137d2a952ffb7cbd15e38350fbbd3d79 OndselSolver-09d6175a2ba69e7016fcecc4f384946a2f84f92d.tar.gz -a6d731c450da91cba34c13293cc0881a842bd90268dd5ef721ae1f48752c41dc355ebea7716a6de5b49d41568e55751c46a9dd78da4cd68656bffd33e5ee448e GSL-2828399820ef4928cc89b65605dca5dc68efca6e.tar.gz -2f190118bddbf2e070519d0244eafd15ae7919f9759f925f593ce43988a7f9ab023c50bec3768404926e8cc661e829f6a55bec5e9e58c58735c050338fbcec16 no-execinfo.patch -" diff --git a/backports/freecad/no-execinfo.patch b/backports/freecad/no-execinfo.patch deleted file mode 100644 index 9443301..0000000 --- a/backports/freecad/no-execinfo.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 9cd1f5e5b90ef2e17c61719ffdb2f6c43cbae185 Mon Sep 17 00:00:00 2001 -From: Bryce Vandegrift -Date: Sun, 24 Nov 2024 18:19:39 -0500 -Subject: [PATCH] Remove dependency on execinfo.h - ---- - .../salomesmesh/src/DriverSTL/Basics_Utils.cpp | 11 ----------- - src/App/Application.cpp | 1 - - 2 files changed, 12 deletions(-) - -diff --git a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -index 23c5083fdf..5ea06ad3f4 100644 ---- a/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -+++ b/src/3rdParty/salomesmesh/src/DriverSTL/Basics_Utils.cpp -@@ -29,7 +29,6 @@ - #ifndef WIN32 - #include - #include --#include - #endif - - -@@ -113,16 +112,6 @@ namespace Kernel_Utils - size_t size; - char **strings; - size_t i; -- -- size = backtrace (array, 40); -- strings = backtrace_symbols (array, size); -- -- for (i = 0; i < size; i++) -- { -- std::cerr << strings[i] << std::endl; -- } -- -- free (strings); - } - #else - #if (_MSC_VER >= 1400) // Visual Studio 2005 -diff --git a/src/App/Application.cpp b/src/App/Application.cpp -index 9384790627..9155c00d25 100644 ---- a/src/App/Application.cpp -+++ b/src/App/Application.cpp -@@ -1798,7 +1798,6 @@ static void freecadNewHandler () - #endif - - #if defined(FC_OS_LINUX) --#include - #include - #include - --- -2.47.0 - diff --git a/backports/libmedc/APKBUILD b/backports/libmedc/APKBUILD deleted file mode 100644 index 0bf52fc..0000000 --- a/backports/libmedc/APKBUILD +++ /dev/null @@ -1,59 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=libmedc -pkgver=5.0.0 -pkgrel=0 -pkgdesc="Open source library for numerical simulation" -url="https://www.salome-platform.org/" -arch="all" -license="GPL-3.0-or-later" -makedepends="cmake hdf5-dev swig python3-dev samurai" -options="!check" #test suite is nonfunctional with python bindings -subpackages="$pkgname-dev $pkgname-doc $pkgname-python-pyc $pkgname-python:_py" -# Upstream disappeared: -# https://www.salome-platform.org/downloads -# https://files.salome-platform.org/Salome/other/med-4.1.1.tar.gz -# -# Using a fork on GitHub by one of the FreeCAD developers instead. -# -source=" - $pkgname-$pkgver.tar.gz::https://github.com/chennes/med/archive/refs/tags/v$pkgver.tar.gz - cmake-config-dir.patch - hdf5-1.14.patch - med-swig-4.3.0.patch - med-py3.13.patch - " -builddir="$srcdir/med-$pkgver" - -build() { - cmake -B build -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_SKIP_RPATH=ON \ - -DMEDFILE_BUILD_PYTHON=ON \ - -DMEDFILE_BUILD_TESTS=OFF - cmake --build build -} - -check() { - cd build - HDF5_DISABLE_VERSION_CHECK=1 LD_LIBRARY_PATH="$srcdir"/build/src ctest -E '._Python' --output-on-failure -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -_py() { - pkgdesc="Python bindings for libmedc" - depends="python3" - amove usr/lib/python3* -} - -sha512sums=" -6ebb06bf403dbe32512a42179a42de3da6f264034fcc143fcb2b780c5d564527656d3ef28ebf25d7bde93a9d2a44df0d10a09d60e6f4720ba9d25719a4e30d37 libmedc-5.0.0.tar.gz -8d0f58cd67d205fbacaff0e6da76e2ee5473457b478ede13a551ebe5853c0716c7406b74c3792e1ace33a34d352fccca8dd2940f063a7c060a12529d060a991a cmake-config-dir.patch -78bfbd17a052c039244ce314d53b0d5e5e6ba6773fe7a836999bf7ddf4b6d732dfda95c58681dd9d7e9586e4d36d3dfe7cca15d45fa7d3d453aef72423fcd5c0 hdf5-1.14.patch -833187253fcbebb13f239f1f559333db6a7d3ef87c4f7b896f64970a3e553735ed01a82d6d4a368a2261e33e364b05ea3abbff3fd58c8221515aa72aa52684a7 med-swig-4.3.0.patch -6c993d924257a01b8bce1952ecc34346ab654a103f4374d514c3616cd6cdf94373b2a4d04b91a68933cd5acbc4fc54becab6bd58f32762973bbee8255c5d7a3d med-py3.13.patch -" diff --git a/backports/libmedc/cmake-config-dir.patch b/backports/libmedc/cmake-config-dir.patch deleted file mode 100644 index e1f43a4..0000000 --- a/backports/libmedc/cmake-config-dir.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -101,7 +101,7 @@ - IF(WIN32 AND NOT CYGWIN) - SET(INSTALL_CMAKE_CONFIG_DIR cmake) - ELSE() -- SET(INSTALL_CMAKE_CONFIG_DIR share/cmake/medfile-${MED_STR_VERSION}) -+ SET(INSTALL_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/medfile-${MED_STR_VERSION}) - ENDIF() - SET(INSTALL_INCLUDE_DIR include) - diff --git a/backports/libmedc/hdf5-1.14.patch b/backports/libmedc/hdf5-1.14.patch deleted file mode 100644 index 6202f74..0000000 --- a/backports/libmedc/hdf5-1.14.patch +++ /dev/null @@ -1,119 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/hdf5-1.14.patch - -diff -rupN --no-dereference med-5.0.0/config/cmake_files/medMacros.cmake med-5.0.0-new/config/cmake_files/medMacros.cmake ---- med-5.0.0/config/cmake_files/medMacros.cmake 2025-01-24 00:28:04.460898497 +0100 -+++ med-5.0.0-new/config/cmake_files/medMacros.cmake 2025-01-24 00:28:04.857640862 +0100 -@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5) - ## - ## Requires 1.12.x version - ## -- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 12 OR NOT HDF_VERSION_RELEASE_REF GREATER 0) -+ IF (HDF5_VERSION VERSION_LESS 1.12.1) - MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.12.1 are supported.") - ENDIF() - ## -diff -rupN --no-dereference med-5.0.0/src/ci/MEDfileCompatibility.c med-5.0.0-new/src/ci/MEDfileCompatibility.c ---- med-5.0.0/src/ci/MEDfileCompatibility.c 2023-06-05 14:14:44.000000000 +0200 -+++ med-5.0.0-new/src/ci/MEDfileCompatibility.c 2025-01-24 00:28:04.858068408 +0100 -@@ -116,7 +116,7 @@ MEDfileCompatibility(const char* const f - #if MED_NUM_MAJEUR != 5 - #error "Don't forget to update the test version here when you change the major version of the library !" - #endif --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !" - #error "Cf. _MEDfileCreate ..." - #endif -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileCreate.c med-5.0.0-new/src/hdfi/_MEDfileCreate.c ---- med-5.0.0/src/hdfi/_MEDfileCreate.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDfileCreate.c 2025-01-24 00:28:04.858334666 +0100 -@@ -189,7 +189,7 @@ med_idt _MEDfileCreate(const char * cons - * Cette ligne est censée obliger HDF à ne pas utiliser un modèle interne différent de 1.10.z - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileOpen.c med-5.0.0-new/src/hdfi/_MEDfileOpen.c ---- med-5.0.0/src/hdfi/_MEDfileOpen.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDfileOpen.c 2025-01-24 00:28:04.858574380 +0100 -@@ -113,7 +113,7 @@ med_idt _MEDfileOpen(const char * const - has been set in the group creation property list (see H5Pset_link_creation_order). - */ - --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - /* L'avantage de bloquer le modèle interne HDF5 -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDfileOpenForImport.c med-5.0.0-new/src/hdfi/_MEDfileOpenForImport.c ---- med-5.0.0/src/hdfi/_MEDfileOpenForImport.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDfileOpenForImport.c 2025-01-24 00:28:04.858834390 +0100 -@@ -53,7 +53,7 @@ med_idt _MEDfileOpenForImport(const cha - } - - --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - /* L'avantage de bloquer le modèle interne HDF5 -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDmemFileOpen.c med-5.0.0-new/src/hdfi/_MEDmemFileOpen.c ---- med-5.0.0/src/hdfi/_MEDmemFileOpen.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDmemFileOpen.c 2025-01-24 00:28:04.859128966 +0100 -@@ -439,7 +439,7 @@ med_idt _MEDmemFileOpen(const char * con - goto ERROR; - } - --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_V112, H5F_LIBVER_V112 ) ) { -@@ -506,7 +506,7 @@ med_idt _MEDmemFileOpen(const char * con - goto ERROR; - } - _fversionMM = 100*_fmajor+10*_fminor; --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( _fversionMM < 500 ) { /*100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR*/ -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDparFileCreate.c med-5.0.0-new/src/hdfi/_MEDparFileCreate.c ---- med-5.0.0/src/hdfi/_MEDparFileCreate.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDparFileCreate.c 2025-01-24 00:28:04.859422685 +0100 -@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c - * En HDF5-1.10.0p1 cela n'a aucun effet ! - * Un test autoconf permet de fixer un intervalle de version HDF à MED. - */ --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - -diff -rupN --no-dereference med-5.0.0/src/hdfi/_MEDparFileOpen.c med-5.0.0-new/src/hdfi/_MEDparFileOpen.c ---- med-5.0.0/src/hdfi/_MEDparFileOpen.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/hdfi/_MEDparFileOpen.c 2025-01-24 00:28:04.859632596 +0100 -@@ -86,7 +86,7 @@ med_idt _MEDparFileOpen(const char * con - } - _fversionMM = 100*_fmajor+10*_fminor; - --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - if ( _fversionMM < 500 ) { /*100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR*/ -diff -rupN --no-dereference med-5.0.0/src/misc/MEDversionedApi3C.c med-5.0.0-new/src/misc/MEDversionedApi3C.c ---- med-5.0.0/src/misc/MEDversionedApi3C.c 2023-06-05 14:14:45.000000000 +0200 -+++ med-5.0.0-new/src/misc/MEDversionedApi3C.c 2025-01-24 00:28:04.859890990 +0100 -@@ -114,7 +114,7 @@ MedFuncType _MEDversionedApi3( const cha - /* (_fversionMM <= (100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR) ) */ - /* ) { */ - --#if H5_VERS_MINOR > 12 -+#if H5_VERS_MINOR > 14 - #error "Don't forget to change the compatibility version of the library !" - #endif - diff --git a/backports/libmedc/med-py3.13.patch b/backports/libmedc/med-py3.13.patch deleted file mode 100644 index 164daf0..0000000 --- a/backports/libmedc/med-py3.13.patch +++ /dev/null @@ -1,26 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/med-swig-4.3.0.patch - -diff -rupN --no-dereference med-5.0.0/python/med_enumtest_typemap.i med-5.0.0-new/python/med_enumtest_typemap.i ---- med-5.0.0/python/med_enumtest_typemap.i 2023-03-07 15:20:57.000000000 +0100 -+++ med-5.0.0-new/python/med_enumtest_typemap.i 2025-01-24 00:28:04.465816239 +0100 -@@ -128,7 +128,7 @@ public: - if (pclass == NULL) printf("%s\n","Can't get class $1_basetype"); - Py_DECREF(pmod); - pargs = Py_BuildValue("(i)",*$1); -- pinst = PyEval_CallObject(pclass, pargs); -+ pinst = PyObject_CallObject(pclass, pargs); - if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); - $result=SWIG_Python_AppendOutput($result, pinst); - } -diff -rupN --no-dereference med-5.0.0/python/med_enum_typemap.i med-5.0.0-new/python/med_enum_typemap.i ---- med-5.0.0/python/med_enum_typemap.i 2023-03-07 15:20:57.000000000 +0100 -+++ med-5.0.0-new/python/med_enum_typemap.i 2025-01-24 00:28:04.466146326 +0100 -@@ -109,7 +109,7 @@ Type.__repr__= lambda self: #Type +"("+s - if (pclass == NULL) printf("%s\n","Can't get class $1_basetype"); - Py_DECREF(pmod); - pargs = Py_BuildValue("(i)",*$1); -- pinst = PyEval_CallObject(pclass, pargs); -+ pinst = PyObject_CallObject(pclass, pargs); - if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); - $result=SWIG_Python_AppendOutput($result, pinst); - } diff --git a/backports/libmedc/med-swig-4.3.0.patch b/backports/libmedc/med-swig-4.3.0.patch deleted file mode 100644 index e9dcb5e..0000000 --- a/backports/libmedc/med-swig-4.3.0.patch +++ /dev/null @@ -1,59 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/med/raw/rawhide/f/med-py3.13.patch - -diff -rupN --no-dereference med-5.0.0/python/med_array_typemap.i med-5.0.0-new/python/med_array_typemap.i ---- med-5.0.0/python/med_array_typemap.i 2023-03-07 15:20:57.000000000 +0100 -+++ med-5.0.0-new/python/med_array_typemap.i 2025-01-24 00:28:05.257751237 +0100 -@@ -181,7 +181,7 @@ Type.__repr__= lambda self: #Type +"("+s - // TypeMed * const ParamName : OUT 2/4 (l'allocation Type est faite ds Python) - %typemap(freearg) TypeMed * const ParamName { - Py_INCREF(o$argnum); -- $result=SWIG_Python_AppendOutput($result, o$argnum); -+ $result=SWIG_AppendOutput($result, o$argnum); - } - // TypeMed * const (OUT) 3/4 - // pour ne pas activer un out du TypeMed * const (par sécurité) -@@ -290,7 +290,7 @@ Type.__repr__= lambda self: #Type +"("+s - // unsigned char * const : OUT 2/4 (l'allocation Type est faite ds Python) - %typemap(freearg) unsigned char * const { - Py_INCREF(o$argnum); -- $result=SWIG_Python_AppendOutput($result, o$argnum); -+ $result=SWIG_AppendOutput($result, o$argnum); - } - // unsigned char * const (OUT) 3/4 - // pour ne pas activer un out du unsigned char * const (par sécurité) -diff -rupN --no-dereference med-5.0.0/python/med_bool_typemap.i med-5.0.0-new/python/med_bool_typemap.i ---- med-5.0.0/python/med_bool_typemap.i 2023-03-07 15:20:57.000000000 +0100 -+++ med-5.0.0-new/python/med_bool_typemap.i 2025-01-24 00:28:05.257993234 +0100 -@@ -22,7 +22,7 @@ - /* Py_DECREF(o2); */ - /* Py_DECREF(o3); */ - /* } */ -- $result=SWIG_Python_AppendOutput($result, o); -+ $result=SWIG_AppendOutput($result, o); - } - - %typemap(in,numinputs=0) med_bool *(med_bool temp) { -diff -rupN --no-dereference med-5.0.0/python/med_enumtest_typemap.i med-5.0.0-new/python/med_enumtest_typemap.i ---- med-5.0.0/python/med_enumtest_typemap.i 2025-01-24 00:28:04.853403794 +0100 -+++ med-5.0.0-new/python/med_enumtest_typemap.i 2025-01-24 00:28:05.258210585 +0100 -@@ -130,7 +130,7 @@ public: - pargs = Py_BuildValue("(i)",*$1); - pinst = PyObject_CallObject(pclass, pargs); - if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); -- $result=SWIG_Python_AppendOutput($result, pinst); -+ $result=SWIG_AppendOutput($result, pinst); - } - - %typemap(in,numinputs=0) TypeEnum * (TypeEnum temp) { -diff -rupN --no-dereference med-5.0.0/python/med_enum_typemap.i med-5.0.0-new/python/med_enum_typemap.i ---- med-5.0.0/python/med_enum_typemap.i 2025-01-24 00:28:04.853741870 +0100 -+++ med-5.0.0-new/python/med_enum_typemap.i 2025-01-24 00:28:05.258385775 +0100 -@@ -111,7 +111,7 @@ Type.__repr__= lambda self: #Type +"("+s - pargs = Py_BuildValue("(i)",*$1); - pinst = PyObject_CallObject(pclass, pargs); - if (pinst == NULL) printf("%s\n","Can't instanciate class $1_basetype"); -- $result=SWIG_Python_AppendOutput($result, pinst); -+ $result=SWIG_AppendOutput($result, pinst); - } - - %typemap(in,numinputs=0) TypeEnum * (TypeEnum temp) { diff --git a/backports/py3-pivy/APKBUILD b/backports/py3-pivy/APKBUILD deleted file mode 100644 index 300d9e7..0000000 --- a/backports/py3-pivy/APKBUILD +++ /dev/null @@ -1,37 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: -pkgname=py3-pivy -pkgver=0.6.9 -pkgrel=2 -pkgdesc="Python3 bindings for coin" -url="https://github.com/coin3d/pivy" -# riscv64 blocked by py3-pyside6 -# armhf blocked by qt6-qtdeclarative -> py3-pyside6 -arch="all !riscv64 !armhf" -license="ISC" -depends="py3-pyside6" -makedepends="swig soqt-dev qt6-qtbase-dev python3-dev glu-dev cmake samurai" -checkdepends="py3-pytest" -options="!check" # test suite is interactive and requires full installation -source="$pkgname-$pkgver.tar.gz::https://github.com/coin3d/pivy/archive/refs/tags/${pkgver//_alpha/.a}.tar.gz" -builddir="$srcdir/pivy-${pkgver//_alpha/.a}" - -build() { - if [ "$CBUILD" != "$CHOST" ]; then - CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux" - fi - cmake -B build -G Ninja \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DBUILD_SHARED_LIBS=True \ - -DCMAKE_BUILD_TYPE=None \ - $CMAKE_CROSSOPTS - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -fd9587c69ad7468b771fbae59e68620f67a3c20850edadd65bf7994c1789d3444feb419e65dce34c6ee897c98eaca9f2f29f0bbfb4d1f0bbde26e4db56f74f78 py3-pivy-0.6.9.tar.gz -" diff --git a/backports/soqt/APKBUILD b/backports/soqt/APKBUILD deleted file mode 100644 index b96f3dd..0000000 --- a/backports/soqt/APKBUILD +++ /dev/null @@ -1,31 +0,0 @@ -# Contributor: Aiden Grossman -# Maintainer: Antoine Martin (ayakael) -pkgname=soqt -pkgver=1.6.3 -pkgrel=0 -pkgdesc="GUI binding library for coin" -url="https://github.com/coin3d/soqt" -arch="all" -license="BSD-3-Clause" -makedepends="coin-dev cmake mesa-dev samurai qt5-qtbase-dev doxygen" -options="!check" # test suite consists only of interactive programs -subpackages="$pkgname-dev $pkgname-doc" -source="https://github.com/coin3d/soqt/releases/download/v$pkgver/soqt-$pkgver-src.tar.gz" -builddir="$srcdir/$pkgname" - -build() { - cmake -B build -G Ninja . \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_BUILD_TYPE=None \ - -DSOQT_BUILD_DOCUMENTATION=ON \ - -DSOQT_BUILD_DOC_MAN=ON - cmake --build build -} - -package() { - DESTDIR="$pkgdir" cmake --install build -} - -sha512sums=" -8cef22cf4214dd03bb4639c1fff77c127bf80f99e3b7fb7c1c21c25a281aa484252414f4a48fa59b8b2485afe7920ce9e86366fd1343badc77b75b78d3ac4c53 soqt-1.6.3-src.tar.gz -" From 7b106bae0caeae93bb41aec73e8b45a9c370304e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 31 May 2025 12:36:51 -0400 Subject: [PATCH 228/313] backports/py3-{dateparser,flask-limiter,limits,pathvalidate}: drop to unneeded --- backports/py3-dateparser/APKBUILD | 65 ------------------- backports/py3-flask-limiter/APKBUILD | 55 ---------------- .../our-std-is-good-enough.patch | 22 ------- backports/py3-limits/APKBUILD | 58 ----------------- .../py3-limits/our-std-is-good-enough.patch | 11 ---- .../tests-drop-etcd3-and-k-argument.patch | 24 ------- backports/py3-pathvalidate/APKBUILD | 37 ----------- 7 files changed, 272 deletions(-) delete mode 100644 backports/py3-dateparser/APKBUILD delete mode 100644 backports/py3-flask-limiter/APKBUILD delete mode 100644 backports/py3-flask-limiter/our-std-is-good-enough.patch delete mode 100644 backports/py3-limits/APKBUILD delete mode 100644 backports/py3-limits/our-std-is-good-enough.patch delete mode 100644 backports/py3-limits/tests-drop-etcd3-and-k-argument.patch delete mode 100644 backports/py3-pathvalidate/APKBUILD diff --git a/backports/py3-dateparser/APKBUILD b/backports/py3-dateparser/APKBUILD deleted file mode 100644 index 17b905e..0000000 --- a/backports/py3-dateparser/APKBUILD +++ /dev/null @@ -1,65 +0,0 @@ -maintainer="Hoang Nguyen " -pkgname=py3-dateparser -_pyname=${pkgname#py3-} -pkgver=1.2.0 -pkgrel=0 -pkgdesc="Python parser for human readable dates" -url="https://github.com/scrapinghub/dateparser" -arch="noarch" -license="BSD-3-Clause" -depends=" - python3 - py3-dateutil - py3-regex - py3-tz - py3-tzlocal - " -makedepends=" - py3-gpep517 - py3-setuptools - py3-wheel - " -checkdepends=" - py3-fasttext - py3-gitpython - py3-langdetect - py3-parameterized - py3-parsel - py3-pytest - py3-requests - py3-ruamel.yaml - " -subpackages="$pkgname-pyc" -source="$pkgname-$pkgver.tar.gz::https://github.com/scrapinghub/dateparser/archive/refs/tags/v$pkgver.tar.gz" -builddir="$srcdir/$_pyname-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - # test_relative_base_setting_2_en fails due to tzinfo mismatch - # test_custom_language_detect_fast_text fails due to wrong file format - _test_filter="not test_parsing_date_should_fail_using_datetime_strptime_if_locale_is_non_english \ - and not test_relative_base_setting_2_en and not test_custom_language_detect_fast_text" - - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - - # test_hijri.py: needs hijri_converter, test_jalali.py: convertdate - .testenv/bin/python3 -m pytest tests \ - -k "$_test_filter" \ - --ignore tests/test_hijri.py \ - --ignore tests/test_jalali.py -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -2d37115f25c2076c4521b77b89ef1cff3cd0a5233c45beb00d78a5c9b1a384dcd993ff7cdd1f77db95a53ce566cf7d709d46ffa2e63eb468ac954fda178a5b6e py3-dateparser-1.2.0.tar.gz -" diff --git a/backports/py3-flask-limiter/APKBUILD b/backports/py3-flask-limiter/APKBUILD deleted file mode 100644 index cd15f22..0000000 --- a/backports/py3-flask-limiter/APKBUILD +++ /dev/null @@ -1,55 +0,0 @@ -# Contributor: lauren n. liberda -maintainer="lauren n. liberda " -pkgname=py3-flask-limiter -pkgver=3.10.1 -pkgrel=0 -pkgdesc="Rate Limiting extension for Flask" -url="https://github.com/alisaifee/flask-limiter" -arch="noarch" -license="MIT" -depends=" - py3-flask - py3-limits - py3-ordered-set - py3-rich - python3 - " -makedepends="py3-setuptools py3-gpep517" -checkdepends=" - py3-flask-restful - py3-flask-restx - py3-limits-mongodb - py3-limits-redis - py3-pytest - py3-pytest-cov - " -subpackages="$pkgname-pyc" -source=" - https://github.com/alisaifee/flask-limiter/archive/refs/tags/$pkgver/flask-limiter-$pkgver.tar.gz - - our-std-is-good-enough.patch - " -builddir="$srcdir/flask-limiter-$pkgver" -options="!check" # tests depend on unpackaged modules - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -a0d3af6f93d4283309d6df46ddb7fed4c358bbc712c2bd9e6897362c6d086c395cb9587c3d9da283ad757b574fd8c09d909f3c4b76d02ae8aade3e61dbea6aa0 flask-limiter-3.10.1.tar.gz -1b90e9134076cda249695d5ea741db9d205a2ae452c7d6edfe01eb37a221ce6f64b0e8ddcdbbee9b0e0fb16a28e5eabf14f1c1e41e965c7e3b93ea4f42caf553 our-std-is-good-enough.patch -" diff --git a/backports/py3-flask-limiter/our-std-is-good-enough.patch b/backports/py3-flask-limiter/our-std-is-good-enough.patch deleted file mode 100644 index 664143f..0000000 --- a/backports/py3-flask-limiter/our-std-is-good-enough.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ./flask_limiter/typing.py.orig -+++ ./flask_limiter/typing.py -@@ -11,7 +11,7 @@ - cast, - ) - --from typing_extensions import ParamSpec -+from typing import ParamSpec - - R = TypeVar("R") - P = ParamSpec("P") ---- ./flask_limiter/commands.py.orig -+++ ./flask_limiter/commands.py -@@ -14,7 +14,7 @@ - from rich.table import Table - from rich.theme import Theme - from rich.tree import Tree --from typing_extensions import TypedDict -+from typing import TypedDict - from werkzeug.exceptions import MethodNotAllowed, NotFound - from werkzeug.routing import Rule - diff --git a/backports/py3-limits/APKBUILD b/backports/py3-limits/APKBUILD deleted file mode 100644 index af4516d..0000000 --- a/backports/py3-limits/APKBUILD +++ /dev/null @@ -1,58 +0,0 @@ -# Contributor: lauren n. liberda -# Maintainer: lauren n. liberda -pkgname=py3-limits -pkgver=3.14.1 -pkgrel=0 -pkgdesc="Rate limiting using various strategies and storage backends such as redis & memcached" -url="https://github.com/alisaifee/limits" -arch="noarch" -license="MIT" -depends=" - py3-deprecated - python3 - " -makedepends="py3-setuptools py3-gpep517" -checkdepends=" - py3-flaky - py3-mongo - py3-pytest - py3-pytest-asyncio - py3-pytest-benchmark - py3-pytest-cov - py3-pytest-lazy-fixtures - py3-pymemcache - py3-redis - " -subpackages="$pkgname-pyc" -source=" - https://github.com/alisaifee/limits/archive/refs/tags/$pkgver/limits-$pkgver.tar.gz - - our-std-is-good-enough.patch - tests-drop-etcd3-and-k-argument.patch - " -builddir="$srcdir/limits-$pkgver" - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl - .testenv/bin/python3 -m pytest -W ignore::DeprecationWarning \ - -m 'not benchmark and not etcd and not integration and not memcached' \ - -k 'not aio and not Storage and not strategy' -v -} - -package() { - gpep517 install-wheel --destdir "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -f30c7ec19c2d1edad9ed77dc590ae35717efa3956a4d97e465793e1923a4af08dc9921d90ee95d3c54ce3364b867ca67a9de62c61d627e07a3f50da20bdabd0f limits-3.14.1.tar.gz -271e3b0501f9f144eda8d2e96c93b285714e339b9217385e38cdbce1f4dec88f9c949e9419f8be94885092e7977f7dca29b86b5499e9fead678b42a686c337db our-std-is-good-enough.patch -e84f4db49349a6feba0f701b9d4357c5f66d64c4a23f8ce512528b0f44b5bbef55041c02d92aae3a4cc8d5340846f9e909217beb869a5aeb49df166dd29ae9e3 tests-drop-etcd3-and-k-argument.patch -" diff --git a/backports/py3-limits/our-std-is-good-enough.patch b/backports/py3-limits/our-std-is-good-enough.patch deleted file mode 100644 index 32d7d73..0000000 --- a/backports/py3-limits/our-std-is-good-enough.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./limits/typing.py.orig -+++ ./limits/typing.py -@@ -13,7 +13,7 @@ - Union, - ) - --from typing_extensions import ClassVar, Counter, ParamSpec, Protocol, TypeAlias -+from typing import ClassVar, Counter, ParamSpec, Protocol, TypeAlias - - Serializable = Union[int, str, float] - diff --git a/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch b/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch deleted file mode 100644 index cab3a06..0000000 --- a/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/tests/conftest.py.orig b/tests/conftest.py -index 2aeb758dda6..a9b2b8b2bd1 100644 ---- a/tests/conftest.py.orig -+++ b/tests/conftest.py -@@ -3,7 +3,6 @@ import platform - import socket - import time - --import etcd3 - import pymemcache - import pymemcache.client - import pymongo -diff --git a/pytest.ini.orig b/pytest.ini -index 38c40a713d0..8c6659e21c2 100644 ---- a/pytest.ini.orig -+++ b/pytest.ini -@@ -17,7 +17,6 @@ addopts = - -rfEsxX - --cov=limits - -m "not benchmark" -- -K - filterwarnings = - error - module::ResourceWarning diff --git a/backports/py3-pathvalidate/APKBUILD b/backports/py3-pathvalidate/APKBUILD deleted file mode 100644 index 94d2053..0000000 --- a/backports/py3-pathvalidate/APKBUILD +++ /dev/null @@ -1,37 +0,0 @@ -# Contributor: lauren n. liberda -# Maintainer: lauren n. liberda -pkgname=py3-pathvalidate -pkgver=3.2.3 -pkgrel=0 -pkgdesc="Python library to sanitize/validate a string such as filenames/file-paths/etc" -url="https://github.com/thombashi/pathvalidate" -arch="noarch" -license="MIT" -depends="python3" -makedepends=" - py3-gpep517 - py3-setuptools - py3-setuptools_scm - py3-wheel - " -checkdepends="py3-pytest py3-click py3-faker" -options="!check" # tests require unpackaged unmaintained dependencies -subpackages="$pkgname-pyc" -source="https://github.com/thombashi/pathvalidate/archive/refs/tags/v$pkgver/pathvalidate-$pkgver.tar.gz" -builddir="$srcdir/pathvalidate-$pkgver" - -build() { - export SETUPTOOLS_SCM_PRETEND_VERSION="$pkgver" - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/*.whl -} - -sha512sums=" -674cddcf94d4f03aff5fe968c4c678f6fa510c8ff4dfd9232b2b075ccfaa17de86a08d497c10664399694c5e72b354d452d75f11f6b40d2f9778a2466af0b265 pathvalidate-3.2.3.tar.gz -" From f2ad704226c692c1e790245c52591991a6983463 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:08:38 -0400 Subject: [PATCH 229/313] ci: add checks for pmos --- .forgejo/bin/check_ver.sh | 10 +++++++++- .forgejo/workflows/check-pmos.yml | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 .forgejo/workflows/check-pmos.yml diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 107aec2..0f3f3a9 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -25,6 +25,7 @@ repo=${downstream/*\/} release=${downstream/\/$repo/} release=${release/*\/} release=${release/v} +arch=$(apk --print-arch) is_semantic() { local downstream_version_dot=${1//[^.]} @@ -34,8 +35,9 @@ is_semantic() { return 1 } + echo "Checking $downstream for out of date packages" -curl --silent $downstream/x86_64/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX +curl --silent $downstream/$arch/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX if [ "$ALL_PACKAGES" == "true" ]; then owned_by_you=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) @@ -89,6 +91,12 @@ for pkg in $owned_by_you; do ;; # we want to track LTS rather than latest arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; + # also tags releases that we can omit + linux-radxa) upstream_version=${upstream_version/-*};; + # track linux-rpi + linux-clockworkpi-uconsole-rpi) + upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) + upstream_version=${upstream_version/-*} *) # continues when package version scheme is not semantic, but minor_only or fix_only is set if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml new file mode 100644 index 0000000..d37db60 --- /dev/null +++ b/.forgejo/workflows/check-pmos.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-community-pmos: + name: Check pmos(edge) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: http://mirror.postmarketos.org/postmarketos/master + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 14 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From 3611b942ed58d582e8f5387139e7e4c6636aaf9a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:09:58 -0400 Subject: [PATCH 230/313] ci: check_ver lint --- .forgejo/bin/check_ver.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 0f3f3a9..b63220e 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -97,6 +97,7 @@ for pkg in $owned_by_you; do linux-clockworkpi-uconsole-rpi) upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) upstream_version=${upstream_version/-*} + ;; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then From 3da0a268ee319ccbf15289f00dc543a552ca1966 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:12:56 -0400 Subject: [PATCH 231/313] ci: add additional package feature and track linux-clockworkpi-uconsole-rpi --- .forgejo/bin/check_ver.sh | 4 ++++ .forgejo/workflows/check-pmos.yml | 1 + 2 files changed, 5 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index b63220e..46e3e48 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -19,6 +19,7 @@ # optional env variables # ALL_PACKAGES: when true, ignore is package is owned by me # skip_package: array of packages to skip +# add_package: array of additional packages to check # repo=${downstream/*\/} @@ -47,6 +48,9 @@ else echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages owned by you" fi +# add additionnal packages +owned_by_you="$owned_by_you $add_package" + rm -f out_of_date not_in_anitya for pkg in $owned_by_you; do diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index d37db60..fc10d52 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -14,6 +14,7 @@ jobs: downstream: http://mirror.postmarketos.org/postmarketos/master ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 14 + add_package: linux-clockworkpi-uconsole-rpi steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 7a2ebe9cfedba6c6b5741b1912753afd627f90fa Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:15:57 -0400 Subject: [PATCH 232/313] ci: skip my device packages --- .forgejo/workflows/check-pmos.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index fc10d52..ce3db67 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -15,6 +15,7 @@ jobs: ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 14 add_package: linux-clockworkpi-uconsole-rpi + skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From d746dda5cbb10542ba4cf476aa77722ce0e8f5a8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:34:11 -0400 Subject: [PATCH 233/313] ci: override repo_name --- .forgejo/bin/check_ver.sh | 4 +++- .forgejo/workflows/check-pmos.yml | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 46e3e48..8a88afb 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -20,12 +20,14 @@ # ALL_PACKAGES: when true, ignore is package is owned by me # skip_package: array of packages to skip # add_package: array of additional packages to check +# repo_name: override repo name # repo=${downstream/*\/} release=${downstream/\/$repo/} release=${release/*\/} release=${release/v} +[ -n "$repo_name" ] && repo=$repo_name arch=$(apk --print-arch) is_semantic() { @@ -99,7 +101,7 @@ for pkg in $owned_by_you; do linux-radxa) upstream_version=${upstream_version/-*};; # track linux-rpi linux-clockworkpi-uconsole-rpi) - upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) + upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) upstream_version=${upstream_version/-*} ;; *) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index ce3db67..f6a98ca 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -16,6 +16,7 @@ jobs: LABEL_NUMBER: 14 add_package: linux-clockworkpi-uconsole-rpi skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote + repo_name: pmos steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From eea9bc1537551b223150c1a8740a64bcd7da9339 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 15:41:29 -0400 Subject: [PATCH 234/313] ci: remove repo_name add special case handling of repo name for postmarketos --- .forgejo/bin/check_ver.sh | 5 +++-- .forgejo/workflows/check-pmos.yml | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 8a88afb..5634b74 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -20,14 +20,15 @@ # ALL_PACKAGES: when true, ignore is package is owned by me # skip_package: array of packages to skip # add_package: array of additional packages to check -# repo_name: override repo name # repo=${downstream/*\/} release=${downstream/\/$repo/} release=${release/*\/} release=${release/v} -[ -n "$repo_name" ] && repo=$repo_name +# add special case for postmarketos +[ "$release" == "postmarketos" ] && { release=$repo; repo="pmos"; } +[ "$release" == "master" ] && release=edge arch=$(apk --print-arch) is_semantic() { diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index f6a98ca..ce3db67 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -16,7 +16,6 @@ jobs: LABEL_NUMBER: 14 add_package: linux-clockworkpi-uconsole-rpi skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote - repo_name: pmos steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From edac436331b683c7fbb5e03c11312646c7c5ad02 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 20:10:29 -0400 Subject: [PATCH 235/313] ci: fix check community workflow --- .forgejo/workflows/check-community.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 8c5f3c5..8a88ce8 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -31,11 +31,11 @@ jobs: container: image: alpine:latest env: - downstream: https://dl-cdn.alpinelinux.org/alpine/3.22/community + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all - skip_package: dotnet9-stage0 dotnet8-stage0 + skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 7c780b5d0f96e0c53c5a92a0764cf4f9d64eb09e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 8 Jun 2025 20:17:25 -0400 Subject: [PATCH 236/313] ci: fix special case for looking-glass --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 5634b74..c65799b 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -69,7 +69,7 @@ for pkg in $owned_by_you; do # special cases where package is not semantic case $pkg in # release-monitoring omits the extra B, while we keep it but put it after the version no. - looking-glass) upstream_version="${upstream_version/b}";; + looking-glass) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1)b";; # we want to track both Firefox security upgrades + Zotero upgrades zotero) commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') From 923797f1b99aae642908c41f39bf0d5e86907d7f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 9 Jun 2025 11:35:23 -0400 Subject: [PATCH 237/313] ci: fix special case for linux-radxa --- .forgejo/bin/check_ver.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index c65799b..f1d5772 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -99,7 +99,10 @@ for pkg in $owned_by_you; do # we want to track LTS rather than latest arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; # also tags releases that we can omit - linux-radxa) upstream_version=${upstream_version/-*};; + linux-radxa) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) + upstream_version=${upstream_version/-*} + ;; # track linux-rpi linux-clockworkpi-uconsole-rpi) upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) From f7e711f9a128f9ce745bf4a97f6a2b00f16e1325 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 14 Jun 2025 23:25:52 -0400 Subject: [PATCH 238/313] ci: do not track linux-clockworkpi-uconsole-rpi --- .forgejo/workflows/check-pmos.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index ce3db67..d7dbcc0 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -14,7 +14,6 @@ jobs: downstream: http://mirror.postmarketos.org/postmarketos/master ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 14 - add_package: linux-clockworkpi-uconsole-rpi skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote steps: - name: Environment setup From 5ea7fbce202b31f2a9f85cd1e85e5cafbe6dca00 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 15 Jun 2025 00:29:52 -0400 Subject: [PATCH 239/313] ci: track linux-pine64-pinenote and linux-radxa --- .forgejo/bin/check_ver.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index f1d5772..6832045 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -103,11 +103,15 @@ for pkg in $owned_by_you; do upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) upstream_version=${upstream_version/-*} ;; - # track linux-rpi - linux-clockworkpi-uconsole-rpi) - upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/main/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-rpi$/,/^$/p" | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) + # track linux-pine64-pinenote against linux-edge + linux-pine64-pinenote) + upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/community/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-edge$/,/^$/p" | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) upstream_version=${upstream_version/-*} ;; + # track linux-radxa against 6.1 SLTS + linux-radxa) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000"| jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[] | match($downstream_version).string' | head -n1) + ;; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then From a48dd2cc708b91e8e12480f7980337bb242459e1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 15 Jun 2025 00:47:10 -0400 Subject: [PATCH 240/313] ci: fix linux kernel tracking --- .forgejo/bin/check_ver.sh | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 6832045..b7b3885 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -98,17 +98,12 @@ for pkg in $owned_by_you; do ;; # we want to track LTS rather than latest arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; - # also tags releases that we can omit - linux-radxa) - upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) - upstream_version=${upstream_version/-*} - ;; - # track linux-pine64-pinenote against linux-edge + # track linux-pine64-pinenote against latest linux-pine64-pinenote) - upstream_version=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/edge/community/aarch64/APKINDEX.tar.gz | tar -O -zx APKINDEX | sed -n "/^P:linux-edge$/,/^$/p" | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) - upstream_version=${upstream_version/-*} + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[]' | head -n1) + ;; - # track linux-radxa against 6.1 SLTS + # track linux-radxa against its major version linux-radxa) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000"| jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[] | match($downstream_version).string' | head -n1) ;; @@ -138,7 +133,7 @@ for pkg in $owned_by_you; do echo "$pkg" >> not_in_anitya fi elif [ "$downstream_version" != "$(printf '%s\n' $upstream_version $downstream_version | sort -V | head -n 1)" ]; then - echo "$pkg higher downstream" + echo "$pkg higher downstream $upstream_version" continue elif [ "$upstream_version" != "$downstream_version" ]; then echo "$pkg upstream version $upstream_version does not match downstream version $downstream_version in $release" From 22a33dd83d219335d1b43a455088d63b3f57f490 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 15 Jun 2025 00:48:26 -0400 Subject: [PATCH 241/313] ci: skip u-boot-radxa-cm5 --- .forgejo/workflows/check-pmos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index d7dbcc0..0785667 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -14,7 +14,7 @@ jobs: downstream: http://mirror.postmarketos.org/postmarketos/master ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 14 - skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote + skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote u-boot-radxa-cm5 steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 2fa99e56c77c50799a999ad79ab0212f0468d095 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 15 Jun 2025 00:54:08 -0400 Subject: [PATCH 242/313] ci: rollback linux-radxa change --- .forgejo/bin/check_ver.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index b7b3885..9f00b5c 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -103,9 +103,11 @@ for pkg in $owned_by_you; do upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[]' | head -n1) ;; - # track linux-radxa against its major version + # track linux-radxa against BSP kernel (usually got awful late linux-radxa) - upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000"| jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[] | match($downstream_version).string' | head -n1) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | h +ead -n1) + upstream_version=${upstream_version/-*} ;; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set From c600b841b3d51906355e23911568cf1995a7c788 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Wed, 9 Jul 2025 03:46:59 -0400 Subject: [PATCH 243/313] ci: add workaround to issues not being created for edge when already existing for stable --- .forgejo/bin/check_ver.sh | 9 ++++----- .forgejo/bin/create_issue.sh | 22 ++++++++++++++++++---- .forgejo/workflows/check-pmos.yml | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 9f00b5c..69b5c00 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -26,10 +26,10 @@ repo=${downstream/*\/} release=${downstream/\/$repo/} release=${release/*\/} release=${release/v} -# add special case for postmarketos -[ "$release" == "postmarketos" ] && { release=$repo; repo="pmos"; } -[ "$release" == "master" ] && release=edge arch=$(apk --print-arch) +# add special case for postmarketos +[ "$release" == "postmarketos" ] && { release=$repo; repo="pmos"; arch="aarch64"; } +[ "$release" == "master" ] && release=edge is_semantic() { local downstream_version_dot=${1//[^.]} @@ -105,8 +105,7 @@ for pkg in $owned_by_you; do ;; # track linux-radxa against BSP kernel (usually got awful late linux-radxa) - upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | h -ead -n1) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) upstream_version=${upstream_version/-*} ;; *) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index c8e5daa..3e3048d 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -16,8 +16,15 @@ does_it_exist() { release=$5 query="$repo/$name: upgrade to $upstream_version" - if [ "$release" != "edge" ]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" + if [ "$release" != "edge" ]; then + query="%22[$release] $query%22" + elif [ "$repo" != "pmos" ]; then + # workaround to this query matching both stable and edge branch + query="%22$query%22&labels=Edge" + else + query="%22$query%22" + fi + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ @@ -38,8 +45,15 @@ is_it_old() { release=$5 query="$repo/$name: upgrade to" - if [ "$release" != "edge" ]; then query="[$release] $query"; fi - query="%22$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')%22" + if [ "$release" != "edge" ]; then + query="%22[$release] $query%22" + elif [ "$repo" != "pmos" ]; then + # workaround to this query matching both stable and edge branch + query="%22$query%22&labels=Edge" + else + query="%22$query%22" + fi + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')" result="$(curl --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index 0785667..a24bdcb 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -7,7 +7,7 @@ on: jobs: check-community-pmos: name: Check pmos(edge) repo - runs-on: aarch64 + runs-on: x86_64 container: image: alpine:latest env: From d0b5791120d1275adde797ef41d5e2fe2c73c954 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 10 Jul 2025 01:16:00 -0400 Subject: [PATCH 244/313] ci: add workaround exception for user repo --- .forgejo/bin/create_issue.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 3e3048d..bb4ea79 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -18,7 +18,7 @@ does_it_exist() { query="$repo/$name: upgrade to $upstream_version" if [ "$release" != "edge" ]; then query="%22[$release] $query%22" - elif [ "$repo" != "pmos" ]; then + elif [ "$repo" != "pmos" ] && [ "$repo" != "user" ]; then # workaround to this query matching both stable and edge branch query="%22$query%22&labels=Edge" else @@ -47,7 +47,7 @@ is_it_old() { query="$repo/$name: upgrade to" if [ "$release" != "edge" ]; then query="%22[$release] $query%22" - elif [ "$repo" != "pmos" ]; then + elif [ "$repo" != "pmos" ] && [ "$repo" != "user" ]; then # workaround to this query matching both stable and edge branch query="%22$query%22&labels=Edge" else From b621ae671673d39012c98cd3c834996303cf8337 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 10 Jul 2025 17:46:21 -0400 Subject: [PATCH 245/313] ci: skip dotnet6-stage0 in workflow --- .forgejo/workflows/check-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index 2137944..cf54831 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -14,7 +14,7 @@ jobs: downstream: https://dl-cdn.alpinelinux.org/alpine/edge/testing ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 4 - skip_package: dotnet6-stage dotnet6-build + skip_package: dotnet6-stage0 dotnet6-build steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 9c137f0b9d0c2162e9d8f0da872a178ce4dea10f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 17:00:46 -0400 Subject: [PATCH 246/313] ci: fix tracking of raspberrypi-usbboot --- .forgejo/bin/check_ver.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 69b5c00..ee1c49f 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -108,6 +108,8 @@ for pkg in $owned_by_you; do upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) upstream_version=${upstream_version/-*} ;; + # removes last bit in github tag from usbboot release, as not needed + raspberrypi-usbboot) curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1 | sed 's|-.*||';; *) # continues when package version scheme is not semantic, but minor_only or fix_only is set if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then From 4a5617805a898a9ebf219c596dc2e0b8afe60fdf Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 17:04:57 -0400 Subject: [PATCH 247/313] ci: track u-boot-pine64-pinenote against u-boot mainline version --- .forgejo/bin/check_ver.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index ee1c49f..f6d3716 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -68,6 +68,8 @@ for pkg in $owned_by_you; do # special cases where package is not semantic case $pkg in + # track u-boot-pine64-pinenote against mainline u-boot + u-boot-pine64-pinenote) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/u-boot" | jq -r '.stable_versions.[]' | head -n1)";; # release-monitoring omits the extra B, while we keep it but put it after the version no. looking-glass) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1)b";; # we want to track both Firefox security upgrades + Zotero upgrades From 4adb8575d1a101aa4740630f829ed561e4ec8a1e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 17:12:37 -0400 Subject: [PATCH 248/313] ci: linux-pine64-pinenote: track latest and current linux release --- .forgejo/bin/check_ver.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index f6d3716..6014831 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -102,8 +102,15 @@ for pkg in $owned_by_you; do arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; # track linux-pine64-pinenote against latest linux-pine64-pinenote) - upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r --arg downstream_version "${downstream_version%.*}.[0-9].*" '.stable_versions.[]' | head -n1) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1) + latest_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r ".stable_versions.[]" | head -n1) + # append version number to signal that this is not latest major version + if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then + echo "$pkg(${latest_version/.*.*}) major version available" + echo "$pkg(${latest_version/.*.*}) $downstream_version $latest_version $repo $release" >> out_of_date + pkg="$pkg(${upstream_version/.*.*})" + fi ;; # track linux-radxa against BSP kernel (usually got awful late linux-radxa) From 7332be756165eb2d7e0e86294d6f030c82442fe1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 17:14:47 -0400 Subject: [PATCH 249/313] ci: linux-pine64-pinenote: fix tracking latest release --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 6014831..91e80bc 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -106,7 +106,7 @@ for pkg in $owned_by_you; do latest_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r ".stable_versions.[]" | head -n1) # append version number to signal that this is not latest major version - if [ "${upstream_version/.*}" != "${latest_version/.*}" ]; then + if [ "${upstream_version/.*.*}" != "${latest_version/.*.*}" ]; then echo "$pkg(${latest_version/.*.*}) major version available" echo "$pkg(${latest_version/.*.*}) $downstream_version $latest_version $repo $release" >> out_of_date pkg="$pkg(${upstream_version/.*.*})" From 8789a20256caf0cb38a733cb96a5cd28991bf8c1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 17:23:02 -0400 Subject: [PATCH 250/313] ci: linux-pine64-pinenote: fix naming current release --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 91e80bc..67b13b1 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -109,7 +109,7 @@ for pkg in $owned_by_you; do if [ "${upstream_version/.*.*}" != "${latest_version/.*.*}" ]; then echo "$pkg(${latest_version/.*.*}) major version available" echo "$pkg(${latest_version/.*.*}) $downstream_version $latest_version $repo $release" >> out_of_date - pkg="$pkg(${upstream_version/.*.*})" + pkg="$pkg(${upstream_version%.*})" fi ;; # track linux-radxa against BSP kernel (usually got awful late From 953627f48d799649b2da5ce9e7a632579c9c5b37 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 20:02:12 -0400 Subject: [PATCH 251/313] ci: u-boot-pine64-pinenote: track ddr and trust blob versions --- .forgejo/bin/check_ver.sh | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 67b13b1..bf1814b 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -68,8 +68,30 @@ for pkg in $owned_by_you; do # special cases where package is not semantic case $pkg in - # track u-boot-pine64-pinenote against mainline u-boot - u-boot-pine64-pinenote) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/u-boot" | jq -r '.stable_versions.[]' | head -n1)";; + # track u-boot-pine64-pinenote against mainline u-boot, and track upstream rockchip blobs + u-boot-pine64-pinenote) + upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/u-boot" | jq -r '.stable_versions.[]' | head -n1)" + commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') + + # fetches upstream version for blobs using ini file + upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}'| grep -o -P '(?<=_v).*(?=.bin)')" + upstream_ddr="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" + + # extracts downstream version via _trust_ver and _ddr_ver variable + downstream_trust=$(curl --fail -X GET -s "https://gitlab.postmarketos.org/postmarketOS/pmaports/-/raw/$commit/device/testing/u-boot-pine64-pinenote/APKBUILD" | awk -F '=' '{if($1=="_trust_ver"){print $2}}') + downstream_ddr=$(curl --fail -X GET -s "https://gitlab.postmarketos.org/postmarketOS/pmaports/-/raw/$commit/device/testing/u-boot-pine64-pinenote/APKBUILD" | awk -F '=' '{if($1=="_ddr_ver"){print $2}}') + + # compares versions and creates newline in out_of_date if problematic + if [ "$upstream_trust" != "$downstream_trust" ]; then + echo "$pkg new Trust blob $upstream_trust version available" + echo "$pkg(trust) $downstream_trust $upstream_trust $repo $release" >> out_of_date + fi + if [ "$upstream_ddr" != "$downstream_ddr" ]; then + echo "$pkg new ddr blob $upstream_ddr version available" + echo "$pkg(ddr) $downstream_ddr $upstream_ddr $repo $release" >> out_of_date + fi + + ;; # release-monitoring omits the extra B, while we keep it but put it after the version no. looking-glass) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1)b";; # we want to track both Firefox security upgrades + Zotero upgrades From d0dfb021eb592537a6cf0da81e46d9a7cc573ae8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 10 Aug 2025 20:19:18 -0400 Subject: [PATCH 252/313] ci: u-boot-pine64-pinenote: fix ddr and trust tracking --- .forgejo/bin/check_ver.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index bf1814b..b936969 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -74,8 +74,8 @@ for pkg in $owned_by_you; do commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') # fetches upstream version for blobs using ini file - upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}'| grep -o -P '(?<=_v).*(?=.bin)')" - upstream_ddr="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" + upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" + upstream_ddr="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKBOOT/RK3566MINIALL_ULTRA.ini' | grep ddr | awk -F '=' '{if($1"="PATH){print $2}}' | head -n 1 | grep -o -P '(?<=_v).*(?=.bin)' # extracts downstream version via _trust_ver and _ddr_ver variable downstream_trust=$(curl --fail -X GET -s "https://gitlab.postmarketos.org/postmarketOS/pmaports/-/raw/$commit/device/testing/u-boot-pine64-pinenote/APKBUILD" | awk -F '=' '{if($1=="_trust_ver"){print $2}}') From 4de45ea910c3c8af059a077abda45bae49876642 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 14 Aug 2025 21:59:55 -0400 Subject: [PATCH 253/313] ci: u-boot-pine64-pinenote: fix typo --- .forgejo/bin/check_ver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index b936969..53e1ac0 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -75,7 +75,7 @@ for pkg in $owned_by_you; do # fetches upstream version for blobs using ini file upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" - upstream_ddr="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKBOOT/RK3566MINIALL_ULTRA.ini' | grep ddr | awk -F '=' '{if($1"="PATH){print $2}}' | head -n 1 | grep -o -P '(?<=_v).*(?=.bin)' + upstream_ddr="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKBOOT/RK3566MINIALL_ULTRA.ini' | grep ddr | awk -F '=' '{if($1"="PATH){print $2}}' | head -n 1 | grep -o -P '(?<=_v).*(?=.bin)')" # extracts downstream version via _trust_ver and _ddr_ver variable downstream_trust=$(curl --fail -X GET -s "https://gitlab.postmarketos.org/postmarketOS/pmaports/-/raw/$commit/device/testing/u-boot-pine64-pinenote/APKBUILD" | awk -F '=' '{if($1=="_trust_ver"){print $2}}') From 8c1da51a6002c4fa1eb0c9a28c056099ab9ff909 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 14 Aug 2025 22:07:15 -0400 Subject: [PATCH 254/313] ci: u-boot-pine64-pinenote: fix commit lookup --- .forgejo/bin/check_ver.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 53e1ac0..1b284fc 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -72,6 +72,7 @@ for pkg in $owned_by_you; do u-boot-pine64-pinenote) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/u-boot" | jq -r '.stable_versions.[]' | head -n1)" commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') + commit=${commit/-dirty/} # fetches upstream version for blobs using ini file upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" From 2eeb660610b8aa84ca78f1a43d032a3b61e5bc87 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 6 Sep 2025 16:40:29 -0400 Subject: [PATCH 255/313] ci: use actions namespace for {upload,download}-artifact action --- .forgejo/workflows/build-aarch64.yaml | 4 ++-- .forgejo/workflows/build-cross.yaml | 4 ++-- .forgejo/workflows/build-x86_64.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.forgejo/workflows/build-aarch64.yaml b/.forgejo/workflows/build-aarch64.yaml index 0ff5e7c..78db319 100644 --- a/.forgejo/workflows/build-aarch64.yaml +++ b/.forgejo/workflows/build-aarch64.yaml @@ -28,7 +28,7 @@ jobs: ${{ github.workspace }}/.forgejo/bin/build.sh touch packages/dummy - name: Package upload - uses: forgejo/upload-artifact@v3 + uses: actions/upload-artifact@v3 with: name: package path: packages @@ -49,6 +49,6 @@ jobs: - name: Repo pull uses: actions/checkout@v4 - name: Package download - uses: forgejo/download-artifact@v3 + uses: actions/download-artifact@v3 - name: Package deployment run: ${{ github.workspace }}/.forgejo/bin/deploy.sh diff --git a/.forgejo/workflows/build-cross.yaml b/.forgejo/workflows/build-cross.yaml index 6d770f7..f4737b6 100644 --- a/.forgejo/workflows/build-cross.yaml +++ b/.forgejo/workflows/build-cross.yaml @@ -33,7 +33,7 @@ jobs: ${{ github.workspace }}/.forgejo/bin/generate-cross.sh ${{ github.ref_name }} ${{ inputs.target_arch }} mv -v /home/buildozer/packages/main ${{ github.workspace }}/packages/cross - name: Package upload - uses: forgejo/upload-artifact@v3 + uses: actions/upload-artifact@v3 with: name: package path: packages @@ -54,6 +54,6 @@ jobs: - name: Repo pull uses: actions/checkout@v4 - name: Package download - uses: forgejo/download-artifact@v3 + uses: actions/download-artifact@v3 - name: Package deployment run: ${{ github.workspace }}/.forgejo/bin/deploy.sh diff --git a/.forgejo/workflows/build-x86_64.yaml b/.forgejo/workflows/build-x86_64.yaml index ad7abb3..84d6908 100644 --- a/.forgejo/workflows/build-x86_64.yaml +++ b/.forgejo/workflows/build-x86_64.yaml @@ -28,7 +28,7 @@ jobs: ${{ github.workspace }}/.forgejo/bin/build.sh touch packages/dummy - name: Package upload - uses: forgejo/upload-artifact@v3 + uses: actions/upload-artifact@v3 with: name: package path: packages @@ -49,6 +49,6 @@ jobs: - name: Repo pull uses: actions/checkout@v4 - name: Package download - uses: forgejo/download-artifact@v3 + uses: actions/download-artifact@v3 - name: Package deployment run: ${{ github.workspace }}/.forgejo/bin/deploy.sh From d3043bab853539e05ad16e797f1236fe79ea6817 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 6 Sep 2025 22:15:59 -0400 Subject: [PATCH 256/313] ci: fix titles for non-edge issues --- .forgejo/bin/create_issue.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index bb4ea79..07879f1 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -80,13 +80,16 @@ update_title() { release=$5 id=$6 + title="$repo/$name: upgrade to $upstream_version" + if [ "$release" != "edge" ]; then title="[$release] $title"; fi + result=$(curl --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ -d "{ - \"title\": \"$repo/$name: upgrade to $upstream_version\" + \"title\": \"$title\", }" ) From bd1a71e8a2bec7f56816bb579df53e37485ea655 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 6 Sep 2025 22:17:07 -0400 Subject: [PATCH 257/313] ci: use aarch64 runner on check and lint workflows --- .forgejo/workflows/check-backports.yml | 2 +- .forgejo/workflows/check-community.yml | 4 ++-- .forgejo/workflows/check-main.yml | 10 +++++----- .forgejo/workflows/check-pmos.yml | 2 +- .forgejo/workflows/check-testing.yml | 2 +- .forgejo/workflows/check-user.yml | 2 +- .forgejo/workflows/lint.yaml | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index cd8f63b..f1d016d 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -7,7 +7,7 @@ on: jobs: check-backports: name: Check backports repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 8a88ce8..95a8032 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -7,7 +7,7 @@ on: jobs: check-community-edge: name: Check community(edge) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: @@ -27,7 +27,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-community-3.22: name: Check community(3.22) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/check-main.yml b/.forgejo/workflows/check-main.yml index 58e8001..6730130 100644 --- a/.forgejo/workflows/check-main.yml +++ b/.forgejo/workflows/check-main.yml @@ -7,7 +7,7 @@ on: jobs: check-main-edge: name: Check main(edge) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: @@ -27,7 +27,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-main-3.22: name: Check main(3.22) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: @@ -48,7 +48,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-main-3.21: name: Check main(3.21) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: @@ -69,7 +69,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-main-3.20: name: Check main(3.20) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: @@ -90,7 +90,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-main-3.19: name: Check main(3.19) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index a24bdcb..0785667 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -7,7 +7,7 @@ on: jobs: check-community-pmos: name: Check pmos(edge) repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index cf54831..a778500 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -7,7 +7,7 @@ on: jobs: check-community: name: Check testing repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml index ba6ed80..db1f574 100644 --- a/.forgejo/workflows/check-user.yml +++ b/.forgejo/workflows/check-user.yml @@ -7,7 +7,7 @@ on: jobs: check-user: name: Check user repo - runs-on: x86_64 + runs-on: aarch64 container: image: alpine:latest env: diff --git a/.forgejo/workflows/lint.yaml b/.forgejo/workflows/lint.yaml index 743cefc..ec79090 100644 --- a/.forgejo/workflows/lint.yaml +++ b/.forgejo/workflows/lint.yaml @@ -5,7 +5,7 @@ on: jobs: lint: run-name: lint - runs-on: x86_64 + runs-on: aarch64 container: image: alpinelinux/apkbuild-lint-tools:latest env: From 223efcc89ff2db8fa225e8020d87cf3ee8557f8c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 13 Sep 2025 10:16:11 -0400 Subject: [PATCH 258/313] ci: add capability to exclude packages from fix_only minor_only rules --- .forgejo/bin/check_ver.sh | 21 +++++++++++++-------- .forgejo/workflows/check-community.yml | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 1b284fc..2560e9f 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -10,12 +10,14 @@ # fix_only: array of packages that should only track bug fix releases (seperated by space) # default: none # all packages: all -# +# # If either minor_only or fix_only is set, only packages with semantic versioning schemes # will be tracked. # # If a package is both minor_only and fix_only, the minor releases will be tracked # +# If a - is placed in front of package name, it'll be excluded from the update rule +# # optional env variables # ALL_PACKAGES: when true, ignore is package is owned by me # skip_package: array of packages to skip @@ -143,17 +145,20 @@ for pkg in $owned_by_you; do # removes last bit in github tag from usbboot release, as not needed raspberrypi-usbboot) curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1 | sed 's|-.*||';; *) - # continues when package version scheme is not semantic, but minor_only or fix_only is set - if [ -n "${minor_only}" ] || [ -n "${fix_only}" ]; then + + if [[ "$minor_only" == *all* || "$minor_only" == *$pkg* ]] && [[ "$minor_only" != *-$pkg* ]] then + # continues when package version scheme is not semantic, but minor_only or fix_only is set if ! is_semantic $downstream_version; then - echo "$pkg is not semantic, and fix_only or minor_only is set" + echo "$pkg is not semantic, and minor_only is set" continue fi - fi - - if [ "${minor_only}" == "all" ] || [[ "${minor_only}" == *$pkg* ]]; then upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*.*}.*\").string" | head -n1) - elif [ "${fix_only}" == "all" ] || [[ "${fix_only}" == *$pkg* ]]; then + elif [[ "$fix_only" == *all* || "$fix_only" == *$pkg* ]] && [[ "$fix_only" != *-$pkg* ]]; then + # continues when package version scheme is not semantic, but minor_only or fix_only is set + if ! is_semantic $downstream_version; then + echo "$pkg is not semantic, and fix_only is set" + continue + fi upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1) else upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 95a8032..fe1d9ad 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -34,7 +34,7 @@ jobs: downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 - fix_only: all + fix_only: all -git-annex skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore steps: - name: Environment setup From b3d03dc81744186a20b377112cc38397b893f09e Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 14 Oct 2025 09:03:25 -0400 Subject: [PATCH 259/313] ci: follow redirects on curl requests --- .forgejo/bin/create_issue.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index 07879f1..cdb9c4a 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -26,7 +26,7 @@ does_it_exist() { fi query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')" - result="$(curl --silent -X 'GET' \ + result="$(curl -L --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "Authorization: token $ISSUE_TOKEN" @@ -55,7 +55,7 @@ is_it_old() { fi query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' | sed 's|\[|%5B|g' | sed 's|\]|%5D|g')" - result="$(curl --silent -X 'GET' \ + result="$(curl -L --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" @@ -83,7 +83,7 @@ update_title() { title="$repo/$name: upgrade to $upstream_version" if [ "$release" != "edge" ]; then title="[$release] $title"; fi - result=$(curl --silent -X 'PATCH' \ + result=$(curl -L --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ @@ -106,7 +106,7 @@ create_issue() { title="$repo/$name: upgrade to $upstream_version" if [ "$release" != "edge" ]; then title="[$release] $title"; fi - result=$(curl --silent -X 'POST' \ + result=$(curl -L --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ @@ -155,7 +155,7 @@ if [ -f not_in_anitya ]; then query="Add missing $repo packages to anitya" query="%22$(echo $query | sed 's| |%20|g')%22" - result="$(curl --silent -X 'GET' \ + result="$(curl -L --silent -X 'GET' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues&sort=latest" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" @@ -163,7 +163,7 @@ if [ -f not_in_anitya ]; then if [ "$result" == "[]" ]; then echo "Creating anitya issue" - result=$(curl --silent -X 'POST' \ + result=$(curl -L --silent -X 'POST' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ @@ -179,7 +179,7 @@ if [ -f not_in_anitya ]; then else echo "Updating anitya issue" result_id="$(echo $result | jq -r '.[].number' )" - result=$(curl --silent -X 'PATCH' \ + result=$(curl -L --silent -X 'PATCH' \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \ -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ From 8658e947c7d20268cfe336103f8e66e3430da802 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 14 Oct 2025 09:22:28 -0400 Subject: [PATCH 260/313] ci: fix title updating --- .forgejo/bin/create_issue.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh index cdb9c4a..3164b14 100755 --- a/.forgejo/bin/create_issue.sh +++ b/.forgejo/bin/create_issue.sh @@ -88,9 +88,7 @@ update_title() { -H 'accept: application/json' \ -H "authorization: token $ISSUE_TOKEN" \ -H 'Content-Type: application/json' \ - -d "{ - \"title\": \"$title\", - }" + -d "{\"title\": \"$title\"}" ) return 0 From 03b4f6425d3969e9f758028ca4d3b159fa441530 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 13 Nov 2025 12:19:14 -0500 Subject: [PATCH 261/313] ci: fix lookup for u-boot-pine64-pinenote blobs --- .forgejo/bin/check_ver.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 2560e9f..d0a9bc0 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -73,8 +73,11 @@ for pkg in $owned_by_you; do # track u-boot-pine64-pinenote against mainline u-boot, and track upstream rockchip blobs u-boot-pine64-pinenote) upstream_version="$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/u-boot" | jq -r '.stable_versions.[]' | head -n1)" - commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') - commit=${commit/-dirty/} + + # some reason the commit now not in APKINDEX, using master instead + #commit=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="c"){print $2}}') + #commit=${commit/-dirty/} + commit=master # fetches upstream version for blobs using ini file upstream_trust="$(curl --fail -s 'https://raw.githubusercontent.com/rockchip-linux/rkbin/master/RKTRUST/RK3566TRUST_ULTRA.ini' | grep bl31 | awk -F '=' '{if($1"="PATH){print $2}}' | grep -o -P '(?<=_v).*(?=.elf)')" From 869d5c3845d5683a2a986af1a83452d43be844bc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 23 Nov 2025 21:45:43 -0500 Subject: [PATCH 262/313] user/koreader: new aport --- user/koreader/APKBUILD | 82 +++++++++++++++++++ ...ader-lua-use-absolute-path-to-luajit.patch | 10 +++ 2 files changed, 92 insertions(+) create mode 100644 user/koreader/APKBUILD create mode 100644 user/koreader/reader-lua-use-absolute-path-to-luajit.patch diff --git a/user/koreader/APKBUILD b/user/koreader/APKBUILD new file mode 100644 index 0000000..73d1a63 --- /dev/null +++ b/user/koreader/APKBUILD @@ -0,0 +1,82 @@ +# Maintainer: Antoine Martin (ayakael) +pkgname=koreader +pkgver=2025.10 +pkgrel=0 +pkgdesc="An ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats" +# s390x|riscv64|ppc64le|loongarch64: FTBFS +# armhf|armv7|x86: Tests fail, segmentation fault +arch="x86_64 aarch64" +url="https://github.com/koreader/koreader/" +license="AGPL-3.0-only" +depends=" + bash + sdl2 + procps-ng + " +makedepends=" + autoconf + automake + cmake + coreutils + curl + diffutils + findutils + gettext + grep + libtool + linux-headers + meson + nasm + ninja-build + perl + pkgconf + wget + " +source=" + https://ayakael.net/api/packages/mirrors/generic/koreader/v$pkgver/koreader-v$pkgver.tar.gz + reader-lua-use-absolute-path-to-luajit.patch + " +subpackages="$pkgname-doc" +builddir="$srcdir"/$pkgname-v$pkgver + +# has vendored copies of system libraries +sonameprefix="$pkgname:" + +prepare() { + default_prepare + + # no need to test manually set version + rm "$builddir"/spec/unit/version_spec.lua +} + +build() { + # add ninja bin to path + export PATH="$PATH":/usr/lib/ninja-build/bin + + # default target is emulator build + make TARGET= KODEBUG= VERBOSE= +} + +check() { + KODEBUG= TARGET= VERBOSE= ./base/utils/fake_tty.py make --assume-old=base testfront +} + +package() { + install -Dm755 "$builddir"/platform/linux/koreader.sh "$pkgdir"/usr/bin/koreader + install -Dm644 "$builddir"/platform/linux/koreader.desktop -t "$pkgdir"/usr/share/applications/ + install -Dm644 "$builddir"/resources/koreader.png -t "$pkgdir"/usr/share/pixmaps/ + install -Dm644 "$builddir"/platform/linux/koreader.1 -t "$pkgdir"/usr/share/man/man1/ + + mkdir -p "$pkgdir"/usr/lib + cp -RL "$builddir"/koreader-emulator-*/koreader "$pkgdir"/usr/lib/koreader + + # delete debug files + find "$pkgdir" -name '*.dbg' -delete + + # version information + echo "v$pkgver" > "$pkgdir"/usr/lib/koreader/git-rev +} +sha512sums=" +3fbbe49ae6134abd810d9932cfb650d031100c95570c8eaa6d6e5d4c6a9a86916961b989696a7d97c149920d63853108905eea34f75f987e58f89e3a49d63948 koreader-v2025.10.tar.gz +76dd6f2ea6416b135b76d95f3c8150378f577ddd68d48312eabd6e12adaa111253dc83fc02add3ded07d3e6174fd5f4bd6c9f7b635ef27e3d760d5acced9e6fe reader-lua-use-absolute-path-to-luajit.patch +" diff --git a/user/koreader/reader-lua-use-absolute-path-to-luajit.patch b/user/koreader/reader-lua-use-absolute-path-to-luajit.patch new file mode 100644 index 0000000..3d25e3f --- /dev/null +++ b/user/koreader/reader-lua-use-absolute-path-to-luajit.patch @@ -0,0 +1,10 @@ +diff --git a/reader.lua.orig b/reader.lua +index 6fe9489..c4cbb2b 100755 +--- a/reader.lua.orig ++++ b/reader.lua +@@ -1,4 +1,4 @@ +-#!./luajit ++#!/usr/lib/koreader/luajit + + -- Enforce line-buffering for stdout (this is the default if it points to a tty, but we redirect to a file on most platforms). + io.stdout:setvbuf("line") From df65efacf1b607bf38818fd1bb28309aa07345e4 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 23 Nov 2025 22:34:36 -0500 Subject: [PATCH 263/313] user/skiasharp: new aport --- ...0001-fix-cflags-for-system-freetype2.patch | 25 +++++ .../skiasharp/0002-add-missing-includes.patch | 38 +++++++ user/skiasharp/APKBUILD | 104 ++++++++++++++++++ user/skiasharp/args.gn.in | 19 ++++ 4 files changed, 186 insertions(+) create mode 100644 user/skiasharp/0001-fix-cflags-for-system-freetype2.patch create mode 100644 user/skiasharp/0002-add-missing-includes.patch create mode 100644 user/skiasharp/APKBUILD create mode 100644 user/skiasharp/args.gn.in diff --git a/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch b/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch new file mode 100644 index 0000000..d9464a4 --- /dev/null +++ b/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch @@ -0,0 +1,25 @@ +From 5f2682ed16394ba3e10ab35150c15e265ab0a0db Mon Sep 17 00:00:00 2001 +From: Naomi Rennie-Waldock +Date: Wed, 4 Dec 2024 02:01:11 +0000 +Subject: [PATCH 1/2] fix cflags for system freetype2 + +--- + third_party/freetype2/BUILD.gn | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn +index d3092c672f..1bf7d9fc62 100644 +--- a/third_party/freetype2/BUILD.gn ++++ b/third_party/freetype2/BUILD.gn +@@ -14,7 +14,7 @@ import("../third_party.gni") + + if (skia_use_system_freetype2) { + system("freetype2") { +- cflags = [ "-I=/usr/include/freetype2" ] ++ cflags = [ "-I/usr/include/freetype2" ] + libs = [ "freetype" ] + } + } else { +-- +2.45.2 + diff --git a/user/skiasharp/0002-add-missing-includes.patch b/user/skiasharp/0002-add-missing-includes.patch new file mode 100644 index 0000000..7ffd79e --- /dev/null +++ b/user/skiasharp/0002-add-missing-includes.patch @@ -0,0 +1,38 @@ +From 4367484b44f349f3f9009a001167c08a61f6934b Mon Sep 17 00:00:00 2001 +From: Naomi Rennie-Waldock +Date: Wed, 4 Dec 2024 02:02:29 +0000 +Subject: [PATCH 2/2] add missing includes + +--- + src/utils/SkParseColor.cpp | 1 + + third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp | 2 ++ + 2 files changed, 3 insertions(+) + +diff --git a/src/utils/SkParseColor.cpp b/src/utils/SkParseColor.cpp +index 7260365b2c..ed118fb5e9 100644 +--- a/src/utils/SkParseColor.cpp ++++ b/src/utils/SkParseColor.cpp +@@ -6,6 +6,7 @@ + */ + + ++#include + #include "include/utils/SkParse.h" + + static constexpr const char* gColorNames[] = { +diff --git a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp b/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp +index fb606984bd..4bc9d99420 100644 +--- a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp ++++ b/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp +@@ -5,6 +5,8 @@ + * found in the LICENSE file. + */ + ++#include ++ + // We use our own functions pointers + #define VMA_STATIC_VULKAN_FUNCTIONS 0 + #define VMA_DYNAMIC_VULKAN_FUNCTIONS 0 +-- +2.45.2 + diff --git a/user/skiasharp/APKBUILD b/user/skiasharp/APKBUILD new file mode 100644 index 0000000..b82e926 --- /dev/null +++ b/user/skiasharp/APKBUILD @@ -0,0 +1,104 @@ +# Contributor: Naomi Rennie-Waldock +# Maintainer: Naomi Rennie-Waldock +pkgname=skiasharp +pkgver=2.88.9 +pkgrel=0 +pkgdesc="2D graphics API for .NET - native library" +url="https://github.com/mono/SkiaSharp" +arch="x86_64 armv7 aarch64" +license="BSD-3-Clause" +_llvmver=21 +_skiaver=2.88.3 +makedepends=" + cmd:awk + cmd:envsubst + clang$_llvmver + llvm$_llvmver + gn + ninja + freetype-dev + fontconfig-dev + libwebp-dev + harfbuzz-dev + cmake + " +subpackages="$pkgname-dbg" +# SkiaSharp currently doesn't work with jpeg-turbo 3.x which we've got packaged +# https://github.com/mono/SkiaSharp/issues/2645 +# https://github.com/libjpeg-turbo/libjpeg-turbo/issues/741 +_jpegturbover=2.1.5.1 +source="https://github.com/mono/SkiaSharp/archive/v$pkgver/SkiaSharp-$pkgver.tar.gz + https://github.com/mono/skia/archive/v$_skiaver/skia-$_skiaver.tar.gz + + args.gn.in + + 0001-fix-cflags-for-system-freetype2.patch + 0002-add-missing-includes.patch + + https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/$_jpegturbover/libjpeg-turbo-$_jpegturbover.tar.gz + " +_skiasharpdir="$srcdir/SkiaSharp-$pkgver" +_skiadir="$srcdir/skia-$_skiaver" +_jpegturbodir="$srcdir/libjpeg-turbo-$_jpegturbover" +builddir="$_skiadir" +options="!check" + +prepare() { + default_prepare + + install -d "$builddir"/third_party/externals + rm -f "$builddir"/third_party/externals/libjpeg-turbo + ln -s "$_jpegturbodir" "$builddir"/third_party/externals/libjpeg-turbo + ln -sf "$_jpegturbodir"/jpeg_nbits_table.h "$_jpegturbodir"/jpeg_nbits_table.c +} + +build() { + + export PATH="$PATH:/usr/lib/llvm$_llvmver/bin" + # Generate config for jpeg-turbo + # Note: jpeg-turbo is linked statically as part of SkiaSharp's build process + # We just run cmake first to generate jconfig.h + cd "$_jpegturbodir" + cmake3.5 . \ + -DCMAKE_BUILD_TYPE= \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DWITH_JPEG8=1 + + # Generate build config for SkiaSharp + cd "$builddir" + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/VERSIONS.txt) + local map="$_skiasharpdir"/native/linux/libSkiaSharp/libSkiaSharp.map + local _skia_arch=$CTARGET_ARCH + + case "$CTARGET_ARCH" in + aarch64) _skia_arch=arm64 ;; + armv7) _skia_arch=arm ;; + x86_64) _skia_arch=x64 ;; + esac + + export soname map _skia_arch _llvmver + + [ -d _build ] || mkdir _build + envsubst < "$srcdir"/args.gn.in > _build/args.gn + + gn gen _build + ninja -j"${JOBS:-1}" -C _build SkiaSharp +} + +package() { + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/VERSIONS.txt) + + install -Dm644 _build/libSkiaSharp.so.$soname -t "$pkgdir"/usr/lib/ + ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so.${soname%%.*} + ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so +} + +sha512sums=" +c13fb2f2cb8e231f5130e97450e242b910ea098419334303ed0b3391ff264549f9283343be8f5e1a6e59fa7ffe9d9aeb1c2d5607af0fb1fc03af0645b685dff2 SkiaSharp-2.88.9.tar.gz +43b19f6ddefe30ddf37034c73cd23feea28cb9e4a5830f8c526771afa051bdb2a96934f70dc035ca85891992b67b47d1becc6f4bf8768175db8452e144dfd9f1 skia-2.88.3.tar.gz +c1d8eace5078a25a8be5aa92337e1211055fb4d6a1da6f019e8f53871051b56af5cd18f19e0d67a34895402bbd575d233c5b5ad752e3ea5cdc85bfd63a392910 args.gn.in +0c4caa5aff089d314540959f068ca06c5580465be7a4a4abb3db9e1756a8043e14cbd4f8be677cfe4bd837b32115c8fefb2c79cf7bd52dd06fa1cb50e2406756 0001-fix-cflags-for-system-freetype2.patch +7eac411d6f235a450dcccf7d451ecc0d9516761b3cf37d3b0438fa2648b4ce7b0912de16d27221dc1df82fe62efb9287084fce433f1aeae48732da454402dbd7 0002-add-missing-includes.patch +86a7248d064043b26b09755633ef4872a2a6133c9e677a9fe4be6645b2e0fde102cf01e09119967b3b6b85f4cb93f3f7c49ec4973944d5eff99b5b90ce8b0be6 libjpeg-turbo-2.1.5.1.tar.gz +" diff --git a/user/skiasharp/args.gn.in b/user/skiasharp/args.gn.in new file mode 100644 index 0000000..4b7d5dd --- /dev/null +++ b/user/skiasharp/args.gn.in @@ -0,0 +1,19 @@ +is_official_build=true +target_os="linux" +target_cpu="$_skia_arch" +skia_enable_gpu=true +skia_use_icu=false +skia_use_piex=true +skia_use_sfntly=false +skia_enable_skottie=true +skia_enable_tools=false +skia_use_vulkan=true +skia_use_system_libjpeg_turbo=false +# disabled as it's not packaged +skia_use_dng_sdk=false +extra_cflags=[ "-DSKIA_C_DLL" ] +extra_ldflags=[ "-Wl,--version-script=$map" ] +linux_soname_version="$soname" +cc="clang" +cxx="clang++" +ar="llvm-ar" From 16d5ce552fa6cd5024e26363d8e067d25814f15a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 23 Nov 2025 22:34:46 -0500 Subject: [PATCH 264/313] user/jellyfin: new aport --- user/jellyfin/APKBUILD | 50 +++++++++++++++++++++ user/jellyfin/jellyfin.confd | 7 +++ user/jellyfin/jellyfin.initd | 20 +++++++++ user/jellyfin/jellyfin.pre-install | 9 ++++ user/jellyfin/remove-prebuilt-library.patch | 32 +++++++++++++ 5 files changed, 118 insertions(+) create mode 100644 user/jellyfin/APKBUILD create mode 100644 user/jellyfin/jellyfin.confd create mode 100644 user/jellyfin/jellyfin.initd create mode 100644 user/jellyfin/jellyfin.pre-install create mode 100644 user/jellyfin/remove-prebuilt-library.patch diff --git a/user/jellyfin/APKBUILD b/user/jellyfin/APKBUILD new file mode 100644 index 0000000..edc9907 --- /dev/null +++ b/user/jellyfin/APKBUILD @@ -0,0 +1,50 @@ +# Maintainer: Simon Zeni +# Contributor: Fabricio Silva +pkgname=jellyfin +pkgver=10.10.7 +pkgrel=1 +pkgdesc="The Free Software Media System" +install="$pkgname.pre-install" +url="https://jellyfin.org/" +arch="x86_64 armv7 aarch64" +license="GPL-2.0-only" +makedepends="dotnet8-sdk" +depends="aspnetcore8-runtime jellyfin-ffmpeg skiasharp" +subpackages="$pkgname-openrc" +source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin/archive/refs/tags/v$pkgver.tar.gz + $pkgname.initd + $pkgname.confd +remove-prebuilt-library.patch + " + +build() { + dotnet publish Jellyfin.Server \ + --configuration Release \ + --no-self-contained \ + --use-current-runtime \ + --output publish +} + +check() { + dotnet test --no-restore +} + +package() { + mkdir -p "$pkgdir"/usr/lib "$pkgdir"/usr/bin + + cp -a publish "$pkgdir"/usr/lib/jellyfin + ln -s ../lib/jellyfin/jellyfin "$pkgdir"/usr/bin/jellyfin + ln -s ../libSkiaSharp.so "$pkgdir"/usr/lib/jellyfin/libSkiaSharp.so + + install -Dm755 "$srcdir"/$pkgname.initd \ + "$pkgdir"/etc/init.d/$pkgname + install -Dm644 "$srcdir"/$pkgname.confd \ + "$pkgdir"/etc/conf.d/$pkgname +} + +sha512sums=" +6c48401f4acf509b69fb6b8916be54b1b697aa85308ac4a39345bef0ce61c78c4ad978650569ac0964eeb9389fdea249ffc279a37bcd49c0341d3825423f5a97 jellyfin-10.10.7.tar.gz +bcdb882b837a08e4c1db363fbf2a075f0d6558a537c3f798b1473f9f1b5b887b6da1928558b0aede8bf56ab16469ac9e80dc95b0f874533ad744465a92b37696 jellyfin.initd +594c26e5235ae2265f3f586f596cd6b57fa0e0cec83531b6fadba48181870167f04381266c6005f1f6cb5cd76d254100a08a871ecb8da28e5890f979816a7b8b jellyfin.confd +50b9535d7b2dbebf7fbda1dc2d88941dad5530c8ab3e8e07c1203c328af426816036b5e6b4d6deb69fa344611bc18785cf8593d7d990a1cbfae0e14c9324b592 remove-prebuilt-library.patch +" diff --git a/user/jellyfin/jellyfin.confd b/user/jellyfin/jellyfin.confd new file mode 100644 index 0000000..38c0def --- /dev/null +++ b/user/jellyfin/jellyfin.confd @@ -0,0 +1,7 @@ +supervisor=supervise-daemon +datadir="/var/lib/jellyfin" +cachedir="/var/cache/jellyfin" +logdir="/var/log/jellyfin" +webdir="/usr/share/webapps/jellyfin-web" +ffmpegpath="/usr/lib/jellyfin-ffmpeg/ffmpeg" +opts="--nowebclient" diff --git a/user/jellyfin/jellyfin.initd b/user/jellyfin/jellyfin.initd new file mode 100644 index 0000000..4641de7 --- /dev/null +++ b/user/jellyfin/jellyfin.initd @@ -0,0 +1,20 @@ +#!/sbin/openrc-run + +name=jellyfin +description="The Free Software Media System" + +command=/usr/bin/jellyfin +command_user=jellyfin:jellyfin +command_args="--webdir ${webdir:-/usr/share/webapps/jellyfin-web} --datadir ${datadir} --cachedir ${cachedir} --logdir ${logdir} --ffmpeg ${ffmpegpath:-/usr/lib/jellyfin-ffmpeg/ffmpeg} ${opts}" + +depend() { + use logger dns + need net + after firewall +} + +start_pre() { + checkpath -d -o $command_user "$datadir" + checkpath -d -o $command_user "$cachedir" + checkpath -d -o $command_user "$logdir" +} diff --git a/user/jellyfin/jellyfin.pre-install b/user/jellyfin/jellyfin.pre-install new file mode 100644 index 0000000..6e64716 --- /dev/null +++ b/user/jellyfin/jellyfin.pre-install @@ -0,0 +1,9 @@ +#!/bin/sh + +user=jellyfin +group=jellyfin + +addgroup -S $group 2>/dev/null +adduser -S -D -h /var/lib/$user -s /sbin/nologin -G $group -g $user $user 2>/dev/null + +exit 0 diff --git a/user/jellyfin/remove-prebuilt-library.patch b/user/jellyfin/remove-prebuilt-library.patch new file mode 100644 index 0000000..09dc3a3 --- /dev/null +++ b/user/jellyfin/remove-prebuilt-library.patch @@ -0,0 +1,32 @@ +diff -urp jellyfin-10.10.3.bak/Directory.Packages.props jellyfin-10.10.3/Directory.Packages.props +--- jellyfin-10.10.3.bak/Directory.Packages.props 2024-11-19 03:38:42.000000000 +0000 ++++ jellyfin-10.10.3/Directory.Packages.props 2024-12-04 02:20:12.294901276 +0000 +@@ -17,7 +17,6 @@ + + + +- + + + +@@ -68,7 +67,6 @@ + + + +- + + + +diff -urp jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj +--- jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-11-19 03:38:42.000000000 +0000 ++++ jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-12-04 02:21:05.773987361 +0000 +@@ -20,9 +20,7 @@ + + + +- + +- + + + From 42d2681350751d89eea4ae916c36c1c543e56786 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 23 Nov 2025 22:34:53 -0500 Subject: [PATCH 265/313] user/jellyfin-web: new aport --- user/jellyfin-web/APKBUILD | 38 +++++++++++++++++++++ user/jellyfin-web/jellyfin-web.post-install | 6 ++++ 2 files changed, 44 insertions(+) create mode 100644 user/jellyfin-web/APKBUILD create mode 100644 user/jellyfin-web/jellyfin-web.post-install diff --git a/user/jellyfin-web/APKBUILD b/user/jellyfin-web/APKBUILD new file mode 100644 index 0000000..243f026 --- /dev/null +++ b/user/jellyfin-web/APKBUILD @@ -0,0 +1,38 @@ +# Maintainer: Simon Zeni +pkgname=jellyfin-web +pkgver=10.10.7 +pkgrel=0 +pkgdesc="Web Client for Jellyfin" +url="https://jellyfin.org/" +# armv7: oom +arch="x86_64 armv7 aarch64" +options="net" # net for npm +license="GPL-2.0-only" +install="$pkgname.post-install" +depends="jellyfin" +makedepends="npm" +source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin-web/archive/refs/tags/v$pkgver.tar.gz" + +prepare() { + default_prepare + + npm ci --no-audit +} + +build() { + npm run build:production +} + +check() { + npm test +} + +package() { + mkdir -p "$pkgdir"/usr/share/webapps/jellyfin-web + + cp -r "$builddir"/dist/* "$pkgdir"/usr/share/webapps/jellyfin-web +} + +sha512sums=" +43836cdc15957889b4ec764f68893ff6131fa4ae1991ac0e5a4991817c491d870783b2e713883b423f30208abad1b77f1856ccaeb5008e6ba56a9bf305a1b5bd jellyfin-web-10.10.7.tar.gz +" diff --git a/user/jellyfin-web/jellyfin-web.post-install b/user/jellyfin-web/jellyfin-web.post-install new file mode 100644 index 0000000..a6e6942 --- /dev/null +++ b/user/jellyfin-web/jellyfin-web.post-install @@ -0,0 +1,6 @@ +#!/bin/sh + +printf " *\n * The default jellyfin configuration does not enable the web ui.\n" +printf " * Remove the '--nowebclient' option from /etc/conf.d/jellyfin to enable it.\n *\n" + +exit 0 From 6770f6babbeebc553e573f4e23a93f780e0a3cfe Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 28 Nov 2025 17:57:01 -0500 Subject: [PATCH 266/313] user/jellyfin-web: upgrade to 10.11.3 --- user/jellyfin-web/APKBUILD | 8 +++++--- user/jellyfin-web/bump-npm-requirement.patch | 13 +++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 user/jellyfin-web/bump-npm-requirement.patch diff --git a/user/jellyfin-web/APKBUILD b/user/jellyfin-web/APKBUILD index 243f026..44f8c19 100644 --- a/user/jellyfin-web/APKBUILD +++ b/user/jellyfin-web/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Simon Zeni pkgname=jellyfin-web -pkgver=10.10.7 +pkgver=10.11.3 pkgrel=0 pkgdesc="Web Client for Jellyfin" url="https://jellyfin.org/" @@ -11,7 +11,8 @@ license="GPL-2.0-only" install="$pkgname.post-install" depends="jellyfin" makedepends="npm" -source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin-web/archive/refs/tags/v$pkgver.tar.gz" +source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin-web/archive/refs/tags/v$pkgver.tar.gz + bump-npm-requirement.patch" prepare() { default_prepare @@ -34,5 +35,6 @@ package() { } sha512sums=" -43836cdc15957889b4ec764f68893ff6131fa4ae1991ac0e5a4991817c491d870783b2e713883b423f30208abad1b77f1856ccaeb5008e6ba56a9bf305a1b5bd jellyfin-web-10.10.7.tar.gz +ef85a77bc0dbba01a877c35627138f0e5eda9bb8ba3eb5ae79997e97b5829af8063e5666f6c77d599791633791eb318de057155d0b36e3934bbd18ff4a4e641b jellyfin-web-10.11.3.tar.gz +93e028def9e44cbe939b530754e279481d5c805014786fd141456c153a4ddd6f4fe440ef44a965ddb9d08cccf81c9bbdaa24a5600aaa76a19a8f013a936dd35e bump-npm-requirement.patch " diff --git a/user/jellyfin-web/bump-npm-requirement.patch b/user/jellyfin-web/bump-npm-requirement.patch new file mode 100644 index 0000000..3731eb2 --- /dev/null +++ b/user/jellyfin-web/bump-npm-requirement.patch @@ -0,0 +1,13 @@ +diff --git a/package.json b/package.json +index f46cb3b95..096c28562 100644 +--- a/package.json ++++ b/package.json +@@ -168,7 +168,7 @@ + }, + "engines": { + "node": ">=20.0.0", +- "npm": ">=9.6.4 <11.0.0", ++ "npm": ">=9.6.4", + "yarn": "YARN NO LONGER USED - use npm instead." + } + } From 749f413ab889787dea39699dd3aa6cbf59b96d5f Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 15:01:20 -0500 Subject: [PATCH 267/313] user/skiasharp: upgrade to 3.119.1 --- ...0001-fix-cflags-for-system-freetype2.patch | 32 ++++-------- .../skiasharp/0002-add-missing-includes.patch | 12 ----- user/skiasharp/APKBUILD | 51 ++++++------------- user/skiasharp/args.gn.in | 6 +-- 4 files changed, 28 insertions(+), 73 deletions(-) diff --git a/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch b/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch index d9464a4..2e3ef7a 100644 --- a/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch +++ b/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch @@ -1,25 +1,13 @@ -From 5f2682ed16394ba3e10ab35150c15e265ab0a0db Mon Sep 17 00:00:00 2001 -From: Naomi Rennie-Waldock -Date: Wed, 4 Dec 2024 02:01:11 +0000 -Subject: [PATCH 1/2] fix cflags for system freetype2 - ---- - third_party/freetype2/BUILD.gn | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn -index d3092c672f..1bf7d9fc62 100644 ---- a/third_party/freetype2/BUILD.gn +diff --git a/third_party/freetype2/BUILD.gn.orig b/third_party/freetype2/BUILD.gn +index 60d7954..a8cd633 100644 +--- a/third_party/freetype2/BUILD.gn.orig +++ b/third_party/freetype2/BUILD.gn -@@ -14,7 +14,7 @@ import("../third_party.gni") - - if (skia_use_system_freetype2) { - system("freetype2") { -- cflags = [ "-I=/usr/include/freetype2" ] -+ cflags = [ "-I/usr/include/freetype2" ] - libs = [ "freetype" ] +@@ -26,7 +26,7 @@ if (skia_use_system_freetype2) { + include_dirs = [ skia_system_freetype2_include_path ] + libs = [ skia_system_freetype2_lib ] + if (is_tizen) { +- cflags = [ "-I=$skia_system_freetype2_include_path" ] ++ cflags = [ "-I$skia_system_freetype2_include_path" ] + } } } else { --- -2.45.2 - diff --git a/user/skiasharp/0002-add-missing-includes.patch b/user/skiasharp/0002-add-missing-includes.patch index 7ffd79e..b6b2891 100644 --- a/user/skiasharp/0002-add-missing-includes.patch +++ b/user/skiasharp/0002-add-missing-includes.patch @@ -8,18 +8,6 @@ Subject: [PATCH 2/2] add missing includes third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp | 2 ++ 2 files changed, 3 insertions(+) -diff --git a/src/utils/SkParseColor.cpp b/src/utils/SkParseColor.cpp -index 7260365b2c..ed118fb5e9 100644 ---- a/src/utils/SkParseColor.cpp -+++ b/src/utils/SkParseColor.cpp -@@ -6,6 +6,7 @@ - */ - - -+#include - #include "include/utils/SkParse.h" - - static constexpr const char* gColorNames[] = { diff --git a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp b/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp index fb606984bd..4bc9d99420 100644 --- a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp diff --git a/user/skiasharp/APKBUILD b/user/skiasharp/APKBUILD index b82e926..5412c72 100644 --- a/user/skiasharp/APKBUILD +++ b/user/skiasharp/APKBUILD @@ -1,14 +1,15 @@ # Contributor: Naomi Rennie-Waldock # Maintainer: Naomi Rennie-Waldock pkgname=skiasharp -pkgver=2.88.9 +pkgver=3.119.1 pkgrel=0 pkgdesc="2D graphics API for .NET - native library" url="https://github.com/mono/SkiaSharp" arch="x86_64 armv7 aarch64" license="BSD-3-Clause" _llvmver=21 -_skiaver=2.88.3 +# track commit in git repo under externals/skia +_skiacommit=40f75dc0051d141913c07c20d4c19590c7da0cb7 makedepends=" cmd:awk cmd:envsubst @@ -19,55 +20,34 @@ makedepends=" freetype-dev fontconfig-dev libwebp-dev + libjpeg-turbo-dev harfbuzz-dev cmake " subpackages="$pkgname-dbg" -# SkiaSharp currently doesn't work with jpeg-turbo 3.x which we've got packaged -# https://github.com/mono/SkiaSharp/issues/2645 -# https://github.com/libjpeg-turbo/libjpeg-turbo/issues/741 -_jpegturbover=2.1.5.1 source="https://github.com/mono/SkiaSharp/archive/v$pkgver/SkiaSharp-$pkgver.tar.gz - https://github.com/mono/skia/archive/v$_skiaver/skia-$_skiaver.tar.gz + skia-$_skiacommit.tar.gz::https://github.com/mono/skia/archive/$_skiacommit.tar.gz args.gn.in 0001-fix-cflags-for-system-freetype2.patch 0002-add-missing-includes.patch - - https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/$_jpegturbover/libjpeg-turbo-$_jpegturbover.tar.gz " _skiasharpdir="$srcdir/SkiaSharp-$pkgver" -_skiadir="$srcdir/skia-$_skiaver" -_jpegturbodir="$srcdir/libjpeg-turbo-$_jpegturbover" +_skiadir="$srcdir/skia-$_skiacommit" builddir="$_skiadir" options="!check" prepare() { default_prepare - install -d "$builddir"/third_party/externals - rm -f "$builddir"/third_party/externals/libjpeg-turbo - ln -s "$_jpegturbodir" "$builddir"/third_party/externals/libjpeg-turbo - ln -sf "$_jpegturbodir"/jpeg_nbits_table.h "$_jpegturbodir"/jpeg_nbits_table.c + # fetch dependencies + ./tools/git-sync-deps } build() { - export PATH="$PATH:/usr/lib/llvm$_llvmver/bin" - # Generate config for jpeg-turbo - # Note: jpeg-turbo is linked statically as part of SkiaSharp's build process - # We just run cmake first to generate jconfig.h - cd "$_jpegturbodir" - cmake3.5 . \ - -DCMAKE_BUILD_TYPE= \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DWITH_JPEG8=1 - - # Generate build config for SkiaSharp - cd "$builddir" - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/VERSIONS.txt) + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/scripts/VERSIONS.txt) local map="$_skiasharpdir"/native/linux/libSkiaSharp/libSkiaSharp.map local _skia_arch=$CTARGET_ARCH @@ -87,7 +67,7 @@ build() { } package() { - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/VERSIONS.txt) + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/scripts/VERSIONS.txt) install -Dm644 _build/libSkiaSharp.so.$soname -t "$pkgdir"/usr/lib/ ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so.${soname%%.*} @@ -95,10 +75,9 @@ package() { } sha512sums=" -c13fb2f2cb8e231f5130e97450e242b910ea098419334303ed0b3391ff264549f9283343be8f5e1a6e59fa7ffe9d9aeb1c2d5607af0fb1fc03af0645b685dff2 SkiaSharp-2.88.9.tar.gz -43b19f6ddefe30ddf37034c73cd23feea28cb9e4a5830f8c526771afa051bdb2a96934f70dc035ca85891992b67b47d1becc6f4bf8768175db8452e144dfd9f1 skia-2.88.3.tar.gz -c1d8eace5078a25a8be5aa92337e1211055fb4d6a1da6f019e8f53871051b56af5cd18f19e0d67a34895402bbd575d233c5b5ad752e3ea5cdc85bfd63a392910 args.gn.in -0c4caa5aff089d314540959f068ca06c5580465be7a4a4abb3db9e1756a8043e14cbd4f8be677cfe4bd837b32115c8fefb2c79cf7bd52dd06fa1cb50e2406756 0001-fix-cflags-for-system-freetype2.patch -7eac411d6f235a450dcccf7d451ecc0d9516761b3cf37d3b0438fa2648b4ce7b0912de16d27221dc1df82fe62efb9287084fce433f1aeae48732da454402dbd7 0002-add-missing-includes.patch -86a7248d064043b26b09755633ef4872a2a6133c9e677a9fe4be6645b2e0fde102cf01e09119967b3b6b85f4cb93f3f7c49ec4973944d5eff99b5b90ce8b0be6 libjpeg-turbo-2.1.5.1.tar.gz +cf9c292edebe972e318f9a807216a5e26053e2cf4b56c4dd0b6a0c7c046a2cec67ae65550fb0e5656ae0fd0b372f5a70dcc4a8704ffe1690f5a8fbc1abadf95b SkiaSharp-3.119.1.tar.gz +ee27e49434a5fe2efb2565e80dd682b6f4e91bb15d1e13f635a1d658929262bc069d04bdf49baf98b62a0425cc9353f3365cb7557c83a03b05381acb2acb2e0d skia-40f75dc0051d141913c07c20d4c19590c7da0cb7.tar.gz +b2b87cec448f5ce777d28c9e865621a121d2f32dc9d9b31d254781fc288d69e4a3a5276664d16f1ecc5eaf9963404657ad0770aeabe14c5a127847262694efd2 args.gn.in +3c6543aa126ba395d32f6831feb5121b151c89b2770589858d5b7820e1fc4d94aa2d89da4e954472b5f3fe9194448f72535b23d2f2815f90d6a9e7ae022fb42f 0001-fix-cflags-for-system-freetype2.patch +44c0044c72ccd9a5a3f679f1fe548264a779c87726d2af448c711d5c2f9b003b69056e0b231e87193d91c66416dc613be992808172522b27d02807845d30f463 0002-add-missing-includes.patch " diff --git a/user/skiasharp/args.gn.in b/user/skiasharp/args.gn.in index 4b7d5dd..cd93cd3 100644 --- a/user/skiasharp/args.gn.in +++ b/user/skiasharp/args.gn.in @@ -2,13 +2,13 @@ is_official_build=true target_os="linux" target_cpu="$_skia_arch" skia_enable_gpu=true -skia_use_icu=false +skia_use_icu=true skia_use_piex=true -skia_use_sfntly=false +skia_use_sfntly=true skia_enable_skottie=true skia_enable_tools=false skia_use_vulkan=true -skia_use_system_libjpeg_turbo=false +skia_use_system_libjpeg_turbo=true # disabled as it's not packaged skia_use_dng_sdk=false extra_cflags=[ "-DSKIA_C_DLL" ] From f45c1e54db385a1f4d717ad808de3ce954a422d5 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 15:01:32 -0500 Subject: [PATCH 268/313] user/jellyfin: upgrade to 10.11.3 --- user/jellyfin/APKBUILD | 16 +++++---- user/jellyfin/remove-prebuilt-library.patch | 39 +++++++++++---------- user/jellyfin/use-skiasharp-3-119-1.patch | 16 +++++++++ 3 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 user/jellyfin/use-skiasharp-3-119-1.patch diff --git a/user/jellyfin/APKBUILD b/user/jellyfin/APKBUILD index edc9907..f3621b0 100644 --- a/user/jellyfin/APKBUILD +++ b/user/jellyfin/APKBUILD @@ -1,20 +1,21 @@ # Maintainer: Simon Zeni # Contributor: Fabricio Silva pkgname=jellyfin -pkgver=10.10.7 -pkgrel=1 +pkgver=10.11.3 +pkgrel=0 pkgdesc="The Free Software Media System" install="$pkgname.pre-install" url="https://jellyfin.org/" arch="x86_64 armv7 aarch64" license="GPL-2.0-only" -makedepends="dotnet8-sdk" -depends="aspnetcore8-runtime jellyfin-ffmpeg skiasharp" +makedepends="dotnet9-sdk" +depends="aspnetcore9-runtime jellyfin-ffmpeg skiasharp" subpackages="$pkgname-openrc" source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin/archive/refs/tags/v$pkgver.tar.gz $pkgname.initd $pkgname.confd -remove-prebuilt-library.patch + remove-prebuilt-library.patch + use-skiasharp-3-119-1.patch " build() { @@ -43,8 +44,9 @@ package() { } sha512sums=" -6c48401f4acf509b69fb6b8916be54b1b697aa85308ac4a39345bef0ce61c78c4ad978650569ac0964eeb9389fdea249ffc279a37bcd49c0341d3825423f5a97 jellyfin-10.10.7.tar.gz +2dd7d2cebc5eed57ab4d38a3004f255a3239a0c23d2d133ab6e0d6a9495fc2e774749af5f53d15968af957e5e96255e1b82089e93101feba78d7800973eb4ac6 jellyfin-10.11.3.tar.gz bcdb882b837a08e4c1db363fbf2a075f0d6558a537c3f798b1473f9f1b5b887b6da1928558b0aede8bf56ab16469ac9e80dc95b0f874533ad744465a92b37696 jellyfin.initd 594c26e5235ae2265f3f586f596cd6b57fa0e0cec83531b6fadba48181870167f04381266c6005f1f6cb5cd76d254100a08a871ecb8da28e5890f979816a7b8b jellyfin.confd -50b9535d7b2dbebf7fbda1dc2d88941dad5530c8ab3e8e07c1203c328af426816036b5e6b4d6deb69fa344611bc18785cf8593d7d990a1cbfae0e14c9324b592 remove-prebuilt-library.patch +fc0bbeab0f37f8d483d7c1b7d9162bf5cbeb79fa82e7b652bf712c07332d8cbcceb80bc21ccaceaa8a10196c3dd9ddcf33977e3baedcd5e3fd5b5cd5a3b60f1a remove-prebuilt-library.patch +cc81a9b0f83914a35d96c68067311eea4c4aaca1f921da9dbb7ff37a06833b6124b48da15d33c44cce5323c1b3f278e96584af66aa491850d4fc5f9d3cd57630 use-skiasharp-3-119-1.patch " diff --git a/user/jellyfin/remove-prebuilt-library.patch b/user/jellyfin/remove-prebuilt-library.patch index 09dc3a3..7efbaf0 100644 --- a/user/jellyfin/remove-prebuilt-library.patch +++ b/user/jellyfin/remove-prebuilt-library.patch @@ -1,22 +1,3 @@ -diff -urp jellyfin-10.10.3.bak/Directory.Packages.props jellyfin-10.10.3/Directory.Packages.props ---- jellyfin-10.10.3.bak/Directory.Packages.props 2024-11-19 03:38:42.000000000 +0000 -+++ jellyfin-10.10.3/Directory.Packages.props 2024-12-04 02:20:12.294901276 +0000 -@@ -17,7 +17,6 @@ - - - -- - - - -@@ -68,7 +67,6 @@ - - - -- - - - diff -urp jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj --- jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-11-19 03:38:42.000000000 +0000 +++ jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-12-04 02:21:05.773987361 +0000 @@ -30,3 +11,23 @@ diff -urp jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.c +diff --git a/Directory.Packages.props.orig b/Directory.Packages.props +index dc3e7d7..275ba3c 100644 +--- a/Directory.Packages.props.orig ++++ b/Directory.Packages.props +@@ -18,7 +18,6 @@ + + + +- + + + +@@ -76,7 +75,6 @@ + + + +- + + + diff --git a/user/jellyfin/use-skiasharp-3-119-1.patch b/user/jellyfin/use-skiasharp-3-119-1.patch new file mode 100644 index 0000000..5068d4a --- /dev/null +++ b/user/jellyfin/use-skiasharp-3-119-1.patch @@ -0,0 +1,16 @@ +diff --git a/Directory.Packages.props.orig b/Directory.Packages.props +index 275ba3c..18cc64a 100644 +--- a/Directory.Packages.props.orig ++++ b/Directory.Packages.props +@@ -72,9 +72,8 @@ + + + +- +- +- ++ ++ + + + From 73ebcb7fcc409860e2b54b3e9c35ad23a0790bdc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 17:48:04 -0500 Subject: [PATCH 269/313] user/skiasharp: use vendored libjpeg-turbo --- user/skiasharp/APKBUILD | 4 ++-- user/skiasharp/args.gn.in | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/user/skiasharp/APKBUILD b/user/skiasharp/APKBUILD index 5412c72..8f48938 100644 --- a/user/skiasharp/APKBUILD +++ b/user/skiasharp/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Naomi Rennie-Waldock pkgname=skiasharp pkgver=3.119.1 -pkgrel=0 +pkgrel=1 pkgdesc="2D graphics API for .NET - native library" url="https://github.com/mono/SkiaSharp" arch="x86_64 armv7 aarch64" @@ -77,7 +77,7 @@ package() { sha512sums=" cf9c292edebe972e318f9a807216a5e26053e2cf4b56c4dd0b6a0c7c046a2cec67ae65550fb0e5656ae0fd0b372f5a70dcc4a8704ffe1690f5a8fbc1abadf95b SkiaSharp-3.119.1.tar.gz ee27e49434a5fe2efb2565e80dd682b6f4e91bb15d1e13f635a1d658929262bc069d04bdf49baf98b62a0425cc9353f3365cb7557c83a03b05381acb2acb2e0d skia-40f75dc0051d141913c07c20d4c19590c7da0cb7.tar.gz -b2b87cec448f5ce777d28c9e865621a121d2f32dc9d9b31d254781fc288d69e4a3a5276664d16f1ecc5eaf9963404657ad0770aeabe14c5a127847262694efd2 args.gn.in +705945ca1cd1b6922a2491ef1ab17b3899334b5b30fb236ced09f7383779184d1c670698874602da3d367bcf35297e14bc6a362ed85f19f8ecc5209fb2918917 args.gn.in 3c6543aa126ba395d32f6831feb5121b151c89b2770589858d5b7820e1fc4d94aa2d89da4e954472b5f3fe9194448f72535b23d2f2815f90d6a9e7ae022fb42f 0001-fix-cflags-for-system-freetype2.patch 44c0044c72ccd9a5a3f679f1fe548264a779c87726d2af448c711d5c2f9b003b69056e0b231e87193d91c66416dc613be992808172522b27d02807845d30f463 0002-add-missing-includes.patch " diff --git a/user/skiasharp/args.gn.in b/user/skiasharp/args.gn.in index cd93cd3..b88b358 100644 --- a/user/skiasharp/args.gn.in +++ b/user/skiasharp/args.gn.in @@ -8,7 +8,7 @@ skia_use_sfntly=true skia_enable_skottie=true skia_enable_tools=false skia_use_vulkan=true -skia_use_system_libjpeg_turbo=true +skia_use_system_libjpeg_turbo=false # disabled as it's not packaged skia_use_dng_sdk=false extra_cflags=[ "-DSKIA_C_DLL" ] From c25b332251b34b85fa1458779afa881dca01687c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 19:47:40 -0500 Subject: [PATCH 270/313] user/skiasharp: use preprocessed tar --- ....patch => 0001-add-missing-includes.patch} | 6 +-- ...0001-fix-cflags-for-system-freetype2.patch | 13 ----- user/skiasharp/APKBUILD | 51 ++++++++----------- 3 files changed, 23 insertions(+), 47 deletions(-) rename user/skiasharp/{0002-add-missing-includes.patch => 0001-add-missing-includes.patch} (65%) delete mode 100644 user/skiasharp/0001-fix-cflags-for-system-freetype2.patch diff --git a/user/skiasharp/0002-add-missing-includes.patch b/user/skiasharp/0001-add-missing-includes.patch similarity index 65% rename from user/skiasharp/0002-add-missing-includes.patch rename to user/skiasharp/0001-add-missing-includes.patch index b6b2891..4a840e8 100644 --- a/user/skiasharp/0002-add-missing-includes.patch +++ b/user/skiasharp/0001-add-missing-includes.patch @@ -8,10 +8,10 @@ Subject: [PATCH 2/2] add missing includes third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp | 2 ++ 2 files changed, 3 insertions(+) -diff --git a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp b/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp +diff --git a/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp b/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp index fb606984bd..4bc9d99420 100644 ---- a/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp -+++ b/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp +--- a/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp ++++ b/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp @@ -5,6 +5,8 @@ * found in the LICENSE file. */ diff --git a/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch b/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch deleted file mode 100644 index 2e3ef7a..0000000 --- a/user/skiasharp/0001-fix-cflags-for-system-freetype2.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/third_party/freetype2/BUILD.gn.orig b/third_party/freetype2/BUILD.gn -index 60d7954..a8cd633 100644 ---- a/third_party/freetype2/BUILD.gn.orig -+++ b/third_party/freetype2/BUILD.gn -@@ -26,7 +26,7 @@ if (skia_use_system_freetype2) { - include_dirs = [ skia_system_freetype2_include_path ] - libs = [ skia_system_freetype2_lib ] - if (is_tizen) { -- cflags = [ "-I=$skia_system_freetype2_include_path" ] -+ cflags = [ "-I$skia_system_freetype2_include_path" ] - } - } - } else { diff --git a/user/skiasharp/APKBUILD b/user/skiasharp/APKBUILD index 8f48938..62ecc16 100644 --- a/user/skiasharp/APKBUILD +++ b/user/skiasharp/APKBUILD @@ -1,5 +1,5 @@ # Contributor: Naomi Rennie-Waldock -# Maintainer: Naomi Rennie-Waldock +# Maintainer: Antoine Martin (ayakael) pkgname=skiasharp pkgver=3.119.1 pkgrel=1 @@ -8,8 +8,6 @@ url="https://github.com/mono/SkiaSharp" arch="x86_64 armv7 aarch64" license="BSD-3-Clause" _llvmver=21 -# track commit in git repo under externals/skia -_skiacommit=40f75dc0051d141913c07c20d4c19590c7da0cb7 makedepends=" cmd:awk cmd:envsubst @@ -23,32 +21,21 @@ makedepends=" libjpeg-turbo-dev harfbuzz-dev cmake + zstd " subpackages="$pkgname-dbg" -source="https://github.com/mono/SkiaSharp/archive/v$pkgver/SkiaSharp-$pkgver.tar.gz - skia-$_skiacommit.tar.gz::https://github.com/mono/skia/archive/$_skiacommit.tar.gz - +source=" + https://ayakael.net/api/packages/mirrors/generic/skiasharp/v$pkgver/skiasharp-v$pkgver.tar.zst args.gn.in - - 0001-fix-cflags-for-system-freetype2.patch - 0002-add-missing-includes.patch + 0001-add-missing-includes.patch " -_skiasharpdir="$srcdir/SkiaSharp-$pkgver" -_skiadir="$srcdir/skia-$_skiacommit" -builddir="$_skiadir" +builddir="$srcdir"/skiasharp-v$pkgver options="!check" -prepare() { - default_prepare - - # fetch dependencies - ./tools/git-sync-deps -} - build() { export PATH="$PATH:/usr/lib/llvm$_llvmver/bin" - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/scripts/VERSIONS.txt) - local map="$_skiasharpdir"/native/linux/libSkiaSharp/libSkiaSharp.map + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$builddir"/scripts/VERSIONS.txt) + local map="$builddir"/native/linux/libSkiaSharp/libSkiaSharp.map local _skia_arch=$CTARGET_ARCH case "$CTARGET_ARCH" in @@ -59,25 +46,27 @@ build() { export soname map _skia_arch _llvmver - [ -d _build ] || mkdir _build - envsubst < "$srcdir"/args.gn.in > _build/args.gn + ( + cd externals/skia - gn gen _build - ninja -j"${JOBS:-1}" -C _build SkiaSharp + [ -d _build ] || mkdir _build + envsubst < "$srcdir"/args.gn.in > _build/args.gn + + gn gen _build + ninja -j"${JOBS:-1}" -C _build SkiaSharp + ) } package() { - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$_skiasharpdir"/scripts/VERSIONS.txt) + local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$builddir"/scripts/VERSIONS.txt) - install -Dm644 _build/libSkiaSharp.so.$soname -t "$pkgdir"/usr/lib/ + install -Dm644 "$builddir"/externals/skia/_build/libSkiaSharp.so.$soname -t "$pkgdir"/usr/lib/ ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so.${soname%%.*} ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so } sha512sums=" -cf9c292edebe972e318f9a807216a5e26053e2cf4b56c4dd0b6a0c7c046a2cec67ae65550fb0e5656ae0fd0b372f5a70dcc4a8704ffe1690f5a8fbc1abadf95b SkiaSharp-3.119.1.tar.gz -ee27e49434a5fe2efb2565e80dd682b6f4e91bb15d1e13f635a1d658929262bc069d04bdf49baf98b62a0425cc9353f3365cb7557c83a03b05381acb2acb2e0d skia-40f75dc0051d141913c07c20d4c19590c7da0cb7.tar.gz +f46ae10474cbf66de5d86a6041e682ebaa7c68d640836ba283023d4d5787ddfa32ae7853b2e19da1ec5a65e40f4ae71d11e55721f6e0ed136b7bbd8477464564 skiasharp-v3.119.1.tar.zst 705945ca1cd1b6922a2491ef1ab17b3899334b5b30fb236ced09f7383779184d1c670698874602da3d367bcf35297e14bc6a362ed85f19f8ecc5209fb2918917 args.gn.in -3c6543aa126ba395d32f6831feb5121b151c89b2770589858d5b7820e1fc4d94aa2d89da4e954472b5f3fe9194448f72535b23d2f2815f90d6a9e7ae022fb42f 0001-fix-cflags-for-system-freetype2.patch -44c0044c72ccd9a5a3f679f1fe548264a779c87726d2af448c711d5c2f9b003b69056e0b231e87193d91c66416dc613be992808172522b27d02807845d30f463 0002-add-missing-includes.patch +a189922f8870352223b2aa9b922167398513333f6f82627b0499d7ca7fbeb211f0f5b192e5caad5b4eb9ebbb49de16f41c691309c3d41b3b19dc17cd13cf18b8 0001-add-missing-includes.patch " From 23bcbc75138e5c8b9e5028d0926100b5d8368e62 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 19:48:20 -0500 Subject: [PATCH 271/313] user/jellyfin: set skiasharp version dynamically --- user/jellyfin/APKBUILD | 17 +++++++++++++---- user/jellyfin/use-skiasharp-3-119-1.patch | 16 ---------------- 2 files changed, 13 insertions(+), 20 deletions(-) delete mode 100644 user/jellyfin/use-skiasharp-3-119-1.patch diff --git a/user/jellyfin/APKBUILD b/user/jellyfin/APKBUILD index f3621b0..0fb06df 100644 --- a/user/jellyfin/APKBUILD +++ b/user/jellyfin/APKBUILD @@ -1,5 +1,5 @@ -# Maintainer: Simon Zeni # Contributor: Fabricio Silva +# Maintainer: Simon Zeni pkgname=jellyfin pkgver=10.11.3 pkgrel=0 @@ -8,16 +8,26 @@ install="$pkgname.pre-install" url="https://jellyfin.org/" arch="x86_64 armv7 aarch64" license="GPL-2.0-only" -makedepends="dotnet9-sdk" +makedepends="dotnet9-sdk gawk" depends="aspnetcore9-runtime jellyfin-ffmpeg skiasharp" subpackages="$pkgname-openrc" source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin/archive/refs/tags/v$pkgver.tar.gz $pkgname.initd $pkgname.confd remove-prebuilt-library.patch - use-skiasharp-3-119-1.patch " +prepare() { + default_prepare + + # set SkiaSharp and SkiaSharp.Harfbuzz version based on packaged library + local _skia_packagedver=$(apk version skiasharp | tail -n 1 | awk -F '=' '{print $2}' | tr -d ' ') + local _skia_packagedver=${_skia_packagedver/-*} + msg "Building against skiasharp $_skia_packagedver" + gawk -i inplace -v "skia_version=Version\=\"$_skia_packagedver\"" '{if($2 == "Include=\"SkiaSharp\""){ $3 = skia_version}{print}}' Directory.Packages.props + gawk -i inplace -v "skia_version=Version\=\"$_skia_packagedver\"" '{if($2 == "Include=\"SkiaSharp.HarfBuzz\""){ $3 = skia_version}{print}}' Directory.Packages.props +} + build() { dotnet publish Jellyfin.Server \ --configuration Release \ @@ -48,5 +58,4 @@ sha512sums=" bcdb882b837a08e4c1db363fbf2a075f0d6558a537c3f798b1473f9f1b5b887b6da1928558b0aede8bf56ab16469ac9e80dc95b0f874533ad744465a92b37696 jellyfin.initd 594c26e5235ae2265f3f586f596cd6b57fa0e0cec83531b6fadba48181870167f04381266c6005f1f6cb5cd76d254100a08a871ecb8da28e5890f979816a7b8b jellyfin.confd fc0bbeab0f37f8d483d7c1b7d9162bf5cbeb79fa82e7b652bf712c07332d8cbcceb80bc21ccaceaa8a10196c3dd9ddcf33977e3baedcd5e3fd5b5cd5a3b60f1a remove-prebuilt-library.patch -cc81a9b0f83914a35d96c68067311eea4c4aaca1f921da9dbb7ff37a06833b6124b48da15d33c44cce5323c1b3f278e96584af66aa491850d4fc5f9d3cd57630 use-skiasharp-3-119-1.patch " diff --git a/user/jellyfin/use-skiasharp-3-119-1.patch b/user/jellyfin/use-skiasharp-3-119-1.patch deleted file mode 100644 index 5068d4a..0000000 --- a/user/jellyfin/use-skiasharp-3-119-1.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/Directory.Packages.props.orig b/Directory.Packages.props -index 275ba3c..18cc64a 100644 ---- a/Directory.Packages.props.orig -+++ b/Directory.Packages.props -@@ -72,9 +72,8 @@ - - - -- -- -- -+ -+ - - - From d6eed040f22426ca9a302edc9aa5f004b2c943c1 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 1 Dec 2025 10:42:33 -0500 Subject: [PATCH 272/313] user/jellyfin{,-web}, skiasharp: drop due to merged on aports --- user/jellyfin-web/APKBUILD | 40 ----------- user/jellyfin-web/bump-npm-requirement.patch | 13 ---- user/jellyfin-web/jellyfin-web.post-install | 6 -- user/jellyfin/APKBUILD | 61 ---------------- user/jellyfin/jellyfin.confd | 7 -- user/jellyfin/jellyfin.initd | 20 ------ user/jellyfin/jellyfin.pre-install | 9 --- user/jellyfin/remove-prebuilt-library.patch | 33 --------- .../skiasharp/0001-add-missing-includes.patch | 26 ------- user/skiasharp/APKBUILD | 72 ------------------- user/skiasharp/args.gn.in | 19 ----- 11 files changed, 306 deletions(-) delete mode 100644 user/jellyfin-web/APKBUILD delete mode 100644 user/jellyfin-web/bump-npm-requirement.patch delete mode 100644 user/jellyfin-web/jellyfin-web.post-install delete mode 100644 user/jellyfin/APKBUILD delete mode 100644 user/jellyfin/jellyfin.confd delete mode 100644 user/jellyfin/jellyfin.initd delete mode 100644 user/jellyfin/jellyfin.pre-install delete mode 100644 user/jellyfin/remove-prebuilt-library.patch delete mode 100644 user/skiasharp/0001-add-missing-includes.patch delete mode 100644 user/skiasharp/APKBUILD delete mode 100644 user/skiasharp/args.gn.in diff --git a/user/jellyfin-web/APKBUILD b/user/jellyfin-web/APKBUILD deleted file mode 100644 index 44f8c19..0000000 --- a/user/jellyfin-web/APKBUILD +++ /dev/null @@ -1,40 +0,0 @@ -# Maintainer: Simon Zeni -pkgname=jellyfin-web -pkgver=10.11.3 -pkgrel=0 -pkgdesc="Web Client for Jellyfin" -url="https://jellyfin.org/" -# armv7: oom -arch="x86_64 armv7 aarch64" -options="net" # net for npm -license="GPL-2.0-only" -install="$pkgname.post-install" -depends="jellyfin" -makedepends="npm" -source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin-web/archive/refs/tags/v$pkgver.tar.gz - bump-npm-requirement.patch" - -prepare() { - default_prepare - - npm ci --no-audit -} - -build() { - npm run build:production -} - -check() { - npm test -} - -package() { - mkdir -p "$pkgdir"/usr/share/webapps/jellyfin-web - - cp -r "$builddir"/dist/* "$pkgdir"/usr/share/webapps/jellyfin-web -} - -sha512sums=" -ef85a77bc0dbba01a877c35627138f0e5eda9bb8ba3eb5ae79997e97b5829af8063e5666f6c77d599791633791eb318de057155d0b36e3934bbd18ff4a4e641b jellyfin-web-10.11.3.tar.gz -93e028def9e44cbe939b530754e279481d5c805014786fd141456c153a4ddd6f4fe440ef44a965ddb9d08cccf81c9bbdaa24a5600aaa76a19a8f013a936dd35e bump-npm-requirement.patch -" diff --git a/user/jellyfin-web/bump-npm-requirement.patch b/user/jellyfin-web/bump-npm-requirement.patch deleted file mode 100644 index 3731eb2..0000000 --- a/user/jellyfin-web/bump-npm-requirement.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/package.json b/package.json -index f46cb3b95..096c28562 100644 ---- a/package.json -+++ b/package.json -@@ -168,7 +168,7 @@ - }, - "engines": { - "node": ">=20.0.0", -- "npm": ">=9.6.4 <11.0.0", -+ "npm": ">=9.6.4", - "yarn": "YARN NO LONGER USED - use npm instead." - } - } diff --git a/user/jellyfin-web/jellyfin-web.post-install b/user/jellyfin-web/jellyfin-web.post-install deleted file mode 100644 index a6e6942..0000000 --- a/user/jellyfin-web/jellyfin-web.post-install +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -printf " *\n * The default jellyfin configuration does not enable the web ui.\n" -printf " * Remove the '--nowebclient' option from /etc/conf.d/jellyfin to enable it.\n *\n" - -exit 0 diff --git a/user/jellyfin/APKBUILD b/user/jellyfin/APKBUILD deleted file mode 100644 index 0fb06df..0000000 --- a/user/jellyfin/APKBUILD +++ /dev/null @@ -1,61 +0,0 @@ -# Contributor: Fabricio Silva -# Maintainer: Simon Zeni -pkgname=jellyfin -pkgver=10.11.3 -pkgrel=0 -pkgdesc="The Free Software Media System" -install="$pkgname.pre-install" -url="https://jellyfin.org/" -arch="x86_64 armv7 aarch64" -license="GPL-2.0-only" -makedepends="dotnet9-sdk gawk" -depends="aspnetcore9-runtime jellyfin-ffmpeg skiasharp" -subpackages="$pkgname-openrc" -source="$pkgname-$pkgver.tar.gz::https://github.com/jellyfin/jellyfin/archive/refs/tags/v$pkgver.tar.gz - $pkgname.initd - $pkgname.confd - remove-prebuilt-library.patch - " - -prepare() { - default_prepare - - # set SkiaSharp and SkiaSharp.Harfbuzz version based on packaged library - local _skia_packagedver=$(apk version skiasharp | tail -n 1 | awk -F '=' '{print $2}' | tr -d ' ') - local _skia_packagedver=${_skia_packagedver/-*} - msg "Building against skiasharp $_skia_packagedver" - gawk -i inplace -v "skia_version=Version\=\"$_skia_packagedver\"" '{if($2 == "Include=\"SkiaSharp\""){ $3 = skia_version}{print}}' Directory.Packages.props - gawk -i inplace -v "skia_version=Version\=\"$_skia_packagedver\"" '{if($2 == "Include=\"SkiaSharp.HarfBuzz\""){ $3 = skia_version}{print}}' Directory.Packages.props -} - -build() { - dotnet publish Jellyfin.Server \ - --configuration Release \ - --no-self-contained \ - --use-current-runtime \ - --output publish -} - -check() { - dotnet test --no-restore -} - -package() { - mkdir -p "$pkgdir"/usr/lib "$pkgdir"/usr/bin - - cp -a publish "$pkgdir"/usr/lib/jellyfin - ln -s ../lib/jellyfin/jellyfin "$pkgdir"/usr/bin/jellyfin - ln -s ../libSkiaSharp.so "$pkgdir"/usr/lib/jellyfin/libSkiaSharp.so - - install -Dm755 "$srcdir"/$pkgname.initd \ - "$pkgdir"/etc/init.d/$pkgname - install -Dm644 "$srcdir"/$pkgname.confd \ - "$pkgdir"/etc/conf.d/$pkgname -} - -sha512sums=" -2dd7d2cebc5eed57ab4d38a3004f255a3239a0c23d2d133ab6e0d6a9495fc2e774749af5f53d15968af957e5e96255e1b82089e93101feba78d7800973eb4ac6 jellyfin-10.11.3.tar.gz -bcdb882b837a08e4c1db363fbf2a075f0d6558a537c3f798b1473f9f1b5b887b6da1928558b0aede8bf56ab16469ac9e80dc95b0f874533ad744465a92b37696 jellyfin.initd -594c26e5235ae2265f3f586f596cd6b57fa0e0cec83531b6fadba48181870167f04381266c6005f1f6cb5cd76d254100a08a871ecb8da28e5890f979816a7b8b jellyfin.confd -fc0bbeab0f37f8d483d7c1b7d9162bf5cbeb79fa82e7b652bf712c07332d8cbcceb80bc21ccaceaa8a10196c3dd9ddcf33977e3baedcd5e3fd5b5cd5a3b60f1a remove-prebuilt-library.patch -" diff --git a/user/jellyfin/jellyfin.confd b/user/jellyfin/jellyfin.confd deleted file mode 100644 index 38c0def..0000000 --- a/user/jellyfin/jellyfin.confd +++ /dev/null @@ -1,7 +0,0 @@ -supervisor=supervise-daemon -datadir="/var/lib/jellyfin" -cachedir="/var/cache/jellyfin" -logdir="/var/log/jellyfin" -webdir="/usr/share/webapps/jellyfin-web" -ffmpegpath="/usr/lib/jellyfin-ffmpeg/ffmpeg" -opts="--nowebclient" diff --git a/user/jellyfin/jellyfin.initd b/user/jellyfin/jellyfin.initd deleted file mode 100644 index 4641de7..0000000 --- a/user/jellyfin/jellyfin.initd +++ /dev/null @@ -1,20 +0,0 @@ -#!/sbin/openrc-run - -name=jellyfin -description="The Free Software Media System" - -command=/usr/bin/jellyfin -command_user=jellyfin:jellyfin -command_args="--webdir ${webdir:-/usr/share/webapps/jellyfin-web} --datadir ${datadir} --cachedir ${cachedir} --logdir ${logdir} --ffmpeg ${ffmpegpath:-/usr/lib/jellyfin-ffmpeg/ffmpeg} ${opts}" - -depend() { - use logger dns - need net - after firewall -} - -start_pre() { - checkpath -d -o $command_user "$datadir" - checkpath -d -o $command_user "$cachedir" - checkpath -d -o $command_user "$logdir" -} diff --git a/user/jellyfin/jellyfin.pre-install b/user/jellyfin/jellyfin.pre-install deleted file mode 100644 index 6e64716..0000000 --- a/user/jellyfin/jellyfin.pre-install +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -user=jellyfin -group=jellyfin - -addgroup -S $group 2>/dev/null -adduser -S -D -h /var/lib/$user -s /sbin/nologin -G $group -g $user $user 2>/dev/null - -exit 0 diff --git a/user/jellyfin/remove-prebuilt-library.patch b/user/jellyfin/remove-prebuilt-library.patch deleted file mode 100644 index 7efbaf0..0000000 --- a/user/jellyfin/remove-prebuilt-library.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -urp jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj ---- jellyfin-10.10.3.bak/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-11-19 03:38:42.000000000 +0000 -+++ jellyfin-10.10.3/src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj 2024-12-04 02:21:05.773987361 +0000 -@@ -20,9 +20,7 @@ - - - -- - -- - - - -diff --git a/Directory.Packages.props.orig b/Directory.Packages.props -index dc3e7d7..275ba3c 100644 ---- a/Directory.Packages.props.orig -+++ b/Directory.Packages.props -@@ -18,7 +18,6 @@ - - - -- - - - -@@ -76,7 +75,6 @@ - - - -- - - - diff --git a/user/skiasharp/0001-add-missing-includes.patch b/user/skiasharp/0001-add-missing-includes.patch deleted file mode 100644 index 4a840e8..0000000 --- a/user/skiasharp/0001-add-missing-includes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 4367484b44f349f3f9009a001167c08a61f6934b Mon Sep 17 00:00:00 2001 -From: Naomi Rennie-Waldock -Date: Wed, 4 Dec 2024 02:02:29 +0000 -Subject: [PATCH 2/2] add missing includes - ---- - src/utils/SkParseColor.cpp | 1 + - third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp | 2 ++ - 2 files changed, 3 insertions(+) - -diff --git a/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp b/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp -index fb606984bd..4bc9d99420 100644 ---- a/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp -+++ b/externals/skia/third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp -@@ -5,6 +5,8 @@ - * found in the LICENSE file. - */ - -+#include -+ - // We use our own functions pointers - #define VMA_STATIC_VULKAN_FUNCTIONS 0 - #define VMA_DYNAMIC_VULKAN_FUNCTIONS 0 --- -2.45.2 - diff --git a/user/skiasharp/APKBUILD b/user/skiasharp/APKBUILD deleted file mode 100644 index 62ecc16..0000000 --- a/user/skiasharp/APKBUILD +++ /dev/null @@ -1,72 +0,0 @@ -# Contributor: Naomi Rennie-Waldock -# Maintainer: Antoine Martin (ayakael) -pkgname=skiasharp -pkgver=3.119.1 -pkgrel=1 -pkgdesc="2D graphics API for .NET - native library" -url="https://github.com/mono/SkiaSharp" -arch="x86_64 armv7 aarch64" -license="BSD-3-Clause" -_llvmver=21 -makedepends=" - cmd:awk - cmd:envsubst - clang$_llvmver - llvm$_llvmver - gn - ninja - freetype-dev - fontconfig-dev - libwebp-dev - libjpeg-turbo-dev - harfbuzz-dev - cmake - zstd - " -subpackages="$pkgname-dbg" -source=" - https://ayakael.net/api/packages/mirrors/generic/skiasharp/v$pkgver/skiasharp-v$pkgver.tar.zst - args.gn.in - 0001-add-missing-includes.patch - " -builddir="$srcdir"/skiasharp-v$pkgver -options="!check" - -build() { - export PATH="$PATH:/usr/lib/llvm$_llvmver/bin" - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$builddir"/scripts/VERSIONS.txt) - local map="$builddir"/native/linux/libSkiaSharp/libSkiaSharp.map - local _skia_arch=$CTARGET_ARCH - - case "$CTARGET_ARCH" in - aarch64) _skia_arch=arm64 ;; - armv7) _skia_arch=arm ;; - x86_64) _skia_arch=x64 ;; - esac - - export soname map _skia_arch _llvmver - - ( - cd externals/skia - - [ -d _build ] || mkdir _build - envsubst < "$srcdir"/args.gn.in > _build/args.gn - - gn gen _build - ninja -j"${JOBS:-1}" -C _build SkiaSharp - ) -} - -package() { - local soname=$(awk '$1 == "libSkiaSharp" && $2 == "soname" { print $3 }' "$builddir"/scripts/VERSIONS.txt) - - install -Dm644 "$builddir"/externals/skia/_build/libSkiaSharp.so.$soname -t "$pkgdir"/usr/lib/ - ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so.${soname%%.*} - ln -s libSkiaSharp.so.$soname "$pkgdir"/usr/lib/libSkiaSharp.so -} - -sha512sums=" -f46ae10474cbf66de5d86a6041e682ebaa7c68d640836ba283023d4d5787ddfa32ae7853b2e19da1ec5a65e40f4ae71d11e55721f6e0ed136b7bbd8477464564 skiasharp-v3.119.1.tar.zst -705945ca1cd1b6922a2491ef1ab17b3899334b5b30fb236ced09f7383779184d1c670698874602da3d367bcf35297e14bc6a362ed85f19f8ecc5209fb2918917 args.gn.in -a189922f8870352223b2aa9b922167398513333f6f82627b0499d7ca7fbeb211f0f5b192e5caad5b4eb9ebbb49de16f41c691309c3d41b3b19dc17cd13cf18b8 0001-add-missing-includes.patch -" diff --git a/user/skiasharp/args.gn.in b/user/skiasharp/args.gn.in deleted file mode 100644 index b88b358..0000000 --- a/user/skiasharp/args.gn.in +++ /dev/null @@ -1,19 +0,0 @@ -is_official_build=true -target_os="linux" -target_cpu="$_skia_arch" -skia_enable_gpu=true -skia_use_icu=true -skia_use_piex=true -skia_use_sfntly=true -skia_enable_skottie=true -skia_enable_tools=false -skia_use_vulkan=true -skia_use_system_libjpeg_turbo=false -# disabled as it's not packaged -skia_use_dng_sdk=false -extra_cflags=[ "-DSKIA_C_DLL" ] -extra_ldflags=[ "-Wl,--version-script=$map" ] -linux_soname_version="$soname" -cc="clang" -cxx="clang++" -ar="llvm-ar" From ee0ce1377325cfdcea87a31c7f41a876c0bed9fe Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:26:58 -0500 Subject: [PATCH 273/313] backports/calibre: upgrade to 8.14.0 --- backports/calibre/0002-calibre-use-make.patch | 13 ++++++ .../calibre/0003-calibre-disable-piper.patch | 46 +++++++++++++++++++ backports/calibre/APKBUILD | 14 ++++-- backports/calibre/musl-pread.patch | 11 ----- 4 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 backports/calibre/0002-calibre-use-make.patch create mode 100644 backports/calibre/0003-calibre-disable-piper.patch delete mode 100644 backports/calibre/musl-pread.patch diff --git a/backports/calibre/0002-calibre-use-make.patch b/backports/calibre/0002-calibre-use-make.patch new file mode 100644 index 0000000..1b49726 --- /dev/null +++ b/backports/calibre/0002-calibre-use-make.patch @@ -0,0 +1,13 @@ +diff --git a/setup/build.py b/setup/build.py +index 956ad7504f..aa9d7ea028 100644 +--- a/setup/build.py ++++ b/setup/build.py +@@ -662,7 +662,7 @@ def build_headless(self): + f.seek(0), f.truncate() + f.write(raw) + bdir = os.path.join(bdir, 'build') +- cmd = [CMAKE] ++ cmd = [CMAKE, '-GUnix Makefiles'] + if is_macos_universal_build: + cmd += ['-DCMAKE_OSX_ARCHITECTURES=x86_64;arm64'] + if sw and os.path.exists(os.path.join(sw, 'qt')): diff --git a/backports/calibre/0003-calibre-disable-piper.patch b/backports/calibre/0003-calibre-disable-piper.patch new file mode 100644 index 0000000..855b62f --- /dev/null +++ b/backports/calibre/0003-calibre-disable-piper.patch @@ -0,0 +1,46 @@ +piper uses a function in espeak-ng that is upstreamed but not in a +release. + +diff --git a/setup/extensions.json b/setup/extensions.json +index b39ce6d..c105031 100644 +--- a/setup/extensions.json ++++ b/setup/extensions.json +@@ -134,14 +134,6 @@ + "error": "!podofo_error", + "needs_c++": "17" + }, +- { +- "name": "piper", +- "sources": "calibre/utils/tts/piper.cpp", +- "needs_c++": "17", +- "libraries": "!piper_libs", +- "lib_dirs": "!piper_lib_dirs", +- "inc_dirs": "!piper_inc_dirs" +- }, + { + "name": "html_as_json", + "sources": "calibre/srv/html_as_json.cpp", +diff --git a/src/calibre/constants.py b/src/calibre/constants.py +index fa4b211459..7b27768953 100644 +--- a/src/calibre/constants.py ++++ b/src/calibre/constants.py +@@ -258,7 +258,6 @@ def __init__(self): + 'rcc_backend', + 'icu', + 'speedup', +- 'piper', + 'html_as_json', + 'fast_css_transform', + 'fast_html_entities', +diff --git a/src/calibre/utils/run_tests.py b/src/calibre/utils/run_tests.py +index ffd0f95c04..c80a35f83d 100644 +--- a/src/calibre/utils/run_tests.py ++++ b/src/calibre/utils/run_tests.py +@@ -192,6 +192,7 @@ def test_import_of_all_python_modules(self): + } + if 'SKIP_SPEECH_TESTS' in os.environ: + exclude_packages.add('calibre.gui2.tts') ++ exclude_modules.add('calibre.utils.tts.piper') + if not isbsd: + exclude_modules.add('calibre.devices.usbms.hal') + d = os.path.dirname diff --git a/backports/calibre/APKBUILD b/backports/calibre/APKBUILD index 5771907..47dc7d8 100644 --- a/backports/calibre/APKBUILD +++ b/backports/calibre/APKBUILD @@ -1,6 +1,6 @@ # Maintainer: Cowington Post pkgname=calibre -pkgver=8.4.0 +pkgver=8.14.0 pkgrel=0 pkgdesc="Ebook management application" # qt6-webengine @@ -47,6 +47,7 @@ depends=" makedepends=" cmake curl + ffmpeg-dev hunspell-dev hyphen-dev libmtp-dev @@ -55,12 +56,12 @@ makedepends=" podofo-dev py3-pyqt-builder py3-pyqt6-sip + py3-qt6 py3-sip python3-dev qt6-qtbase-dev uchardet-dev xdg-utils - ffmpeg-dev " subpackages=" $pkgname-pyc @@ -70,13 +71,15 @@ subpackages=" " source="https://download.calibre-ebook.com/$pkgver/calibre-$pkgver.tar.xz 0001-$pkgname-no-update.patch - musl-pread.patch + 0002-$pkgname-use-make.patch + 0003-$pkgname-disable-piper.patch " # net: downloads iso-codes # !check: no tests ran options="net !check" export LANG="en_US.UTF-8" +export PATH="$PATH:/usr/lib/qt6/bin" prepare() { default_prepare @@ -113,7 +116,8 @@ package() { } sha512sums=" -df998fa31b9e581739872a649669fccf29f34d3ac1b4d0a96c37e08a0b049b1357b56a2af25f2733936e78901dd61b38a24e536e107e7094ada7e60a5c2c56ab calibre-8.4.0.tar.xz +edb32e47b083e10fbf53088e485737f3b61bb642ce6c4dd444e58a6618979c3b05b77ceffc4b8cb42e35eee7dcc2b94145abc22030ffd8b5de63e45b321fbf72 calibre-8.14.0.tar.xz eb8e7ce40ff8b8daf6e7e55a5dff8ec4dff06c45744266bb48b3194e92ab1196bc91468203e3c2ca1e5144166a7d6be90e6cf0253513e761b56a4c85be4c2c76 0001-calibre-no-update.patch -d27d29c434a3d2df1b18125225a4d3762bf6fdba77385b377b18a7f325f29ae0b698974a39263f4f7aed8a368c87d0dc4446f488505b8e38664f8e9ee5b9bd12 musl-pread.patch +bbb7253257073ae14840b3b4697943fe129d862b49cabd9388ea24cbd0259e68a1d359870334772164897f0c781db121de55fcdf5bccc841e36c021abe56f1ec 0002-calibre-use-make.patch +0efcf35944cd0f42d6f3572839647fc5c8336562db3f71655211d3de682e155b6d6fee4d281f9576201156e0bc828b6a579a8708a27791e4e4d604d456416954 0003-calibre-disable-piper.patch " diff --git a/backports/calibre/musl-pread.patch b/backports/calibre/musl-pread.patch deleted file mode 100644 index 241ce63..0000000 --- a/backports/calibre/musl-pread.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/calibre/utils/speedup.c -+++ b/src/calibre/utils/speedup.c -@@ -748,7 +748,7 @@ - break; - } - #else --#ifdef __linux__ -+#ifdef __GLIBC__ - ssize_t nr = pread64(fd, buf + pos, n - pos, offset); - #else - ssize_t nr = pread(fd, buf + pos, n - pos, offset); From 2825fbb4f54790bd8708df026c9eade8d26dcf29 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:27:19 -0500 Subject: [PATCH 274/313] backports/caprine: bump pkgrel --- backports/caprine/APKBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backports/caprine/APKBUILD b/backports/caprine/APKBUILD index 41f1806..f8f2b6d 100644 --- a/backports/caprine/APKBUILD +++ b/backports/caprine/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Antoine Martin (ayakael) pkgname=caprine pkgver=2.60.3 -pkgrel=2 +pkgrel=6 pkgdesc="Elegant Facebook Messenger desktop app" arch="x86_64 aarch64" # blocked by electron url="https://github.com/sindresorhus/caprine" From a993aebd4dd3d7223fbe384b740abd12201ac421 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:27:35 -0500 Subject: [PATCH 275/313] backports/electron: upgrade to 39.2.3 --- ...l_allocator-to-provide-Rust-allocato.patch | 730 ------------------ ...ix-ignore-a-new-warning-in-rust-1.89.patch | 21 + ...default-allocator-directly-from-Rust.patch | 319 -------- ...7b43542838f0a4a6cfdb17fbeadf45002042.patch | 102 --- .../electron/0004-Drop-remap_alloc-dep.patch | 44 -- ...ild-rust-allocator-after-a-Rust-tool.patch | 354 --------- backports/electron/APKBUILD | 100 +-- .../chromium-revert-drop-of-system-java.patch | 17 - backports/electron/compiler.patch | 179 +++-- .../electron/disable-dns_config_service.patch | 10 +- .../electron/disable-failing-tests.patch | 321 -------- .../electron_do-not-strip-binaries.patch | 127 +++ ...lectron_shell-file-dialog-drop-glibc.patch | 16 + backports/electron/fc-cache-version.patch | 8 +- .../electron/fix-ffmpeg-codec-list.patch | 13 + backports/electron/fix-opus.patch | 11 - backports/electron/gperf-3.2-fix.patch | 29 - .../electron/headless-shell-no-license.patch | 27 + backports/electron/musl-auxv.patch | 11 - ...-v8-monotonic-pthread-cont_timedwait.patch | 23 - backports/electron/net-test-no-vpython.patch | 22 + .../electron/net-test-pyws3-py3.12.patch | 39 + .../electron/partalloc-no-tagging-arm64.patch | 13 +- backports/electron/pipewire-1.4.patch | 23 - backports/electron/yes-musl.patch | 11 - 25 files changed, 449 insertions(+), 2121 deletions(-) delete mode 100644 backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch create mode 100644 backports/electron/0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch delete mode 100644 backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch delete mode 100644 backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch delete mode 100644 backports/electron/0004-Drop-remap_alloc-dep.patch delete mode 100644 backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch delete mode 100644 backports/electron/chromium-revert-drop-of-system-java.patch create mode 100644 backports/electron/electron_do-not-strip-binaries.patch create mode 100644 backports/electron/electron_shell-file-dialog-drop-glibc.patch create mode 100644 backports/electron/fix-ffmpeg-codec-list.patch delete mode 100644 backports/electron/fix-opus.patch delete mode 100644 backports/electron/gperf-3.2-fix.patch create mode 100644 backports/electron/headless-shell-no-license.patch delete mode 100644 backports/electron/musl-auxv.patch delete mode 100644 backports/electron/musl-v8-monotonic-pthread-cont_timedwait.patch create mode 100644 backports/electron/net-test-no-vpython.patch create mode 100644 backports/electron/net-test-pyws3-py3.12.patch delete mode 100644 backports/electron/pipewire-1.4.patch delete mode 100644 backports/electron/yes-musl.patch diff --git a/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch b/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch deleted file mode 100644 index 580323c..0000000 --- a/backports/electron/0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch +++ /dev/null @@ -1,730 +0,0 @@ -From c854a92a215d0cf39c704bbadd3611e552073d5f Mon Sep 17 00:00:00 2001 -From: Collin Baker -Date: Fri, 4 Apr 2025 14:08:18 -0700 -Subject: [PATCH] Reland "Use #[global_allocator] to provide Rust allocator - implementation" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This is a reland of commit cfa3beef52625e03ba6ce2b2ac98e1b89dde5cdb - -Original was reverted due to a cronet gn2bp failure. The script -filtered out GN rules in //build/rust/std, but this caused an exception -when //build/rust/std:allocator was referenced later. - -Moving the rules to //build/rust/allocator sidesteps the issue. - -Original change's description: -> Use #[global_allocator] to provide Rust allocator implementation -> -> The allocator shim hack we have been using no longer works with -> upstream Rust. Replace it with a less-unsupported method: provide a -> https://github.com/rust-lang/rust/issues/123015, which still requires -> us to provide a few symbol definitions. -> -> Bug: 408221149, 407024458 -> Change-Id: If1808ca24b12dc80ead35a25521313a3d2e148d5 -> -> Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel -> Change-Id: If1808ca24b12dc80ead35a25521313a3d2e148d5 -> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6427855 -> Reviewed-by: Alan Zhao -> Reviewed-by: Lei Zhang -> Reviewed-by: Łukasz Anforowicz -> Commit-Queue: Collin Baker -> Auto-Submit: Collin Baker -> Cr-Commit-Position: refs/heads/main@{#1442472} - -Bug: 408221149, 407024458 -Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel -Change-Id: I36fef217297bfe64ae81519be24b8c653f6fdfa1 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6432410 -Reviewed-by: Mohannad Farrag -Reviewed-by: Łukasz Anforowicz -Auto-Submit: Collin Baker -Commit-Queue: Łukasz Anforowicz -Cr-Commit-Position: refs/heads/main@{#1442922} ---- - build/rust/allocator/BUILD.gn | 90 ++++++++++++++++ - build/rust/{std => allocator}/alias.cc | 4 +- - build/rust/{std => allocator}/alias.h | 6 +- - .../allocator_impls.cc} | 100 ++++++++---------- - build/rust/allocator/allocator_impls.h | 25 +++++ - .../allocator/allocator_shim_definitions.cc | 30 ++++++ - .../{std => allocator}/compiler_specific.h | 6 +- - .../rust/{std => allocator}/immediate_crash.h | 6 +- - build/rust/allocator/lib.rs | 48 +++++++++ - build/rust/cargo_crate.gni | 9 ++ - build/rust/rust_macro.gni | 3 + - build/rust/rust_target.gni | 4 + - build/rust/std/BUILD.gn | 41 ------- - components/cronet/android/dependencies.txt | 1 + - third_party/breakpad/BUILD.gn | 10 +- - 15 files changed, 272 insertions(+), 111 deletions(-) - create mode 100644 build/rust/allocator/BUILD.gn - rename build/rust/{std => allocator}/alias.cc (87%) - rename build/rust/{std => allocator}/alias.h (91%) - rename build/rust/{std/remap_alloc.cc => allocator/allocator_impls.cc} (67%) - create mode 100644 build/rust/allocator/allocator_impls.h - create mode 100644 build/rust/allocator/allocator_shim_definitions.cc - rename build/rust/{std => allocator}/compiler_specific.h (87%) - rename build/rust/{std => allocator}/immediate_crash.h (97%) - create mode 100644 build/rust/allocator/lib.rs - -diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn -new file mode 100644 -index 0000000000000..06aa47f097c9c ---- /dev/null -+++ b/build/rust/allocator/BUILD.gn -@@ -0,0 +1,90 @@ -+# Copyright 2025 The Chromium Authors -+# Use of this source code is governed by a BSD-style license that can be -+# found in the LICENSE file. -+ -+import("//build/buildflag_header.gni") -+import("//build/config/rust.gni") -+import("//build/rust/rust_static_library.gni") -+ -+rust_allocator_uses_partition_alloc = false -+if (build_with_chromium) { -+ import("//base/allocator/partition_allocator/partition_alloc.gni") -+ rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc -+} -+ -+buildflag_header("buildflags") { -+ header = "buildflags.h" -+ flags = [ -+ "RUST_ALLOCATOR_USES_PARTITION_ALLOC=$rust_allocator_uses_partition_alloc", -+ ] -+ visibility = [ ":*" ] -+} -+ -+if (toolchain_has_rust) { -+ # All targets which depend on Rust code but are not linked by rustc must -+ # depend on this. Usually, this dependency will come from the rust_target() GN -+ # template. However, cargo_crate() does *not* include this dependency so any -+ # C++ targets which directly depend on a cargo_crate() must depend on this. -+ rust_static_library("allocator") { -+ sources = [ "lib.rs" ] -+ crate_root = "lib.rs" -+ cxx_bindings = [ "lib.rs" ] -+ -+ deps = [ -+ ":allocator_impls", -+ ":allocator_shim_definitions", -+ ] -+ -+ no_chromium_prelude = true -+ no_allocator_crate = true -+ allow_unsafe = true -+ } -+ -+ static_library("allocator_impls") { -+ public_deps = [] -+ if (rust_allocator_uses_partition_alloc) { -+ public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] -+ } -+ -+ sources = [ -+ "allocator_impls.cc", -+ "allocator_impls.h", -+ ] -+ -+ deps = [ -+ ":allocator_cpp_shared", -+ ":buildflags", -+ -+ # TODO(crbug.com/408221149): remove the C++ -> Rust dependency for the -+ # default allocator. -+ "//build/rust/std", -+ ] -+ -+ visibility = [ ":*" ] -+ } -+ -+ source_set("allocator_shim_definitions") { -+ sources = [ "allocator_shim_definitions.cc" ] -+ -+ deps = [ ":allocator_cpp_shared" ] -+ -+ visibility = [ ":*" ] -+ } -+ -+ source_set("allocator_cpp_shared") { -+ sources = [ -+ # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been -+ # copied from `//base`. -+ # TODO(crbug.com/40279749): Avoid duplication / reuse code. -+ "alias.cc", -+ "alias.h", -+ "compiler_specific.h", -+ "immediate_crash.h", -+ ] -+ -+ visibility = [ -+ ":allocator_impls", -+ ":allocator_shim_definitions", -+ ] -+ } -+} -diff --git a/build/rust/std/alias.cc b/build/rust/allocator/alias.cc -similarity index 87% -rename from build/rust/std/alias.cc -rename to build/rust/allocator/alias.cc -index 42febac3ed1fc..ca20986f8ed49 100644 ---- a/build/rust/std/alias.cc -+++ b/build/rust/allocator/alias.cc -@@ -7,9 +7,9 @@ - // - // TODO(crbug.com/40279749): Avoid code duplication / reuse code. - --#include "build/rust/std/alias.h" -+#include "build/rust/allocator/alias.h" - --#include "build/rust/std/compiler_specific.h" -+#include "build/rust/allocator/compiler_specific.h" - - namespace build_rust_std { - namespace debug { -diff --git a/build/rust/std/alias.h b/build/rust/allocator/alias.h -similarity index 91% -rename from build/rust/std/alias.h -rename to build/rust/allocator/alias.h -index 0eaba6766148f..80995ecfb045e 100644 ---- a/build/rust/std/alias.h -+++ b/build/rust/allocator/alias.h -@@ -8,8 +8,8 @@ - // - // TODO(crbug.com/40279749): Avoid code duplication / reuse code. - --#ifndef BUILD_RUST_STD_ALIAS_H_ --#define BUILD_RUST_STD_ALIAS_H_ -+#ifndef BUILD_RUST_ALLOCATOR_ALIAS_H_ -+#define BUILD_RUST_ALLOCATOR_ALIAS_H_ - - #include - -@@ -34,4 +34,4 @@ void Alias(const void* var); - const int line_number = __LINE__; \ - build_rust_std::debug::Alias(&line_number) - --#endif // BUILD_RUST_STD_ALIAS_H_ -+#endif // BUILD_RUST_ALLOCATOR_ALIAS_H_ -diff --git a/build/rust/std/remap_alloc.cc b/build/rust/allocator/allocator_impls.cc -similarity index 67% -rename from build/rust/std/remap_alloc.cc -rename to build/rust/allocator/allocator_impls.cc -index a443b11ec513d..1fde98f23cd12 100644 ---- a/build/rust/std/remap_alloc.cc -+++ b/build/rust/allocator/allocator_impls.cc -@@ -2,6 +2,8 @@ - // Use of this source code is governed by a BSD-style license that can be - // found in the LICENSE file. - -+#include "build/rust/allocator/allocator_impls.h" -+ - #ifdef UNSAFE_BUFFERS_BUILD - // TODO(crbug.com/390223051): Remove C-library calls to fix the errors. - #pragma allow_unsafe_libc_calls -@@ -11,9 +13,9 @@ - #include - - #include "build/build_config.h" --#include "build/rust/std/alias.h" --#include "build/rust/std/buildflags.h" --#include "build/rust/std/immediate_crash.h" -+#include "build/rust/allocator/alias.h" -+#include "build/rust/allocator/buildflags.h" -+#include "build/rust/allocator/immediate_crash.h" - - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) - #include "partition_alloc/partition_alloc_constants.h" // nogncheck -@@ -22,6 +24,11 @@ - #include - #endif - -+// NOTE: this documentation is outdated. -+// -+// TODO(crbug.com/408221149): update this documentation, or replace it with docs -+// in the Rust allocator implementation. -+// - // When linking a final binary, rustc has to pick between either: - // * The default Rust allocator - // * Any #[global_allocator] defined in *any rlib in its dependency tree* -@@ -87,19 +94,6 @@ - // enabling it breaks Win32 APIs like CreateProcess: - // https://issues.chromium.org/u/1/issues/368070343#comment29 - --extern "C" { -- --#ifdef COMPONENT_BUILD --#if BUILDFLAG(IS_WIN) --#define REMAP_ALLOC_ATTRIBUTES __declspec(dllexport) __attribute__((weak)) --#else --#define REMAP_ALLOC_ATTRIBUTES \ -- __attribute__((visibility("default"))) __attribute__((weak)) --#endif --#else --#define REMAP_ALLOC_ATTRIBUTES __attribute__((weak)) --#endif // COMPONENT_BUILD -- - #if !BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) && BUILDFLAG(IS_WIN) && \ - defined(ADDRESS_SANITIZER) - #define USE_WIN_ALIGNED_MALLOC 1 -@@ -107,17 +101,19 @@ extern "C" { - #define USE_WIN_ALIGNED_MALLOC 0 - #endif - --// This must exist as the stdlib depends on it to prove that we know the --// alloc shims below are unstable. In the future we may be required to replace --// them with a #[global_allocator] crate (see file comment above for more). --// --// Marked as weak as when Rust drives linking it includes this symbol itself, --// and we don't want a collision due to C++ being in the same link target, where --// C++ causes us to explicitly link in the stdlib and this symbol here. --[[maybe_unused]] --__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; -+// The default allocator functions provided by the Rust standard library. -+extern "C" void* __rdl_alloc(size_t size, size_t align); -+extern "C" void __rdl_dealloc(void* p, size_t size, size_t align); -+extern "C" void* __rdl_realloc(void* p, -+ size_t old_size, -+ size_t align, -+ size_t new_size); -+ -+extern "C" void* __rdl_alloc_zeroed(size_t size, size_t align); -+ -+namespace rust_allocator_internal { - --REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { -+unsigned char* alloc(size_t size, size_t align) { - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) - // PartitionAlloc will crash if given an alignment larger than this. - if (align > partition_alloc::internal::kMaxSupportedAlignment) { -@@ -125,19 +121,19 @@ REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { - } - - if (align <= alignof(std::max_align_t)) { -- return allocator_shim::UncheckedAlloc(size); -+ return static_cast(allocator_shim::UncheckedAlloc(size)); - } else { -- return allocator_shim::UncheckedAlignedAlloc(size, align); -+ return static_cast( -+ allocator_shim::UncheckedAlignedAlloc(size, align)); - } - #elif USE_WIN_ALIGNED_MALLOC -- return _aligned_malloc(size, align); -+ return static_cast(_aligned_malloc(size, align)); - #else -- extern void* __rdl_alloc(size_t size, size_t align); -- return __rdl_alloc(size, align); -+ return static_cast(__rdl_alloc(size, align)); - #endif - } - --REMAP_ALLOC_ATTRIBUTES void __rust_dealloc(void* p, size_t size, size_t align) { -+void dealloc(unsigned char* p, size_t size, size_t align) { - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) - if (align <= alignof(std::max_align_t)) { - allocator_shim::UncheckedFree(p); -@@ -147,54 +143,44 @@ REMAP_ALLOC_ATTRIBUTES void __rust_dealloc(void* p, size_t size, size_t align) { - #elif USE_WIN_ALIGNED_MALLOC - return _aligned_free(p); - #else -- extern void __rdl_dealloc(void* p, size_t size, size_t align); - __rdl_dealloc(p, size, align); - #endif - } - --REMAP_ALLOC_ATTRIBUTES void* __rust_realloc(void* p, -- size_t old_size, -- size_t align, -- size_t new_size) { -+unsigned char* realloc(unsigned char* p, -+ size_t old_size, -+ size_t align, -+ size_t new_size) { - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) - if (align <= alignof(std::max_align_t)) { -- return allocator_shim::UncheckedRealloc(p, new_size); -+ return static_cast( -+ allocator_shim::UncheckedRealloc(p, new_size)); - } else { -- return allocator_shim::UncheckedAlignedRealloc(p, new_size, align); -+ return static_cast( -+ allocator_shim::UncheckedAlignedRealloc(p, new_size, align)); - } - #elif USE_WIN_ALIGNED_MALLOC -- return _aligned_realloc(p, new_size, align); -+ return static_cast(_aligned_realloc(p, new_size, align)); - #else -- extern void* __rdl_realloc(void* p, size_t old_size, size_t align, -- size_t new_size); -- return __rdl_realloc(p, old_size, align, new_size); -+ return static_cast( -+ __rdl_realloc(p, old_size, align, new_size)); - #endif - } - --REMAP_ALLOC_ATTRIBUTES void* __rust_alloc_zeroed(size_t size, size_t align) { -+unsigned char* alloc_zeroed(size_t size, size_t align) { - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) || USE_WIN_ALIGNED_MALLOC - // TODO(danakj): When RUST_ALLOCATOR_USES_PARTITION_ALLOC is true, it's - // possible that a partition_alloc::UncheckedAllocZeroed() call would perform - // better than partition_alloc::UncheckedAlloc() + memset. But there is no - // such API today. See b/342251590. -- void* p = __rust_alloc(size, align); -+ unsigned char* p = alloc(size, align); - if (p) { - memset(p, 0, size); - } - return p; - #else -- extern void* __rdl_alloc_zeroed(size_t size, size_t align); -- return __rdl_alloc_zeroed(size, align); -+ return static_cast(__rdl_alloc_zeroed(size, align)); - #endif - } - --REMAP_ALLOC_ATTRIBUTES void __rust_alloc_error_handler(size_t size, -- size_t align) { -- NO_CODE_FOLDING(); -- IMMEDIATE_CRASH(); --} -- --REMAP_ALLOC_ATTRIBUTES extern const unsigned char -- __rust_alloc_error_handler_should_panic = 0; -- --} // extern "C" -+} // namespace rust_allocator_internal -diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h -new file mode 100644 -index 0000000000000..afb335412faf9 ---- /dev/null -+++ b/build/rust/allocator/allocator_impls.h -@@ -0,0 +1,25 @@ -+// Copyright 2025 The Chromium Authors -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+#ifndef BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ -+#define BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ -+ -+#include -+ -+#include "build/build_config.h" -+#include "build/rust/allocator/buildflags.h" -+ -+namespace rust_allocator_internal { -+ -+unsigned char* alloc(size_t size, size_t align); -+void dealloc(unsigned char* p, size_t size, size_t align); -+unsigned char* realloc(unsigned char* p, -+ size_t old_size, -+ size_t align, -+ size_t new_size); -+unsigned char* alloc_zeroed(size_t size, size_t align); -+ -+} // namespace rust_allocator_internal -+ -+#endif // BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ -diff --git a/build/rust/allocator/allocator_shim_definitions.cc b/build/rust/allocator/allocator_shim_definitions.cc -new file mode 100644 -index 0000000000000..a4d1bd77b7016 ---- /dev/null -+++ b/build/rust/allocator/allocator_shim_definitions.cc -@@ -0,0 +1,30 @@ -+// Copyright 2025 The Chromium Authors -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+#include -+ -+#include "build/rust/allocator/alias.h" -+#include "build/rust/allocator/immediate_crash.h" -+ -+extern "C" { -+ -+// As part of rustc's contract for using `#[global_allocator]` without -+// rustc-generated shims we must define this symbol, since we are opting in to -+// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 -+// -+// Mark it weak since rustc will generate it when it drives linking. -+[[maybe_unused]] -+__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; -+ -+__attribute__((weak)) void __rust_alloc_error_handler(size_t size, -+ size_t align) { -+ NO_CODE_FOLDING(); -+ IMMEDIATE_CRASH(); -+} -+ -+__attribute__(( -+ weak)) extern const unsigned char __rust_alloc_error_handler_should_panic = -+ 0; -+ -+} // extern "C" -diff --git a/build/rust/std/compiler_specific.h b/build/rust/allocator/compiler_specific.h -similarity index 87% -rename from build/rust/std/compiler_specific.h -rename to build/rust/allocator/compiler_specific.h -index ea79a7a8dc284..f9079679a3e9a 100644 ---- a/build/rust/std/compiler_specific.h -+++ b/build/rust/allocator/compiler_specific.h -@@ -7,8 +7,8 @@ - // - // TODO(crbug.com/40279749): Avoid code duplication / reuse code. - --#ifndef BUILD_RUST_STD_COMPILER_SPECIFIC_H_ --#define BUILD_RUST_STD_COMPILER_SPECIFIC_H_ -+#ifndef BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ -+#define BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ - - #include "build/build_config.h" - -@@ -35,4 +35,4 @@ - #define NOINLINE - #endif - --#endif // BUILD_RUST_STD_COMPILER_SPECIFIC_H_ -+#endif // BUILD_RUST_ALLOCATOR_COMPILER_SPECIFIC_H_ -diff --git a/build/rust/std/immediate_crash.h b/build/rust/allocator/immediate_crash.h -similarity index 97% -rename from build/rust/std/immediate_crash.h -rename to build/rust/allocator/immediate_crash.h -index e4fd5a09d9379..9cbf9fd65f3e0 100644 ---- a/build/rust/std/immediate_crash.h -+++ b/build/rust/allocator/immediate_crash.h -@@ -5,8 +5,8 @@ - // This file has been copied from //base/immediate_crash.h. - // TODO(crbug.com/40279749): Avoid code duplication / reuse code. - --#ifndef BUILD_RUST_STD_IMMEDIATE_CRASH_H_ --#define BUILD_RUST_STD_IMMEDIATE_CRASH_H_ -+#ifndef BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ -+#define BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ - - #include "build/build_config.h" - -@@ -168,4 +168,4 @@ - - #endif // defined(__clang__) || defined(COMPILER_GCC) - --#endif // BUILD_RUST_STD_IMMEDIATE_CRASH_H_ -+#endif // BUILD_RUST_ALLOCATOR_IMMEDIATE_CRASH_H_ -diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs -new file mode 100644 -index 0000000000000..7f4a0fc245694 ---- /dev/null -+++ b/build/rust/allocator/lib.rs -@@ -0,0 +1,48 @@ -+// Copyright 2025 The Chromium Authors -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+//! Define the allocator that Rust code in Chrome should use. -+//! -+//! Any final artifact that depends on this crate, even transitively, will use -+//! the allocator defined here. Currently this is a thin wrapper around -+//! allocator_impls.cc's functions; see the documentation there. -+ -+use std::alloc::{GlobalAlloc, Layout}; -+ -+struct Allocator; -+ -+unsafe impl GlobalAlloc for Allocator { -+ unsafe fn alloc(&self, layout: Layout) -> *mut u8 { -+ unsafe { ffi::alloc(layout.size(), layout.align()) } -+ } -+ -+ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { -+ unsafe { -+ ffi::dealloc(ptr, layout.size(), layout.align()); -+ } -+ } -+ -+ unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { -+ unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } -+ } -+ -+ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { -+ unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } -+ } -+} -+ -+#[global_allocator] -+static GLOBAL: Allocator = Allocator; -+ -+#[cxx::bridge(namespace = "rust_allocator_internal")] -+mod ffi { -+ extern "C++" { -+ include!("build/rust/allocator/allocator_impls.h"); -+ -+ unsafe fn alloc(size: usize, align: usize) -> *mut u8; -+ unsafe fn dealloc(p: *mut u8, size: usize, align: usize); -+ unsafe fn realloc(p: *mut u8, old_size: usize, align: usize, new_size: usize) -> *mut u8; -+ unsafe fn alloc_zeroed(size: usize, align: usize) -> *mut u8; -+ } -+} -diff --git a/build/rust/cargo_crate.gni b/build/rust/cargo_crate.gni -index 6d11c538bf4d5..d9912722b4ecd 100644 ---- a/build/rust/cargo_crate.gni -+++ b/build/rust/cargo_crate.gni -@@ -259,6 +259,12 @@ template("cargo_crate") { - # Don't import the `chromium` crate into third-party code. - no_chromium_prelude = true - -+ # Don't depend on the chrome-specific #[global_allocator] crate from -+ # third-party code. This avoids some dependency cycle issues. The allocator -+ # crate will still be used if it exists anywhere in the dependency graph for -+ # a given linked artifact. -+ no_allocator_crate = true -+ - rustc_metadata = _rustc_metadata - - # TODO(crbug.com/40259764): don't default to true. This requires changes to -@@ -483,6 +489,9 @@ template("cargo_crate") { - # Don't import the `chromium` crate into third-party code. - no_chromium_prelude = true - -+ # Build scripts do not need to link to chrome's allocator. -+ no_allocator_crate = true -+ - # The ${_build_script_name}_output target looks for the exe in this - # location. Due to how the Windows component build works, this has to - # be $root_out_dir for all EXEs. In component build, C++ links to the -diff --git a/build/rust/rust_macro.gni b/build/rust/rust_macro.gni -index bcbb30ed44111..41d857632ccdc 100644 ---- a/build/rust/rust_macro.gni -+++ b/build/rust/rust_macro.gni -@@ -16,6 +16,9 @@ template("rust_macro") { - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - proc_macro_configs = invoker.configs - target_type = "rust_proc_macro" -+ -+ # Macros are loaded by rustc and shouldn't use chrome's allocation routines. -+ no_allocator_crate = true - } - } - -diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni -index 1a2f96337d436..1003a7b678352 100644 ---- a/build/rust/rust_target.gni -+++ b/build/rust/rust_target.gni -@@ -339,6 +339,10 @@ template("rust_target") { - _rust_deps += [ "//build/rust/std" ] - } - -+ if (!defined(invoker.no_allocator_crate) || !invoker.no_allocator_crate) { -+ _rust_deps += [ "//build/rust/allocator" ] -+ } -+ - if (_build_unit_tests) { - _unit_test_target = "${_target_name}_unittests" - if (defined(invoker.unit_test_target)) { -diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn -index 6b996aa1fe386..25db126076b2f 100644 ---- a/build/rust/std/BUILD.gn -+++ b/build/rust/std/BUILD.gn -@@ -15,51 +15,12 @@ - # allocator functions to PartitionAlloc when `use_partition_alloc_as_malloc` is - # true, so that Rust and C++ use the same allocator backend. - --import("//build/buildflag_header.gni") - import("//build/config/compiler/compiler.gni") - import("//build/config/coverage/coverage.gni") - import("//build/config/rust.gni") - import("//build/config/sanitizers/sanitizers.gni") - --rust_allocator_uses_partition_alloc = false --if (build_with_chromium) { -- import("//base/allocator/partition_allocator/partition_alloc.gni") -- rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc --} -- --buildflag_header("buildflags") { -- header = "buildflags.h" -- flags = [ -- "RUST_ALLOCATOR_USES_PARTITION_ALLOC=$rust_allocator_uses_partition_alloc", -- ] -- visibility = [ ":*" ] --} -- - if (toolchain_has_rust) { -- # If clang performs the link step, we need to provide the allocator symbols -- # that are normally injected by rustc during linking. -- # -- # We also "happen to" use this to redirect allocations to PartitionAlloc, -- # though that would be better done through a #[global_allocator] crate (see -- # above). -- source_set("remap_alloc") { -- public_deps = [] -- if (rust_allocator_uses_partition_alloc) { -- public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] -- } -- deps = [ ":buildflags" ] -- sources = [ -- # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been -- # copied from `//base`. -- # TODO(crbug.com/40279749): Avoid duplication / reuse code. -- "alias.cc", -- "alias.h", -- "compiler_specific.h", -- "immediate_crash.h", -- "remap_alloc.cc", -- ] -- } -- - # List of Rust stdlib rlibs which are present in the official Rust toolchain - # we are using from the Android team. This is usually a version or two behind - # nightly. Generally this matches the toolchain we build ourselves, but if -@@ -269,8 +230,6 @@ if (toolchain_has_rust) { - foreach(libname, stdlib_files + skip_stdlib_files) { - deps += [ "rules:$libname" ] - } -- -- public_deps = [ ":remap_alloc" ] - } - } else { - action("find_stdlib") { -diff --git a/components/cronet/android/dependencies.txt b/components/cronet/android/dependencies.txt -index bf56bc45ed41f..c0e41ef7c6766 100644 ---- a/components/cronet/android/dependencies.txt -+++ b/components/cronet/android/dependencies.txt -@@ -14,6 +14,7 @@ - //build/config - //build/config/compiler - //build/rust -+//build/rust/allocator - //build/rust/chromium_prelude - //build/rust/std - //build/rust/std/rules -diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn -index 007fdff16e92e..00da4fa484998 100644 ---- a/third_party/breakpad/BUILD.gn -+++ b/third_party/breakpad/BUILD.gn -@@ -495,7 +495,10 @@ if (is_mac) { - defines = [ "HAVE_MACH_O_NLIST_H" ] - - # Rust demangle support. -- deps = [ "//third_party/rust/rustc_demangle_capi/v0_1:lib" ] -+ deps = [ -+ "//build/rust/allocator", -+ "//third_party/rust/rustc_demangle_capi/v0_1:lib", -+ ] - defines += [ "HAVE_RUSTC_DEMANGLE" ] - include_dirs += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include" ] - sources += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include/rustc_demangle.h" ] -@@ -743,7 +746,10 @@ if (is_linux || is_chromeos || is_android) { - include_dirs = [ "breakpad/src" ] - - # Rust demangle support. -- deps = [ "//third_party/rust/rustc_demangle_capi/v0_1:lib" ] -+ deps = [ -+ "//build/rust/allocator", -+ "//third_party/rust/rustc_demangle_capi/v0_1:lib", -+ ] - defines += [ "HAVE_RUSTC_DEMANGLE" ] - include_dirs += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include" ] - sources += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-0.1.0/include/rustc_demangle.h" ] diff --git a/backports/electron/0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch b/backports/electron/0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch new file mode 100644 index 0000000..2c38c7c --- /dev/null +++ b/backports/electron/0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch @@ -0,0 +1,21 @@ +From adbc495726382c023b755c35aea36c6e9cad1950 Mon Sep 17 00:00:00 2001 +From: LN Liberda +Date: Sat, 23 Aug 2025 03:11:09 +0200 +Subject: [PATCH] hotfix: ignore a new warning in rust 1.89 + +--- + third_party/rust/chromium_crates_io/vendor/qr_code-v2/src/lib.rs | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/third_party/rust/chromium_crates_io/vendor/qr_code-v2/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/qr_code-v2/src/lib.rs +index 1b729621c2f47..55d392c6da72f 100644 +--- a/third_party/rust/chromium_crates_io/vendor/qr_code-v2/src/lib.rs ++++ b/third_party/rust/chromium_crates_io/vendor/qr_code-v2/src/lib.rs +@@ -5,7 +5,6 @@ + //! + + #![deny(missing_docs)] +-#![deny(warnings)] + #![allow( + clippy::must_use_candidate, // This is just annoying. + clippy::use_self, // Rust 1.33 doesn't support Self::EnumVariant, let's try again in 1.37. diff --git a/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch b/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch deleted file mode 100644 index 12b3aaa..0000000 --- a/backports/electron/0002-Call-Rust-default-allocator-directly-from-Rust.patch +++ /dev/null @@ -1,319 +0,0 @@ -From 5032162442c5f2f3093cd7646f3a06f826d7f7a8 Mon Sep 17 00:00:00 2001 -From: Collin Baker -Date: Mon, 7 Apr 2025 12:48:17 -0700 -Subject: [PATCH] Call Rust default allocator directly from Rust -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The Chromium `#[global_allocator] crate forwarded calls to the C++ -implementation, which in turn called into the Rust standard library -implementations in some build configurations. - -This Rust -> C++ -> Rust round trip is unnecessary, and the references -to these symbols is blocking a toolchain update: upstream, these -symbol names are now mangled. - -Instead, use Rust conditional compilation to choose between the -Chromium and the libstd-provided allocators. - -Additionally, the remaining internal symbols defined in C++ are moved -to Rust. - -Bug: 408221149, 407024458 -Change-Id: I78f8c90d51a36a73099aa7d333091d7b8aded3c0 - -Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-dbg,android-rust-arm64-rel,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel -Change-Id: I78f8c90d51a36a73099aa7d333091d7b8aded3c0 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6434355 -Reviewed-by: Łukasz Anforowicz -Commit-Queue: Collin Baker -Cr-Commit-Position: refs/heads/main@{#1443703} ---- - build/rust/allocator/BUILD.gn | 54 +++++++------------ - build/rust/allocator/allocator_impls.cc | 28 +++++----- - build/rust/allocator/allocator_impls.h | 2 + - .../allocator/allocator_shim_definitions.cc | 30 ----------- - build/rust/allocator/lib.rs | 38 +++++++++++++ - 5 files changed, 73 insertions(+), 79 deletions(-) - delete mode 100644 build/rust/allocator/allocator_shim_definitions.cc - -diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn -index 06aa47f097c9c..f09314afc8158 100644 ---- a/build/rust/allocator/BUILD.gn -+++ b/build/rust/allocator/BUILD.gn -@@ -12,6 +12,9 @@ if (build_with_chromium) { - rust_allocator_uses_partition_alloc = use_partition_alloc_as_malloc - } - -+use_cpp_allocator_impls = -+ rust_allocator_uses_partition_alloc || (is_win && is_asan) -+ - buildflag_header("buildflags") { - header = "buildflags.h" - flags = [ -@@ -30,61 +33,44 @@ if (toolchain_has_rust) { - crate_root = "lib.rs" - cxx_bindings = [ "lib.rs" ] - -- deps = [ -- ":allocator_impls", -- ":allocator_shim_definitions", -- ] -+ deps = [ ":allocator_impls" ] - - no_chromium_prelude = true - no_allocator_crate = true - allow_unsafe = true -+ -+ if (use_cpp_allocator_impls) { -+ rustflags = [ -+ "--cfg", -+ "use_cpp_allocator_impls", -+ ] -+ } -+ -+ configs -= [ "//build/config/compiler:disallow_unstable_features" ] - } - -+ # TODO(crbug.com/408221149): don't build this when `use_cpp_allocator_impls` -+ # is false. - static_library("allocator_impls") { - public_deps = [] - if (rust_allocator_uses_partition_alloc) { - public_deps += [ "//base/allocator/partition_allocator:partition_alloc" ] - } - -- sources = [ -- "allocator_impls.cc", -- "allocator_impls.h", -- ] -- -- deps = [ -- ":allocator_cpp_shared", -- ":buildflags", -- -- # TODO(crbug.com/408221149): remove the C++ -> Rust dependency for the -- # default allocator. -- "//build/rust/std", -- ] -- -- visibility = [ ":*" ] -- } -- -- source_set("allocator_shim_definitions") { -- sources = [ "allocator_shim_definitions.cc" ] -- -- deps = [ ":allocator_cpp_shared" ] -- -- visibility = [ ":*" ] -- } -- -- source_set("allocator_cpp_shared") { - sources = [ - # `alias.*`, `compiler_specific.h`, and `immediate_crash.*` have been - # copied from `//base`. - # TODO(crbug.com/40279749): Avoid duplication / reuse code. - "alias.cc", - "alias.h", -+ "allocator_impls.cc", -+ "allocator_impls.h", - "compiler_specific.h", - "immediate_crash.h", - ] - -- visibility = [ -- ":allocator_impls", -- ":allocator_shim_definitions", -- ] -+ deps = [ ":buildflags" ] -+ -+ visibility = [ ":*" ] - } - } -diff --git a/build/rust/allocator/allocator_impls.cc b/build/rust/allocator/allocator_impls.cc -index 1fde98f23cd12..bf3c2a301adf5 100644 ---- a/build/rust/allocator/allocator_impls.cc -+++ b/build/rust/allocator/allocator_impls.cc -@@ -101,16 +101,6 @@ - #define USE_WIN_ALIGNED_MALLOC 0 - #endif - --// The default allocator functions provided by the Rust standard library. --extern "C" void* __rdl_alloc(size_t size, size_t align); --extern "C" void __rdl_dealloc(void* p, size_t size, size_t align); --extern "C" void* __rdl_realloc(void* p, -- size_t old_size, -- size_t align, -- size_t new_size); -- --extern "C" void* __rdl_alloc_zeroed(size_t size, size_t align); -- - namespace rust_allocator_internal { - - unsigned char* alloc(size_t size, size_t align) { -@@ -129,7 +119,8 @@ unsigned char* alloc(size_t size, size_t align) { - #elif USE_WIN_ALIGNED_MALLOC - return static_cast(_aligned_malloc(size, align)); - #else -- return static_cast(__rdl_alloc(size, align)); -+ // TODO(crbug.com/408221149): don't build this file in this case. -+ IMMEDIATE_CRASH(); - #endif - } - -@@ -143,7 +134,8 @@ void dealloc(unsigned char* p, size_t size, size_t align) { - #elif USE_WIN_ALIGNED_MALLOC - return _aligned_free(p); - #else -- __rdl_dealloc(p, size, align); -+ // TODO(crbug.com/408221149): don't build this file in this case. -+ IMMEDIATE_CRASH(); - #endif - } - -@@ -162,8 +154,8 @@ unsigned char* realloc(unsigned char* p, - #elif USE_WIN_ALIGNED_MALLOC - return static_cast(_aligned_realloc(p, new_size, align)); - #else -- return static_cast( -- __rdl_realloc(p, old_size, align, new_size)); -+ // TODO(crbug.com/408221149): don't build this file in this case. -+ IMMEDIATE_CRASH(); - #endif - } - -@@ -179,8 +171,14 @@ unsigned char* alloc_zeroed(size_t size, size_t align) { - } - return p; - #else -- return static_cast(__rdl_alloc_zeroed(size, align)); -+ // TODO(crbug.com/408221149): don't build this file in this case. -+ IMMEDIATE_CRASH(); - #endif - } - -+void crash_immediately() { -+ NO_CODE_FOLDING(); -+ IMMEDIATE_CRASH(); -+} -+ - } // namespace rust_allocator_internal -diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h -index afb335412faf9..e90ab7cd422c1 100644 ---- a/build/rust/allocator/allocator_impls.h -+++ b/build/rust/allocator/allocator_impls.h -@@ -20,6 +20,8 @@ unsigned char* realloc(unsigned char* p, - size_t new_size); - unsigned char* alloc_zeroed(size_t size, size_t align); - -+void crash_immediately(); -+ - } // namespace rust_allocator_internal - - #endif // BUILD_RUST_ALLOCATOR_ALLOCATOR_IMPLS_H_ -diff --git a/build/rust/allocator/allocator_shim_definitions.cc b/build/rust/allocator/allocator_shim_definitions.cc -deleted file mode 100644 -index a4d1bd77b7016..0000000000000 ---- a/build/rust/allocator/allocator_shim_definitions.cc -+++ /dev/null -@@ -1,30 +0,0 @@ --// Copyright 2025 The Chromium Authors --// Use of this source code is governed by a BSD-style license that can be --// found in the LICENSE file. -- --#include -- --#include "build/rust/allocator/alias.h" --#include "build/rust/allocator/immediate_crash.h" -- --extern "C" { -- --// As part of rustc's contract for using `#[global_allocator]` without --// rustc-generated shims we must define this symbol, since we are opting in to --// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 --// --// Mark it weak since rustc will generate it when it drives linking. --[[maybe_unused]] --__attribute__((weak)) unsigned char __rust_no_alloc_shim_is_unstable; -- --__attribute__((weak)) void __rust_alloc_error_handler(size_t size, -- size_t align) { -- NO_CODE_FOLDING(); -- IMMEDIATE_CRASH(); --} -- --__attribute__(( -- weak)) extern const unsigned char __rust_alloc_error_handler_should_panic = -- 0; -- --} // extern "C" -diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs -index 7f4a0fc245694..b8b67d9c6c649 100644 ---- a/build/rust/allocator/lib.rs -+++ b/build/rust/allocator/lib.rs -@@ -8,10 +8,20 @@ - //! the allocator defined here. Currently this is a thin wrapper around - //! allocator_impls.cc's functions; see the documentation there. - -+// Required to apply weak linkage to symbols. -+#![feature(linkage)] -+// Required to apply `#[rustc_std_internal_symbol]` to our alloc error handler -+// so the name is correctly mangled as rustc expects. -+#![cfg_attr(mangle_alloc_error_handler, allow(internal_features))] -+#![cfg_attr(mangle_alloc_error_handler, feature(rustc_attrs))] -+ -+#[cfg(use_cpp_allocator_impls)] - use std::alloc::{GlobalAlloc, Layout}; - -+#[cfg(use_cpp_allocator_impls)] - struct Allocator; - -+#[cfg(use_cpp_allocator_impls)] - unsafe impl GlobalAlloc for Allocator { - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - unsafe { ffi::alloc(layout.size(), layout.align()) } -@@ -32,9 +42,36 @@ unsafe impl GlobalAlloc for Allocator { - } - } - -+#[cfg(use_cpp_allocator_impls)] - #[global_allocator] - static GLOBAL: Allocator = Allocator; - -+#[cfg(not(use_cpp_allocator_impls))] -+#[global_allocator] -+static GLOBAL: std::alloc::System = std::alloc::System; -+ -+// As part of rustc's contract for using `#[global_allocator]` without -+// rustc-generated shims we must define this symbol, since we are opting in to -+// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 -+#[no_mangle] -+#[linkage = "weak"] -+static __rust_no_alloc_shim_is_unstable: u8 = 0; -+ -+#[no_mangle] -+#[linkage = "weak"] -+static __rust_alloc_error_handler_should_panic: u8 = 0; -+ -+// Mangle the symbol name as rustc expects. -+#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] -+#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] -+#[linkage = "weak"] -+fn __rust_alloc_error_handler(_size: usize, _align: usize) { -+ unsafe { ffi::crash_immediately() } -+} -+ -+// TODO(crbug.com/408221149): conditionally include the FFI glue based on -+// `use_cpp_allocator_impls` -+#[allow(dead_code)] - #[cxx::bridge(namespace = "rust_allocator_internal")] - mod ffi { - extern "C++" { -@@ -44,5 +81,6 @@ mod ffi { - unsafe fn dealloc(p: *mut u8, size: usize, align: usize); - unsafe fn realloc(p: *mut u8, old_size: usize, align: usize, new_size: usize) -> *mut u8; - unsafe fn alloc_zeroed(size: usize, align: usize) -> *mut u8; -+ unsafe fn crash_immediately(); - } - } diff --git a/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch b/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch deleted file mode 100644 index 1cfa07f..0000000 --- a/backports/electron/0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch +++ /dev/null @@ -1,102 +0,0 @@ -reduced -lnl - -From e201e2d467b0daad6cdbbfcd5b0e34760e4099c1 Mon Sep 17 00:00:00 2001 -From: Alan Zhao -Date: Mon, 7 Apr 2025 18:15:01 -0700 -Subject: [PATCH] Roll rust *only* f7b43542838f0a4a6cfdb17fbeadf45002042a77-1 : - 3f690c2257b7080cd3a8cce64e082fc972148990-1 - -https://chromium.googlesource.com/external/github.com/rust-lang/rust/+log/f7b43542838f..3f690c2257b7 - -Ran: ./tools/clang/scripts/upload_revision.py 5b36835df010c5813808d34e45428c624fb52ff1 - -Additionally, add fixes to the rust allocator to address https://crbug.com/407024458. - -Bug: 404285928,407024458 -Disable-Rts: True -Cq-Include-Trybots: chromium/try:chromeos-amd64-generic-cfi-thin-lto-rel -Cq-Include-Trybots: chromium/try:dawn-win10-x86-deps-rel -Cq-Include-Trybots: chromium/try:linux-chromeos-dbg -Cq-Include-Trybots: chromium/try:linux_chromium_cfi_rel_ng -Cq-Include-Trybots: chromium/try:linux_chromium_chromeos_msan_rel_ng -Cq-Include-Trybots: chromium/try:linux_chromium_msan_rel_ng -Cq-Include-Trybots: chromium/try:mac11-arm64-rel,mac_chromium_asan_rel_ng -Cq-Include-Trybots: chromium/try:ios-catalyst,win-asan,android-official -Cq-Include-Trybots: chromium/try:fuchsia-arm64-cast-receiver-rel -Cq-Include-Trybots: chromium/try:mac-official,linux-official -Cq-Include-Trybots: chromium/try:win-official,win32-official -Cq-Include-Trybots: chromium/try:win-swangle-try-x86 -Cq-Include-Trybots: chromium/try:android-cronet-riscv64-dbg -Cq-Include-Trybots: chromium/try:android-cronet-riscv64-rel -Cq-Include-Trybots: chrome/try:iphone-device -Cq-Include-Trybots: chrome/try:linux-chromeos-chrome -Cq-Include-Trybots: chrome/try:win-chrome,win64-chrome,linux-chrome,mac-chrome -Cq-Include-Trybots: chrome/try:linux-pgo,mac-pgo,win32-pgo,win64-pgo -Cq-Include-Trybots: luci.chromium.try:linux-cast-x64-rel -Cq-Include-Trybots: chromium/try:android-rust-arm32-rel -Cq-Include-Trybots: chromium/try:android-rust-arm64-dbg -Cq-Include-Trybots: chromium/try:android-rust-arm64-rel -Cq-Include-Trybots: chromium/try:linux-rust-x64-dbg -Cq-Include-Trybots: chromium/try:linux-rust-x64-rel -Cq-Include-Trybots: chromium/try:mac-rust-x64-dbg -Cq-Include-Trybots: chromium/try:win-rust-x64-dbg -Cq-Include-Trybots: chromium/try:win-rust-x64-rel -Change-Id: Iec99681a89deaf3f2c79c76f9c4d1c2b2b7d6fe1 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6439711 -Reviewed-by: Collin Baker -Commit-Queue: Alan Zhao -Cr-Commit-Position: refs/heads/main@{#1443873} ---- - build/rust/allocator/BUILD.gn | 6 +- - build/rust/allocator/lib.rs | 6 +- - build/rust/std/rules/BUILD.gn | 476 +++++++++++++++++----------------- - tools/rust/update_rust.py | 2 +- - 4 files changed, 251 insertions(+), 239 deletions(-) - -diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn -index f09314afc8158..ca581630c76c9 100644 ---- a/build/rust/allocator/BUILD.gn -+++ b/build/rust/allocator/BUILD.gn -@@ -32,6 +32,10 @@ if (toolchain_has_rust) { - sources = [ "lib.rs" ] - crate_root = "lib.rs" - cxx_bindings = [ "lib.rs" ] -+ rustflags = [ -+ "--cfg", -+ "mangle_alloc_error_handler", -+ ] - - deps = [ ":allocator_impls" ] - -@@ -40,7 +44,7 @@ if (toolchain_has_rust) { - allow_unsafe = true - - if (use_cpp_allocator_impls) { -- rustflags = [ -+ rustflags += [ - "--cfg", - "use_cpp_allocator_impls", - ] -diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs -index b8b67d9c6c649..4e2dad3d542a8 100644 ---- a/build/rust/allocator/lib.rs -+++ b/build/rust/allocator/lib.rs -@@ -57,13 +57,17 @@ static GLOBAL: std::alloc::System = std::alloc::System; - #[linkage = "weak"] - static __rust_no_alloc_shim_is_unstable: u8 = 0; - --#[no_mangle] -+// Mangle the symbol name as rustc expects. -+#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] -+#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] -+#[allow(non_upper_case_globals)] - #[linkage = "weak"] - static __rust_alloc_error_handler_should_panic: u8 = 0; - - // Mangle the symbol name as rustc expects. - #[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] - #[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] -+#[allow(non_upper_case_globals)] - #[linkage = "weak"] - fn __rust_alloc_error_handler(_size: usize, _align: usize) { - unsafe { ffi::crash_immediately() } diff --git a/backports/electron/0004-Drop-remap_alloc-dep.patch b/backports/electron/0004-Drop-remap_alloc-dep.patch deleted file mode 100644 index c6762a4..0000000 --- a/backports/electron/0004-Drop-remap_alloc-dep.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 4a0377f0b847af505915b0e0a6c4178d4e7c3244 Mon Sep 17 00:00:00 2001 -From: Matt Jolly -Date: Mon, 14 Apr 2025 20:16:46 -0700 -Subject: [PATCH] Drop `remap_alloc` dep -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -commit e3a1797dbab3eaa1c808d53215b32c8759d27ac7 dropped the source set -that this refers to, in favour of a more modern, crate-based solution. - -This seems to have been overlooked, possibly as it only appears to -be called if using the unbundle toolchain. - -Bug: 408221149 -Signed-off-by: Matt Jolly -Change-Id: I1703d8e1e456161aa2b736169eec407235847099 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6456604 -Reviewed-by: Andrew Grieve -Reviewed-by: Lei Zhang -Commit-Queue: Łukasz Anforowicz -Reviewed-by: Łukasz Anforowicz -Cr-Commit-Position: refs/heads/main@{#1446912} ---- - build/rust/std/BUILD.gn | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn -index 25db126076b2f..bb2c9884520b3 100644 ---- a/build/rust/std/BUILD.gn -+++ b/build/rust/std/BUILD.gn -@@ -355,12 +355,6 @@ if (toolchain_has_rust) { - ":stdlib_public_dependent_libs", - ] - deps = [ ":prebuilt_rustc_copy_to_sysroot" ] -- -- # The host builds tools toolchain supports Rust only and does not use -- # the allocator remapping to point it to PartitionAlloc. -- if (!toolchain_for_rust_host_build_tools) { -- deps += [ ":remap_alloc" ] -- } - } - } - } diff --git a/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch b/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch deleted file mode 100644 index 5ba4d83..0000000 --- a/backports/electron/0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch +++ /dev/null @@ -1,354 +0,0 @@ -From e65cb388e5da56d1236607e0db9cadf89e50eded Mon Sep 17 00:00:00 2001 -From: Lukasz Anforowicz -Date: Tue, 15 Apr 2025 11:10:19 -0700 -Subject: [PATCH] [rust] Clean up `//build/rust/allocator` after a Rust - toolchain roll. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This CL makes minor tweaks and changes under `//build/rust/allocator`: - -* Thanks to the Rust toolchain roll, we no longer need to keep two - implementations, picking between them using the - `mangle_alloc_error_handler` configuration knob. -* The `#[cfg(use_cpp_allocator_impls)]` vs - `#[cfg(not(use_cpp_allocator_impls))]` choices have been deduplicated - by putting the related/conditional stuff under `mod cpp_allocator` and - `rust_allocator`. -* Closes a minor gap missed in https://crrev.com/c/6432410: - - Moving `DEPS` file to the new source location - -Bug: 408221149 -Change-Id: Id541797e03da113a5271b02a5f60eb2be08254a9 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6454872 -Reviewed-by: Alan Zhao -Commit-Queue: Łukasz Anforowicz -Cr-Commit-Position: refs/heads/main@{#1447241} ---- - build/rust/allocator/BUILD.gn | 11 +- - build/rust/{std => allocator}/DEPS | 2 +- - build/rust/allocator/allocator_impls.cc | 65 ++---------- - build/rust/allocator/allocator_impls.h | 2 + - build/rust/allocator/lib.rs | 132 +++++++++++++++--------- - 5 files changed, 97 insertions(+), 115 deletions(-) - rename build/rust/{std => allocator}/DEPS (76%) - -diff --git a/build/rust/allocator/BUILD.gn b/build/rust/allocator/BUILD.gn -index ca581630c76c9..434a61e11bdbb 100644 ---- a/build/rust/allocator/BUILD.gn -+++ b/build/rust/allocator/BUILD.gn -@@ -32,10 +32,6 @@ if (toolchain_has_rust) { - sources = [ "lib.rs" ] - crate_root = "lib.rs" - cxx_bindings = [ "lib.rs" ] -- rustflags = [ -- "--cfg", -- "mangle_alloc_error_handler", -- ] - - deps = [ ":allocator_impls" ] - -@@ -43,13 +39,12 @@ if (toolchain_has_rust) { - no_allocator_crate = true - allow_unsafe = true - -+ rustflags = [] - if (use_cpp_allocator_impls) { -- rustflags += [ -- "--cfg", -- "use_cpp_allocator_impls", -- ] -+ rustflags += [ "--cfg=use_cpp_allocator_impls" ] - } - -+ # TODO(https://crbug.com/410596442): Stop using unstable features here. - configs -= [ "//build/config/compiler:disallow_unstable_features" ] - } - -diff --git a/build/rust/std/DEPS b/build/rust/allocator/DEPS -similarity index 76% -rename from build/rust/std/DEPS -rename to build/rust/allocator/DEPS -index eb524c0a06acd..923a2e07c80f4 100644 ---- a/build/rust/std/DEPS -+++ b/build/rust/allocator/DEPS -@@ -3,7 +3,7 @@ include_rules = [ - ] - - specific_include_rules = { -- "remap_alloc.cc" : [ -+ "allocator_impls.cc" : [ - "+partition_alloc" - ] - } -diff --git a/build/rust/allocator/allocator_impls.cc b/build/rust/allocator/allocator_impls.cc -index bf3c2a301adf5..8887752f3dfad 100644 ---- a/build/rust/allocator/allocator_impls.cc -+++ b/build/rust/allocator/allocator_impls.cc -@@ -24,62 +24,6 @@ - #include - #endif - --// NOTE: this documentation is outdated. --// --// TODO(crbug.com/408221149): update this documentation, or replace it with docs --// in the Rust allocator implementation. --// --// When linking a final binary, rustc has to pick between either: --// * The default Rust allocator --// * Any #[global_allocator] defined in *any rlib in its dependency tree* --// (https://doc.rust-lang.org/edition-guide/rust-2018/platform-and-target-support/global-allocators.html) --// --// In this latter case, this fact will be recorded in some of the metadata --// within the .rlib file. (An .rlib file is just a .a file, but does have --// additional metadata for use by rustc. This is, as far as I know, the only --// such metadata we would ideally care about.) --// --// In all the linked rlibs, --// * If 0 crates define a #[global_allocator], rustc uses its default allocator --// * If 1 crate defines a #[global_allocator], rustc uses that --// * If >1 crates define a #[global_allocator], rustc bombs out. --// --// Because rustc does these checks, it doesn't just have the __rust_alloc --// symbols defined anywhere (neither in the stdlib nor in any of these --// crates which have a #[global_allocator] defined.) --// --// Instead: --// Rust's final linking stage invokes dynamic LLVM codegen to create symbols --// for the basic heap allocation operations. It literally creates a --// __rust_alloc symbol at link time. Unless any crate has specified a --// #[global_allocator], it simply calls from __rust_alloc into --// __rdl_alloc, which is the default Rust allocator. The same applies to a --// few other symbols. --// --// We're not (always) using rustc for final linking. For cases where we're not --// Rustc as the final linker, we'll define those symbols here instead. This --// allows us to redirect allocation to PartitionAlloc if clang is doing the --// link. --// --// We use unchecked allocation paths in PartitionAlloc rather than going through --// its shims in `malloc()` etc so that we can support fallible allocation paths --// such as Vec::try_reserve without crashing on allocation failure. --// --// In future, we should build a crate with a #[global_allocator] and --// redirect these symbols back to Rust in order to use to that crate instead. --// This would allow Rust-linked executables to: --// 1. Use PartitionAlloc on Windows. The stdlib uses Windows heap functions --// directly that PartitionAlloc can not intercept. --// 2. Have `Vec::try_reserve` to fail at runtime on Linux instead of crashing in --// malloc() where PartitionAlloc replaces that function. --// --// They're weak symbols, because this file will sometimes end up in targets --// which are linked by rustc, and thus we would otherwise get duplicate --// definitions. The following definitions will therefore only end up being --// used in targets which are linked by our C++ toolchain. --// --// # On Windows ASAN --// - // In ASAN builds, PartitionAlloc-Everywhere is disabled, meaning malloc() and - // friends in C++ do not go to PartitionAlloc. So we also don't point the Rust - // allocation functions at PartitionAlloc. Generally, this means we just direct -@@ -93,7 +37,6 @@ - // Note that there is a runtime option to make ASAN hook HeapAlloc() but - // enabling it breaks Win32 APIs like CreateProcess: - // https://issues.chromium.org/u/1/issues/368070343#comment29 -- - #if !BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) && BUILDFLAG(IS_WIN) && \ - defined(ADDRESS_SANITIZER) - #define USE_WIN_ALIGNED_MALLOC 1 -@@ -110,6 +53,10 @@ unsigned char* alloc(size_t size, size_t align) { - return nullptr; - } - -+ // We use unchecked allocation paths in PartitionAlloc rather than going -+ // through its shims in `malloc()` etc so that we can support fallible -+ // allocation paths such as Vec::try_reserve without crashing on allocation -+ // failure. - if (align <= alignof(std::max_align_t)) { - return static_cast(allocator_shim::UncheckedAlloc(size)); - } else { -@@ -144,6 +91,10 @@ unsigned char* realloc(unsigned char* p, - size_t align, - size_t new_size) { - #if BUILDFLAG(RUST_ALLOCATOR_USES_PARTITION_ALLOC) -+ // We use unchecked allocation paths in PartitionAlloc rather than going -+ // through its shims in `malloc()` etc so that we can support fallible -+ // allocation paths such as Vec::try_reserve without crashing on allocation -+ // failure. - if (align <= alignof(std::max_align_t)) { - return static_cast( - allocator_shim::UncheckedRealloc(p, new_size)); -diff --git a/build/rust/allocator/allocator_impls.h b/build/rust/allocator/allocator_impls.h -index e90ab7cd422c1..e562a877d886e 100644 ---- a/build/rust/allocator/allocator_impls.h -+++ b/build/rust/allocator/allocator_impls.h -@@ -10,6 +10,8 @@ - #include "build/build_config.h" - #include "build/rust/allocator/buildflags.h" - -+// This header exposes PartitionAlloc to Rust -+// (most APIs below are called from `impl GlobalAlloc` in `lib.rs`). - namespace rust_allocator_internal { - - unsigned char* alloc(size_t size, size_t align); -diff --git a/build/rust/allocator/lib.rs b/build/rust/allocator/lib.rs -index 4e2dad3d542a8..a4f898f9b107f 100644 ---- a/build/rust/allocator/lib.rs -+++ b/build/rust/allocator/lib.rs -@@ -5,72 +5,106 @@ - //! Define the allocator that Rust code in Chrome should use. - //! - //! Any final artifact that depends on this crate, even transitively, will use --//! the allocator defined here. Currently this is a thin wrapper around --//! allocator_impls.cc's functions; see the documentation there. -+//! the allocator defined here. -+//! -+//! List of known issues: -+//! -+//! 1. We'd like to use PartitionAlloc on Windows, but the stdlib uses Windows -+//! heap functions directly that PartitionAlloc can not intercept. -+//! 2. We'd like `Vec::try_reserve` to fail at runtime on Linux instead of -+//! crashing in malloc() where PartitionAlloc replaces that function. - - // Required to apply weak linkage to symbols. -+// -+// TODO(https://crbug.com/410596442): Stop using unstable features here. -+// https://github.com/rust-lang/rust/issues/29603 tracks stabilization of the `linkage` feature. - #![feature(linkage)] - // Required to apply `#[rustc_std_internal_symbol]` to our alloc error handler - // so the name is correctly mangled as rustc expects. --#![cfg_attr(mangle_alloc_error_handler, allow(internal_features))] --#![cfg_attr(mangle_alloc_error_handler, feature(rustc_attrs))] -+// -+// TODO(https://crbug.com/410596442): Stop using internal features here. -+#![allow(internal_features)] -+#![feature(rustc_attrs)] - -+/// Module that provides `#[global_allocator]` / `GlobalAlloc` interface for -+/// using an allocator from C++. - #[cfg(use_cpp_allocator_impls)] --use std::alloc::{GlobalAlloc, Layout}; -+mod cpp_allocator { -+ use super::ffi; -+ use std::alloc::{GlobalAlloc, Layout}; - --#[cfg(use_cpp_allocator_impls)] --struct Allocator; -+ struct Allocator; - --#[cfg(use_cpp_allocator_impls)] --unsafe impl GlobalAlloc for Allocator { -- unsafe fn alloc(&self, layout: Layout) -> *mut u8 { -- unsafe { ffi::alloc(layout.size(), layout.align()) } -- } -+ unsafe impl GlobalAlloc for Allocator { -+ unsafe fn alloc(&self, layout: Layout) -> *mut u8 { -+ unsafe { ffi::alloc(layout.size(), layout.align()) } -+ } - -- unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { -- unsafe { -- ffi::dealloc(ptr, layout.size(), layout.align()); -+ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { -+ unsafe { -+ ffi::dealloc(ptr, layout.size(), layout.align()); -+ } - } -- } - -- unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { -- unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } -- } -+ unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { -+ unsafe { ffi::alloc_zeroed(layout.size(), layout.align()) } -+ } - -- unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { -- unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } -+ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { -+ unsafe { ffi::realloc(ptr, layout.size(), layout.align(), new_size) } -+ } - } --} - --#[cfg(use_cpp_allocator_impls)] --#[global_allocator] --static GLOBAL: Allocator = Allocator; -+ #[global_allocator] -+ static GLOBAL: Allocator = Allocator; -+} - -+/// Module that provides `#[global_allocator]` / `GlobalAlloc` interface for -+/// using the default Rust allocator. - #[cfg(not(use_cpp_allocator_impls))] --#[global_allocator] --static GLOBAL: std::alloc::System = std::alloc::System; -- --// As part of rustc's contract for using `#[global_allocator]` without --// rustc-generated shims we must define this symbol, since we are opting in to --// unstable functionality. See https://github.com/rust-lang/rust/issues/123015 --#[no_mangle] --#[linkage = "weak"] --static __rust_no_alloc_shim_is_unstable: u8 = 0; -- --// Mangle the symbol name as rustc expects. --#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] --#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] --#[allow(non_upper_case_globals)] --#[linkage = "weak"] --static __rust_alloc_error_handler_should_panic: u8 = 0; -- --// Mangle the symbol name as rustc expects. --#[cfg_attr(mangle_alloc_error_handler, rustc_std_internal_symbol)] --#[cfg_attr(not(mangle_alloc_error_handler), no_mangle)] --#[allow(non_upper_case_globals)] --#[linkage = "weak"] --fn __rust_alloc_error_handler(_size: usize, _align: usize) { -- unsafe { ffi::crash_immediately() } -+mod rust_allocator { -+ #[global_allocator] -+ static GLOBAL: std::alloc::System = std::alloc::System; -+} -+ -+/// Module that provides global symbols that are needed both by `cpp_allocator` -+/// and `rust_allocator`. -+/// -+/// When `rustc` drives linking, then it will define the symbols below. But -+/// Chromium only uses `rustc` to link Rust-only executables (e.g. `build.rs` -+/// scripts) and otherwise uses a non-Rust linker. This is why we have to -+/// manually define a few symbols below. We define those symbols -+/// as "weak" symbols, so that Rust-provided symbols "win" in case where Rust -+/// actually does drive the linking. This hack works (not only for Chromium, -+/// but also for google3 and other projects), but isn't officially supported by -+/// `rustc`. -+/// -+/// TODO(https://crbug.com/410596442): Stop using internal features here. -+mod both_allocators { -+ use super::ffi; -+ -+ /// As part of rustc's contract for using `#[global_allocator]` without -+ /// rustc-generated shims we must define this symbol, since we are opting in -+ /// to unstable functionality. See https://github.com/rust-lang/rust/issues/123015 -+ #[no_mangle] -+ #[linkage = "weak"] -+ static __rust_no_alloc_shim_is_unstable: u8 = 0; -+ -+ // Mangle the symbol name as rustc expects. -+ #[rustc_std_internal_symbol] -+ #[allow(non_upper_case_globals)] -+ #[linkage = "weak"] -+ static __rust_alloc_error_handler_should_panic: u8 = 0; -+ -+ // Mangle the symbol name as rustc expects. -+ #[rustc_std_internal_symbol] -+ #[allow(non_upper_case_globals)] -+ #[linkage = "weak"] -+ fn __rust_alloc_error_handler(_size: usize, _align: usize) { -+ // TODO(lukasza): Investigate if we can just call `std::process::abort()` here. -+ // (Not really _needed_, but it could simplify code a little bit.) -+ unsafe { ffi::crash_immediately() } -+ } - } - - // TODO(crbug.com/408221149): conditionally include the FFI glue based on diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index 92270b8..ab1603d 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,18 +1,19 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=35.5.0 +pkgver=39.2.3 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 -_chromium=134.0.6998.205 -_copium_tag=134.0 +_chromium=142.0.7444.175 +_copium_tag=142.0 _depot_tools=495b23b39aaba2ca3b55dd27cadc523f1cb17ee6 pkgdesc="Electron cross-platform desktop toolkit" url="https://github.com/electron/electron" +# armv7: Segmentation fault on builder despite building in CI arch="aarch64 x86_64" # same as chromium license="MIT" depends="gtk+3.0 so:libudev.so.1 xdg-utils" -_llvmver=20 +_llvmver=21 makedepends=" ada-dev alsa-lib-dev @@ -24,8 +25,8 @@ makedepends=" c-ares-dev cairo-dev clang$_llvmver-dev + clang$_llvmver-rtlib clang-extra-tools - compiler-rt crc32c-dev cups-dev curl-dev @@ -44,6 +45,7 @@ makedepends=" gn gzip harfbuzz-dev + highway-dev hdrhistogram-c-dev hunspell-dev http-parser-dev @@ -74,7 +76,7 @@ makedepends=" libxscrnsaver-dev libxslt-dev linux-headers - lld + lld$_llvmver llhttp-dev llvm$_llvmver mesa-dev @@ -116,18 +118,20 @@ subpackages="$pkgname-lang $pkgname-dev" source=" https://ayakael.net/api/packages/mirrors/generic/electron/$_gittag/electron-$_gittag-$_chromium.tar.zst copium-$_copium_tag.tar.gz::https://codeberg.org/selfisekai/copium/archive/$_copium_tag.tar.gz - chromium-revert-drop-of-system-java.patch + 0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch compiler.patch disable-dns_config_service.patch disable-failing-tests.patch fc-cache-version.patch - fix-opus.patch + fix-ffmpeg-codec-list.patch fstatat-32bit.patch gdbinit.patch generic-sensor-include.patch - musl-auxv.patch + headless-shell-no-license.patch musl-sandbox.patch musl-tid-caching.patch + net-test-no-vpython.patch + net-test-pyws3-py3.12.patch no-execinfo.patch no-mallinfo.patch no-res-ninit-nclose.patch @@ -135,19 +139,14 @@ source=" partalloc-no-tagging-arm64.patch pvalloc.patch temp-failure-retry.patch - pipewire-1.4.patch - gperf-3.2-fix.patch - 0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch - 0002-Call-Rust-default-allocator-directly-from-Rust.patch - 0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch - 0004-Drop-remap_alloc-dep.patch - 0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch electron_icon.patch electron_python-jinja-3.10.patch electron_webpack-hash.patch electron_unbundle-node.patch electron_system-zlib-headers.patch + electron_do-not-strip-binaries.patch + electron_shell-file-dialog-drop-glibc.patch default.conf electron.desktop @@ -157,8 +156,9 @@ _copium_patches=" cr131-v8-non4k-pages.patch cr133-ffmpeg-no-noh264parse.patch cr133-is-musl-libcxx.patch - cr133-mv2-still-not-dead.patch - cr134-unbundle-simdutf.patch + cr138-node-version-check.patch + cr140-musl-prctl.patch + cr142-autofill-incomplete-formfielddata.patch " # Avoid conflicting providers sonameprefix="$pkgname:" @@ -166,17 +166,19 @@ sonameprefix="$pkgname:" options="!check net suid" builddir="$srcdir/electron-$_gittag-$_chromium" -export CC=clang-$_llvmver -export CXX=clang++-$_llvmver +export CC="/usr/lib/llvm$_llvmver/bin/clang" +export CXX="/usr/lib/llvm$_llvmver/bin/clang++" # required to find the tools -export AR=llvm-ar -export NM=llvm-nm -export LD=clang++-$_llvmver +export NM="/usr/lib/llvm$_llvmver/bin/llvm-nm" +export AR="/usr/lib/llvm$_llvmver/bin/llvm-ar" +export LD="/usr/lib/llvm$_llvmver/bin/clang++" # less log spam, reproducible export CFLAGS="${CFLAGS/-g/} -O2 -Wno-builtin-macro-redefined -Wno-deprecated-declarations -Wno-shift-count-overflow -Wno-ignored-attributes" export CXXFLAGS="${CXXFLAGS/-g/} -O2 -Wno-builtin-macro-redefined -Wno-deprecated-declarations -Wno-invalid-constexpr" +# _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE is set by project +export CXXFLAGS="${CXXFLAGS/-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST/}" export CPPFLAGS="${CPPFLAGS/-g/} -D__DATE__= -D__TIME__= -D__TIMESTAMP__=" case "$CARCH" in aarch64|arm*|riscv64) @@ -233,8 +235,8 @@ snapshot() { --nohooks python3 src/build/landmines.py - python3 src/build/util/lastchange.py -o src/build/util/LASTCHANGE \ - --revision src/gpu/webgpu/DAWN_VERSION + python3 src/build/util/lastchange.py -m DAWN_COMMIT_HASH -s src/third_party/dawn \ + --revision src/gpu/webgpu/DAWN_VERSION --header src/gpu/webgpu/dawn_commit_hash.h python3 src/build/util/lastchange.py -m GPU_LISTS_VERSION \ --revision-id-only --header src/gpu/config/gpu_lists_version.h python3 src/build/util/lastchange.py -m SKIA_COMMIT_HASH \ @@ -269,6 +271,8 @@ snapshot() { mcli cp "$SRCDEST"/$pkgname-$_gittag-$_chromium.tar.zst "$_distbucket" } +export RUSTC_BOOTSTRAP=1 + prepare() { default_prepare @@ -314,9 +318,14 @@ prepare() { ./update_npm_deps ) + # generate dawn_commit_hash + # TODO: remove on next update as it'll be generated after + # https://ayakael.net/mirrors/electron/commit/7623f4a14ab44fa4f4343e47d9d681c9b4aa984c + python3 build/util/lastchange.py -m DAWN_COMMIT_HASH -s third_party/dawn \ + --revision gpu/webgpu/DAWN_VERSION --header gpu/webgpu/dawn_commit_hash.h + # reusable system library settings # flatbuffers - tensorflow has a few static_asserts for a specific patch version - # highway - requires highway>=1.1.0 (arm failures) # libavif - https://github.com/AOMediaCodec/libavif/commit/50a541469c98009016af8dcc9f83a1be79f3a7d9 # libaom - https://aomedia.googlesource.com/aom/+/706ee36dcc82%5E%21/ # but watch this space: https://aomedia-review.googlesource.com/c/aom/+/188606 @@ -332,6 +341,7 @@ prepare() { fontconfig freetype harfbuzz-ng + highway libdrm libjpeg libsecret @@ -420,6 +430,8 @@ prepare() { third_party/blink/renderer/core/xml/parser/xml_document_parser.cc \ third_party/libxml/chromium/*.cc + echo "$CTARGET" >> build/rust/known-target-triples.txt + _configure } @@ -453,10 +465,9 @@ _configure() { custom_toolchain=\"//build/toolchain/linux/unbundle:default\" disable_fieldtrial_testing_config=true enable_hangout_services_extension=true - enable_nacl=false enable_nocompile_tests=false - enable_stripping=false enable_rust=true + enable_stripping=false enable_vr=false fatal_linker_warnings=false ffmpeg_branding=\"Chrome\" @@ -469,6 +480,7 @@ _configure() { is_musl=true is_official_build=true link_pulseaudio=true + node_version_check=false proprietary_codecs=true rtc_link_pipewire=true rtc_use_pipewire=true @@ -478,6 +490,7 @@ _configure() { safe_browsing_use_unrar=false symbol_level=$symbol_level treat_warnings_as_errors=false + se_clang_modules=false use_custom_libcxx=true use_lld=true use_pulseaudio=true @@ -551,39 +564,36 @@ lang() { } sha512sums=" -a30c115f17f9811347f8713fa604b56244e39facbbab7b6b82cbc3049ed12b429b06f2faafa8a48dd727b655753848d099ba6720fae15c9bb00e6a427dc2758e electron-v35.5.0-134.0.6998.205.tar.zst -c1857b5d6975650f915f3db552666f521822b857e39958ccfb54129f3878f272deaafc3dd446bc8441a5e84f075791feeeb62841b74bb555d8c546bfe231d164 copium-134.0.tar.gz -29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020 chromium-revert-drop-of-system-java.patch -d9cc4a37a0311d23ae315a8d8124f8dbf60db8cc4a3943818638174b20387f1d770d00871f6608957b246ad956abca43c22ea0b072724287f2947e1909e47323 compiler.patch -4057cc78f10bfd64092bc35a373869abb1d68b880cdbca70422f39ffd78a929c19c7728d4d4c40709aaba25581148a93ae5343e724849fd35323062ed68753fa disable-dns_config_service.patch -2470904846e3adde2c9506f9e78220daca0932320b628dd3d427bf2b7c17a8f7880cb97e787b046c28de7aca642e1a8d30824d6049905976da77e7473baa64da disable-failing-tests.patch -5fc5c012c1db6cf1ba82f38c6f3f4f5ca3a209e47ac708a74de379b018e0649b7694877c9571ef79002dde875ffc07b458a3355425f1c01867f362c66c2bc1bf fc-cache-version.patch -f7fe8a8e5eee17310fb4c3e5de621b4b89ea0567f75033c65be970950cca62b50c5fbd004735e4ad39bdb2e1638b3b73ea614203d323f8181ae18c71edf302a0 fix-opus.patch +7c4c33570bf6c0ff0d1d2606b64e25e9b8f64f399e49dd03632ee712de5551eb7757ac999ff1206d0c70057b4bf0ce535ac228ddbb88ffd9b1585d7abd483266 electron-v39.2.3-142.0.7444.175.tar.zst +30b298549804e7753b0b639b72417ba081e964676862b6c7d73ad73cdf806883f20e4a4b36e67a6c375eaf2dd97686cf21b90b062400d3b61fba86da4d239bfa copium-142.0.tar.gz +69b45005451ccd69c354b4c2910e92371cb801665f5e300dbecd36f8bc4ce68e77a431b5dac07c0937787debb4e93b7aadefa0a1e76c4ae334d2547ca3ca14ff 0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch +dc254dd79e135aeac3e9c03eb055e3bc17980fc213f8c4d8d7921a575be7f9c26b91f110a6dcb01c0a824a7d9375c09f8a61c8858c20c11d79c03f873e2cb3f9 compiler.patch +1bee1448e409fedff635388ee6f1efa6d23c29ae3e6b6fd31452c56974adb40fcd0088c82d1e643d549154663e402942cbab9807dff5aff2d8997a09de6f5655 disable-dns_config_service.patch +0ef9168b8b1a4779bc4c8df718735e06d29e459dcfd00f8cbf9a4edaf9fade8089225219e46dead7de81de716bddc8d745dc2069db0ee7f7e5d2f64c5236e2ab disable-failing-tests.patch +0050857a9a9553c10fd502fe70606bce48269c9b48fa82ce9e111575637a0c03578e923c82fc639fcb574fc3337aeef50d8a0aea5e512ae4eab83b8c3d732cf6 fc-cache-version.patch +87f63d83139562e058f3f649eb1f62bf100dd92c2bb6ee393fdce0c8f7d7c188a7062394647aafe4e82c0a8fbbffeb613edc5c8dd9415dd9dda777827ea371c5 fix-ffmpeg-codec-list.patch c63dee5044353eb306a39ca1526158c0f003ab310ecb03d1c368dc2a979454590c84b8d3c15484517d5e66bb8add9b231da9abbadf2e50850abd72ac1345c4ab fstatat-32bit.patch 33ee60863cc438ef57ffef92ba4cf67a856a5ffc16138bce241bcf87e47b15154aa86918e793c26f7ec4dc62a445257ad5673ed7001daf22c4043cf6cc57da7f gdbinit.patch 36a764fa73443b47d38050b52dbe6ad2fa8d67201ff4ccdbad13b52308ef165ca046aac6f9609fe35890a6485f0f3e672e78cc41e3e44f3cdc7f145e540524e8 generic-sensor-include.patch -99bcc7dd485b404a90c606a96addab1d900852128d44fb8cea8acc7303189ef87c89a7b0e749fd0e10c5ef5f6bf1fadeb5c16a34503cab6a59938ce2653d887e musl-auxv.patch +a94cf7a0670abf5178abba33c619cc6d41d73f2e16c7a1fd5b152152f5077df103e049d166e3b8627797c38113821d2f2e6b64cd48d132c1e90ad32d63a349f5 headless-shell-no-license.patch 51f1959bd622af26a1c3a1f4b0ad9a5bfa461057aa4cf9960c568dddf8ac47d55989c277f5d5ab5db040a04c54925a531af7a1cc767559218b408eaa6bdd7577 musl-sandbox.patch e7163ac5810ac85366cef2447412287c856e3d67c6b77f219a6e5a418b1965b98e449c409424ad0704a5bded9355dd0aec3dc4585918ce5a2ab36c079707afe2 musl-tid-caching.patch +3b7420d58d13dfc4baab5065e3017f666f51fed6de087af42a660a839d7b4444b50d1a93204322d213df36c6722eaf6b08d46d50dc374198a342da2675fafff5 net-test-no-vpython.patch +e487662b6606ea526ddd716c31e6b9ad3d61f1bee5356cd94b78a903efb3928338cbb48e3d5840b34c3b70a71e8361a228430bd50e707ad301228a7049d59e37 net-test-pyws3-py3.12.patch a250cff50d282b02ce0f28880d0a2b4fb8e7df51bc072bfeeddc561c29a7c76453dbcbc7b17b82966a7b30a31409d2555720d1dcf963e1b3fb8a2a06a6abcf46 no-execinfo.patch 0b41aeb6b212f9c3f61aa0a8d3085c9e865a2e68f3270ceec2376aab67f337ac46eaea7da36d3fd7219e2a1cb731b7aa2d3fb619a374d2b7653976b9f4f384bb no-mallinfo.patch e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9c46ea066405857536964a36436a68eecf7da7952736333cf no-res-ninit-nclose.patch 6dc4d8dc92e685dace62265a1ddb3aebc558aed54d20ff6d36b030be0c48d7e84662326c31363612492574d9a03c62653cdc21a60995b97dee1d75cae86a9f9b no-sandbox-settls.patch -f2b08538ff57c50b3772a07ca91845f9d45f4a5112f608b6192d4fb5d7be48f478c0c36194d95ab7bbf933e0278e5c6d578619d8643895cdc40386eebc5b975f partalloc-no-tagging-arm64.patch +b75908a45ee2f4f806eec8d86fca2f51fda3531b88de48ef4539c364a40d7e2897cdaf38b715682d712648e3f43aac983055e688385f85fa7b7204ffb6d617e1 partalloc-no-tagging-arm64.patch 03f829a2da633533ef3fd0f287f5ec602d936a97a98b53cd2415553c2537ae9d571f35397ca7c9fb3f4b0806c300e3b189569f8d979ca132e1a2a4dae7206396 pvalloc.patch e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb temp-failure-retry.patch -1814096bc611e7f56cc5c570214dae715a4cda1fba96a6b585a73a1abc8b9161efaa799dc83887dac531dbafe9479bbe235cabe1a61cb3081e268c53a6144908 pipewire-1.4.patch -4bc087a1e5acbb0f8f884756b40c127df88699ecd6eb42c4aff6691b87239bb6915dd102e9ef2544502a12bff011859ad497206940473e6b0a0fd75afb562a4c gperf-3.2-fix.patch -858f8e3c544abf3ffe0f54ba303713e9b4058e15996c8dc10bab7c999d82e1960756325a41d6bebb3a00404efb8e51c299f61f60de4feaac6b621757ab85d329 0001-Reland-Use-global_allocator-to-provide-Rust-allocato.patch -077497c1598c7db9f4c23e000e9b86e1833de4866479fd921313543ad599e141427bf38ae687f84c3da59af68f09a776265c2a569e1a7abfa80440231baef10a 0002-Call-Rust-default-allocator-directly-from-Rust.patch -5002aa73eb19b87c702eef5b087ecb3a2679142c28cd95a5a9571aeffe24e6944497e862058ed1d609317a723cdec1678f84543235fb93f12653a92b92309efe 0003-Roll-rust-only-f7b43542838f0a4a6cfdb17fbeadf45002042.patch -d2e414135d2b046dd9efe277f88062bcb0a94749a17a014309260b1469305d55059931b9531572713c8e516897e30fd2f5317948ece1581ffe9b7b6c01078a6d 0004-Drop-remap_alloc-dep.patch -fe66228c0eefe3d08e2a7955b11e6a46f58f477befceba1628765fb016f30eb0bb02723aeedcabdb1ea3b84c42b5ea65073998e0a64f5ce082120fc7e65dee9a 0005-rust-Clean-up-build-rust-allocator-after-a-Rust-tool.patch 465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec electron_icon.patch e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3 electron_python-jinja-3.10.patch 2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30 electron_webpack-hash.patch c7f57929943a86f9e5f333da9d5691da88038770eeb46dd0a0719962c934deb2879f0e7a1ed714e9383e38ee4d68eb754501f362c4d7cdee76cfc2e980b21272 electron_unbundle-node.patch 4d9287d4cdfe27fbfb7be3d4b26c0c40edbd6a0c3ff926d60f2093ca09c15bcb58e20c2ccc8c0606aafd66c6d25a54225bc329cb056d8c5b297db4c6d0e768e6 electron_system-zlib-headers.patch +7031ddb61a858e95d83366185a53b5a2e4be9abe0aa4957543e0621cad57175ffef31bd87b8be25255184bb4cb30ec4fbced055407c6c8c7940c9e240b25d498 electron_do-not-strip-binaries.patch +0f8f36c21cc50c80e378691265845ff10fa53953d6cd5352fe71efcba489f956e50d374d8f634dadc3569c4901a81a1f308a3e69140c0f9136e0777022b9520f electron_shell-file-dialog-drop-glibc.patch e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e default.conf 191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463 electron.desktop 5f7ba5ad005f196facec1c0f26108356b64cafb1e5cfa462ff714a33b8a4c757ac00bfcb080da09eb5b65032f8eb245d9676a61ec554515d125ed63912708648 electron-launcher.sh diff --git a/backports/electron/chromium-revert-drop-of-system-java.patch b/backports/electron/chromium-revert-drop-of-system-java.patch deleted file mode 100644 index 24355bf..0000000 --- a/backports/electron/chromium-revert-drop-of-system-java.patch +++ /dev/null @@ -1,17 +0,0 @@ -This was dropped for some reason in 6951c37cecd05979b232a39e5c10e6346a0f74ef -allows using /usr/bin/java instead of a downloaded one (that doesn't work on musl) --- ---- a/third_party/closure_compiler/compiler.py 2021-05-20 04:17:53.000000000 +0200 -+++ b/third_party/closure_compiler/compiler.py 2021-05-20 04:17:53.000000000 +0200 -@@ -13,8 +13,9 @@ - - - _CURRENT_DIR = os.path.join(os.path.dirname(__file__)) --_JAVA_PATH = os.path.join(_CURRENT_DIR, "..", "jdk", "current", "bin", "java") --assert os.path.isfile(_JAVA_PATH), "java only allowed in android builds" -+_JAVA_BIN = "java" -+_JDK_PATH = os.path.join(_CURRENT_DIR, "..", "jdk", "current", "bin", "java") -+_JAVA_PATH = _JDK_PATH if os.path.isfile(_JDK_PATH) else _JAVA_BIN - - class Compiler(object): - """Runs the Closure compiler on given source files to typecheck them diff --git a/backports/electron/compiler.patch b/backports/electron/compiler.patch index df41f2c..41b9b08 100644 --- a/backports/electron/compiler.patch +++ b/backports/electron/compiler.patch @@ -1,14 +1,12 @@ --- ./build/config/compiler/BUILD.gn.orig +++ ./build/config/compiler/BUILD.gn -@@ -591,24 +591,6 @@ +@@ -658,22 +658,6 @@ } } - # TODO(crbug.com/40283598): This causes binary size growth and potentially - # other problems. -- # TODO(crbug.com/40284925): This isn't supported by Cronet's mainline llvm version. -- if (default_toolchain != "//build/toolchain/cros:target" && -- !llvm_android_mainline) { +- if (default_toolchain != "//build/toolchain/cros:target") { - cflags += [ - "-mllvm", - "-split-threshold-for-reg-with-hint=0", @@ -25,58 +23,91 @@ # TODO(crbug.com/40192287): Investigate why/if this should be needed. if (is_win) { cflags += [ "/clang:-ffp-contract=off" ] -@@ -1045,20 +1027,6 @@ - # `-nodefaultlibs` from the linker invocation from Rust, which would be used - # to compile dylibs on Android, such as for constructing unit test APKs. - "-Cdefault-linker-libraries", -- -- # To make Rust .d files compatible with ninja -- "-Zdep-info-omit-d-target", -- -- # If a macro panics during compilation, show which macro and where it is -- # defined. -- "-Zmacro-backtrace", -- -- # For deterministic builds, keep the local machine's current working -- # directory from appearing in build outputs. -- "-Zremap-cwd-prefix=.", -- -- # We use clang-rt sanitizer runtimes. -- "-Zexternal-clangrt", - ] - - if (!is_win || force_rustc_color_output) { -@@ -1107,7 +1075,6 @@ - # Don't allow unstable features to be enabled by `#![feature()]` without - # additional command line flags. - config("disallow_unstable_features") { -- rustflags = [ "-Zallow-features=" ] - } - - config("libcxx_hardening") { -@@ -1242,8 +1209,8 @@ - } +@@ -1273,8 +1257,8 @@ + # simplicity we always explicitly set the architecture. + if (current_cpu == "x64") { + if (is_clang && !is_android && !is_fuchsia && !is_chromeos_device) { +- cflags += [ "--target=x86_64-unknown-linux-gnu" ] +- ldflags += [ "--target=x86_64-unknown-linux-gnu" ] ++ cflags += [ "--target=x86_64-alpine-linux-musl" ] ++ ldflags += [ "--target=x86_64-alpine-linux-musl" ] + } else { + cflags += [ "-m64" ] + ldflags += [ "-m64" ] +@@ -1282,8 +1266,8 @@ + cflags += [ "-msse3" ] + } else if (current_cpu == "x86") { + if (is_clang && !is_android && !is_chromeos_device) { +- cflags += [ "--target=i386-unknown-linux-gnu" ] +- ldflags += [ "--target=i386-unknown-linux-gnu" ] ++ cflags += [ "--target=i586-alpine-linux-musl" ] ++ ldflags += [ "--target=i586-alpine-linux-musl" ] + } else { + cflags += [ "-m32" ] + ldflags += [ "-m32" ] +@@ -1294,8 +1278,8 @@ + ] } else if (current_cpu == "arm") { - if (is_clang && !is_android && !is_nacl && !is_chromeos_device) { + if (is_clang && !is_android && !is_chromeos_device) { - cflags += [ "--target=arm-linux-gnueabihf" ] - ldflags += [ "--target=arm-linux-gnueabihf" ] + cflags += [ "--target=armv7-alpine-linux-musleabihf" ] + ldflags += [ "--target=armv7-alpine-linux-musleabihf" ] } - if (!is_nacl) { - cflags += [ -@@ -1257,8 +1224,8 @@ + cflags += [ + "-march=$arm_arch", +@@ -1306,8 +1290,8 @@ + } } else if (current_cpu == "arm64") { - if (is_clang && !is_android && !is_nacl && !is_fuchsia && - !is_chromeos_device) { + if (is_clang && !is_android && !is_fuchsia && !is_chromeos_device) { - cflags += [ "--target=aarch64-linux-gnu" ] - ldflags += [ "--target=aarch64-linux-gnu" ] + cflags += [ "--target=aarch64-alpine-linux-musl" ] + ldflags += [ "--target=aarch64-alpine-linux-musl" ] } - } else if (current_cpu == "mipsel" && !is_nacl) { + } else if (current_cpu == "mipsel") { ldflags += [ "-Wl,--hash-style=sysv" ] -@@ -2086,7 +2053,7 @@ +@@ -1551,22 +1535,22 @@ + ldflags += [ "-maix64" ] + } + } else if (is_clang) { +- cflags += [ "--target=powerpc64le-unknown-linux-gnu" ] +- ldflags += [ "--target=powerpc64le-unknown-linux-gnu" ] ++ cflags += [ "--target=powerpc64le-alpine-linux-musl" ] ++ ldflags += [ "--target=powerpc64le-alpine-linux-musl" ] + } else { + cflags += [ "-m64" ] + ldflags += [ "-m64" ] + } + } else if (current_cpu == "riscv64") { + if (is_clang && !is_android) { +- cflags += [ "--target=riscv64-linux-gnu" ] +- ldflags += [ "--target=riscv64-linux-gnu" ] ++ cflags += [ "--target=riscv64-alpine-linux-musl" ] ++ ldflags += [ "--target=riscv64-alpine-linux-musl" ] + } + cflags += [ "-mabi=lp64d" ] + } else if (current_cpu == "loong64") { + if (is_clang) { +- cflags += [ "--target=loongarch64-linux-gnu" ] +- ldflags += [ "--target=loongarch64-linux-gnu" ] ++ cflags += [ "--target=loongarch64-alpine-linux-musl" ] ++ ldflags += [ "--target=loongarch64-alpine-linux-musl" ] + } + cflags += [ + "-mabi=lp64d", +@@ -1574,8 +1558,8 @@ + ] + } else if (current_cpu == "s390x") { + if (is_clang) { +- cflags += [ "--target=s390x-unknown-linux-gnu" ] +- ldflags += [ "--target=s390x-unknown-linux-gnu" ] ++ cflags += [ "--target=s390x-alpine-linux-musl" ] ++ ldflags += [ "--target=s390x-alpine-linux-musl" ] + } + cflags += [ "-m64" ] + ldflags += [ "-m64" ] +@@ -2274,7 +2258,7 @@ defines = [ "_HAS_NODISCARD" ] } } else { @@ -87,51 +118,59 @@ cflags += [ "-Wextra" ] --- ./build/config/rust.gni.orig +++ ./build/config/rust.gni -@@ -198,13 +198,13 @@ +@@ -178,11 +178,11 @@ rust_abi_target = "" if (is_linux || is_chromeos) { if (current_cpu == "arm64") { - rust_abi_target = "aarch64-unknown-linux-gnu" + rust_abi_target = "aarch64-alpine-linux-musl" - cargo_target_abi = "" } else if (current_cpu == "x86") { - rust_abi_target = "i686-unknown-linux-gnu" + rust_abi_target = "i586-alpine-linux-musl" - cargo_target_abi = "" } else if (current_cpu == "x64") { - rust_abi_target = "x86_64-unknown-linux-gnu" + rust_abi_target = "x86_64-alpine-linux-musl" - cargo_target_abi = "" } else if (current_cpu == "arm") { if (arm_float_abi == "hard") { -@@ -214,18 +214,18 @@ - } - if (arm_arch == "armv7-a" || arm_arch == "armv7") { - # No way to inform Rust about the -a suffix. -- rust_abi_target = "armv7-unknown-linux-gnueabi" + float_suffix + float_suffix = "hf" +@@ -200,25 +200,21 @@ + # The thumbv7 vs. armv7 distinction is for legacy reasons and both + # targets in fact target Thumb, see: + # https://github.com/rust-lang/rust/issues/44722 +- if (arm_use_neon) { +- rust_abi_target = "thumbv7neon-unknown-linux-gnueabi" + float_suffix +- } else { +- rust_abi_target = "armv7-unknown-linux-gnueabi" + float_suffix +- } + rust_abi_target = "armv7-alpine-linux-musleabi" + float_suffix - cargo_target_abi = "eabi" + float_suffix } else { - rust_abi_target = "arm-unknown-linux-gnueabi" + float_suffix + rust_abi_target = "armv6-alpine-linux-musleabi" + float_suffix - cargo_target_abi = "eabi" + float_suffix } } else if (current_cpu == "riscv64") { - rust_abi_target = "riscv64gc-unknown-linux-gnu" + rust_abi_target = "riscv64-alpine-linux-musl" - cargo_target_abi = "" + } else if (current_cpu == "ppc64") { +- rust_abi_target = "powerpc64le-unknown-linux-gnu" ++ rust_abi_target = "powerpc64le-alpine-linux-musl" + } else if (current_cpu == "s390x") { +- rust_abi_target = "s390x-unknown-linux-gnu" ++ rust_abi_target = "s390x-alpine-linux-musl" + } else if (current_cpu == "loong64") { +- rust_abi_target = "loongarch64-unknown-linux-gnu" ++ rust_abi_target = "loongarch64-alpine-linux-musl" } else { # Best guess for other future platforms. - rust_abi_target = current_cpu + "-unknown-linux-gnu" + rust_abi_target = current_cpu + "-alpine-linux-musl" - cargo_target_abi = "" } } else if (is_android) { + import("//build/config/android/abi.gni") --- ./build/config/clang/BUILD.gn.orig +++ ./build/config/clang/BUILD.gn -@@ -128,14 +128,15 @@ - } else if (is_apple) { - _dir = "darwin" +@@ -207,22 +207,23 @@ + assert(false) # Unhandled cpu type + } } else if (is_linux || is_chromeos) { + _dir = "linux" if (current_cpu == "x64") { @@ -146,16 +185,18 @@ } else if (current_cpu == "arm64") { - _dir = "aarch64-unknown-linux-gnu" + _suffix = "-aarch64" + } else if (current_cpu == "loong64") { +- _dir = "loongarch64-unknown-linux-gnu" ++ _suffix = "-loongarch64" + } else if (current_cpu == "riscv64") { +- _dir = "riscv64-unknown-linux-gnu" ++ _suffix = "-riscv64" + } else if (current_cpu == "ppc64") { +- _dir = "ppc64le-unknown-linux-gnu" ++ _suffix = "-powerpc64le" + } else if (current_cpu == "s390x") { +- _dir = "s390x-unknown-linux-gnu" ++ _suffix = "-s390x" } else { assert(false) # Unhandled cpu type } ---- ./build/config/gcc/BUILD.gn.orig -+++ ./build/config/gcc/BUILD.gn -@@ -32,7 +32,6 @@ - # See http://gcc.gnu.org/wiki/Visibility - config("symbol_visibility_hidden") { - cflags = [ "-fvisibility=hidden" ] -- rustflags = [ "-Zdefault-visibility=hidden" ] - - # Visibility attribute is not supported on AIX. - if (current_os != "aix") { diff --git a/backports/electron/disable-dns_config_service.patch b/backports/electron/disable-dns_config_service.patch index a72e1c4..731a751 100644 --- a/backports/electron/disable-dns_config_service.patch +++ b/backports/electron/disable-dns_config_service.patch @@ -2,7 +2,7 @@ diff --git a/net/dns/BUILD.gn b/net/dns/BUILD.gn index f36bf68..805d9a6 100644 --- a/net/dns/BUILD.gn +++ b/net/dns/BUILD.gn -@@ -130,8 +130,8 @@ source_set("dns") { +@@ -142,8 +142,8 @@ ] } else if (is_linux) { sources += [ @@ -13,3 +13,11 @@ index f36bf68..805d9a6 100644 ] } else if (is_posix) { sources += [ +@@ -455,7 +455,6 @@ + if (is_android) { + sources += [ "dns_config_service_android_unittest.cc" ] + } else if (is_linux) { +- sources += [ "dns_config_service_linux_unittest.cc" ] + } else if (is_posix) { + sources += [ "dns_config_service_posix_unittest.cc" ] + } diff --git a/backports/electron/disable-failing-tests.patch b/backports/electron/disable-failing-tests.patch index 84d0027..9351ea0 100644 --- a/backports/electron/disable-failing-tests.patch +++ b/backports/electron/disable-failing-tests.patch @@ -2,86 +2,6 @@ safesprintf emitnull: error: conversion from 'std::nullptr_t' to 'const internal::Arg' is ambiguous const internal::Arg arg_array[] = { args... }; -flatmap incompletetype: - error: static assertion failed due to requirement 'std::__is_complete_or_unbounded(std::__type_identity>{})': template argument must be a complete class or an unbounded array - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - -i18n, time: - various icu failures (new icu time formatting? internal api difference?) - a ton of these fail: - - Expected equality of these values: - u"Monday 16 May – Saturday 28 May" - Which is: u"Monday 16 May \x2013 Saturday 28 May" - DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY) - Which is: u"Monday 16\x2009\x2013\x2009Saturday 28 May" - - ../../base/i18n/time_formatting_unittest.cc:84: Failure - Expected equality of these values: - clock12h_pm - Which is: u"3:42 PM" - TimeFormatTimeOfDay(time) - Which is: u"3:42\x202FPM" - - .. and so on - -fileutiltest filetofile: - ../../base/files/file_util_unittest.cc:2692: Failure - Value of: stream - Actual: true - Expected: false - -stacktracetest: crashes (this doesn't seem to use execinfo so probably relies on glibc internal layout for tracing here) - -platformthreadtest canchangethreadtype: - ../../base/threading/platform_thread_unittest.cc:445: Failure - Expected equality of these values: - PlatformThread::CanChangeThreadType(ThreadType::kBackground, ThreadType::kResourceEfficient) - Which is: true - kCanIncreasePriority - Which is: false - -scopedfdownershiptrackingtest crashonunownedclose: fails due to scoped-file-no-close.patch - -stackcontainer customallocator: - ../../base/containers/stack_container_unittest.cc:211: Failure - Expected equality of these values: - 1 - Allocator::deallocated - Which is: 0 - -nativelibrarytest loadlibrarypreferownsymbols: crashes (probably musl dlopen does not play nice here) - -spantest empty: crashes (this looks fishy) - -readelfbuildid: crashes (this looks like glibc dynamic linker semantics) - -nss db unittest: various nss failures: e.g.: - ../../net/cert/nss_cert_database_unittest.cc:209: Failure - Expected equality of these values: - OK - Which is: 0 - cert_db_->ImportFromPKCS12(GetPublicSlot(), pkcs12_data, u"12345", true, nullptr) - Which is: -702 - -processutiltest cloneflags: fails in CI (ulimit? too many threads?) - ../../base/process/process_util_unittest.cc:1434: Failure - Value of: process.IsValid() - Actual: false - Expected: true - -addresstrackerlinuxnetlinktest: - ../../net/base/address_tracker_linux_unittest.cc:886: Failure - Value of: child.process.IsValid() - Actual: false - Expected: true - -ToAddressDoesNotDereference: ; Expected `get_for_extraction_cnt` to be 1 but got 0; - -DataCapturedManyThreads: flaky - -ProcessAlternativeServicesTest.Process*: crashed ? - --- a/base/strings/safe_sprintf_unittest.cc +++ b/base/strings/safe_sprintf_unittest.cc @@ -740,6 +740,7 @@ @@ -100,244 +20,3 @@ ProcessAlternativeServicesTest.Process*: crashed ? TEST(SafeSPrintfTest, PointerSize) { // The internal data representation is a 64bit value, independent of the ---- a/base/containers/flat_map_unittest.cc -+++ b/base/containers/flat_map_unittest.cc -@@ -52,6 +52,7 @@ - - } // namespace - -+#if 0 - TEST(FlatMap, IncompleteType) { - struct A { - using Map = flat_map; -@@ -65,6 +66,7 @@ - - A a; - } -+#endif - - TEST(FlatMap, RangeConstructor) { - flat_map::value_type input_vals[] = { ---- a/base/BUILD.gn -+++ b/base/BUILD.gn -@@ -3194,21 +3194,6 @@ - "hash/md5_constexpr_unittest.cc", - "hash/md5_unittest.cc", - "hash/sha1_unittest.cc", -- "i18n/break_iterator_unittest.cc", -- "i18n/case_conversion_unittest.cc", -- "i18n/char_iterator_unittest.cc", -- "i18n/character_encoding_unittest.cc", -- "i18n/file_util_icu_unittest.cc", -- "i18n/icu_string_conversions_unittest.cc", -- "i18n/icu_util_unittest.cc", -- "i18n/message_formatter_unittest.cc", -- "i18n/number_formatting_unittest.cc", -- "i18n/rtl_unittest.cc", -- "i18n/streaming_utf8_validator_unittest.cc", -- "i18n/string_search_unittest.cc", -- "i18n/time_formatting_unittest.cc", -- "i18n/timezone_unittest.cc", -- "i18n/transliterator_unittest.cc", - "immediate_crash_unittest.cc", - "json/json_parser_unittest.cc", - "json/json_reader_unittest.cc", ---- a/base/files/file_util_unittest.cc -+++ b/base/files/file_util_unittest.cc -@@ -2686,6 +2686,7 @@ - } - } - -+#if 0 - TEST_F(FileUtilTest, FileToFILE) { - File file; - FILE* stream = FileToFILE(std::move(file), "w"); -@@ -2700,6 +2701,7 @@ - EXPECT_FALSE(file.IsValid()); - EXPECT_TRUE(CloseFile(stream)); - } -+#endif - - TEST_F(FileUtilTest, FILEToFile) { - ScopedFILE stream; ---- a/base/threading/platform_thread_unittest.cc -+++ b/base/threading/platform_thread_unittest.cc -@@ -416,6 +416,7 @@ - // platforms for all priorities. This not being the case. This test documents - // and hardcodes what we know. Please inform scheduler-dev@chromium.org if this - // proprerty changes for a given platform. -+#if 0 - TEST(PlatformThreadTest, CanChangeThreadType) { - #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - // On Ubuntu, RLIMIT_NICE and RLIMIT_RTPRIO are 0 by default, so we won't be -@@ -472,6 +473,7 @@ - ThreadType::kBackground)); - #endif - } -+#endif - - TEST(PlatformThreadTest, SetCurrentThreadTypeTest) { - TestPriorityResultingFromThreadType(ThreadType::kBackground, ---- a/base/files/scoped_file_linux_unittest.cc -+++ b/base/files/scoped_file_linux_unittest.cc -@@ -42,11 +42,13 @@ - EXPECT_DEATH(ScopedFD(fd.get()), ""); - } - -+#if 0 - TEST_F(ScopedFDOwnershipTrackingTest, CrashOnUnownedClose) { - ScopedFD fd = OpenFD(); - subtle::EnableFDOwnershipEnforcement(true); - EXPECT_DEATH(close(fd.get()), ""); - } -+#endif - - #endif // defined(GTEST_HAS_DEATH_TEST) - ---- a/base/native_library_unittest.cc -+++ b/base/native_library_unittest.cc -@@ -139,6 +139,7 @@ - // Verifies that the |prefer_own_symbols| option satisfies its guarantee that - // a loaded library will always prefer local symbol resolution before - // considering global symbols. -+#if 0 - TEST(NativeLibraryTest, LoadLibraryPreferOwnSymbols) { - NativeLibraryOptions options; - options.prefer_own_symbols = true; -@@ -171,6 +172,7 @@ - EXPECT_EQ(2, NativeLibraryTestIncrement()); - EXPECT_EQ(3, NativeLibraryTestIncrement()); - } -+#endif - - #endif // !BUILDFLAG(IS_ANDROID) && !defined(THREAD_SANITIZER) && \ - // !defined(MEMORY_SANITIZER) ---- a/base/containers/span_unittest.cc -+++ b/base/containers/span_unittest.cc -@@ -995,6 +995,7 @@ - } - } - -+#if 0 - TEST(SpanTest, Empty) { - { - span span; -@@ -1014,6 +1015,7 @@ - EXPECT_TRUE(span_of_checked_iterators.empty()); - } - } -+#endif - - TEST(SpanTest, OperatorAt) { - static constexpr int kArray[] = {1, 6, 1, 8, 0}; ---- a/base/debug/elf_reader_unittest.cc -+++ b/base/debug/elf_reader_unittest.cc -@@ -194,6 +194,7 @@ - } - } - -+#if 0 - TEST(ElfReaderTestWithCurrentImage, ReadElfBuildId) { - #if BUILDFLAG(IS_ANDROID) - // On Android the library loader memory maps the full so file. -@@ -229,6 +230,7 @@ - UnloadNativeLibrary(library); - #endif - } -+#endif - - } // namespace debug - } // namespace base ---- a/net/BUILD.gn -+++ b/net/BUILD.gn -@@ -4826,7 +4826,6 @@ - sources += [ - "cert/internal/system_trust_store_nss_unittest.cc", - "cert/internal/trust_store_nss_unittest.cc", -- "cert/nss_cert_database_unittest.cc", - "cert/x509_util_nss_unittest.cc", - ] - if (!is_castos) { ---- a/base/process/process_util_unittest.cc -+++ b/base/process/process_util_unittest.cc -@@ -1419,7 +1419,7 @@ - return kSuccess; - } - --#if defined(CLONE_NEWUSER) && defined(CLONE_NEWPID) -+#if 0 && defined(CLONE_NEWUSER) && defined(CLONE_NEWPID) - TEST_F(ProcessUtilTest, CloneFlags) { - if (!PathExists(FilePath("/proc/self/ns/user")) || - !PathExists(FilePath("/proc/self/ns/pid"))) { ---- a/net/base/address_tracker_linux_unittest.cc -+++ b/net/base/address_tracker_linux_unittest.cc -@@ -831,6 +831,7 @@ - // - // This test creates multiple concurrent `AddressTrackerLinux` instances in - // separate processes, each in their own PID namespaces. -+#if 0 - TEST(AddressTrackerLinuxNetlinkTest, TestInitializeTwoTrackersInPidNamespaces) { - // This test initializes `kNumChildren` instances of `AddressTrackerLinux` in - // tracking mode, each in their own child process running in a PID namespace. -@@ -901,6 +902,7 @@ - ASSERT_EQ(exit_code, 0); - } - } -+#endif - - MULTIPROCESS_TEST_MAIN(ChildProcessInitializeTrackerForTesting) { - base::test::TaskEnvironment task_env( ---- a/base/trace_event/trace_event_unittest.cc -+++ b/base/trace_event/trace_event_unittest.cc -@@ -1368,6 +1368,7 @@ - } - - // Test that data sent from multiple threads is gathered -+#if 0 - TEST_F(TraceEventTestFixture, DataCapturedManyThreads) { - BeginTrace(); - -@@ -1408,6 +1409,7 @@ - delete task_complete_events[i]; - } - } -+#endif - - // Test that thread and process names show up in the trace. - // In SDK build, thread names are not tracked inside //base. Instead, there's ---- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc -+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc -@@ -1481,6 +1481,7 @@ - // `base::to_address()` will use the dereference operator. This is not - // what we want; this test enforces extraction semantics for - // `to_address()`. -+#if 0 - TEST_F(RawPtrTest, ToAddressDoesNotDereference) { - CountingRawPtr ptr = nullptr; - int* raw = base::to_address(ptr); -@@ -1492,6 +1493,7 @@ - .get_for_duplication_cnt = 0}), - CountersMatch()); - } -+#endif - - TEST_F(RawPtrTest, ToAddressGivesBackRawAddress) { - int* raw = nullptr; ---- a/net/http/http_stream_factory_unittest.cc -+++ b/net/http/http_stream_factory_unittest.cc -@@ -3477,6 +3477,7 @@ - DefaultCTPolicyEnforcer ct_policy_enforcer_; - }; - -+#if 0 - TEST_F(ProcessAlternativeServicesTest, ProcessEmptyAltSvc) { - session_ = - std::make_unique(session_params_, session_context_); -@@ -3585,6 +3586,7 @@ - alternatives[0].host_port_pair()); - EXPECT_EQ(0u, alternatives[0].advertised_versions().size()); - } -+#endif - - } // namespace - diff --git a/backports/electron/electron_do-not-strip-binaries.patch b/backports/electron/electron_do-not-strip-binaries.patch new file mode 100644 index 0000000..f90ce54 --- /dev/null +++ b/backports/electron/electron_do-not-strip-binaries.patch @@ -0,0 +1,127 @@ +diff --git a/electron/BUILD.gn.orig b/electron/BUILD.gn +index b08f434..4062428 100644 +--- a/electron/BUILD.gn.orig ++++ b/electron/BUILD.gn +@@ -44,7 +44,6 @@ if (is_mac) { + + if (is_linux) { + import("//build/config/linux/pkg_config.gni") +- import("//electron/build/linux/strip_binary.gni") + import("//tools/generate_stubs/rules.gni") + + pkg_config("gio_unix") { +@@ -1424,18 +1423,6 @@ dist_zip("electron_dist_zip") { + ":licenses", + ] + if (is_linux) { +- if (is_official_build) { +- data_deps += [ +- ":strip_chrome_crashpad_handler", +- ":strip_chrome_sandbox", +- ":strip_electron_binary", +- ":strip_libEGL_shlib", +- ":strip_libGLESv2_shlib", +- ":strip_libffmpeg_shlib", +- ":strip_libvk_swiftshader_shlib", +- ] +- } +- + data_deps += [ "//sandbox/linux:chrome_sandbox" ] + } + deps = data_deps +@@ -1481,16 +1468,6 @@ group("electron_mksnapshot") { + + dist_zip("electron_mksnapshot_zip") { + data_deps = mksnapshot_deps +- if (is_linux && is_official_build) { +- data_deps += [ +- ":strip_libEGL_shlib", +- ":strip_libGLESv2_shlib", +- ":strip_libffmpeg_shlib", +- ":strip_libvk_swiftshader_shlib", +- ":strip_mksnapshot_binary", +- ":strip_v8_context_snapshot_generator_binary", +- ] +- } + deps = data_deps + outputs = [ "$root_build_dir/mksnapshot.zip" ] + } +@@ -1637,78 +1614,3 @@ group("release_build") { + ] + } + } +- +-if (is_linux && is_official_build) { +- strip_binary("strip_electron_binary") { +- binary_input = "$root_out_dir/$electron_project_name" +- symbol_output = "$root_out_dir/debug/$electron_project_name.debug" +- compress_debug_sections = true +- deps = [ ":electron_app" ] +- } +- +- strip_binary("strip_chrome_crashpad_handler") { +- binary_input = "$root_out_dir/chrome_crashpad_handler" +- symbol_output = "$root_out_dir/debug/chrome_crashpad_handler.debug" +- compress_debug_sections = true +- deps = [ "//components/crash/core/app:chrome_crashpad_handler" ] +- } +- +- strip_binary("strip_chrome_sandbox") { +- binary_input = "$root_out_dir/chrome_sandbox" +- symbol_output = "$root_out_dir/debug/chrome-sandbox.debug" +- compress_debug_sections = true +- deps = [ "//sandbox/linux:chrome_sandbox" ] +- } +- +- strip_binary("strip_libEGL_shlib") { +- binary_input = "$root_out_dir/libEGL.so" +- symbol_output = "$root_out_dir/debug/libEGL.so.debug" +- compress_debug_sections = true +- deps = [ "//third_party/angle:libEGL" ] +- } +- +- strip_binary("strip_libGLESv2_shlib") { +- binary_input = "$root_out_dir/libGLESv2.so" +- symbol_output = "$root_out_dir/debug/libGLESv2.so.debug" +- compress_debug_sections = true +- deps = [ "//third_party/angle:libGLESv2" ] +- } +- +- strip_binary("strip_libffmpeg_shlib") { +- binary_input = "$root_out_dir/libffmpeg.so" +- symbol_output = "$root_out_dir/debug/libffmpeg.so.debug" +- compress_debug_sections = true +- deps = [ "//third_party/ffmpeg" ] +- } +- +- strip_binary("strip_libvk_swiftshader_shlib") { +- binary_input = "$root_out_dir/libvk_swiftshader.so" +- symbol_output = "$root_out_dir/debug/libvk_swiftshader.so.debug" +- compress_debug_sections = true +- deps = [ "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan" ] +- } +- +- strip_binary("strip_mksnapshot_binary") { +- _binary_path = rebase_path( +- get_label_info( +- ":v8_context_snapshot_generator($v8_snapshot_toolchain)", +- "root_out_dir") + "/mksnapshot", +- root_build_dir) +- binary_input = "$root_out_dir/$_binary_path" +- symbol_output = "$root_out_dir/debug/${_binary_path}.debug" +- compress_debug_sections = true +- deps = mksnapshot_deps +- } +- +- strip_binary("strip_v8_context_snapshot_generator_binary") { +- _binary_path = rebase_path( +- get_label_info( +- ":v8_context_snapshot_generator($v8_snapshot_toolchain)", +- "root_out_dir") + "/v8_context_snapshot_generator", +- root_build_dir) +- binary_input = "$root_out_dir/$_binary_path" +- symbol_output = "$root_out_dir/debug/${_binary_path}.debug" +- compress_debug_sections = true +- deps = mksnapshot_deps +- } +-} diff --git a/backports/electron/electron_shell-file-dialog-drop-glibc.patch b/backports/electron/electron_shell-file-dialog-drop-glibc.patch new file mode 100644 index 0000000..b2a6927 --- /dev/null +++ b/backports/electron/electron_shell-file-dialog-drop-glibc.patch @@ -0,0 +1,16 @@ +diff --git a/./electron/shell/browser/ui/file_dialog.h.orig b/./electron/shell/browser/ui/file_dialog.h +index 6cdfc7b..f7757da 100644 +--- a/./electron/shell/browser/ui/file_dialog.h.orig ++++ b/./electron/shell/browser/ui/file_dialog.h +@@ -13,10 +13,6 @@ + #include "base/files/file_path.h" + #include "base/memory/raw_ptr_exclusion.h" + +-#if BUILDFLAG(IS_LINUX) +-#include +-#endif +- + namespace electron { + class NativeWindow; + } + diff --git a/backports/electron/fc-cache-version.patch b/backports/electron/fc-cache-version.patch index 3b76897..7cbd2a8 100644 --- a/backports/electron/fc-cache-version.patch +++ b/backports/electron/fc-cache-version.patch @@ -1,12 +1,10 @@ -instead of hardcoding the version, use the defined macro. --- ---- a/third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc -+++ b/third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc +--- ./third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc.orig ++++ ./third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc @@ -56,7 +56,7 @@ FcFini(); // Check existence of intended fontconfig cache file. -- auto cache = fontconfig_caches + "/" + kCacheKey + "-le64.cache-9"; +- auto cache = fontconfig_caches + "/" + kCacheKey + "-le64.cache-11"; + auto cache = fontconfig_caches + "/" + kCacheKey + "-le64.cache-" + FC_CACHE_VERSION; bool cache_exists = access(cache.c_str(), F_OK) == 0; return !cache_exists; diff --git a/backports/electron/fix-ffmpeg-codec-list.patch b/backports/electron/fix-ffmpeg-codec-list.patch new file mode 100644 index 0000000..de24f66 --- /dev/null +++ b/backports/electron/fix-ffmpeg-codec-list.patch @@ -0,0 +1,13 @@ +--- a/media/ffmpeg/ffmpeg_common.cc ++++ b/media/ffmpeg/ffmpeg_common.cc +@@ -1046,8 +1046,8 @@ + + // This should match the configured lists in //third_party/ffmpeg. + static constexpr std::string_view kAllowedAudioCodecs = +- "vorbis,libopus,flac,pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le," +- "mp3,pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw" EXTRA_CODECS; ++ "vorbis,opus,libopus,flac,pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le," ++ "mp3float,mp3,pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw" EXTRA_CODECS; + #undef EXTRA_CODECS + + return kAllowedAudioCodecs.data(); diff --git a/backports/electron/fix-opus.patch b/backports/electron/fix-opus.patch deleted file mode 100644 index 836b719..0000000 --- a/backports/electron/fix-opus.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/media/ffmpeg/ffmpeg_common.cc -+++ b/media/ffmpeg/ffmpeg_common.cc -@@ -1025,7 +1025,7 @@ - static const base::NoDestructor kAllowedAudioCodecs([]() { - // This should match the configured lists in //third_party/ffmpeg. - std::string allowed_decoders( -- "vorbis,libopus,flac,pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le," -+ "vorbis,opus,libopus,flac,pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le," - "mp3,pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw"); - #if BUILDFLAG(USE_PROPRIETARY_CODECS) - allowed_decoders += ",aac"; diff --git a/backports/electron/gperf-3.2-fix.patch b/backports/electron/gperf-3.2-fix.patch deleted file mode 100644 index fa462e3..0000000 --- a/backports/electron/gperf-3.2-fix.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff --git a/third_party/blink/renderer/build/scripts/gperf.py.orig b/third_party/blink/renderer/build/scripts/gperf.py -index 42630d3..d909aee 100644 ---- a/third_party/blink/renderer/build/scripts/gperf.py.orig -+++ b/third_party/blink/renderer/build/scripts/gperf.py -@@ -28,24 +28,6 @@ def generate_gperf(gperf_path, gperf_input, gperf_args): - stdout=subprocess.PIPE, - universal_newlines=True) - gperf_output = gperf.communicate(gperf_input)[0] -- # Massage gperf output to be more palatable for modern compilers. -- # TODO(thakis): Upstream these to gperf so we don't need massaging. -- # `register` is deprecated in C++11 and removed in C++17, so remove -- # it from gperf's output. -- # https://savannah.gnu.org/bugs/index.php?53028 -- gperf_output = re.sub(r'\bregister ', '', gperf_output) -- # -Wimplicit-fallthrough needs an explicit fallthrough statement, -- # so replace gperf's /*FALLTHROUGH*/ comment with the statement. -- # https://savannah.gnu.org/bugs/index.php?53029 -- gperf_output = gperf_output.replace('/*FALLTHROUGH*/', -- ' [[fallthrough]];') -- # -Wpointer-to-int-cast warns about casting pointers to smaller ints -- # Replace {(int)(long)&(foo), bar} with -- # {static_cast(reinterpret_cast(&(foo)), bar} -- gperf_output = re.sub( -- r'\(int\)\(long\)(.*?),', -- r'static_cast(reinterpret_cast(\1)),', -- gperf_output) - script = 'third_party/blink/renderer/build/scripts/gperf.py' - return '// Generated by %s\n' % script + gperf_output - except OSError: diff --git a/backports/electron/headless-shell-no-license.patch b/backports/electron/headless-shell-no-license.patch new file mode 100644 index 0000000..6a6027d --- /dev/null +++ b/backports/electron/headless-shell-no-license.patch @@ -0,0 +1,27 @@ +From 6f4685cff1ab8c68de98c0731bb8afaf8a05a723 Mon Sep 17 00:00:00 2001 +From: knuxify +Date: Sat, 5 Apr 2025 14:10:37 +0200 +Subject: [PATCH] Do not generate license file for headless-shell build + +--- + headless/BUILD.gn | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/headless/BUILD.gn b/headless/BUILD.gn +index 798bb22..9d83f49 100644 +--- a/headless/BUILD.gn ++++ b/headless/BUILD.gn +@@ -934,10 +934,6 @@ executable("headless_shell") { + + deps = [ ":headless_shell_lib" ] + +- if (proprietary_codecs) { +- deps += [ ":generate_headless_shell_license_file" ] +- } +- + if (!headless_use_embedded_resources) { + data = [ + "$root_out_dir/headless_lib_data.pak", +-- +2.49.0 + diff --git a/backports/electron/musl-auxv.patch b/backports/electron/musl-auxv.patch deleted file mode 100644 index ce348cc..0000000 --- a/backports/electron/musl-auxv.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./v8/src/base/cpu.cc.orig -+++ ./v8/src/base/cpu.cc -@@ -14,7 +14,7 @@ - #if V8_OS_LINUX - #include // AT_HWCAP - #endif --#if V8_GLIBC_PREREQ(2, 16) || V8_OS_ANDROID -+#if 1 - #include // getauxval() - #endif - #if V8_OS_QNX diff --git a/backports/electron/musl-v8-monotonic-pthread-cont_timedwait.patch b/backports/electron/musl-v8-monotonic-pthread-cont_timedwait.patch deleted file mode 100644 index 3a99ee5..0000000 --- a/backports/electron/musl-v8-monotonic-pthread-cont_timedwait.patch +++ /dev/null @@ -1,23 +0,0 @@ -use monotonic clock for pthread_cond_timedwait with musl too, since it supports -it --- ---- a/v8/src/base/platform/condition-variable.cc -+++ b/v8/src/base/platform/condition-variable.cc -@@ -16,7 +16,7 @@ - - ConditionVariable::ConditionVariable() { - #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ -- (V8_OS_LINUX && V8_LIBC_GLIBC)) -+ V8_OS_LINUX) - // On Free/Net/OpenBSD and Linux with glibc we can change the time - // source for pthread_cond_timedwait() to use the monotonic clock. - pthread_condattr_t attr; -@@ -92,7 +92,7 @@ - &native_handle_, &mutex->native_handle(), &ts); - #else - #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ -- (V8_OS_LINUX && V8_LIBC_GLIBC)) -+ V8_OS_LINUX) - // On Free/Net/OpenBSD and Linux with glibc we can change the time - // source for pthread_cond_timedwait() to use the monotonic clock. - result = clock_gettime(CLOCK_MONOTONIC, &ts); diff --git a/backports/electron/net-test-no-vpython.patch b/backports/electron/net-test-no-vpython.patch new file mode 100644 index 0000000..efb2920 --- /dev/null +++ b/backports/electron/net-test-no-vpython.patch @@ -0,0 +1,22 @@ +From 4b41417068045f11db9e7edead1447e93adb9073 Mon Sep 17 00:00:00 2001 +From: LN Liberda +Date: Sat, 28 Jun 2025 18:13:59 +0200 +Subject: [PATCH] Test net without vendored python + +--- + net/test/python_utils.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/test/python_utils.cc b/net/test/python_utils.cc +index 2cdc07dad9948..0b2d42a5bf126 100644 +--- a/net/test/python_utils.cc ++++ b/net/test/python_utils.cc +@@ -47,7 +47,7 @@ bool GetPython3Command(base::CommandLine* python_cmd) { + #if BUILDFLAG(IS_WIN) + python_cmd->SetProgram(base::FilePath(FILE_PATH_LITERAL("vpython3.bat"))); + #else +- python_cmd->SetProgram(base::FilePath(FILE_PATH_LITERAL("vpython3"))); ++ python_cmd->SetProgram(base::FilePath(FILE_PATH_LITERAL("python3"))); + #endif + + #if BUILDFLAG(IS_MAC) diff --git a/backports/electron/net-test-pyws3-py3.12.patch b/backports/electron/net-test-pyws3-py3.12.patch new file mode 100644 index 0000000..cee3e61 --- /dev/null +++ b/backports/electron/net-test-pyws3-py3.12.patch @@ -0,0 +1,39 @@ +ssl.wrap_socket() was removed in Python 3.12, needed for net_unittests. +Patch-Source: https://github.com/GoogleChromeLabs/pywebsocket3/pull/39 +Modified (changed path) -lnl + +From bc50ae9d451ca705edd6101d987b839e1a09d45e Mon Sep 17 00:00:00 2001 +From: Sven Diederichs <22592421+zaurask@users.noreply.github.com> +Date: Thu, 28 Mar 2024 18:55:28 +0100 +Subject: [PATCH] use ssl.SSLContext.wrap_socket rather than the deprecated + ssl.wrap_socket + +--- + pywebsocket3/websocket_server.py | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/third_party/pywebsocket3/src/mod_pywebsocket/websocket_server.py b/third_party/pywebsocket3/src/mod_pywebsocket/websocket_server.py +index e7485ec..93ad6f1 100644 +--- a/third_party/pywebsocket3/src/mod_pywebsocket/websocket_server.py ++++ b/third_party/pywebsocket3/src/mod_pywebsocket/websocket_server.py +@@ -157,12 +157,14 @@ class WebSocketServer(socketserver.ThreadingMixIn, BaseHTTPServer.HTTPServer): + client_cert_ = ssl.CERT_REQUIRED + else: + client_cert_ = ssl.CERT_NONE +- socket_ = ssl.wrap_socket( +- socket_, +- keyfile=server_options.private_key, +- certfile=server_options.certificate, +- ca_certs=server_options.tls_client_ca, +- cert_reqs=client_cert_) ++ ++ ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS) ++ if server_options.certificate: ++ ssl_context.load_cert_chain(certfile=server_options.certificate, keyfile=server_options.private_key) ++ if server_options.tls_client_ca: ++ ssl_context.load_verify_locations(server_options.tls_client_ca) ++ ssl_context.verify_mode =client_cert_ ++ socket_ = ssl_context.wrap_socket(socket_) + self._sockets.append((socket_, addrinfo)) + + def server_bind(self): diff --git a/backports/electron/partalloc-no-tagging-arm64.patch b/backports/electron/partalloc-no-tagging-arm64.patch index fb33151..422fcf5 100644 --- a/backports/electron/partalloc-no-tagging-arm64.patch +++ b/backports/electron/partalloc-no-tagging-arm64.patch @@ -3,15 +3,16 @@ missing some required interface headers for it, and it's not clear how to make the partalloc support code for it work. --- ./base/allocator/partition_allocator/partition_alloc.gni.orig +++ ./base/allocator/partition_allocator/partition_alloc.gni -@@ -30,7 +30,7 @@ - } +@@ -89,8 +89,7 @@ + # TODO(crbug.com/329199197): Clean this up when experiments are complete. + use_large_empty_slot_span_ring = true - has_memory_tagging = -- current_cpu == "arm64" && is_clang && !is_asan && (is_linux || is_android) -+ false +-has_memory_tagging = current_cpu == "arm64" && is_clang && !is_asan && +- !is_hwasan && (is_linux || is_android) ++has_memory_tagging = false declare_args() { - # Causes all the allocations to be routed via allocator_shim.cc. Usually, + # Debug configuration. --- ./base/allocator/partition_allocator/src/partition_alloc/aarch64_support.h.orig +++ ./base/allocator/partition_allocator/src/partition_alloc/aarch64_support.h @@ -10,7 +10,7 @@ diff --git a/backports/electron/pipewire-1.4.patch b/backports/electron/pipewire-1.4.patch deleted file mode 100644 index ab9c37f..0000000 --- a/backports/electron/pipewire-1.4.patch +++ /dev/null @@ -1,23 +0,0 @@ -Patch-Source: https://webrtc-review.googlesource.com/c/src/+/380500 ---- ---- a/third_party/webrtc/modules/video_capture/linux/pipewire_session.cc -+++ b/third_party/webrtc/modules/video_capture/linux/pipewire_session.cc -@@ -87,7 +87,7 @@ - .param = OnNodeParam, - }; - -- pw_node_add_listener(proxy_, &node_listener_, &node_events, this); -+ pw_node_add_listener(reinterpret_cast(proxy_), &node_listener_, &node_events, this); - } - - // static -@@ -119,7 +119,7 @@ - uint32_t id = info->params[i].id; - if (id == SPA_PARAM_EnumFormat && - info->params[i].flags & SPA_PARAM_INFO_READ) { -- pw_node_enum_params(that->proxy_, 0, id, 0, UINT32_MAX, nullptr); -+ pw_node_enum_params(reinterpret_cast(that->proxy_), 0, id, 0, UINT32_MAX, nullptr); - break; - } - } - diff --git a/backports/electron/yes-musl.patch b/backports/electron/yes-musl.patch deleted file mode 100644 index e860b8e..0000000 --- a/backports/electron/yes-musl.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./buildtools/third_party/libc++/__config_site.orig -+++ ./buildtools/third_party/libc++/__config_site -@@ -18,7 +18,7 @@ - /* #undef _LIBCPP_ABI_FORCE_MICROSOFT */ - /* #undef _LIBCPP_HAS_NO_THREADS */ - /* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */ --/* #undef _LIBCPP_HAS_MUSL_LIBC */ -+#define _LIBCPP_HAS_MUSL_LIBC 1 - /* #undef _LIBCPP_HAS_THREAD_API_PTHREAD */ - /* #undef _LIBCPP_HAS_THREAD_API_EXTERNAL */ - /* #undef _LIBCPP_HAS_THREAD_API_WIN32 */ From 1300d8170939a17ada2ebadc440a4e97bac52367 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:27:55 -0500 Subject: [PATCH 276/313] backports/element-desktop: upgrade to 1.12.3 --- backports/element-desktop/APKBUILD | 19 +++---- ...{tasje-one-hak.patch => tasje-fixes.patch} | 17 +++++- .../element-desktop/tasje-no-fuses.patch | 52 ------------------- 3 files changed, 25 insertions(+), 63 deletions(-) rename backports/element-desktop/{tasje-one-hak.patch => tasje-fixes.patch} (50%) delete mode 100644 backports/element-desktop/tasje-no-fuses.patch diff --git a/backports/element-desktop/APKBUILD b/backports/element-desktop/APKBUILD index de6a4d7..c5d8fd7 100644 --- a/backports/element-desktop/APKBUILD +++ b/backports/element-desktop/APKBUILD @@ -1,13 +1,13 @@ # Contributor: lauren n. liberda maintainer="lauren n. liberda " pkgname=element-desktop -pkgver=1.11.100 +pkgver=1.12.3 pkgrel=1 pkgdesc="Secure and independent communication, connected via Matrix" url="https://element.io/" arch="aarch64 x86_64" # same as electron license="GPL-3.0-only" -_electronver=35 +_electronver=39 depends=" electron~$_electronver font-inconsolata @@ -36,14 +36,15 @@ source=" add-alpine-targets.patch use-system-headers.patch - tasje-one-hak.patch - tasje-no-fuses.patch + tasje-fixes.patch no-source-maps.patch.web use-system-fonts.patch.web element-desktop " options="net !check" # broken +# Avoid conflicting providers +sonameprefix="$pkgname:" # secfixes: # 1.11.30-r0: @@ -94,6 +95,7 @@ prepare() { msg "Fetch element-desktop dependencies" yarn install --frozen-lockfile --ignore-scripts + patch -p1 -i patches/@types+auto-launch+5.0.5.patch } build() { @@ -148,7 +150,7 @@ package() { cp -r $resources/app.asar.unpacked "$pkgdir"/usr/lib/element-desktop/app.asar.unpacked - install -Dm644 $resources/img/element.png "$pkgdir"/usr/lib/element-desktop/img/element.png + install -Dm644 $resources/build/icon.png "$pkgdir"/usr/lib/element-desktop/build/icon.png install -Dm755 "$srcdir"/$pkgname "$pkgdir"/usr/bin/$pkgname @@ -159,12 +161,11 @@ package() { } sha512sums=" -a8ac5180df3b204fb1947ecaa4786c9c5fdd53ffe705f4dfe97a0b051fa371fd9102c41a898e8783cf25f732674da2d987ef315f2facc7b18b20ef214ea0f81d element-desktop-1.11.100.tar.gz -e3e50fd867f9b7388eb22778ccb97d6504a480ab4e2aa9eba10fd0f4d0324a1525c2afe6c80181567d8e554f03086a9e0994a6221cfcb0ca29700754c8f31cac element-web-1.11.100.tar.gz +f302907165a35f4a4f069f5aec6bc28edeba3d09c75f483c818e3930ceb4e838e5bb91ad9d42019a11a661d6e656da3c1ff25507cbb281c69183aac7d499e882 element-desktop-1.12.3.tar.gz +b845ff71ca39d7ae4dca9bb55e821bfdf911b12de5d012ba55d598f3287046fb2b525bce608925a9fa8fa7d39a4ceed9b4213d5d1c1d0c9e6b9b72154c9a35a5 element-web-1.12.3.tar.gz 4747893ed3e43d3074e9afe1cdd668a6be0de073d439205fe8c38c5e0f4091cc76e3cd15d98818bea5139add29501d8d07e83c58e9da230a4ce5bb538d388f80 add-alpine-targets.patch 755b17f7b828eb6920c06a6950ad4e14c32c99d22e9c05fcef7a081b5d2034adb03db3958aa5209c99fb7201f4d888c2383fc9864c5e743dd33f8b5c4925acd7 use-system-headers.patch -92e69817fdc71f60c5c7dcbd3c7b13428cc18141cf5f27720326390f6817bec85fb1c60f8016b3a8fa275f601b16f646cda12b5e379a349368eef2f801b4de7a tasje-one-hak.patch -a1399662bdbe5e7256d31f7bdc05070e7009d70113699856b025a1d5ab1d9b8bf1020072a08255d4eddab0874044131dec296f98a91ba5c12ca61948b1d18dbe tasje-no-fuses.patch +a5d90dd1ec7aec0dc18b73eb3a6fd51ac1223e381c492d24e7dc0fd2ade955ac727cebbaff6ffa27c7e18d9acf712c709de3f886ee2ddf87ab3b028d3eb461c6 tasje-fixes.patch ec635fde026f7fce8e8cc57960b5b9dcec4418416d4867ed47711422d48f068bb58a3c9ceb7715efc9c177beca3788da6b0babc9b689ea8c0724a0395f2b85f8 no-source-maps.patch.web aaf46476bac403aa5204aa265fcf0654fad4c149fd74d0ec4273c051a5549943384cae3cdd62c5b78fdedfed55c11ecceb898b886e44165cbe7e30953a095cf9 use-system-fonts.patch.web afc588311dc3b566a754e3e7fe6b37b99a06d47b8bbce0ed9acca8ef308fdab0bd1d41b406199e5cbdd86bdce695ff847cd8668857a235cbdc292ad8b899c063 element-desktop diff --git a/backports/element-desktop/tasje-one-hak.patch b/backports/element-desktop/tasje-fixes.patch similarity index 50% rename from backports/element-desktop/tasje-one-hak.patch rename to backports/element-desktop/tasje-fixes.patch index a855eee..0e026c5 100644 --- a/backports/element-desktop/tasje-one-hak.patch +++ b/backports/element-desktop/tasje-fixes.patch @@ -5,9 +5,22 @@ thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: FileAlreadyWritten("/node_modules/keytar/package.json")', src/main.rs:200:18 ``` +console.log interferes with tasje, which reads config from node stdout + --- ./electron-builder.ts.orig +++ ./electron-builder.ts -@@ -74,10 +74,6 @@ +@@ -72,10 +72,6 @@ + console.warn(`No VARIANT_PATH specified, using default variant configuration '${DEFAULT_VARIANT}':`); + } + +-for (const key in variant) { +- console.log(`${key}: ${variant[key]}`); +-} +- + interface Configuration extends BaseConfiguration { + extraMetadata: Partial> & ExtraMetadata; + linux: BaseConfiguration["linux"]; +@@ -112,10 +108,6 @@ }, files: [ "package.json", @@ -17,4 +30,4 @@ FileAlreadyWritten("/node_modules/keytar/package.json")', src/main.rs:200:18 - }, "lib/**", ], - extraResources: [ + extraResources: ["build/icon.*", "webapp.asar"], diff --git a/backports/element-desktop/tasje-no-fuses.patch b/backports/element-desktop/tasje-no-fuses.patch deleted file mode 100644 index 72c515f..0000000 --- a/backports/element-desktop/tasje-no-fuses.patch +++ /dev/null @@ -1,52 +0,0 @@ -we can't do fuses because we ship one binary in the electron package. -and we can't import them here, since they are in devDependencies, which are uninstalled at this stage. - ---- ./electron-builder.ts.orig -+++ ./electron-builder.ts -@@ -2,8 +2,7 @@ - import * as fs from "node:fs"; - import * as path from "node:path"; - import * as plist from "plist"; --import { AfterPackContext, Arch, Configuration as BaseConfiguration, Platform } from "electron-builder"; --import { computeData } from "app-builder-lib/out/asar/integrity"; -+import { Configuration as BaseConfiguration } from "electron-builder"; - import { readFile, writeFile } from "node:fs/promises"; - - /** -@@ -46,26 +45,6 @@ - } & BaseConfiguration["deb"]; - } - --async function injectAsarIntegrity(context: AfterPackContext) { -- const packager = context.packager; -- -- // We only need to re-generate asar on universal Mac builds, due to https://github.com/electron/universal/issues/116 -- if (packager.platform !== Platform.MAC || context.arch !== Arch.universal) return; -- -- const resourcesPath = packager.getResourcesDir(context.appOutDir); -- const asarIntegrity = await computeData({ -- resourcesPath, -- resourcesRelativePath: "Resources", -- resourcesDestinationPath: resourcesPath, -- extraResourceMatchers: [], -- }); -- -- const plistPath = path.join(resourcesPath, "..", "Info.plist"); -- const data = plist.parse(await readFile(plistPath, "utf8")) as unknown as Writable; -- data["ElectronAsarIntegrity"] = asarIntegrity as unknown as Writable; -- await writeFile(plistPath, plist.build(data)); --} -- - /** - * @type {import('electron-builder').Configuration} - * @see https://www.electron.build/configuration/configuration -@@ -89,9 +68,6 @@ - - loadBrowserProcessSpecificV8Snapshot: false, - enableEmbeddedAsarIntegrityValidation: true, -- }, -- afterPack: async (context: AfterPackContext) => { -- await injectAsarIntegrity(context); - }, - files: [ - "package.json", From 061cc8069cdf53b135dd243b333541831c3b5670 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:28:10 -0500 Subject: [PATCH 277/313] backports/freetube: upgrade to 0.23.12 --- backports/freetube/APKBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backports/freetube/APKBUILD b/backports/freetube/APKBUILD index 19bacf0..3ab6bf8 100644 --- a/backports/freetube/APKBUILD +++ b/backports/freetube/APKBUILD @@ -1,7 +1,7 @@ -# Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) +# Maintainer: Antoine Martin (ayakael) pkgname=freetube -pkgver=0.23.5 +pkgver=0.23.12 pkgrel=1 pkgdesc="An open source desktop YouTube player built with privacy in mind." arch="x86_64 aarch64" # blocked by electron @@ -50,7 +50,7 @@ package() { } sha512sums=" -5811ac53788a12f94cbd4cec6f7075350c223865cb4cf4436f131b9d1197b89aa5da128d6c531d1e56a0302aa3d2523c7ba8d48edbf5f328be6fed3fbba02752 freetube-0.23.5.tar.gz +e19c7e8de0c6c5bbddcd3da73cd1907cae7157e8f44f550c4a34965b3b4f3c1a180c111a8c497d74a556d6d8e74e9fdd1ed6e064d4fc899f80712a1f187395ae freetube-0.23.12.tar.gz 2ce2effc794bb663789cefe968b5899122127983dbfa1b240aa33a2be383720b18204e6d01b4a550df72956f02b6636b79c93a58f470a970b09b770f5b8f2fc4 freetube.sh d27cb896b65a7e8d52ffe86e5f74eed72b6cf976b28e1a13012d34c7eceba5ff6f20298017738dfa93c0336ffa52b8ee4da7e06b02747062898db7e678819526 tasje-dotdash.patch " From e5734af93ea4a046c256bdfae9f7b71b6b822ab0 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:28:33 -0500 Subject: [PATCH 278/313] backports/py3-apsw: upgrade to 3.50.4.0 --- backports/py3-apsw/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backports/py3-apsw/APKBUILD b/backports/py3-apsw/APKBUILD index 8f034f7..62e95a7 100644 --- a/backports/py3-apsw/APKBUILD +++ b/backports/py3-apsw/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Francesco Colista pkgname=py3-apsw _pkgname=apsw -pkgver=3.49.1.0 +pkgver=3.50.4.0 pkgrel=0 pkgdesc="Another Python SQLite Wrapper" url="https://github.com/rogerbinns/apsw" @@ -41,6 +41,6 @@ package() { } sha512sums=" -faae9cceb462428345fd2815a970dfc80574848f87bade7cceb09aed17127d020fd16402b3d36afe0fbc6bf707a408feea0ce038486c2a68a2ab1077a9b68d0a py3-apsw-3.49.1.0.zip +71db63b0a7f550c9a5d3f112d47c24953472cc6555f0b57198428997d5cf5acf73629f2da8d5d53a2473067ba19d4b655cce467a5e2267e5bd6e8cf0d9883579 py3-apsw-3.50.4.0.zip 8f3957bd6fecb5660a7cab367043e4ccdacd87d8963bbe41cc3d525265de28f08aa207099658d785be29c5c90b818c1418f766995cd780d02b8e36252a389758 detect-sqlite-config.patch " From fe3b86d53a29916c5876b905c3fe85865d827434 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:28:52 -0500 Subject: [PATCH 279/313] backports/signal-desktop: upgrade to 7.76.0 --- backports/signal-desktop/APKBUILD | 70 +-- backports/signal-desktop/ringrtc-use-sh.patch | 14 + backports/signal-desktop/signal-desktop.sh | 2 +- .../signal-disable-updates.patch | 6 +- .../signal-do-not-package-desktop-entry.patch | 16 + .../signal-rollback-locale-changes.patch | 4 +- .../signal-desktop/webrtc-compiler.patch | 18 +- ...ion-that-change-meaning-inside-class.patch | 58 +++ backports/signal-desktop/webrtc-gcc13.patch | 31 -- .../signal-desktop/webrtc-pipewire-1.4.patch | 23 - .../webrtc-rollback-3rdparty-build-gn.patch | 31 -- .../signal-desktop/webrtc-rollback-red.patch | 136 ------ ...pe-do-not-include-linux-prctl-header.patch | 12 + .../signal-desktop/webrtc-shared-libs.patch | 22 +- ...loadtypesuggester-for-pt-assignement.patch | 459 ++++++++++++++++++ 15 files changed, 630 insertions(+), 272 deletions(-) create mode 100644 backports/signal-desktop/ringrtc-use-sh.patch create mode 100644 backports/signal-desktop/signal-do-not-package-desktop-entry.patch create mode 100644 backports/signal-desktop/webrtc-fix-declaration-that-change-meaning-inside-class.patch delete mode 100644 backports/signal-desktop/webrtc-gcc13.patch delete mode 100644 backports/signal-desktop/webrtc-pipewire-1.4.patch delete mode 100644 backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch delete mode 100644 backports/signal-desktop/webrtc-rollback-red.patch create mode 100644 backports/signal-desktop/webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch create mode 100644 backports/signal-desktop/webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch diff --git a/backports/signal-desktop/APKBUILD b/backports/signal-desktop/APKBUILD index f1cd958..ede5795 100644 --- a/backports/signal-desktop/APKBUILD +++ b/backports/signal-desktop/APKBUILD @@ -2,14 +2,14 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=signal-desktop -pkgver=7.55.0 -pkgrel=0 +pkgver=7.76.0 +pkgrel=1 pkgdesc="A messaging app for simple private communication with friends" url="https://github.com/signalapp/Signal-Desktop/" # same as electron arch="aarch64 x86_64" license="AGPL-3.0-only" -_llvmver=20 +_llvmver=21 depends=" electron font-barlow @@ -29,7 +29,6 @@ makedepends=" cmake crc32c-dev dav1d-dev - double-conversion-dev electron-dev electron-tasje ffmpeg-dev @@ -37,7 +36,6 @@ makedepends=" glib-dev gn jsoncpp-dev - libavif-dev libjpeg-turbo-dev libepoxy-dev libsecret-dev @@ -67,10 +65,10 @@ makedepends=" options="net !check" # use _check_depends to validate this -_libsignalver=0.71.1 -_ringrtcver=2.51.0 -_webrtcver=6998b -_sqlcipherver=2.0.1 +_libsignalver=0.83.0 +_ringrtcver=2.59.0 +_webrtcver=7339c +_sqlcipherver=2.4.4 source=" https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz @@ -86,13 +84,14 @@ source=" signal-show-window-please.patch signal-rollback-locale-changes.patch signal-do-not-package-sqlcipher-deps.patch + signal-do-not-package-desktop-entry.patch ringrtc-webrtc-renamed.patch + ringrtc-use-sh.patch webrtc-shared-libs.patch webrtc-compiler.patch - webrtc-gcc13.patch - webrtc-rollback-red.patch - webrtc-rollback-3rdparty-build-gn.patch - webrtc-pipewire-1.4.patch + webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch + webrtc-fix-declaration-that-change-meaning-inside-class.patch + webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch signal-desktop.sh " @@ -112,6 +111,10 @@ export CFLAGS="${CFLAGS/-g/} -O2 -Wno-error -Wno-deprecated-builtins -Wno-unknow export CXXFLAGS="${CXXFLAGS/-g/} -O2 -Wno-error -Wno-deprecated-builtins -Wno-unknown-warning-option -Wno-builtin-macro-redefined -Wno-deprecated-declarations" export CPPFLAGS="$CPPFLAGS -D__DATE__= -D__TIME__= -D__TIMESTAMP__=" +# stdatomic from compiler-rt uses implicit function declaration +export CFLAGS="$CFLAGS -Wno-implicit-function-declaration" +export CXXFLAGS="$CXXFLAGS -Wno-implicit-function-declaration" + export CARGO_PROFILE_RELEASE_OPT_LEVEL=2 export CARGO_PROFILE_RELEASE_STRIP="symbols" #export RUSTFLAGS="$RUSTFLAGS -C linker=clang" @@ -136,7 +139,7 @@ _update_depends() { -e "s|^_ringrtcver=.*|_ringrtcver=$_ringrtcver|" \ -e "s|^_webrtcver=.*|_webrtcver=$_webrtcver|" \ -e "s|^_sqlcipherver=.*|_sqlcipherver=$_sqlcipherver|" \ - APKBUILD + $APKBUILD } # webrtc only, the other dependencies are fine with tarballs @@ -213,7 +216,6 @@ prepare() { brotli crc32c dav1d - double-conversion ffmpeg flatbuffers fontconfig @@ -223,7 +225,6 @@ prepare() { icu jsoncpp libaom - libavif libdrm libjpeg libpng @@ -304,7 +305,7 @@ prepare() { cd "$builddir"/libsignal/node # fix target - sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' binding.gyp + sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' build_node_bridge.py msg "Installing libsignal js dependencies" yarn --ignore-scripts --frozen-lockfile @@ -329,6 +330,9 @@ build() { rtc_include_ilbc=false rtc_libvpx_build_vp9=true rtc_use_x11=false + rustc_version=\"yes\" + rust_bindgen_root=\"/usr\" + rust_sysroot_absolute=\"/usr\" build_with_mozilla=false chrome_pgo_phase=0 @@ -381,8 +385,7 @@ build() { cd "$builddir"/libsignal/node msg "Building libsignal" - node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source - node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source + npm_config_nodedir=/usr/include/electron/node_headers python3 build_node_bridge.py mkdir -p prebuilds/linux-$chromium_arch mv build/Release/libsignal_client_linux_$chromium_arch.node prebuilds/linux-$chromium_arch/node.napi.node @@ -478,24 +481,25 @@ package() { } sha512sums=" -59e1aae568735976e79ee38d55c87b137f7075063985e72deb42b53af6facd7ed2a8c0912fd86cb88df3182d17c1b58af11bf1501135e6855cfd5ee70270905e Signal-Desktop-7.55.0.tar.gz -3d1b5b84d42b4f6da46a2f626ec72931d3d7432c10c0d43e562851933f6cf0a434630eb5f8bb9a586d27d6ad5a5d8a6c96873dc468e53bbf6297c35a8da090d8 libsignal-0.71.1.tar.gz -8e32d75f9f8216106b6858d9ab58ad53f209408fc155fe27dec184c8c65c9ab5a3a93e9567953f209424ed435ccc6d4903a49a4edae36eb744a897cc02098312 ringrtc-2.51.0.tar.gz -592987c1661de464a4e6dee3081cb5fd32e5afdacdba43d901557a217e62301b4655009ad5bdc0c1dcff5e8b67d7acd68ac953cd638f31196162aa3ccdd9c63b node-sqlcipher-2.0.1.tar.gz -ba02cb0c293210f9a683b0e08c6acbe84f5b78089329ec017b0db3493b38ccf39e92c49c2475dc66b5ce3bfe060686718cb5053787e2d61ed320dadb22891989 webrtc-6998b.tar.zst +c847d3679df77ca137b4c3345b3b941a08639677efcd5eeea6613572fa90b8ad1b8d1d53e077902d4f47c05c480c408787024906d6917dcbf4a840838bf6d79d Signal-Desktop-7.76.0.tar.gz +43271a64f65a4cf0e7855fb84476ff811ef248665cb74fdaa9ce12b02d2039abdf8fca28554e7e884eabaa9bdd77e8f5383e6354e589436671675ddab7194d81 libsignal-0.83.0.tar.gz +ba4a1850bd096470a6370a0bf730550f64df4a2349cacca3b4864ef1a3a04713dd200307b9ad7ba47425322573148d6bd2ce85c11c2a49232d41e739ef5e788d ringrtc-2.59.0.tar.gz +79dd21548329b4ee409fa73b013c18ed4e85038aeef7a4cfe196fd6b5113279da8ad287a259fa6a6b546b52a5a6dd6ae2cb1050007043d25f76d7917dbbbc02d node-sqlcipher-2.4.4.tar.gz +06ffb4cdb82f818cc419d42ff2de03977d7e94c5f3eb8ac8a401bcb52ec38fa988c5d757f4bd79e5d9968fa83754fc9046180c950961c90a59eeb6130bf5552f webrtc-7339c.tar.zst 8d2d2d82c8546c2dd1fef161b61df79918f8c22235a56a46adb375a0beb4acef12c5fe53e67242a4be97f77adc522ff79b47949c352956c742a70d50f4179f7f libsignal-auditable.patch 7ee747c8aaa9d6e9149fe0a031e3d4cc9e9c08f22c42076bd05e2acb86952f8170032613d13a53716010edfa3f26ad97b530e82460318eb46a42e28cf5faeb9d signal-use-system-sqlcipher.patch -fc2af28645364cd85c106304a26811b036f6be048c52137fbbcc112870a84132a181f532563e0569b560fde3cf8c02480666a9b01d804b0008f97c728005b1c7 signal-disable-updates.patch +ef3622da416a5bd2d4bea4f2a4fbb21a985f660d4acc17bbe66ce51ac1180ab92c0c843a5414ff56ea1deda87c2b0f611a299ca8ebe4d6a24df53626b36ceea8 signal-disable-updates.patch 853de84d636f730694f17bcec63463fa7bfbdd0a7f7a64618a8fc6bc523ce1a9854b4c651753735af735c18101295d3efbe54f83ae0bccbed83c8c1fee3e7049 signal-update-links.patch 882d6889b23a3ebc6449c8b6acec8c3853674a7e94f066d65b57bab674ba8c11d582ba2c760825cb67b9202716e6d8b7123001d1e9f9229e49a0b77e9d978265 signal-show-window-please.patch -aca92e4de6cd005d660d7e8b99607de96ca2d7dc220e3465247d517e915e4d41a4b0eb519e85c5eca1c81cd8bac9821acd03ff57f1603918987829c6ea7757b4 signal-rollback-locale-changes.patch +3dd3bf2f6925e2672a20ef56bbac519099d54e912e5a434a0649ea152db5039dbe1bbade3430b485ae9a6085d747dd88602d4efc5198d5a4dbf1b8359de11f94 signal-rollback-locale-changes.patch 961568777b86f8fbcc73360252123686c9d1e16b2650f23d8afbc6d7580d53024f81b62e9e9cbdcd0031b5cf99854bd47c6dd4580197f2b27b8b4cbb51c6c9c9 signal-do-not-package-sqlcipher-deps.patch +d8cafd4ae1f7438417f5c414d68a175c3d24b66a14b9f3b8ca9c9acae2b2eaa68985ee81c1df7d754a206ff1c9b02929803440fb0734db38b6ac9ab3e34205b0 signal-do-not-package-desktop-entry.patch 02a648bb8541a39c75fec2db39f024a27976afca41908eefa2fe1f2e30b05b5d59f980ccc930021c0b0c09ba8b0cbcae071e9f0dd530543c667adbc4272af552 ringrtc-webrtc-renamed.patch -98a7e4df27c3ed56c5968ebc3ae8e08bfb54362d0c910f9af1d414079a6d5fe0f18aa570ae3c38042f4691af6a130cb3ff689625e26a3987720dd319a5f587b1 webrtc-shared-libs.patch -897174fa3b1eaa74a3b2d7d861863a9f60550ddb0d7be700cd590600efdc3bd962f52c21e371276eaf8d5657c98fe8ade9853b0197b61a68d5dce6fa03b5899b webrtc-compiler.patch -3f1095861a79862ab5a55c86d7e353d272974617afba39e4d4441024bede8d7b9b8e122da90d56a9c3c0965171803d6b9e29e91d78167a08c6bcc86b3eedab18 webrtc-gcc13.patch -8f53dcf3264c5cec338f037e57a7770ec939ee06dfb0c5dfeab23967a3a64d3f861a6b5419766ac892676036b4522bce2f47279ca3658b5c0b6a31c82ac05053 webrtc-rollback-red.patch -f8bd574a0de077a643ced26e8a0e3f162e014bbf91c957bbefd113883a70e2b63e483bf400b7e2da8d09edfe76d4f6a257f194a14124f344f1625c5632d12acb webrtc-rollback-3rdparty-build-gn.patch -7fa0344a144d5b8f05d0962799b8ce1dbe8f2d403a311d4fbf802a2d032e6586a1268387052b529e809c4740a79d6737a63d7e37ea8902ce926b74309dd44fc3 webrtc-pipewire-1.4.patch -87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5 signal-desktop.sh +19d2e07bdc0b160ec542fcb0a3d94ae1e37dcb1b3455e57b278cf074f8aac625341b47f4f06a1f7eb5a197cb0f11754de8785ffd10876852972cbfafdc2615db ringrtc-use-sh.patch +a9374040dcbc9203c8a3b4ad1cf97d58805cd4755f4f585a988b113697ea97d5900ad68f6a30aa0621f34ab54ae98984a8ce228a2d08186ee1bf3384abf3f364 webrtc-shared-libs.patch +8ba740f0552872ddf383545a6bb99bf7bcdd2610cee51c6e69dc667893006facd5d72f62274e25c1a58e1a58c8e8b0b5303b648e4c74a71925639cc9691c72c4 webrtc-compiler.patch +d44f62e4ccf2d9094d6ed217b24fa2cde276c7f64f4d6fd26e84dfc021ea667abcb21f9e4666cfd0d88d6ee0a6b1a20b6cc68c8720462711e3b5451e263f6c4a webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch +ace87a2be03c6965012a87a10918c5923b10d5e74a7169c1e1384c15b34a367d0c47e806764c368cc30dad01a3dce54b50587abea9831130178db3806619abc8 webrtc-fix-declaration-that-change-meaning-inside-class.patch +d17ecd89e867b24a21144d267e1bf7d09e3898018a0f9fcd87084b9de8091bc56f904a1cabdc487a8e46ab509c11ddd363c574d75d85a79e3c4d9424a13b2093 webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch +8e1de53ec1608fa05972af605213e8423b8f88cfd8d6a1989bdcaf77ed1420871c39efa15c56ffeccb6ff86677acc5bc436020f3554bee4f94930c7d9f4e16b6 signal-desktop.sh " diff --git a/backports/signal-desktop/ringrtc-use-sh.patch b/backports/signal-desktop/ringrtc-use-sh.patch new file mode 100644 index 0000000..53ec09c --- /dev/null +++ b/backports/signal-desktop/ringrtc-use-sh.patch @@ -0,0 +1,14 @@ +diff --git a/ringrtc/src/node/package.json.orig b/ringrtc/src/node/package.json +index 366caf2927f..eedeca3895e 100644 +--- a/ringrtc/src/node/package.json.orig ++++ b/ringrtc/src/node/package.json +@@ -16,7 +16,7 @@ + "virtual_audio": "dist/bin/virtual_audio.sh" + }, + "scripts": { +- "build": "tsc && bash scripts/build-help.sh", ++ "build": "tsc && sh scripts/build-help.sh", + "clean": "rimraf dist", + "test": "electron-mocha --renderer --recursive dist/test --timeout 10000 --require source-map-support/register", + "eslint": "eslint .", + diff --git a/backports/signal-desktop/signal-desktop.sh b/backports/signal-desktop/signal-desktop.sh index 370469c..3904d51 100755 --- a/backports/signal-desktop/signal-desktop.sh +++ b/backports/signal-desktop/signal-desktop.sh @@ -3,4 +3,4 @@ # app chooses config (including used endpoints) based on this export NODE_ENV=production -exec electron /usr/lib/signal-desktop/app.asar +exec electron /usr/lib/signal-desktop/app.asar "$@" diff --git a/backports/signal-desktop/signal-disable-updates.patch b/backports/signal-desktop/signal-disable-updates.patch index f5496f4..3d8fc38 100644 --- a/backports/signal-desktop/signal-disable-updates.patch +++ b/backports/signal-desktop/signal-disable-updates.patch @@ -1,9 +1,11 @@ ---- a/Signal-Desktop/config/production.json +diff --git a/Signal-Desktop/config/production.json.orig b/Signal-Desktop/config/production.json +index ee1fc6523d8..6fcb97f3a36 100644 +--- a/Signal-Desktop/config/production.json.orig +++ b/Signal-Desktop/config/production.json @@ -16,5 +16,5 @@ - "serverTrustRoot": "BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF", "genericServerPublicParams": "AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN", "backupServerPublicParams": "AJwNSU55fsFCbgaxGRD11wO1juAs8Yr5GF8FPlGzzvdJJIKH5/4CC7ZJSOe3yL2vturVaRU2Cx0n751Vt8wkj1bozK3CBV1UokxV09GWf+hdVImLGjXGYLLhnI1J2TWEe7iWHyb553EEnRb5oxr9n3lUbNAJuRmFM7hrr0Al0F0wrDD4S8lo2mGaXe0MJCOM166F8oYRQqpFeEHfiLnxA1O8ZLh7vMdv4g9jI5phpRBTsJ5IjiJrWeP0zdIGHEssUeprDZ9OUJ14m0v61eYJMKsf59Bn+mAT2a7YfB+Don9O", + "stripePublishableKey": "pk_live_6cmGZopuTsV8novGgJJW9JpC00vLIgtQ1D", - "updatesEnabled": true + "updatesEnabled": false } diff --git a/backports/signal-desktop/signal-do-not-package-desktop-entry.patch b/backports/signal-desktop/signal-do-not-package-desktop-entry.patch new file mode 100644 index 0000000..7a973a1 --- /dev/null +++ b/backports/signal-desktop/signal-do-not-package-desktop-entry.patch @@ -0,0 +1,16 @@ +diff --git a/Signal-Desktop/package.json.orig b/Signal-Desktop/package.json +index 832035e..e6ac14c 100644 +--- a/Signal-Desktop/package.json.orig ++++ b/Signal-Desktop/package.json +@@ -519,11 +519,6 @@ + }, + "linux": { + "category": "Network;InstantMessaging;Chat", +- "desktop": { +- "entry": { +- "StartupWMClass": "signal" +- } +- }, + "target": [ + "deb" + ], diff --git a/backports/signal-desktop/signal-rollback-locale-changes.patch b/backports/signal-desktop/signal-rollback-locale-changes.patch index fce29a2..97e2cf9 100644 --- a/backports/signal-desktop/signal-rollback-locale-changes.patch +++ b/backports/signal-desktop/signal-rollback-locale-changes.patch @@ -42,7 +42,7 @@ index a63eef4079d..2a959da4d0d 100644 -import { app } from 'electron'; +import { join } from 'path'; +import { readFileSync } from 'fs'; - import { merge } from 'lodash'; + import lodash from 'lodash'; import * as LocaleMatcher from '@formatjs/intl-localematcher'; import { z } from 'zod'; @@ -16,9 +15,6 @@ import type { LocalizerType } from '../ts/types/Util'; @@ -129,7 +129,7 @@ index 7187d287acc..9a17d638f44 100644 import { readdir, mkdir, readFile, writeFile } from 'node:fs/promises'; import { join, dirname } from 'node:path'; -import pMap from 'p-map'; --import { isLocaleMessageType } from '../util/setupI18nMain'; +-import { isLocaleMessageType } from '../util/setupI18nMain.js'; - -async function compact({ - sourceDir, diff --git a/backports/signal-desktop/webrtc-compiler.patch b/backports/signal-desktop/webrtc-compiler.patch index d27f61f..a3fb742 100644 --- a/backports/signal-desktop/webrtc-compiler.patch +++ b/backports/signal-desktop/webrtc-compiler.patch @@ -29,27 +29,27 @@ index 88109264ea9..192a3f3119e 100644 } if (!optimize_for_size) { -@@ -1241,8 +1241,8 @@ config("compiler_cpu_abi") { - } +@@ -1303,8 +1303,8 @@ config("compiler_cpu_abi") { + ] } else if (current_cpu == "arm") { - if (is_clang && !is_android && !is_nacl && !is_chromeos_device) { + if (is_clang && !is_android && !is_chromeos_device) { - cflags += [ "--target=arm-linux-gnueabihf" ] - ldflags += [ "--target=arm-linux-gnueabihf" ] + cflags += [ "--target=arm-alpine-linux-gnueabihf" ] + ldflags += [ "--target=arm-alpine-linux-gnueabihf" ] } - if (!is_nacl) { - cflags += [ -@@ -1256,8 +1256,8 @@ config("compiler_cpu_abi") { + cflags += [ + "-march=$arm_arch", +@@ -1315,8 +1315,8 @@ config("compiler_cpu_abi") { + } } else if (current_cpu == "arm64") { - if (is_clang && !is_android && !is_nacl && !is_fuchsia && - !is_chromeos_device) { + if (is_clang && !is_android && !is_fuchsia && !is_chromeos_device) { - cflags += [ "--target=aarch64-linux-gnu" ] - ldflags += [ "--target=aarch64-linux-gnu" ] + cflags += [ "--target=aarch64-alpine-linux-gnu" ] + ldflags += [ "--target=aarch64-alpine-linux-gnu" ] } - } else if (current_cpu == "mipsel" && !is_nacl) { + } else if (current_cpu == "mipsel") { ldflags += [ "-Wl,--hash-style=sysv" ] @@ -1267,8 +1267,8 @@ config("compiler_cpu_abi") { cflags += [ "--target=mipsel-linux-android" ] diff --git a/backports/signal-desktop/webrtc-fix-declaration-that-change-meaning-inside-class.patch b/backports/signal-desktop/webrtc-fix-declaration-that-change-meaning-inside-class.patch new file mode 100644 index 0000000..565f8d2 --- /dev/null +++ b/backports/signal-desktop/webrtc-fix-declaration-that-change-meaning-inside-class.patch @@ -0,0 +1,58 @@ +diff --git a/webrtc/p2p/base/port_interface.h b/webrtc/p2p/base/port_interface.h +index 2335fc2..1484a14 100644 +--- a/webrtc/p2p/base/port_interface.h ++++ b/webrtc/p2p/base/port_interface.h +@@ -55,7 +55,7 @@ + virtual ~PortInterface(); + + virtual IceCandidateType Type() const = 0; +- virtual const Network* Network() const = 0; ++ virtual const ::webrtc::Network* Network() const = 0; + + // Methods to set/get ICE role and tiebreaker values. + virtual void SetIceRole(IceRole role) = 0; +diff --git a/webrtc/pc/codec_vendor.h b/webrtc/pc/codec_vendor.h +index aaddc4f..719a082 100644 +--- a/webrtc/pc/codec_vendor.h ++++ b/webrtc/pc/codec_vendor.h +@@ -119,7 +119,7 @@ + class CodecLookupHelper { + public: + virtual ~CodecLookupHelper() = default; +- virtual PayloadTypeSuggester* PayloadTypeSuggester() = 0; ++ virtual ::webrtc::PayloadTypeSuggester* PayloadTypeSuggester() = 0; + // Look up the codec vendor to use, depending on context. + // This call may get additional arguments in the future, to aid + // in selection of the correct context. +diff --git a/webrtc/pc/jsep_transport.h b/webrtc/pc/jsep_transport.h +index 017aad7..50dc991 100644 +--- a/webrtc/pc/jsep_transport.h ++++ b/webrtc/pc/jsep_transport.h +@@ -115,14 +115,12 @@ + } + + RTCError SetLocalJsepTransportDescription( +- const JsepTransportDescription& jsep_description, +- SdpType type); ++ const JsepTransportDescription& jsep_description, SdpType type); + + // Set the remote TransportDescription to be used by DTLS and ICE channels + // that are part of this Transport. + RTCError SetRemoteJsepTransportDescription( +- const JsepTransportDescription& jsep_description, +- SdpType type); ++ const JsepTransportDescription& jsep_description, SdpType type); + RTCError AddRemoteCandidates(const Candidates& candidates); + + // Set the "needs-ice-restart" flag as described in JSEP. After the flag is +@@ -204,7 +202,9 @@ + return rtp_dtls_transport_; + } + +- scoped_refptr SctpTransport() const { return sctp_transport_; } ++ scoped_refptr<::webrtc::SctpTransport> SctpTransport() const { ++ return sctp_transport_; ++ } + + // TODO(bugs.webrtc.org/9719): Delete method, update callers to use + // SctpTransport() instead. diff --git a/backports/signal-desktop/webrtc-gcc13.patch b/backports/signal-desktop/webrtc-gcc13.patch deleted file mode 100644 index 2144a30..0000000 --- a/backports/signal-desktop/webrtc-gcc13.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ./webrtc/rtc_base/system/file_wrapper.h.orig -+++ ./webrtc/rtc_base/system/file_wrapper.h -@@ -13,6 +13,7 @@ - - #include - #include -+#include - - #include - ---- ./webrtc/modules/audio_coding/neteq/reorder_optimizer.cc.orig -+++ ./webrtc/modules/audio_coding/neteq/reorder_optimizer.cc -@@ -11,6 +11,7 @@ - #include "modules/audio_coding/neteq/reorder_optimizer.h" - - #include -+#include - #include - #include - ---- ./webrtc/rtc_base/ssl_stream_adapter.h.orig -+++ ./webrtc/rtc_base/ssl_stream_adapter.h -@@ -24,6 +24,7 @@ - #include "rtc_base/ssl_certificate.h" - #include "rtc_base/ssl_identity.h" - #include "rtc_base/stream.h" -+#include - - namespace rtc { - - diff --git a/backports/signal-desktop/webrtc-pipewire-1.4.patch b/backports/signal-desktop/webrtc-pipewire-1.4.patch deleted file mode 100644 index 2c39a9e..0000000 --- a/backports/signal-desktop/webrtc-pipewire-1.4.patch +++ /dev/null @@ -1,23 +0,0 @@ -Patch-Source: https://webrtc-review.googlesource.com/c/src/+/380500 ---- ---- a/webrtc/modules/video_capture/linux/pipewire_session.cc -+++ b/webrtc/modules/video_capture/linux/pipewire_session.cc -@@ -87,7 +87,7 @@ - .param = OnNodeParam, - }; - -- pw_node_add_listener(proxy_, &node_listener_, &node_events, this); -+ pw_node_add_listener(reinterpret_cast(proxy_), &node_listener_, &node_events, this); - } - - // static -@@ -119,7 +119,7 @@ - uint32_t id = info->params[i].id; - if (id == SPA_PARAM_EnumFormat && - info->params[i].flags & SPA_PARAM_INFO_READ) { -- pw_node_enum_params(that->proxy_, 0, id, 0, UINT32_MAX, nullptr); -+ pw_node_enum_params(reinterpret_cast(that->proxy_), 0, id, 0, UINT32_MAX, nullptr); - break; - } - } - diff --git a/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch b/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch deleted file mode 100644 index 6352e27..0000000 --- a/backports/signal-desktop/webrtc-rollback-3rdparty-build-gn.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/webrtc/third_party/BUILD.gn b/webrtc/third_party/BUILD.gn -index 256fd092e2e..4ce797ebad7 100644 ---- a/webrtc/third_party/BUILD.gn -+++ b/webrtc/third_party/BUILD.gn -@@ -55,12 +55,10 @@ group("jpeg_includes") { - component("freetype_harfbuzz") { - public_configs = [] - public_deps = [] -- if (enable_freetype) { -- if (use_system_freetype) { -- public_configs += [ "//build/linux:freetype_from_pkgconfig" ] -- } else { -- public_deps += [ "//third_party/freetype:freetype_source" ] -- } -+ if (use_system_freetype) { -+ public_configs += [ "//build/linux:freetype_from_pkgconfig" ] -+ } else { -+ public_deps += [ "//third_party/freetype:freetype_source" ] - } - if (use_system_harfbuzz) { - public_configs += [ "//third_party/harfbuzz-ng:harfbuzz_from_pkgconfig" ] -@@ -71,8 +69,5 @@ component("freetype_harfbuzz") { - - buildflag_header("freetype_buildflags") { - header = "freetype_buildflags.h" -- flags = [ -- "USE_SYSTEM_FREETYPE=$use_system_freetype", -- "ENABLE_FREETYPE=$enable_freetype", -- ] -+ flags = [ "USE_SYSTEM_FREETYPE=$use_system_freetype" ] - } diff --git a/backports/signal-desktop/webrtc-rollback-red.patch b/backports/signal-desktop/webrtc-rollback-red.patch deleted file mode 100644 index c11eb07..0000000 --- a/backports/signal-desktop/webrtc-rollback-red.patch +++ /dev/null @@ -1,136 +0,0 @@ -diff --git a/webrtc/ringrtc/rffi/src/sdp_observer.cc b/webrtc/ringrtc/rffi/src/sdp_observer.cc -index d60f3d5e7ba..d561dedd1d0 100644 ---- a/webrtc/ringrtc/rffi/src/sdp_observer.cc -+++ b/webrtc/ringrtc/rffi/src/sdp_observer.cc -@@ -6,7 +6,7 @@ - #include "rffi/api/sdp_observer_intf.h" - #include "rffi/src/ptr.h" - #include "rffi/src/sdp_observer.h" --#include "third_party/re2/src/re2/re2.h" -+#include - - namespace webrtc { - namespace rffi { -@@ -29,8 +29,8 @@ void CreateSessionDescriptionObserverRffi::OnSuccess(SessionDescriptionInterface - // TODO tweak the response a little - std::string sdp; - if (session_description->ToString(&sdp)) { -- static LazyRE2 ssrc_re = {".+urn:ietf:params:rtp-hdrext:ssrc-audio-level.*\r?\n"}; -- RE2::Replace(&sdp, *ssrc_re, ""); -+ sdp = std::regex_replace(sdp, std::regex("(a=fmtp:111 ((?!cbr=).)*)\r?\n"), "$1;cbr=1\r\n"); -+ sdp = std::regex_replace(sdp, std::regex(".+urn:ietf:params:rtp-hdrext:ssrc-audio-level.*\r?\n"), ""); - - std::unique_ptr session_description2 = CreateSessionDescription(session_description->GetType(), sdp); - delete session_description; -diff --git a/webrtc/ringrtc/rffi/BUILD.gn b/webrtc/ringrtc/rffi/BUILD.gn -index 4564e734e63..341535b0fc7 100644 ---- a/webrtc/ringrtc/rffi/BUILD.gn -+++ b/webrtc/ringrtc/rffi/BUILD.gn -@@ -58,7 +58,6 @@ if (is_android) { - "${android_sdk}:libjingle_peerconnection_jni", - "${android_sdk}:libjingle_peerconnection_metrics_default_jni", - "//pc:libjingle_peerconnection", -- "//third_party/re2", - ] - output_extension = "so" - } -@@ -78,7 +77,6 @@ if (is_ios) { - - deps = [ - "//third_party/libyuv", -- "//third_party/re2", - ] - } - } -@@ -94,7 +92,6 @@ if (is_linux || is_mac || is_win) { - deps = [ - "//sdk:media_constraints", - "//media:rtc_simulcast_encoder_adapter", -- "//third_party/re2", - ] - } - } -diff --git a/webrtc/ringrtc/rffi/api/peer_connection_intf.h b/webrtc/ringrtc/rffi/api/peer_connection_intf.h -index 66958254fed..4cd223beb93 100644 ---- a/webrtc/ringrtc/rffi/api/peer_connection_intf.h -+++ b/webrtc/ringrtc/rffi/api/peer_connection_intf.h -@@ -105,6 +105,7 @@ RUSTEXPORT webrtc::SessionDescriptionInterface* - Rust_sessionDescriptionFromV4(bool offer, - const RffiConnectionParametersV4* v4_borrowed, - bool enable_tcc_audio, -+ bool enable_red_audio, - bool enable_vp9); - - RUSTEXPORT void -diff --git a/webrtc/ringrtc/rffi/src/peer_connection.cc b/webrtc/ringrtc/rffi/src/peer_connection.cc -index 9db5ed8219d..0714b3589e3 100644 ---- a/webrtc/ringrtc/rffi/src/peer_connection.cc -+++ b/webrtc/ringrtc/rffi/src/peer_connection.cc -@@ -42,6 +42,7 @@ int VIDEO_LAYERS_ALLOCATION_EXT_ID = 14; - // 101 used by connection.rs - int DATA_PT = 101; - int OPUS_PT = 102; -+int OPUS_RED_PT = 105; - int VP8_PT = 108; - int VP8_RTX_PT = 118; - int VP9_PT = 109; -@@ -317,12 +318,14 @@ RUSTEXPORT webrtc::SessionDescriptionInterface* - Rust_sessionDescriptionFromV4(bool offer, - const RffiConnectionParametersV4* v4_borrowed, - bool enable_tcc_audio, -+ bool enable_red_audio, - bool enable_vp9) { - // Major changes from the default WebRTC behavior: - // 1. We remove all codecs except Opus, VP8, and VP9 - // 2. We remove all header extensions except for transport-cc, video orientation, - // and abs send time. - // 3. Opus CBR and DTX is enabled. -+ // 4. RED is enabled for audio. - - // For some reason, WebRTC insists that the video SSRCs for one side don't - // overlap with SSRCs from the other side. To avoid potential problems, we'll give the -@@ -361,6 +364,15 @@ Rust_sessionDescriptionFromV4(bool offer, - auto video = std::make_unique(); - set_rtp_params(video.get()); - -+ // Turn on the RED "meta codec" for Opus redundancy. -+ auto opus_red = cricket::CreateAudioCodec(OPUS_RED_PT, cricket::kRedCodecName, 48000, 2); -+ opus_red.SetParam("", std::to_string(OPUS_PT) + "/" + std::to_string(OPUS_PT)); -+ -+ if (enable_red_audio) { -+ // Add RED before Opus to use it by default when sending. -+ audio->AddCodec(opus_red); -+ } -+ - auto opus = cricket::CreateAudioCodec(OPUS_PT, cricket::kOpusCodecName, 48000, 2); - // These are the current defaults for WebRTC - // We set them explicitly to avoid having the defaults change on us. -@@ -378,6 +390,11 @@ Rust_sessionDescriptionFromV4(bool offer, - opus.AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); - audio->AddCodec(opus); - -+ if (!enable_red_audio) { -+ // Add RED after Opus so that RED packets can at least be decoded properly if received. -+ audio->AddCodec(opus_red); -+ } -+ - auto add_video_feedback_params = [] (cricket::Codec* video_codec) { - video_codec->AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); - video_codec->AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)); -@@ -589,9 +606,16 @@ CreateSessionDescriptionForGroupCall(bool local, - opus.SetParam("cbr", "1"); - opus.AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)); - -+ // Turn on the RED "meta codec" for Opus redundancy. -+ auto opus_red = cricket::CreateAudioCodec(OPUS_RED_PT, cricket::kRedCodecName, 48000, 2); -+ opus_red.SetParam("", std::to_string(OPUS_PT) + "/" + std::to_string(OPUS_PT)); -+ -+ // Add RED after Opus so that RED packets can at least be decoded properly if received. - local_audio->AddCodec(opus); -+ local_audio->AddCodec(opus_red); - for (auto& remote_audio : remote_audios) { - remote_audio->AddCodec(opus); -+ remote_audio->AddCodec(opus_red); - } - - auto add_video_feedback_params = [] (cricket::Codec* video_codec) { diff --git a/backports/signal-desktop/webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch b/backports/signal-desktop/webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch new file mode 100644 index 0000000..c2279a0 --- /dev/null +++ b/backports/signal-desktop/webrtc-rtcbase-platform-thread-type-do-not-include-linux-prctl-header.patch @@ -0,0 +1,12 @@ +diff --git a/webrtc/rtc_base/platform_thread_types.cc.orig b/webrtc/rtc_base/platform_thread_types.cc +index 20bf4af..482b15f 100644 +--- a/webrtc/rtc_base/platform_thread_types.cc.orig ++++ b/webrtc/rtc_base/platform_thread_types.cc +@@ -12,7 +12,6 @@ + + // IWYU pragma: begin_keep + #if defined(WEBRTC_LINUX) +-#include + #include + #include + diff --git a/backports/signal-desktop/webrtc-shared-libs.patch b/backports/signal-desktop/webrtc-shared-libs.patch index f4bf714..04b55c0 100644 --- a/backports/signal-desktop/webrtc-shared-libs.patch +++ b/backports/signal-desktop/webrtc-shared-libs.patch @@ -18,10 +18,10 @@ # Only the root target and the test should depend on this. visibility = [ "//:default", -@@ -472,7 +472,6 @@ - ] +@@ -530,7 +530,6 @@ if (!build_with_chromium) { sources = [] + - complete_static_lib = true suppressed_configs += [ "//build/config/compiler:thin_archive" ] defines = [] @@ -42,12 +42,12 @@ diff --git a/webrtc/third_party/googletest/BUILD.gn.orig b/webrtc/third_party/go index b7dc621..367f929 100644 --- a/webrtc/third_party/googletest/BUILD.gn.orig +++ b/webrtc/third_party/googletest/BUILD.gn -@@ -133,7 +133,6 @@ source_set("gtest") { +@@ -129,7 +128,6 @@ source_set("gtest") { # googletest only needs `absl`, but this makes gn check happier. deps = [ "//third_party/abseil-cpp:absl_full" ] - public_deps = [ "//third_party/re2" ] - if (is_nacl || !build_with_chromium) { + if (!build_with_chromium) { defines += [ "GTEST_DISABLE_PRINT_STACK_TRACE" ] sources -= [ diff --git a/webrtc/third_party/fuzztest/BUILD.gn.orig b/webrtc/third_party/fuzztest/BUILD.gn @@ -62,3 +62,17 @@ index 57ee790..ba1d297 100644 # For protobuf mutators "$protobuf_target_prefix:protobuf_lite", +diff --git a/webrtc/third_party/BUILD.gn b/webrtc/third_party/BUILD.gn +index 256fd092e2e..4ce797ebad7 100644 +--- a/webrtc/third_party/BUILD.gn ++++ b/webrtc/third_party/BUILD.gn +@@ -71,8 +69,5 @@ component("freetype_harfbuzz") { + + buildflag_header("freetype_buildflags") { + header = "freetype_buildflags.h" +- flags = [ +- "USE_SYSTEM_FREETYPE=$use_system_freetype", +- "ENABLE_FREETYPE=$enable_freetype", +- ] ++ flags = [ "USE_SYSTEM_FREETYPE=$use_system_freetype" ] + } diff --git a/backports/signal-desktop/webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch b/backports/signal-desktop/webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch new file mode 100644 index 0000000..1504f81 --- /dev/null +++ b/backports/signal-desktop/webrtc-use-only-payloadtypesuggester-for-pt-assignement.patch @@ -0,0 +1,459 @@ +diff --git a/webrtc/pc/codec_vendor.cc b/webrtc/pc/codec_vendor.cc +index 42d52f6..e45516c 100644 +--- a/webrtc/pc/codec_vendor.cc ++++ b/webrtc/pc/codec_vendor.cc +@@ -39,7 +39,6 @@ + #include "pc/rtp_media_utils.h" + #include "pc/session_description.h" + #include "pc/typed_codec_vendor.h" +-#include "pc/used_ids.h" + #include "rtc_base/checks.h" + #include "rtc_base/logging.h" + #include "rtc_base/string_encode.h" +@@ -54,11 +53,6 @@ + + namespace { + +-using webrtc::PayloadTypeSuggester; +-using webrtc::RTCError; +-using webrtc::RTCErrorOr; +-using webrtc::RtpTransceiverDirection; +- + bool IsRtxCodec(const RtpCodecCapability& capability) { + return absl::EqualsIgnoreCase(capability.name, kRtxCodecName); + } +@@ -75,8 +69,7 @@ + std::optional FindMatchingCodec(const CodecList& codecs1, + const CodecList& codecs2, + const Codec& codec_to_match) { +- return webrtc::FindMatchingCodec(codecs1.codecs(), codecs2.codecs(), +- codec_to_match); ++ return FindMatchingCodec(codecs1.codecs(), codecs2.codecs(), codec_to_match); + } + + void StripCNCodecs(CodecList& audio_codecs) { +@@ -105,7 +98,7 @@ + } + + int associated_pt; +- if (!webrtc::FromString(associated_pt_str, &associated_pt)) { ++ if (!FromString(associated_pt_str, &associated_pt)) { + RTC_LOG(LS_WARNING) << "Couldn't convert payload type " << associated_pt_str + << " of RTX codec " << rtx_codec.id + << " to an integer."; +@@ -136,14 +129,14 @@ + return nullptr; + } + +- std::vector redundant_payloads = webrtc::split(fmtp, '/'); ++ std::vector redundant_payloads = split(fmtp, '/'); + if (redundant_payloads.size() < 2) { + return nullptr; + } + + absl::string_view associated_pt_str = redundant_payloads[0]; + int associated_pt; +- if (!webrtc::FromString(associated_pt_str, &associated_pt)) { ++ if (!FromString(associated_pt_str, &associated_pt)) { + RTC_LOG(LS_WARNING) << "Couldn't convert first payload type " + << associated_pt_str << " of RED codec " << red_codec.id + << " to an integer."; +@@ -182,7 +175,21 @@ + return suggestion.MoveError(); + } + codec.id = suggestion.value(); +- offered_codecs.push_back(codec); ++ // The rewrite of the parameter may have turned the codec into ++ // one that is already present. ++ bool skip = false; ++ for (const Codec& present_codec : offered_codecs) { ++ if (present_codec.id == codec.id) { ++ RTC_DCHECK(MatchesWithReferenceAttributes(present_codec, codec)) ++ << "Codec mismatch: present " << present_codec << ", new " ++ << codec; ++ skip = true; ++ break; ++ } ++ } ++ if (!skip) { ++ offered_codecs.push_back(codec); ++ } + } + } + +@@ -232,7 +239,7 @@ + } + std::string red_param = absl::StrCat(matching_codec->id); + red_codec.params[kCodecParamNotInNameValueFormat] = +- webrtc::StrJoin(std::vector{red_param, red_param}, "/"); ++ StrJoin(std::vector{red_param, red_param}, "/"); + } + RTCErrorOr suggestion = + pt_suggester.SuggestPayloadType(mid, red_codec); +@@ -240,84 +247,25 @@ + return suggestion.MoveError(); + } + red_codec.id = suggestion.value(); +- offered_codecs.push_back(red_codec); ++ // The rewrite of the parameter may have turned the RED codec into ++ // one that is already present. ++ bool skip = false; ++ for (const Codec& present_codec : offered_codecs) { ++ if (present_codec.id == red_codec.id) { ++ RTC_DCHECK(MatchesWithReferenceAttributes(present_codec, red_codec)); ++ skip = true; ++ break; ++ } ++ } ++ if (!skip) { ++ offered_codecs.push_back(red_codec); ++ } + } + } + offered_codecs.CheckConsistency(); + return RTCError::OK(); + } + +-// Adds all codecs from `reference_codecs` to `offered_codecs` that don't +-// already exist in `offered_codecs` and ensure the payload types don't +-// collide. +-// OLD VERSION - uses UsedPayloadTypes +-void MergeCodecs(const CodecList& reference_codecs, +- CodecList& offered_codecs, +- UsedPayloadTypes* used_pltypes) { +- // Add all new codecs that are not RTX/RED codecs. +- // The two-pass splitting of the loops means preferring payload types +- // of actual codecs with respect to collisions. +- for (const Codec& reference_codec : reference_codecs) { +- if (reference_codec.GetResiliencyType() != Codec::ResiliencyType::kRtx && +- reference_codec.GetResiliencyType() != Codec::ResiliencyType::kRed && +- !FindMatchingCodec(reference_codecs, offered_codecs, reference_codec)) { +- Codec codec = reference_codec; +- used_pltypes->FindAndSetIdUsed(&codec); +- offered_codecs.push_back(codec); +- } +- } +- +- // Add all new RTX or RED codecs. +- for (const Codec& reference_codec : reference_codecs) { +- if (reference_codec.GetResiliencyType() == Codec::ResiliencyType::kRtx && +- !FindMatchingCodec(reference_codecs, offered_codecs, reference_codec)) { +- Codec rtx_codec = reference_codec; +- const Codec* associated_codec = +- GetAssociatedCodecForRtx(reference_codecs, rtx_codec); +- if (!associated_codec) { +- continue; +- } +- // Find a codec in the offered list that matches the reference codec. +- // Its payload type may be different than the reference codec. +- std::optional matching_codec = FindMatchingCodec( +- reference_codecs, offered_codecs, *associated_codec); +- if (!matching_codec) { +- RTC_LOG(LS_WARNING) +- << "Couldn't find matching " << associated_codec->name << " codec."; +- continue; +- } +- +- rtx_codec.params[kCodecParamAssociatedPayloadType] = +- absl::StrCat(matching_codec->id); +- used_pltypes->FindAndSetIdUsed(&rtx_codec); +- offered_codecs.push_back(rtx_codec); +- } else if (reference_codec.GetResiliencyType() == +- Codec::ResiliencyType::kRed && +- !FindMatchingCodec(reference_codecs, offered_codecs, +- reference_codec)) { +- Codec red_codec = reference_codec; +- const Codec* associated_codec = +- GetAssociatedCodecForRed(reference_codecs, red_codec); +- if (associated_codec) { +- std::optional matching_codec = FindMatchingCodec( +- reference_codecs, offered_codecs, *associated_codec); +- if (!matching_codec) { +- RTC_LOG(LS_WARNING) << "Couldn't find matching " +- << associated_codec->name << " codec."; +- continue; +- } +- +- red_codec.params[kCodecParamNotInNameValueFormat] = +- absl::StrCat(matching_codec->id) + "/" + +- absl::StrCat(matching_codec->id); +- } +- used_pltypes->FindAndSetIdUsed(&red_codec); +- offered_codecs.push_back(red_codec); +- } +- } +- offered_codecs.CheckConsistency(); +-} +- + // `codecs` is a full list of codecs with correct payload type mappings, which + // don't conflict with mappings of the other media type; `supported_codecs` is + // a list filtered for the media section`s direction but with default payload +@@ -382,7 +330,7 @@ + codec.params.find(kCodecParamNotInNameValueFormat); + if (fmtp != codec.params.end()) { + std::vector redundant_payloads = +- webrtc::split(fmtp->second, '/'); ++ split(fmtp->second, '/'); + if (!redundant_payloads.empty() && + redundant_payloads[0] == id) { + if (!red_was_added) { +@@ -443,7 +391,7 @@ + for (const Codec& supported_codec : supported_codecs) { + if (absl::EqualsIgnoreCase(supported_codec.name, kH265CodecName)) { + std::optional supported_ptl = +- webrtc::ParseSdpForH265ProfileTierLevel(supported_codec.params); ++ ParseSdpForH265ProfileTierLevel(supported_codec.params); + if (supported_ptl.has_value()) { + supported_h265_profiles[supported_ptl->profile] = + supported_ptl->level; +@@ -458,14 +406,14 @@ + for (auto& filtered_codec : filtered_codecs) { + if (absl::EqualsIgnoreCase(filtered_codec.name, kH265CodecName)) { + std::optional filtered_ptl = +- webrtc::ParseSdpForH265ProfileTierLevel(filtered_codec.params); ++ ParseSdpForH265ProfileTierLevel(filtered_codec.params); + if (filtered_ptl.has_value()) { + auto it = supported_h265_profiles.find(filtered_ptl->profile); + + if (it != supported_h265_profiles.end() && + filtered_ptl->level != it->second) { + filtered_codec.params[kH265FmtpLevelId] = +- webrtc::H265LevelToString(it->second); ++ H265LevelToString(it->second); + } + } + } +@@ -506,13 +454,13 @@ + } + } + if (absl::EqualsIgnoreCase(ours.name, kH264CodecName)) { +- webrtc::H264GenerateProfileLevelIdForAnswer(ours.params, theirs->params, +- &negotiated.params); ++ H264GenerateProfileLevelIdForAnswer(ours.params, theirs->params, ++ &negotiated.params); + } + #ifdef RTC_ENABLE_H265 + if (absl::EqualsIgnoreCase(ours.name, kH265CodecName)) { +- webrtc::H265GenerateProfileTierLevelForAnswer( +- ours.params, theirs->params, &negotiated.params); ++ H265GenerateProfileTierLevelForAnswer(ours.params, theirs->params, ++ &negotiated.params); + NegotiateTxMode(ours, *theirs, &negotiated); + } + #endif +@@ -534,7 +482,7 @@ + continue; + } + int apt_value; +- if (!webrtc::FromString(apt_str, &apt_value)) { ++ if (!FromString(apt_str, &apt_value)) { + RTC_LOG(LS_WARNING) << "Unconvertable apt value"; + continue; + } +@@ -634,9 +582,11 @@ + } + // Add our codecs that are not in the current description. + if (media_description_options.type == MediaType::AUDIO) { +- MergeCodecs(all_audio_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(audio_recv_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(audio_send_codecs(), mid, codecs, pt_suggester); + } else { +- MergeCodecs(all_video_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(video_recv_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(video_send_codecs(), mid, codecs, pt_suggester); + } + CodecList filtered_codecs; + CodecList supported_codecs = +@@ -667,20 +617,11 @@ + const MediaContentDescription* mcd = + current_content->media_description(); + for (const Codec& codec : mcd->codecs()) { +- if (webrtc::FindMatchingCodec(mcd->codecs(), codecs.codecs(), +- codec)) { ++ if (FindMatchingCodec(mcd->codecs(), codecs.codecs(), codec)) { + filtered_codecs.push_back(codec); + } + } + } +- // Note what PTs are already in use. +- UsedPayloadTypes +- used_pltypes; // Used to avoid pt collisions in filtered_codecs +- for (auto& codec : filtered_codecs) { +- // Note: This may change PTs. Doing so woud indicate an error, but +- // UsedPayloadTypes doesn't offer a means to make the distinction. +- used_pltypes.FindAndSetIdUsed(&codec); +- } + // Add other supported codecs. + for (const Codec& codec : supported_codecs) { + std::optional found_codec = +@@ -707,8 +648,11 @@ + changed_referenced_codec->id); + } + } +- // Quick fix for b/395077842: Remap the codec if it collides. +- used_pltypes.FindAndSetIdUsed(&(*found_codec)); ++ auto pt_or_error = pt_suggester.SuggestPayloadType(mid, *found_codec); ++ if (!pt_or_error.ok()) { ++ return pt_or_error.MoveError(); ++ } ++ found_codec->id = pt_or_error.value(); + filtered_codecs.push_back(*found_codec); + } + } +@@ -763,9 +707,11 @@ + } + // Add all our supported codecs + if (media_description_options.type == MediaType::AUDIO) { +- MergeCodecs(all_audio_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(audio_recv_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(audio_send_codecs(), mid, codecs, pt_suggester); + } else { +- MergeCodecs(all_video_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(video_recv_codecs(), mid, codecs, pt_suggester); ++ MergeCodecs(video_send_codecs(), mid, codecs, pt_suggester); + } + CodecList filtered_codecs; + CodecList negotiated_codecs; +@@ -794,8 +740,8 @@ + const MediaContentDescription* mcd = + current_content->media_description(); + for (const Codec& codec : mcd->codecs()) { +- if (std::optional found_codec = webrtc::FindMatchingCodec( +- mcd->codecs(), codecs.codecs(), codec)) { ++ if (std::optional found_codec = ++ FindMatchingCodec(mcd->codecs(), codecs.codecs(), codec)) { + filtered_codecs.push_back(*found_codec); + } + } +@@ -913,8 +859,7 @@ + case RtpTransceiverDirection::kSendRecv: + case RtpTransceiverDirection::kStopped: + case RtpTransceiverDirection::kInactive: +- return GetVideoCodecsForOffer( +- webrtc::RtpTransceiverDirectionReversed(offer)); ++ return GetVideoCodecsForOffer(RtpTransceiverDirectionReversed(offer)); + case RtpTransceiverDirection::kSendOnly: + return video_send_codecs_.codecs(); + case RtpTransceiverDirection::kRecvOnly: +@@ -948,8 +893,7 @@ + case RtpTransceiverDirection::kSendRecv: + case RtpTransceiverDirection::kStopped: + case RtpTransceiverDirection::kInactive: +- return GetAudioCodecsForOffer( +- webrtc::RtpTransceiverDirectionReversed(offer)); ++ return GetAudioCodecsForOffer(RtpTransceiverDirectionReversed(offer)); + case RtpTransceiverDirection::kSendOnly: + return audio_send_codecs_.codecs(); + case RtpTransceiverDirection::kRecvOnly: +@@ -958,43 +902,6 @@ + RTC_CHECK_NOTREACHED(); + } + +-CodecList CodecVendor::all_video_codecs() const { +- CodecList all_codecs; +- UsedPayloadTypes used_payload_types; +- for (const Codec& codec : video_recv_codecs_.codecs()) { +- Codec codec_mutable = codec; +- used_payload_types.FindAndSetIdUsed(&codec_mutable); +- all_codecs.push_back(codec_mutable); +- } +- +- // Use MergeCodecs to merge the second half of our list as it already checks +- // and fixes problems with duplicate payload types. +- MergeCodecs(video_send_codecs_.codecs(), all_codecs, &used_payload_types); +- +- return all_codecs; +-} +- +-CodecList CodecVendor::all_audio_codecs() const { +- // Compute the audio codecs union. +- CodecList codecs; +- for (const Codec& send : audio_send_codecs_.codecs()) { +- codecs.push_back(send); +- if (!FindMatchingCodec(audio_send_codecs_.codecs(), +- audio_recv_codecs_.codecs(), send)) { +- // It doesn't make sense to have an RTX codec we support sending but not +- // receiving. +- RTC_DCHECK(send.GetResiliencyType() != Codec::ResiliencyType::kRtx); +- } +- } +- for (const Codec& recv : audio_recv_codecs_.codecs()) { +- if (!FindMatchingCodec(audio_recv_codecs_.codecs(), +- audio_send_codecs_.codecs(), recv)) { +- codecs.push_back(recv); +- } +- } +- return codecs; +-} +- + CodecList CodecVendor::audio_sendrecv_codecs() const { + // Use NegotiateCodecs to merge our codec lists, since the operation is + // essentially the same. Put send_codecs as the offered_codecs, which is the +diff --git a/webrtc/pc/wcodec_vendor.h b/webrtc/pc/codec_vendor.h +index 1472225..4a3a8d9 100644 +--- a/webrtc/pc/codec_vendor.h ++++ b/webrtc/pc/codec_vendor.h +@@ -102,9 +102,6 @@ + const RtpTransceiverDirection& offer, + const RtpTransceiverDirection& answer) const; + +- CodecList all_video_codecs() const; +- CodecList all_audio_codecs() const; +- + TypedCodecVendor audio_send_codecs_; + TypedCodecVendor audio_recv_codecs_; + +diff --git a/webrtc/pc/used_ids.h b/webrtc/pc/used_ids.h +index fe80531..f9d825c 100644 +--- a/webrtc/pc/used_ids.h ++++ b/webrtc/pc/used_ids.h +@@ -14,7 +14,6 @@ + #include + + #include "api/rtp_parameters.h" +-#include "media/base/codec.h" + #include "rtc_base/checks.h" + + namespace webrtc { +@@ -88,41 +86,6 @@ + std::set id_set_; + }; + +-// Helper class used for finding duplicate RTP payload types among audio, video +-// and data codecs. When bundle is used the payload types may not collide. +-class UsedPayloadTypes : public UsedIds { +- public: +- UsedPayloadTypes() +- : UsedIds(kFirstDynamicPayloadTypeLowerRange, +- kLastDynamicPayloadTypeUpperRange) {} +- +- // Check if a payload type is valid. The range [64-95] is forbidden +- // when rtcp-mux is used. +- static bool IsIdValid(Codec codec, bool rtcp_mux) { +- if (rtcp_mux && (codec.id > kLastDynamicPayloadTypeLowerRange && +- codec.id < kFirstDynamicPayloadTypeUpperRange)) { +- return false; +- } +- return codec.id >= 0 && codec.id <= kLastDynamicPayloadTypeUpperRange; +- } +- +- protected: +- bool IsIdUsed(int new_id) override { +- // Range marked for RTCP avoidance is "used". +- if (new_id > kLastDynamicPayloadTypeLowerRange && +- new_id < kFirstDynamicPayloadTypeUpperRange) +- return true; +- return UsedIds::IsIdUsed(new_id); +- } +- +- private: +- static const int kFirstDynamicPayloadTypeLowerRange = 35; +- static const int kLastDynamicPayloadTypeLowerRange = 63; +- +- static const int kFirstDynamicPayloadTypeUpperRange = 96; +- static const int kLastDynamicPayloadTypeUpperRange = 127; +-}; +- + // Helper class used for finding duplicate RTP Header extension ids among + // audio and video extensions. + class UsedRtpHeaderExtensionIds : public UsedIds { From a1898dab2d7d0ccc65e58e95646dc3e9b43d1320 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Nov 2025 13:30:52 -0500 Subject: [PATCH 280/313] backports/thelounge: enable check --- backports/thelounge/APKBUILD | 4 ++-- .../allow-https-for-connect-src.patch | 13 ------------- backports/thelounge/no-version-test.patch | 19 ------------------- 3 files changed, 2 insertions(+), 34 deletions(-) delete mode 100644 backports/thelounge/allow-https-for-connect-src.patch delete mode 100644 backports/thelounge/no-version-test.patch diff --git a/backports/thelounge/APKBUILD b/backports/thelounge/APKBUILD index 0e84a6e..bc0de04 100644 --- a/backports/thelounge/APKBUILD +++ b/backports/thelounge/APKBUILD @@ -3,7 +3,7 @@ # Maintainer: Fabricio Silva pkgname=thelounge pkgver=4.4.3 -pkgrel=1 +pkgrel=0 pkgdesc="Modern, responsive, cross-platform, self-hosted web IRC client" url="https://thelounge.chat" arch="all !riscv64" # riscv64 gets SIGILL @@ -17,7 +17,7 @@ source=" thelounge.initd thelounge.confd " -options="!check net" # net for npm +options="net" # net for npm case $CARCH in # loongarch64: 2 tests failed on the builder diff --git a/backports/thelounge/allow-https-for-connect-src.patch b/backports/thelounge/allow-https-for-connect-src.patch deleted file mode 100644 index a147a91..0000000 --- a/backports/thelounge/allow-https-for-connect-src.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/server/server.ts b/server/server.ts.orig -index 7a1514e..5ecdea9 100644 ---- a/server/server.ts -+++ b/server/server.ts.orig -@@ -377,7 +377,7 @@ function addSecurityHeaders(req: Request, res: Response, next: NextFunction) { - "default-src 'none'", // default to nothing - "base-uri 'none'", // disallow , has no fallback to default-src - "form-action 'self'", // 'self' to fix saving passwords in Firefox, even though login is handled in javascript -- "connect-src 'self' ws: wss:", // allow self for polling; websockets -+ "connect-src 'self' ws: wss: https:", // allow self for polling; websockets - "style-src 'self' https: 'unsafe-inline'", // allow inline due to use in irc hex colors - "script-src 'self'", // javascript - "worker-src 'self'", // service worker diff --git a/backports/thelounge/no-version-test.patch b/backports/thelounge/no-version-test.patch deleted file mode 100644 index dfae092..0000000 --- a/backports/thelounge/no-version-test.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/test/src/helperTest.ts b/test/src/helperTest.ts -index 2a8ddc8..22f0532 100644 ---- a/test/src/helperTest.ts -+++ b/test/src/helperTest.ts -@@ -40,14 +40,6 @@ describe("Helper", function () { - describe("#getVersion()", function () { - const version = Helper.getVersion(); - -- it("should mention it is served from source code", function () { -- expect(version).to.include("source"); -- }); -- -- it("should include a short Git SHA", function () { -- expect(version).to.match(/\([0-9a-f]{7,11} /); -- }); -- - it("should include a valid semver version", function () { - expect(version).to.match(/v[0-9]+\.[0-9]+\.[0-9]+/); - }); From fd29f9c77b95c961ce599b711819a8cbe1de29d2 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 16:51:44 -0500 Subject: [PATCH 281/313] backports/shntool: fix build against latest gcc --- backports/shntool/APKBUILD | 7 +++++-- backports/shntool/no-cdquality-check.patch | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 backports/shntool/no-cdquality-check.patch diff --git a/backports/shntool/APKBUILD b/backports/shntool/APKBUILD index 117a36b..05cb959 100644 --- a/backports/shntool/APKBUILD +++ b/backports/shntool/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Jean-Louis Fuchs pkgname=shntool pkgver=3.0.10 -pkgrel=5 +pkgrel=6 pkgdesc="A multi-purpose WAVE data processing and reporting utility" url="http://shnutils.freeshell.org/shntool/" arch="all" @@ -13,6 +13,7 @@ source="http://shnutils.freeshell.org/shntool/dist/src/shntool-$pkgver.tar.gz shntool-3.0.10-large-size.patch shntool-3.0.10-large-times.patch 24bit.patch + no-cdquality-check.patch " build() { @@ -24,7 +25,8 @@ build() { --sysconfdir=/etc \ --mandir=/usr/share/man \ --infodir=/usr/share/info \ - --localstatedir=/var + --localstatedir=/var \ + CFLAGS="--std=gnu17" make } @@ -63,4 +65,5 @@ sha512sums=" fc44bca63d79b279db6d275caaacdb73cbebd6b902276a9052f005146fa125f4674e3cf559d46405637a337192f4a38f9bec4836af46e7ae52e4f220352c1ba7 shntool-3.0.10-large-size.patch 9780f22d93e20dd01d18067978bdf6cbb0b460bb80f41c4f4752b3322c3d70182b3acf35b789e30fc36ca52af6127e24c00599fb49b916f01448613721a94ebe shntool-3.0.10-large-times.patch 3c9cdd7936a6572a3c9dfc7575f5ff9a0981dd557add8e1113454487091c7b161040d25d3266937449295a1bb5317ee3515a84c3d7168360bf84643ed828e202 24bit.patch +e5b5fe4894eea92e026eec666900bde2b10ea33d4b0ffbf74a231e443c476e11b50eebc21bc2ff2b844ca48af0a41a7b6af77fdc524d0b1bd33d03f133d99992 no-cdquality-check.patch " diff --git a/backports/shntool/no-cdquality-check.patch b/backports/shntool/no-cdquality-check.patch new file mode 100644 index 0000000..4ca3717 --- /dev/null +++ b/backports/shntool/no-cdquality-check.patch @@ -0,0 +1,21 @@ +Last-Update: 2014-11-15 +Forwarded: yes +Author: Dmitry Smirnov +Bug-Debian: http://bugs.debian.org/769585 +Description: disable CD-quality check, needed to process 24bit 96kHz files. + +--- a/src/core_mode.c ++++ b/src/core_mode.c +@@ -344,10 +344,10 @@ + + *colon = 0; + *dot = 0; + +- if (PROB_NOT_CD(info)) +- st_error("m:ss.ff format can only be used with CD-quality files"); ++// if (PROB_NOT_CD(info)) ++// st_error("m:ss.ff format can only be used with CD-quality files"); + + min = atoi((const char *)buf); + sec = atoi((const char *)(colon+1)); + frames = atoi((const char *)(dot+1)); From df11191c86615ce2599cbcad1ded473a2225da1c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 16:52:17 -0500 Subject: [PATCH 282/313] backports/thelounge: disable as broken against node 24 --- backports/thelounge/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backports/thelounge/APKBUILD b/backports/thelounge/APKBUILD index bc0de04..22b5565 100644 --- a/backports/thelounge/APKBUILD +++ b/backports/thelounge/APKBUILD @@ -6,7 +6,8 @@ pkgver=4.4.3 pkgrel=0 pkgdesc="Modern, responsive, cross-platform, self-hosted web IRC client" url="https://thelounge.chat" -arch="all !riscv64" # riscv64 gets SIGILL +# build broken against node 24 +#arch="all !riscv64" # riscv64 gets SIGILL license="MIT" depends="nodejs" makedepends="yarn py3-setuptools" From 8792a8c06a16cee3f067d4c21578ad4d497f7774 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 16:52:59 -0500 Subject: [PATCH 283/313] user/papermc-plugin-luckperms: disable as upstream dependency not available --- user/papermc-plugin-luckperms/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/papermc-plugin-luckperms/APKBUILD b/user/papermc-plugin-luckperms/APKBUILD index 4de9ddb..d480f40 100644 --- a/user/papermc-plugin-luckperms/APKBUILD +++ b/user/papermc-plugin-luckperms/APKBUILD @@ -5,7 +5,8 @@ pkgver=5.4.151 _gittag=0fef481d480737528491fc0b3b8487eb1612f955 pkgrel=0 pkgdesc="An advanced permissions plugin for Bukkit/Spigot, BungeeCord and Sponge." -arch='noarch' +# dependency not available upstream anymore +#arch='noarch' url="https://github.com/lucko/LuckPerms" license="MIT" depends="papermc>=1.8.8" From 2865b8f524aee2d7d284a55120d3f23c5809a27b Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sat, 29 Nov 2025 16:53:27 -0500 Subject: [PATCH 284/313] user/papermc-plugin-essentialsx: blocked by luckperms --- user/papermc-plugin-essentialsx/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/papermc-plugin-essentialsx/APKBUILD b/user/papermc-plugin-essentialsx/APKBUILD index 6abab9f..17643a5 100644 --- a/user/papermc-plugin-essentialsx/APKBUILD +++ b/user/papermc-plugin-essentialsx/APKBUILD @@ -5,7 +5,8 @@ pkgver=2.21.1 _gittag=$pkgver pkgrel=0 pkgdesc="EssentialsX is the essential plugin suite for Minecraft servers, with over 130 commands for servers of all size and scale." -arch='noarch' +# blocked by luckperms +#arch='noarch' url="https://essentialsx.net/" license="GPL-3.0" depends=" From ba29f2b00023ce6a4b33152f18aa1666ad1b070a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 1 Dec 2025 21:34:42 -0500 Subject: [PATCH 285/313] user/uvicorn: drop due to re-added to aports --- .../2540_add-websocketssansioprotocol.patch | 1194 ----------------- .../2541_bump-wesockets-on-requirements.patch | 559 -------- user/uvicorn/APKBUILD | 55 - user/uvicorn/test_multiprocess.patch | 14 - 4 files changed, 1822 deletions(-) delete mode 100644 user/uvicorn/2540_add-websocketssansioprotocol.patch delete mode 100644 user/uvicorn/2541_bump-wesockets-on-requirements.patch delete mode 100644 user/uvicorn/APKBUILD delete mode 100644 user/uvicorn/test_multiprocess.patch diff --git a/user/uvicorn/2540_add-websocketssansioprotocol.patch b/user/uvicorn/2540_add-websocketssansioprotocol.patch deleted file mode 100644 index a1fe5bf..0000000 --- a/user/uvicorn/2540_add-websocketssansioprotocol.patch +++ /dev/null @@ -1,1194 +0,0 @@ -From d79d86eee1ad8cdcc9668de3237b0c6203257992 Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sat, 14 Dec 2024 13:44:22 +0100 -Subject: [PATCH 1/7] Add WebSocketsSansIOProtocol - ---- - docs/deployment.md | 2 +- - docs/index.md | 2 +- - pyproject.toml | 3 + - requirements.txt | 2 +- - tests/conftest.py | 4 +- - tests/middleware/test_logging.py | 11 +- - tests/middleware/test_proxy_headers.py | 5 +- - uvicorn/config.py | 3 +- - .../websockets/websockets_sansio_impl.py | 386 ++++++++++++++++++ - uvicorn/server.py | 3 +- - 10 files changed, 408 insertions(+), 13 deletions(-) - create mode 100644 uvicorn/protocols/websockets/websockets_sansio_impl.py - -diff --git a/pyproject.toml b/pyproject.toml -index 6f809030e..3e30b658c 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -93,6 +93,9 @@ filterwarnings = [ - "ignore:Uvicorn's native WSGI implementation is deprecated.*:DeprecationWarning", - "ignore: 'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning", - "ignore: remove second argument of ws_handler:DeprecationWarning:websockets", -+ "ignore: websockets.legacy is deprecated.*:DeprecationWarning", -+ "ignore: websockets.server.WebSocketServerProtocol is deprecated.*:DeprecationWarning", -+ "ignore: websockets.client.connect is deprecated.*:DeprecationWarning", - ] - - [tool.coverage.run] -diff --git a/requirements.txt b/requirements.txt -index b3a464c0b..fd2334d02 100644 ---- a/requirements.txt -+++ b/requirements.txt -@@ -7,7 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master - # Explicit optionals - a2wsgi==1.10.7 - wsproto==1.2.0 --websockets==13.1 -+websockets==14.1 - - # Packaging - build==1.2.2.post1 -diff --git a/tests/conftest.py b/tests/conftest.py -index 1b0c0e84e..84bda4dc2 100644 ---- a/tests/conftest.py -+++ b/tests/conftest.py -@@ -233,9 +233,9 @@ def unused_tcp_port() -> int: - marks=pytest.mark.skipif(not importlib.util.find_spec("wsproto"), reason="wsproto not installed."), - id="wsproto", - ), -+ pytest.param("uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", id="websockets"), - pytest.param( -- "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", -- id="websockets", -+ "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", id="websockets-sansio" - ), - ] - ) -diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py -index f27633aa5..c8126f9e6 100644 ---- a/tests/middleware/test_logging.py -+++ b/tests/middleware/test_logging.py -@@ -49,7 +49,9 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable - await send({"type": "http.response.body", "body": b"", "more_body": False}) - - --async def test_trace_logging(caplog: pytest.LogCaptureFixture, logging_config, unused_tcp_port: int): -+async def test_trace_logging( -+ caplog: pytest.LogCaptureFixture, logging_config: dict[str, typing.Any], unused_tcp_port: int -+): - config = Config( - app=app, - log_level="trace", -@@ -89,10 +91,11 @@ async def test_trace_logging_on_http_protocol(http_protocol_cls, caplog, logging - assert any(" - HTTP connection lost" in message for message in messages) - - -+@pytest.mark.skip() - async def test_trace_logging_on_ws_protocol( - ws_protocol_cls: WSProtocol, -- caplog, -- logging_config, -+ caplog: pytest.LogCaptureFixture, -+ logging_config: dict[str, typing.Any], - unused_tcp_port: int, - ): - async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): -@@ -104,7 +107,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe - elif message["type"] == "websocket.disconnect": - break - -- async def open_connection(url): -+ async def open_connection(url: str): - async with websockets.client.connect(url) as websocket: - return websocket.open - -diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py -index 0ade97450..4b5f195f6 100644 ---- a/tests/middleware/test_proxy_headers.py -+++ b/tests/middleware/test_proxy_headers.py -@@ -5,7 +5,7 @@ - import httpx - import httpx._transports.asgi - import pytest --import websockets.client -+from websockets.asyncio.client import connect - - from tests.response import Response - from tests.utils import run_server -@@ -465,6 +465,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe - host, port = scope["client"] - await send({"type": "websocket.accept"}) - await send({"type": "websocket.send", "text": f"{scheme}://{host}:{port}"}) -+ await send({"type": "websocket.close"}) - - app_with_middleware = ProxyHeadersMiddleware(websocket_app, trusted_hosts="*") - config = Config( -@@ -478,7 +479,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe - async with run_server(config): - url = f"ws://127.0.0.1:{unused_tcp_port}" - headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} -- async with websockets.client.connect(url, extra_headers=headers) as websocket: -+ async with connect(url, additional_headers=headers) as websocket: - data = await websocket.recv() - assert data == expected - -diff --git a/uvicorn/config.py b/uvicorn/config.py -index b08a8426b..3480b5392 100644 ---- a/uvicorn/config.py -+++ b/uvicorn/config.py -@@ -24,7 +24,7 @@ - from uvicorn.middleware.wsgi import WSGIMiddleware - - HTTPProtocolType = Literal["auto", "h11", "httptools"] --WSProtocolType = Literal["auto", "none", "websockets", "wsproto"] -+WSProtocolType = Literal["auto", "none", "websockets", "websockets-sansio", "wsproto"] - LifespanType = Literal["auto", "on", "off"] - LoopSetupType = Literal["none", "auto", "asyncio", "uvloop"] - InterfaceType = Literal["auto", "asgi3", "asgi2", "wsgi"] -@@ -46,6 +46,7 @@ - "auto": "uvicorn.protocols.websockets.auto:AutoWebSocketsProtocol", - "none": None, - "websockets": "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", -+ "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", - "wsproto": "uvicorn.protocols.websockets.wsproto_impl:WSProtocol", - } - LIFESPAN: dict[LifespanType, str] = { -diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py -new file mode 100644 -index 000000000..49e8a71a1 ---- /dev/null -+++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py -@@ -0,0 +1,386 @@ -+from __future__ import annotations -+ -+import asyncio -+import logging -+from asyncio.transports import BaseTransport, Transport -+from http import HTTPStatus -+from typing import Any, Literal, cast -+from urllib.parse import unquote -+ -+from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory -+from websockets.frames import Frame, Opcode -+from websockets.http11 import Request -+from websockets.server import ServerProtocol -+ -+from uvicorn._types import ( -+ ASGIReceiveEvent, -+ ASGISendEvent, -+ WebSocketAcceptEvent, -+ WebSocketCloseEvent, -+ WebSocketDisconnectEvent, -+ WebSocketReceiveEvent, -+ WebSocketResponseBodyEvent, -+ WebSocketResponseStartEvent, -+ WebSocketScope, -+ WebSocketSendEvent, -+) -+from uvicorn.config import Config -+from uvicorn.logging import TRACE_LOG_LEVEL -+from uvicorn.protocols.utils import get_local_addr, get_path_with_query_string, get_remote_addr, is_ssl -+from uvicorn.server import ServerState -+ -+ -+class WebSocketSansIOProtocol(asyncio.Protocol): -+ def __init__( -+ self, -+ config: Config, -+ server_state: ServerState, -+ app_state: dict[str, Any], -+ _loop: asyncio.AbstractEventLoop | None = None, -+ ) -> None: -+ if not config.loaded: -+ config.load() # pragma: no cover -+ -+ self.config = config -+ self.app = config.loaded_app -+ self.loop = _loop or asyncio.get_event_loop() -+ self.logger = logging.getLogger("uvicorn.error") -+ self.root_path = config.root_path -+ self.app_state = app_state -+ -+ # Shared server state -+ self.connections = server_state.connections -+ self.tasks = server_state.tasks -+ self.default_headers = server_state.default_headers -+ -+ # Connection state -+ self.transport: asyncio.Transport = None # type: ignore[assignment] -+ self.server: tuple[str, int] | None = None -+ self.client: tuple[str, int] | None = None -+ self.scheme: Literal["wss", "ws"] = None # type: ignore[assignment] -+ -+ # WebSocket state -+ self.queue: asyncio.Queue[ASGIReceiveEvent] = asyncio.Queue() -+ self.handshake_initiated = False -+ self.handshake_complete = False -+ self.close_sent = False -+ self.initial_response: tuple[int, list[tuple[str, str]], bytes] | None = None -+ -+ extensions = [] -+ if self.config.ws_per_message_deflate: -+ extensions = [ServerPerMessageDeflateFactory()] -+ self.conn = ServerProtocol( -+ extensions=extensions, -+ max_size=self.config.ws_max_size, -+ logger=logging.getLogger("uvicorn.error"), -+ ) -+ -+ self.read_paused = False -+ self.writable = asyncio.Event() -+ self.writable.set() -+ -+ # Buffers -+ self.bytes = b"" -+ -+ def connection_made(self, transport: BaseTransport) -> None: -+ """Called when a connection is made.""" -+ transport = cast(Transport, transport) -+ self.connections.add(self) -+ self.transport = transport -+ self.server = get_local_addr(transport) -+ self.client = get_remote_addr(transport) -+ self.scheme = "wss" if is_ssl(transport) else "ws" -+ -+ if self.logger.level <= TRACE_LOG_LEVEL: -+ prefix = "%s:%d - " % self.client if self.client else "" -+ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix) -+ -+ def connection_lost(self, exc: Exception | None) -> None: -+ self.connections.remove(self) -+ if self.logger.level <= TRACE_LOG_LEVEL: -+ prefix = "%s:%d - " % self.client if self.client else "" -+ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection lost", prefix) -+ if self.handshake_initiated and not self.close_sent: -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) -+ -+ def shutdown(self) -> None: -+ if not self.transport.is_closing(): -+ if self.handshake_complete: -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) -+ self.close_sent = True -+ self.conn.send_close(1012) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ elif self.handshake_initiated: -+ self.send_500_response() -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) -+ self.transport.close() -+ -+ def data_received(self, data: bytes) -> None: -+ self.conn.receive_data(data) -+ parser_exc = self.conn.parser_exc -+ if parser_exc is not None: -+ self.handle_parser_exception() -+ return -+ self.handle_events() -+ -+ def handle_events(self) -> None: -+ for event in self.conn.events_received(): -+ if isinstance(event, Request): -+ self.handle_connect(event) -+ if isinstance(event, Frame): -+ if event.opcode == Opcode.CONT: -+ self.handle_cont(event) -+ elif event.opcode == Opcode.TEXT: -+ self.handle_text(event) -+ elif event.opcode == Opcode.BINARY: -+ self.handle_bytes(event) -+ elif event.opcode == Opcode.PING: -+ self.handle_ping(event) -+ elif event.opcode == Opcode.CLOSE: -+ self.handle_close(event) -+ -+ # Event handlers -+ -+ def handle_connect(self, event: Request) -> None: -+ self.request = event -+ self.response = self.conn.accept(event) -+ self.handshake_initiated = True -+ # if status_code is not 101 return response -+ if self.response.status_code != 101: -+ self.handshake_complete = True -+ self.close_sent = True -+ self.conn.send_response(self.response) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ self.transport.close() -+ return -+ -+ headers = [ -+ (key.encode("ascii"), value.encode("ascii", errors="surrogateescape")) -+ for key, value in event.headers.raw_items() -+ ] -+ raw_path, _, query_string = event.path.partition("?") -+ self.scope: WebSocketScope = { -+ "type": "websocket", -+ "asgi": {"version": self.config.asgi_version, "spec_version": "2.3"}, -+ "http_version": "1.1", -+ "scheme": self.scheme, -+ "server": self.server, -+ "client": self.client, -+ "root_path": self.root_path, -+ "path": unquote(raw_path), -+ "raw_path": raw_path.encode("ascii"), -+ "query_string": query_string.encode("ascii"), -+ "headers": headers, -+ "subprotocols": event.headers.get_all("Sec-WebSocket-Protocol"), -+ "state": self.app_state.copy(), -+ "extensions": {"websocket.http.response": {}}, -+ } -+ self.queue.put_nowait({"type": "websocket.connect"}) -+ task = self.loop.create_task(self.run_asgi()) -+ task.add_done_callback(self.on_task_complete) -+ self.tasks.add(task) -+ -+ def handle_cont(self, event: Frame) -> None: -+ self.bytes += event.data -+ if event.fin: -+ self.send_receive_event_to_app() -+ -+ def handle_text(self, event: Frame) -> None: -+ self.bytes = event.data -+ self.curr_msg_data_type: Literal["text", "bytes"] = "text" -+ if event.fin: -+ self.send_receive_event_to_app() -+ -+ def handle_bytes(self, event: Frame) -> None: -+ self.bytes = event.data -+ self.curr_msg_data_type = "bytes" -+ if event.fin: -+ self.send_receive_event_to_app() -+ -+ def send_receive_event_to_app(self) -> None: -+ data_type = self.curr_msg_data_type -+ msg: WebSocketReceiveEvent -+ if data_type == "text": -+ msg = {"type": "websocket.receive", data_type: self.bytes.decode()} -+ else: -+ msg = {"type": "websocket.receive", data_type: self.bytes} -+ self.queue.put_nowait(msg) -+ if not self.read_paused: -+ self.read_paused = True -+ self.transport.pause_reading() -+ -+ def handle_ping(self, event: Frame) -> None: -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ -+ def handle_close(self, event: Frame) -> None: -+ if not self.close_sent and self.conn.close_rcvd and not self.transport.is_closing(): -+ disconnect_event: WebSocketDisconnectEvent = { -+ "type": "websocket.disconnect", -+ "code": self.conn.close_rcvd.code, -+ "reason": self.conn.close_rcvd.reason, -+ } -+ self.queue.put_nowait(disconnect_event) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ self.close_sent = True -+ self.transport.close() -+ -+ def handle_parser_exception(self) -> None: -+ disconnect_event: WebSocketDisconnectEvent = { -+ "type": "websocket.disconnect", -+ "code": self.conn.close_sent.code if self.conn.close_sent else 1006, -+ } -+ self.queue.put_nowait(disconnect_event) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ self.close_sent = True -+ self.transport.close() -+ -+ def on_task_complete(self, task: asyncio.Task[None]) -> None: -+ self.tasks.discard(task) -+ -+ async def run_asgi(self) -> None: -+ try: -+ result = await self.app(self.scope, self.receive, self.send) -+ except BaseException: -+ self.logger.exception("Exception in ASGI application\n") -+ if not self.handshake_complete: -+ self.send_500_response() -+ self.transport.close() -+ else: -+ if not self.handshake_complete: -+ msg = "ASGI callable returned without completing handshake." -+ self.logger.error(msg) -+ self.send_500_response() -+ self.transport.close() -+ elif result is not None: -+ msg = "ASGI callable should return None, but returned '%s'." -+ self.logger.error(msg, result) -+ self.transport.close() -+ -+ def send_500_response(self) -> None: -+ response = self.conn.reject(500, "Internal Server Error") -+ self.conn.send_response(response) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ -+ async def send(self, message: ASGISendEvent) -> None: -+ await self.writable.wait() -+ -+ message_type = message["type"] -+ -+ if not self.handshake_complete and self.initial_response is None: -+ if message_type == "websocket.accept": -+ message = cast(WebSocketAcceptEvent, message) -+ self.logger.info( -+ '%s - "WebSocket %s" [accepted]', -+ self.scope["client"], -+ get_path_with_query_string(self.scope), -+ ) -+ headers = [ -+ (name.decode("latin-1").lower(), value.decode("latin-1").lower()) -+ for name, value in (self.default_headers + list(message.get("headers", []))) -+ ] -+ accepted_subprotocol = message.get("subprotocol") -+ if accepted_subprotocol: -+ headers.append(("Sec-WebSocket-Protocol", accepted_subprotocol)) -+ self.response.headers.update(headers) -+ -+ if not self.transport.is_closing(): -+ self.handshake_complete = True -+ self.conn.send_response(self.response) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ -+ elif message_type == "websocket.close": -+ message = cast(WebSocketCloseEvent, message) -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) -+ self.logger.info( -+ '%s - "WebSocket %s" 403', -+ self.scope["client"], -+ get_path_with_query_string(self.scope), -+ ) -+ response = self.conn.reject(HTTPStatus.FORBIDDEN, "") -+ self.conn.send_response(response) -+ output = self.conn.data_to_send() -+ self.close_sent = True -+ self.handshake_complete = True -+ self.transport.writelines(output) -+ self.transport.close() -+ elif message_type == "websocket.http.response.start": -+ message = cast(WebSocketResponseStartEvent, message) -+ self.logger.info( -+ '%s - "WebSocket %s" %d', -+ self.scope["client"], -+ get_path_with_query_string(self.scope), -+ message["status"], -+ ) -+ headers = [ -+ (name.decode("latin-1"), value.decode("latin-1")) -+ for name, value in list(message.get("headers", [])) -+ ] -+ self.initial_response = (message["status"], headers, b"") -+ else: -+ msg = ( -+ "Expected ASGI message 'websocket.accept', 'websocket.close' " -+ "or 'websocket.http.response.start' " -+ "but got '%s'." -+ ) -+ print(message) -+ raise RuntimeError(msg % message_type) -+ -+ elif not self.close_sent and self.initial_response is None: -+ if message_type == "websocket.send" and not self.transport.is_closing(): -+ message = cast(WebSocketSendEvent, message) -+ bytes_data = message.get("bytes") -+ text_data = message.get("text") -+ if text_data: -+ self.conn.send_text(text_data.encode()) -+ elif bytes_data: -+ self.conn.send_binary(bytes_data) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ -+ elif message_type == "websocket.close" and not self.transport.is_closing(): -+ message = cast(WebSocketCloseEvent, message) -+ code = message.get("code", 1000) -+ reason = message.get("reason", "") or "" -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) -+ self.conn.send_close(code, reason) -+ output = self.conn.data_to_send() -+ self.transport.writelines(output) -+ self.close_sent = True -+ self.transport.close() -+ else: -+ msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." -+ raise RuntimeError(msg % message_type) -+ elif self.initial_response is not None: -+ if message_type == "websocket.http.response.body": -+ message = cast(WebSocketResponseBodyEvent, message) -+ body = self.initial_response[2] + message["body"] -+ self.initial_response = self.initial_response[:2] + (body,) -+ if not message.get("more_body", False): -+ response = self.conn.reject(self.initial_response[0], body.decode()) -+ response.headers.update(self.initial_response[1]) -+ self.conn.send_response(response) -+ output = self.conn.data_to_send() -+ self.close_sent = True -+ self.transport.writelines(output) -+ self.transport.close() -+ else: -+ msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." -+ raise RuntimeError(msg % message_type) -+ -+ else: -+ msg = "Unexpected ASGI message '%s', after sending 'websocket.close'." -+ raise RuntimeError(msg % message_type) -+ -+ async def receive(self) -> ASGIReceiveEvent: -+ message = await self.queue.get() -+ if self.read_paused and self.queue.empty(): -+ self.read_paused = False -+ self.transport.resume_reading() -+ return message -diff --git a/uvicorn/server.py b/uvicorn/server.py -index f14026f16..2250e2dc7 100644 ---- a/uvicorn/server.py -+++ b/uvicorn/server.py -@@ -22,9 +22,10 @@ - from uvicorn.protocols.http.h11_impl import H11Protocol - from uvicorn.protocols.http.httptools_impl import HttpToolsProtocol - from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol -+ from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketSansIOProtocol - from uvicorn.protocols.websockets.wsproto_impl import WSProtocol - -- Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol] -+ Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketSansIOProtocol] - - HANDLED_SIGNALS = ( - signal.SIGINT, # Unix signal 2. Sent by Ctrl+C. - -From 7ee1e15a850d78754b757849886abb2011dd2e55 Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sat, 14 Dec 2024 17:54:55 +0100 -Subject: [PATCH 2/7] Add WebSocketsSansIOProtocol - ---- - tests/conftest.py | 2 +- - tests/middleware/test_logging.py | 1 - - tests/middleware/test_proxy_headers.py | 4 +- - tests/protocols/test_websocket.py | 35 +++--- - uvicorn/config.py | 2 +- - .../websockets/websockets_sansio_impl.py | 117 +++++++++++------- - uvicorn/server.py | 4 +- - 7 files changed, 96 insertions(+), 69 deletions(-) - -diff --git a/tests/conftest.py b/tests/conftest.py -index 84bda4dc2..7061a143b 100644 ---- a/tests/conftest.py -+++ b/tests/conftest.py -@@ -235,7 +235,7 @@ def unused_tcp_port() -> int: - ), - pytest.param("uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", id="websockets"), - pytest.param( -- "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", id="websockets-sansio" -+ "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol", id="websockets-sansio" - ), - ] - ) -diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py -index c8126f9e6..63d7daf83 100644 ---- a/tests/middleware/test_logging.py -+++ b/tests/middleware/test_logging.py -@@ -91,7 +91,6 @@ async def test_trace_logging_on_http_protocol(http_protocol_cls, caplog, logging - assert any(" - HTTP connection lost" in message for message in messages) - - --@pytest.mark.skip() - async def test_trace_logging_on_ws_protocol( - ws_protocol_cls: WSProtocol, - caplog: pytest.LogCaptureFixture, -diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py -index 4b5f195f6..62a51ab20 100644 ---- a/tests/middleware/test_proxy_headers.py -+++ b/tests/middleware/test_proxy_headers.py -@@ -5,8 +5,8 @@ - import httpx - import httpx._transports.asgi - import pytest --from websockets.asyncio.client import connect - -+import websockets.client - from tests.response import Response - from tests.utils import run_server - from uvicorn._types import ASGIReceiveCallable, ASGISendCallable, Scope -@@ -479,7 +479,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe - async with run_server(config): - url = f"ws://127.0.0.1:{unused_tcp_port}" - headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} -- async with connect(url, additional_headers=headers) as websocket: -+ async with websockets.client.connect(url, extra_headers=headers) as websocket: - data = await websocket.recv() - assert data == expected - -diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py -index 15ccfdd7d..8971a7d97 100644 ---- a/tests/protocols/test_websocket.py -+++ b/tests/protocols/test_websocket.py -@@ -601,20 +601,20 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable - await send_accept_task.wait() - disconnect_message = await receive() # type: ignore - -- response: httpx.Response | None = None -- - async def websocket_session(uri: str): -- nonlocal response - async with httpx.AsyncClient() as client: -- response = await client.get( -- f"http://127.0.0.1:{unused_tcp_port}", -- headers={ -- "upgrade": "websocket", -- "connection": "upgrade", -- "sec-websocket-version": "13", -- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", -- }, -- ) -+ try: -+ await client.get( -+ f"http://127.0.0.1:{unused_tcp_port}", -+ headers={ -+ "upgrade": "websocket", -+ "connection": "upgrade", -+ "sec-websocket-version": "13", -+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", -+ }, -+ ) -+ except httpx.RemoteProtocolError: -+ pass # pragma: no cover - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -623,9 +623,6 @@ async def websocket_session(uri: str): - send_accept_task.set() - await asyncio.sleep(0.1) - -- assert response is not None -- assert response.status_code == 500, response.text -- assert response.text == "Internal Server Error" - assert disconnect_message == {"type": "websocket.disconnect", "code": 1006} - await task - -@@ -920,6 +917,9 @@ async def websocket_session(url: str): - async def test_server_reject_connection_with_invalid_msg( - ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int - ): -+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": -+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") -+ - async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): - assert scope["type"] == "websocket" - assert "extensions" in scope and "websocket.http.response" in scope["extensions"] -@@ -951,6 +951,9 @@ async def websocket_session(url: str): - async def test_server_reject_connection_with_missing_body( - ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int - ): -+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": -+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") -+ - async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): - assert scope["type"] == "websocket" - assert "extensions" in scope and "websocket.http.response" in scope["extensions"] -@@ -986,6 +989,8 @@ async def test_server_multiple_websocket_http_response_start_events( - The server should raise an exception if it sends multiple - websocket.http.response.start events. - """ -+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol": -+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.") - exception_message: str | None = None - - async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): -diff --git a/uvicorn/config.py b/uvicorn/config.py -index 3480b5392..187b94972 100644 ---- a/uvicorn/config.py -+++ b/uvicorn/config.py -@@ -46,7 +46,7 @@ - "auto": "uvicorn.protocols.websockets.auto:AutoWebSocketsProtocol", - "none": None, - "websockets": "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", -- "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketSansIOProtocol", -+ "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol", - "wsproto": "uvicorn.protocols.websockets.wsproto_impl:WSProtocol", - } - LIFESPAN: dict[LifespanType, str] = { -diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py -index 49e8a71a1..ea70236b2 100644 ---- a/uvicorn/protocols/websockets/websockets_sansio_impl.py -+++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py -@@ -7,6 +7,7 @@ - from typing import Any, Literal, cast - from urllib.parse import unquote - -+from websockets import InvalidState - from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory - from websockets.frames import Frame, Opcode - from websockets.http11 import Request -@@ -26,11 +27,17 @@ - ) - from uvicorn.config import Config - from uvicorn.logging import TRACE_LOG_LEVEL --from uvicorn.protocols.utils import get_local_addr, get_path_with_query_string, get_remote_addr, is_ssl -+from uvicorn.protocols.utils import ( -+ ClientDisconnected, -+ get_local_addr, -+ get_path_with_query_string, -+ get_remote_addr, -+ is_ssl, -+) - from uvicorn.server import ServerState - - --class WebSocketSansIOProtocol(asyncio.Protocol): -+class WebSocketsSansIOProtocol(asyncio.Protocol): - def __init__( - self, - config: Config, -@@ -96,12 +103,20 @@ def connection_made(self, transport: BaseTransport) -> None: - self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix) - - def connection_lost(self, exc: Exception | None) -> None: -+ code = 1005 if self.handshake_complete else 1006 -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) - self.connections.remove(self) -+ - if self.logger.level <= TRACE_LOG_LEVEL: - prefix = "%s:%d - " % self.client if self.client else "" - self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection lost", prefix) -- if self.handshake_initiated and not self.close_sent: -- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) -+ -+ self.handshake_complete = True -+ if exc is None: -+ self.transport.close() -+ -+ def eof_received(self) -> None: -+ pass - - def shutdown(self) -> None: - if not self.transport.is_closing(): -@@ -110,8 +125,8 @@ def shutdown(self) -> None: - self.close_sent = True - self.conn.send_close(1012) - output = self.conn.data_to_send() -- self.transport.writelines(output) -- elif self.handshake_initiated: -+ self.transport.write(b"".join(output)) -+ elif not self.handshake_initiated: - self.send_500_response() - self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) - self.transport.close() -@@ -152,7 +167,7 @@ def handle_connect(self, event: Request) -> None: - self.close_sent = True - self.conn.send_response(self.response) - output = self.conn.data_to_send() -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - self.transport.close() - return - -@@ -213,29 +228,29 @@ def send_receive_event_to_app(self) -> None: - - def handle_ping(self, event: Frame) -> None: - output = self.conn.data_to_send() -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - - def handle_close(self, event: Frame) -> None: -- if not self.close_sent and self.conn.close_rcvd and not self.transport.is_closing(): -+ if not self.close_sent and not self.transport.is_closing(): - disconnect_event: WebSocketDisconnectEvent = { - "type": "websocket.disconnect", -- "code": self.conn.close_rcvd.code, -- "reason": self.conn.close_rcvd.reason, -+ "code": self.conn.close_rcvd.code, # type: ignore[union-attr] -+ "reason": self.conn.close_rcvd.reason, # type: ignore[union-attr] - } - self.queue.put_nowait(disconnect_event) - output = self.conn.data_to_send() -- self.transport.writelines(output) -- self.close_sent = True -+ self.transport.write(b"".join(output)) - self.transport.close() - - def handle_parser_exception(self) -> None: - disconnect_event: WebSocketDisconnectEvent = { - "type": "websocket.disconnect", -- "code": self.conn.close_sent.code if self.conn.close_sent else 1006, -+ "code": self.conn.close_sent.code, # type: ignore[union-attr] -+ "reason": self.conn.close_sent.reason, # type: ignore[union-attr] - } - self.queue.put_nowait(disconnect_event) - output = self.conn.data_to_send() -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - self.close_sent = True - self.transport.close() - -@@ -245,10 +260,11 @@ def on_task_complete(self, task: asyncio.Task[None]) -> None: - async def run_asgi(self) -> None: - try: - result = await self.app(self.scope, self.receive, self.send) -+ except ClientDisconnected: -+ self.transport.close() - except BaseException: - self.logger.exception("Exception in ASGI application\n") -- if not self.handshake_complete: -- self.send_500_response() -+ self.send_500_response() - self.transport.close() - else: - if not self.handshake_complete: -@@ -262,10 +278,12 @@ async def run_asgi(self) -> None: - self.transport.close() - - def send_500_response(self) -> None: -+ if self.initial_response or self.handshake_complete: -+ return - response = self.conn.reject(500, "Internal Server Error") - self.conn.send_response(response) - output = self.conn.data_to_send() -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - - async def send(self, message: ASGISendEvent) -> None: - await self.writable.wait() -@@ -293,7 +311,7 @@ async def send(self, message: ASGISendEvent) -> None: - self.handshake_complete = True - self.conn.send_response(self.response) - output = self.conn.data_to_send() -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - - elif message_type == "websocket.close": - message = cast(WebSocketCloseEvent, message) -@@ -308,10 +326,12 @@ async def send(self, message: ASGISendEvent) -> None: - output = self.conn.data_to_send() - self.close_sent = True - self.handshake_complete = True -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - self.transport.close() -- elif message_type == "websocket.http.response.start": -+ elif message_type == "websocket.http.response.start" and self.initial_response is None: - message = cast(WebSocketResponseStartEvent, message) -+ if not (100 <= message["status"] < 600): -+ raise RuntimeError("Invalid HTTP status code '%d' in response." % message["status"]) - self.logger.info( - '%s - "WebSocket %s" %d', - self.scope["client"], -@@ -329,34 +349,36 @@ async def send(self, message: ASGISendEvent) -> None: - "or 'websocket.http.response.start' " - "but got '%s'." - ) -- print(message) - raise RuntimeError(msg % message_type) - - elif not self.close_sent and self.initial_response is None: -- if message_type == "websocket.send" and not self.transport.is_closing(): -- message = cast(WebSocketSendEvent, message) -- bytes_data = message.get("bytes") -- text_data = message.get("text") -- if text_data: -- self.conn.send_text(text_data.encode()) -- elif bytes_data: -- self.conn.send_binary(bytes_data) -- output = self.conn.data_to_send() -- self.transport.writelines(output) -- -- elif message_type == "websocket.close" and not self.transport.is_closing(): -- message = cast(WebSocketCloseEvent, message) -- code = message.get("code", 1000) -- reason = message.get("reason", "") or "" -- self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) -- self.conn.send_close(code, reason) -- output = self.conn.data_to_send() -- self.transport.writelines(output) -- self.close_sent = True -- self.transport.close() -- else: -- msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." -- raise RuntimeError(msg % message_type) -+ try: -+ if message_type == "websocket.send": -+ message = cast(WebSocketSendEvent, message) -+ bytes_data = message.get("bytes") -+ text_data = message.get("text") -+ if text_data: -+ self.conn.send_text(text_data.encode()) -+ elif bytes_data: -+ self.conn.send_binary(bytes_data) -+ output = self.conn.data_to_send() -+ self.transport.write(b"".join(output)) -+ -+ elif message_type == "websocket.close" and not self.transport.is_closing(): -+ message = cast(WebSocketCloseEvent, message) -+ code = message.get("code", 1000) -+ reason = message.get("reason", "") or "" -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": code}) -+ self.conn.send_close(code, reason) -+ output = self.conn.data_to_send() -+ self.transport.write(b"".join(output)) -+ self.close_sent = True -+ self.transport.close() -+ else: -+ msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." -+ raise RuntimeError(msg % message_type) -+ except InvalidState: -+ raise ClientDisconnected() - elif self.initial_response is not None: - if message_type == "websocket.http.response.body": - message = cast(WebSocketResponseBodyEvent, message) -@@ -365,10 +387,11 @@ async def send(self, message: ASGISendEvent) -> None: - if not message.get("more_body", False): - response = self.conn.reject(self.initial_response[0], body.decode()) - response.headers.update(self.initial_response[1]) -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) - self.conn.send_response(response) - output = self.conn.data_to_send() - self.close_sent = True -- self.transport.writelines(output) -+ self.transport.write(b"".join(output)) - self.transport.close() - else: - msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." -diff --git a/uvicorn/server.py b/uvicorn/server.py -index 2250e2dc7..e33716fd4 100644 ---- a/uvicorn/server.py -+++ b/uvicorn/server.py -@@ -22,10 +22,10 @@ - from uvicorn.protocols.http.h11_impl import H11Protocol - from uvicorn.protocols.http.httptools_impl import HttpToolsProtocol - from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol -- from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketSansIOProtocol -+ from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketsSansIOProtocol - from uvicorn.protocols.websockets.wsproto_impl import WSProtocol - -- Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketSansIOProtocol] -+ Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketsSansIOProtocol] - - HANDLED_SIGNALS = ( - signal.SIGINT, # Unix signal 2. Sent by Ctrl+C. - -From 035e7c38e98dbdbe81eae19f63ee8e1bfa1d1e4c Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sat, 14 Dec 2024 17:55:28 +0100 -Subject: [PATCH 3/7] lint - ---- - tests/middleware/test_proxy_headers.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py -index 62a51ab20..d300c45f8 100644 ---- a/tests/middleware/test_proxy_headers.py -+++ b/tests/middleware/test_proxy_headers.py -@@ -5,8 +5,8 @@ - import httpx - import httpx._transports.asgi - import pytest -- - import websockets.client -+ - from tests.response import Response - from tests.utils import run_server - from uvicorn._types import ASGIReceiveCallable, ASGISendCallable, Scope - -From eac77b7d86edb6a2ebcf9e2f380db18bb46fe684 Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sat, 14 Dec 2024 17:57:33 +0100 -Subject: [PATCH 4/7] pin python versions - ---- - requirements.txt | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/requirements.txt b/requirements.txt -index fd2334d02..366a0963a 100644 ---- a/requirements.txt -+++ b/requirements.txt -@@ -7,7 +7,8 @@ h11 @ git+https://github.com/python-hyper/h11.git@master - # Explicit optionals - a2wsgi==1.10.7 - wsproto==1.2.0 --websockets==14.1 -+websockets==13.1; python_version < '3.9' -+websockets==14.1; python_version >= '3.9' - - # Packaging - build==1.2.2.post1 - -From 032c00c5a13167deb638a1a5e13c9ccee091598a Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sun, 15 Dec 2024 13:18:34 +0100 -Subject: [PATCH 5/7] Update requirements.txt - ---- - requirements.txt | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/requirements.txt b/requirements.txt -index 366a0963a..b3a464c0b 100644 ---- a/requirements.txt -+++ b/requirements.txt -@@ -7,8 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master - # Explicit optionals - a2wsgi==1.10.7 - wsproto==1.2.0 --websockets==13.1; python_version < '3.9' --websockets==14.1; python_version >= '3.9' -+websockets==13.1 - - # Packaging - build==1.2.2.post1 - -From c523508d5b5959bba65ebe1da2b4d3550e3c6674 Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sun, 15 Dec 2024 14:27:48 +0100 -Subject: [PATCH 6/7] Add a bit more coverage - ---- - tests/protocols/test_websocket.py | 23 +++++++++---------- - .../websockets/websockets_sansio_impl.py | 20 +++++++--------- - 2 files changed, 19 insertions(+), 24 deletions(-) - -diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py -index 8971a7d97..e7285449c 100644 ---- a/tests/protocols/test_websocket.py -+++ b/tests/protocols/test_websocket.py -@@ -7,6 +7,8 @@ - import httpx - import pytest - import websockets -+import websockets.asyncio -+import websockets.asyncio.client - import websockets.client - import websockets.exceptions - from typing_extensions import TypedDict -@@ -603,18 +605,15 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable - - async def websocket_session(uri: str): - async with httpx.AsyncClient() as client: -- try: -- await client.get( -- f"http://127.0.0.1:{unused_tcp_port}", -- headers={ -- "upgrade": "websocket", -- "connection": "upgrade", -- "sec-websocket-version": "13", -- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", -- }, -- ) -- except httpx.RemoteProtocolError: -- pass # pragma: no cover -+ await client.get( -+ f"http://127.0.0.1:{unused_tcp_port}", -+ headers={ -+ "upgrade": "websocket", -+ "connection": "upgrade", -+ "sec-websocket-version": "13", -+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", -+ }, -+ ) - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py -index ea70236b2..994af07e7 100644 ---- a/uvicorn/protocols/websockets/websockets_sansio_impl.py -+++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py -@@ -119,17 +119,14 @@ def eof_received(self) -> None: - pass - - def shutdown(self) -> None: -- if not self.transport.is_closing(): -- if self.handshake_complete: -- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) -- self.close_sent = True -- self.conn.send_close(1012) -- output = self.conn.data_to_send() -- self.transport.write(b"".join(output)) -- elif not self.handshake_initiated: -- self.send_500_response() -- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006}) -- self.transport.close() -+ if self.handshake_complete: -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) -+ self.conn.send_close(1012) -+ output = self.conn.data_to_send() -+ self.transport.write(b"".join(output)) -+ else: -+ self.send_500_response() -+ self.transport.close() - - def data_received(self, data: bytes) -> None: - self.conn.receive_data(data) -@@ -161,7 +158,6 @@ def handle_connect(self, event: Request) -> None: - self.request = event - self.response = self.conn.accept(event) - self.handshake_initiated = True -- # if status_code is not 101 return response - if self.response.status_code != 101: - self.handshake_complete = True - self.close_sent = True - -From f774f2fcb04b3cfe0f3046cdd9298b04b55daf9a Mon Sep 17 00:00:00 2001 -From: Marcelo Trylesinski -Date: Sat, 19 Apr 2025 15:45:45 +0200 -Subject: [PATCH 7/7] Apply comments - ---- - tests/middleware/test_logging.py | 3 ++- - uvicorn/protocols/websockets/websockets_sansio_impl.py | 6 +++--- - 2 files changed, 5 insertions(+), 4 deletions(-) - -diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py -index 63d7daf83..1b8b4fbb1 100644 ---- a/tests/middleware/test_logging.py -+++ b/tests/middleware/test_logging.py -@@ -10,6 +10,7 @@ - import pytest - import websockets - import websockets.client -+from websockets.protocol import State - - from tests.utils import run_server - from uvicorn import Config -@@ -108,7 +109,7 @@ async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISe - - async def open_connection(url: str): - async with websockets.client.connect(url) as websocket: -- return websocket.open -+ return websocket.state is State.OPEN - - config = Config( - app=websocket_app, -diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py -index 994af07e7..b518c8407 100644 ---- a/uvicorn/protocols/websockets/websockets_sansio_impl.py -+++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py -@@ -7,7 +7,7 @@ - from typing import Any, Literal, cast - from urllib.parse import unquote - --from websockets import InvalidState -+from websockets.exceptions import InvalidState - from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory - from websockets.frames import Frame, Opcode - from websockets.http11 import Request -@@ -371,7 +371,7 @@ async def send(self, message: ASGISendEvent) -> None: - self.close_sent = True - self.transport.close() - else: -- msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'." -+ msg = "Expected ASGI message 'websocket.send' or 'websocket.close', but got '%s'." - raise RuntimeError(msg % message_type) - except InvalidState: - raise ClientDisconnected() -@@ -390,7 +390,7 @@ async def send(self, message: ASGISendEvent) -> None: - self.transport.write(b"".join(output)) - self.transport.close() - else: -- msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'." -+ msg = "Expected ASGI message 'websocket.http.response.body' but got '%s'." - raise RuntimeError(msg % message_type) - - else: diff --git a/user/uvicorn/2541_bump-wesockets-on-requirements.patch b/user/uvicorn/2541_bump-wesockets-on-requirements.patch deleted file mode 100644 index 6b9f671..0000000 --- a/user/uvicorn/2541_bump-wesockets-on-requirements.patch +++ /dev/null @@ -1,559 +0,0 @@ -diff --git a/requirements.txt b/requirements.txt -index e26e6b3..b16569f 100644 ---- a/requirements.txt -+++ b/requirements.txt -@@ -7,7 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master - # Explicit optionals - a2wsgi==1.10.7 - wsproto==1.2.0 --websockets==13.1 -+websockets==14.1 - - # Packaging - build==1.2.2.post1 -diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py -index d300c45..4b5f195 100644 ---- a/tests/middleware/test_proxy_headers.py -+++ b/tests/middleware/test_proxy_headers.py -@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING - import httpx - import httpx._transports.asgi - import pytest --import websockets.client -+from websockets.asyncio.client import connect - - from tests.response import Response - from tests.utils import run_server -@@ -479,7 +479,7 @@ async def test_proxy_headers_websocket_x_forwarded_proto( - async with run_server(config): - url = f"ws://127.0.0.1:{unused_tcp_port}" - headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto} -- async with websockets.client.connect(url, extra_headers=headers) as websocket: -+ async with connect(url, additional_headers=headers) as websocket: - data = await websocket.recv() - assert data == expected - -diff --git a/uvicorn/protocols/websockets/websockets_impl.py b/uvicorn/protocols/websockets/websockets_impl.py -index cd6c54f..685d6b6 100644 ---- a/uvicorn/protocols/websockets/websockets_impl.py -+++ b/uvicorn/protocols/websockets/websockets_impl.py -@@ -13,8 +13,7 @@ from websockets.datastructures import Headers - from websockets.exceptions import ConnectionClosed - from websockets.extensions.base import ServerExtensionFactory - from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory --from websockets.legacy.server import HTTPResponse --from websockets.server import WebSocketServerProtocol -+from websockets.legacy.server import HTTPResponse, WebSocketServerProtocol - from websockets.typing import Subprotocol - - from uvicorn._types import ( -diff --git a/uvicorn/protocols/websockets/wsproto_impl.py b/uvicorn/protocols/websockets/wsproto_impl.py -index 828afe5..5d84bff 100644 ---- a/uvicorn/protocols/websockets/wsproto_impl.py -+++ b/uvicorn/protocols/websockets/wsproto_impl.py -@@ -149,12 +149,13 @@ class WSProtocol(asyncio.Protocol): - self.writable.set() # pragma: full coverage - - def shutdown(self) -> None: -- if self.handshake_complete: -- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) -- output = self.conn.send(wsproto.events.CloseConnection(code=1012)) -- self.transport.write(output) -- else: -- self.send_500_response() -+ if not self.response_started: -+ if self.handshake_complete: -+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012}) -+ output = self.conn.send(wsproto.events.CloseConnection(code=1012)) -+ self.transport.write(output) -+ else: -+ self.send_500_response() - self.transport.close() - - def on_task_complete(self, task: asyncio.Task[None]) -> None: -@@ -221,13 +222,15 @@ class WSProtocol(asyncio.Protocol): - def send_500_response(self) -> None: - if self.response_started or self.handshake_complete: - return # we cannot send responses anymore -+ reject_data = b"Internal Server Error" - headers: list[tuple[bytes, bytes]] = [ - (b"content-type", b"text/plain; charset=utf-8"), -+ (b"content-length", str(len(reject_data)).encode()), - (b"connection", b"close"), - (b"content-length", b"21"), - ] - output = self.conn.send(wsproto.events.RejectConnection(status_code=500, headers=headers, has_body=True)) -- output += self.conn.send(wsproto.events.RejectData(data=b"Internal Server Error")) -+ output += self.conn.send(wsproto.events.RejectData(data=reject_data)) - self.transport.write(output) - - async def run_asgi(self) -> None: -diff --git a/tests/middleware/test_logging.py.orig b/tests/middleware/test_logging.py -index 1b8b4fbb108..a8a74ee8ca0 100644 ---- a/tests/middleware/test_logging.py.orig -+++ b/tests/middleware/test_logging.py -@@ -8,8 +8,7 @@ import typing - - import httpx - import pytest --import websockets --import websockets.client -+from websockets.asyncio.client import connect - from websockets.protocol import State - - from tests.utils import run_server -@@ -108,8 +107,8 @@ async def test_trace_logging_on_ws_protocol( - break - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.state is State.OPEN -+ async with connect(url): -+ return True - - config = Config( - app=websocket_app, -diff --git a/tests/protocols/test_websocket.py.orig b/tests/protocols/test_websocket.py -index 399769b6395..9971f4bbecd 100644 ---- a/tests/protocols/test_websocket.py.orig -+++ b/tests/protocols/test_websocket.py -@@ -11,6 +11,8 @@ import websockets.asyncio - import websockets.asyncio.client - import websockets.client - import websockets.exceptions -+from websockets.asyncio.client import ClientConnection, connect -+from websockets.exceptions import ConnectionClosed, ConnectionClosedError, InvalidHandshake, InvalidStatus - from websockets.extensions.permessage_deflate import ClientPerMessageDeflateFactory - from websockets.typing import Subprotocol - -@@ -126,8 +128,8 @@ async def test_accept_connection(ws_protocol_cls: WSProtocol, http_protocol_cls: - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.open -+ async with connect(url): -+ return True - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -142,7 +144,7 @@ async def test_shutdown(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProt - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config) as server: -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}"): -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}"): - # Attempt shutdown while connection is still open - await server.shutdown() - -@@ -156,8 +158,8 @@ async def test_supports_permessage_deflate_extension( - - async def open_connection(url: str): - extension_factories = [ClientPerMessageDeflateFactory()] -- async with websockets.client.connect(url, extensions=extension_factories) as websocket: -- return [extension.name for extension in websocket.extensions] -+ async with connect(url, extensions=extension_factories) as websocket: -+ return [extension.name for extension in websocket.protocol.extensions] - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -176,8 +178,8 @@ async def test_can_disable_permessage_deflate_extension( - # enable per-message deflate on the client, so that we can check the server - # won't support it when it's disabled. - extension_factories = [ClientPerMessageDeflateFactory()] -- async with websockets.client.connect(url, extensions=extension_factories) as websocket: -- return [extension.name for extension in websocket.extensions] -+ async with connect(url, extensions=extension_factories) as websocket: -+ return [extension.name for extension in websocket.protocol.extensions] - - config = Config( - app=App, -@@ -199,8 +201,8 @@ async def test_close_connection(ws_protocol_cls: WSProtocol, http_protocol_cls: - - async def open_connection(url: str): - try: -- await websockets.client.connect(url) -- except websockets.exceptions.InvalidHandshake: -+ await connect(url) -+ except InvalidHandshake: - return False - return True # pragma: no cover - -@@ -220,8 +222,8 @@ async def test_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProto - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url, extra_headers=[("username", "abraão")]) as websocket: -- return websocket.open -+ async with connect(url, additional_headers=[("username", "abraão")]): -+ return True - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -235,8 +237,9 @@ async def test_extra_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTT - await self.send({"type": "websocket.accept", "headers": [(b"extra", b"header")]}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.response_headers -+ async with connect(url) as websocket: -+ assert websocket.response -+ return websocket.response.headers - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -254,8 +257,8 @@ async def test_path_and_raw_path(ws_protocol_cls: WSProtocol, http_protocol_cls: - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.open -+ async with connect(url): -+ return True - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -272,7 +275,7 @@ async def test_send_text_data_to_client( - await self.send({"type": "websocket.send", "text": "123"}) - - async def get_data(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - return await websocket.recv() - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) -@@ -290,7 +293,7 @@ async def test_send_binary_data_to_client( - await self.send({"type": "websocket.send", "bytes": b"123"}) - - async def get_data(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - return await websocket.recv() - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) -@@ -309,7 +312,7 @@ async def test_send_and_close_connection( - await self.send({"type": "websocket.close"}) - - async def get_data(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - data = await websocket.recv() - is_open = True - try: -@@ -338,7 +341,7 @@ async def test_send_text_data_to_server( - await self.send({"type": "websocket.send", "text": _text}) - - async def send_text(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - await websocket.send("abc") - return await websocket.recv() - -@@ -361,7 +364,7 @@ async def test_send_binary_data_to_server( - await self.send({"type": "websocket.send", "bytes": _bytes}) - - async def send_text(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - await websocket.send(b"abc") - return await websocket.recv() - -@@ -383,7 +386,7 @@ async def test_send_after_protocol_close( - await self.send({"type": "websocket.send", "text": "123"}) - - async def get_data(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - data = await websocket.recv() - is_open = True - try: -@@ -403,14 +406,14 @@ async def test_missing_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls: - async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): - pass - -- async def connect(url: str): -- await websockets.client.connect(url) -+ async def open_connection(url: str): -+ await connect(url) - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- await connect(f"ws://127.0.0.1:{unused_tcp_port}") -- assert exc_info.value.status_code == 500 -+ with pytest.raises(InvalidStatus) as exc_info: -+ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}") -+ assert exc_info.value.response.status_code == 500 - - - async def test_send_before_handshake( -@@ -419,14 +422,14 @@ async def test_send_before_handshake( - async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): - await send({"type": "websocket.send", "text": "123"}) - -- async def connect(url: str): -- await websockets.client.connect(url) -+ async def open_connection(url: str): -+ await connect(url) - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- await connect(f"ws://127.0.0.1:{unused_tcp_port}") -- assert exc_info.value.status_code == 500 -+ with pytest.raises(InvalidStatus) as exc_info: -+ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}") -+ assert exc_info.value.response.status_code == 500 - - - async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): -@@ -436,10 +439,10 @@ async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cl - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -- with pytest.raises(websockets.exceptions.ConnectionClosed): -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -+ with pytest.raises(ConnectionClosed): - _ = await websocket.recv() -- assert websocket.close_code == 1006 -+ assert websocket.protocol.close_code == 1006 - - - async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): -@@ -454,10 +457,10 @@ async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls: - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -- with pytest.raises(websockets.exceptions.ConnectionClosed): -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -+ with pytest.raises(ConnectionClosed): - _ = await websocket.recv() -- assert websocket.close_code == 1006 -+ assert websocket.protocol.close_code == 1006 - - - @pytest.mark.parametrize("code", [None, 1000, 1001]) -@@ -489,13 +492,13 @@ async def test_app_close( - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: - await websocket.ping() - await websocket.send("abc") -- with pytest.raises(websockets.exceptions.ConnectionClosed): -+ with pytest.raises(ConnectionClosed): - await websocket.recv() -- assert websocket.close_code == (code or 1000) -- assert websocket.close_reason == (reason or "") -+ assert websocket.protocol.close_code == (code or 1000) -+ assert websocket.protocol.close_reason == (reason or "") - - - async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int): -@@ -514,7 +517,7 @@ async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTP - break - - async def websocket_session(url: str): -- async with websockets.client.connect(url) as websocket: -+ async with connect(url) as websocket: - await websocket.ping() - await websocket.send("abc") - await websocket.close(code=1001, reason="custom reason") -@@ -551,7 +554,7 @@ async def test_client_connection_lost( - port=unused_tcp_port, - ) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: - websocket.transport.close() - await asyncio.sleep(0.1) - got_disconnect_event_before_shutdown = got_disconnect_event -@@ -579,7 +582,7 @@ async def test_client_connection_lost_on_send( - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): - url = f"ws://127.0.0.1:{unused_tcp_port}" -- async with websockets.client.connect(url): -+ async with connect(url): - await asyncio.sleep(0.1) - disconnect.set() - -@@ -638,11 +641,11 @@ async def test_send_close_on_server_shutdown( - disconnect_message = message - break - -- websocket: websockets.client.WebSocketClientProtocol | None = None -+ websocket: ClientConnection | None = None - - async def websocket_session(uri: str): - nonlocal websocket -- async with websockets.client.connect(uri) as ws_connection: -+ async with connect(uri) as ws_connection: - websocket = ws_connection - await server_shutdown_event.wait() - -@@ -672,9 +675,7 @@ async def test_subprotocols( - await self.send({"type": "websocket.accept", "subprotocol": subprotocol}) - - async def get_subprotocol(url: str): -- async with websockets.client.connect( -- url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")] -- ) as websocket: -+ async with connect(url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")]) as websocket: - return websocket.subprotocol - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) -@@ -684,7 +685,7 @@ async def test_subprotocols( - - - MAX_WS_BYTES = 1024 * 1024 * 16 --MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 1 -+MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 10 - - - @pytest.mark.parametrize( -@@ -727,15 +728,15 @@ async def test_send_binary_data_to_server_bigger_than_default_on_websockets( - port=unused_tcp_port, - ) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws: -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws: - await ws.send(b"\x01" * client_size_sent) - if expected_result == 0: - data = await ws.recv() - assert data == b"\x01" * client_size_sent - else: -- with pytest.raises(websockets.exceptions.ConnectionClosedError): -+ with pytest.raises(ConnectionClosedError): - await ws.recv() -- assert ws.close_code == expected_result -+ assert ws.protocol.close_code == expected_result - - - async def test_server_reject_connection( -@@ -760,10 +761,10 @@ async def test_server_reject_connection( - disconnected_message = await receive() - - async def websocket_session(url: str): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- async with websockets.client.connect(url): -+ with pytest.raises(InvalidStatus) as exc_info: -+ async with connect(url): - pass # pragma: no cover -- assert exc_info.value.status_code == 403 -+ assert exc_info.value.response.status_code == 403 - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -933,10 +934,10 @@ async def test_server_reject_connection_with_invalid_msg( - await send(message) - - async def websocket_session(url: str): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- async with websockets.client.connect(url): -+ with pytest.raises(InvalidStatus) as exc_info: -+ async with connect(url): - pass # pragma: no cover -- assert exc_info.value.status_code == 404 -+ assert exc_info.value.response.status_code == 404 - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -967,10 +968,10 @@ async def test_server_reject_connection_with_missing_body( - # no further message - - async def websocket_session(url: str): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- async with websockets.client.connect(url): -+ with pytest.raises(InvalidStatus) as exc_info: -+ async with connect(url): - pass # pragma: no cover -- assert exc_info.value.status_code == 404 -+ assert exc_info.value.response.status_code == 404 - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -1010,10 +1011,10 @@ async def test_server_multiple_websocket_http_response_start_events( - exception_message = str(exc) - - async def websocket_session(url: str): -- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info: -- async with websockets.client.connect(url): -+ with pytest.raises(InvalidStatus) as exc_info: -+ async with connect(url): - pass # pragma: no cover -- assert exc_info.value.status_code == 404 -+ assert exc_info.value.response.status_code == 404 - - config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -1049,7 +1050,7 @@ async def test_server_can_read_messages_in_buffer_after_close( - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: -+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket: - await websocket.send(b"abc") - await websocket.send(b"abc") - await websocket.send(b"abc") -@@ -1066,8 +1067,9 @@ async def test_default_server_headers( - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.response_headers -+ async with connect(url) as websocket: -+ assert websocket.response -+ return websocket.response.headers - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -1081,8 +1083,9 @@ async def test_no_server_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.response_headers -+ async with connect(url) as websocket: -+ assert websocket.response -+ return websocket.response.headers - - config = Config( - app=App, -@@ -1104,8 +1107,9 @@ async def test_no_date_header_on_wsproto(http_protocol_cls: HTTPProtocol, unused - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.response_headers -+ async with connect(url) as websocket: -+ assert websocket.response -+ return websocket.response.headers - - config = Config( - app=App, -@@ -1136,8 +1140,9 @@ async def test_multiple_server_header( - ) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.response_headers -+ async with connect(url) as websocket: -+ assert websocket.response -+ return websocket.response.headers - - config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port) - async with run_server(config): -@@ -1172,8 +1177,8 @@ async def test_lifespan_state(ws_protocol_cls: WSProtocol, http_protocol_cls: HT - await self.send({"type": "websocket.accept"}) - - async def open_connection(url: str): -- async with websockets.client.connect(url) as websocket: -- return websocket.open -+ async with connect(url): -+ return True - - async def app_wrapper(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable): - if scope["type"] == "lifespan": diff --git a/user/uvicorn/APKBUILD b/user/uvicorn/APKBUILD deleted file mode 100644 index 62d0a4c..0000000 --- a/user/uvicorn/APKBUILD +++ /dev/null @@ -1,55 +0,0 @@ -maintainer="Michał Polański " -pkgname=uvicorn -pkgver=0.34.2 -pkgrel=0 -pkgdesc="Lightning-fast ASGI server" -url="https://www.uvicorn.org/" -license="BSD-3-Clause" -arch="noarch" -depends="py3-click py3-h11" -makedepends="py3-gpep517 py3-hatchling" -checkdepends=" - py3-a2wsgi - py3-dotenv - py3-httptools - py3-httpx - py3-pytest - py3-pytest-mock - py3-pytest-xdist - py3-trustme - py3-typing-extensions - py3-watchfiles - py3-websockets - py3-wsproto - py3-yaml - " -subpackages="$pkgname-pyc" -source="https://github.com/encode/uvicorn/archive/$pkgver/uvicorn-$pkgver.tar.gz - test_multiprocess.patch - 2540_add-websocketssansioprotocol.patch - 2541_bump-wesockets-on-requirements.patch - " - -build() { - gpep517 build-wheel \ - --wheel-dir .dist \ - --output-fd 3 3>&1 >&2 -} - -check() { - python3 -m venv --clear --without-pip --system-site-packages .testenv - .testenv/bin/python3 -m installer .dist/*.whl - .testenv/bin/python3 -m pytest -v -} - -package() { - python3 -m installer -d "$pkgdir" \ - .dist/uvicorn-$pkgver-py3-none-any.whl -} - -sha512sums=" -e8d4dbf182a47431ab9485a8f1072b327c2adb97e4489dcad08835d2759241539971192781cffe4cbb12ff68e70b040e07ad60fe274aa1d62320ad0d63278e64 uvicorn-0.34.2.tar.gz -cfad91dd84f8974362f52d754d7a29f09d07927a46acaa0eb490b6115a5729d84d6df94fead10ccd4cce7f5ea376f1348b0f59daede661dd8373a3851c313c46 test_multiprocess.patch -a3850f030b936c219041266c9ff9050614a5ac6252ff56462c73f2a6114502da460684c10c86f0c5b5054677e89798602ee84cf39c132be6f8bf9946e41f1e79 2540_add-websocketssansioprotocol.patch -b4ef7e63f3fe9e3b499b5a57bb368fcde98c084f5cca42683188c1047d109bdac158e06eeb5a7fb3e61075a1918761c8b0a59a8f7856704bba9234222529de7d 2541_bump-wesockets-on-requirements.patch -" diff --git a/user/uvicorn/test_multiprocess.patch b/user/uvicorn/test_multiprocess.patch deleted file mode 100644 index 231526e..0000000 --- a/user/uvicorn/test_multiprocess.patch +++ /dev/null @@ -1,14 +0,0 @@ -Wait a bit longer, otherwise the workers might -not have time to finish restarting. - ---- a/tests/supervisors/test_multiprocess.py -+++ b/tests/supervisors/test_multiprocess.py -@@ -132,7 +132,7 @@ def test_multiprocess_sighup() -> None: - time.sleep(1) - pids = [p.pid for p in supervisor.processes] - supervisor.signal_queue.append(signal.SIGHUP) -- time.sleep(1) -+ time.sleep(3) - assert pids != [p.pid for p in supervisor.processes] - supervisor.signal_queue.append(signal.SIGINT) - supervisor.join_all() From 8e2f15f24414273094a961b65b6b1f85de7dbafa Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 1 Dec 2025 21:58:50 -0500 Subject: [PATCH 286/313] user/*: disable packages broken on armv7 --- user/papermc-plugin-essentialsx/APKBUILD | 3 ++- user/papermc-plugin-luckperms/APKBUILD | 3 ++- user/papermc-plugin-vault/APKBUILD | 3 ++- user/papermc-plugin-worldedit/APKBUILD | 3 ++- user/papermc-plugin-worldguard/APKBUILD | 3 ++- user/papermc/APKBUILD | 3 ++- user/rmfakecloud/APKBUILD | 3 ++- user/tandoor-recipes/APKBUILD | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/user/papermc-plugin-essentialsx/APKBUILD b/user/papermc-plugin-essentialsx/APKBUILD index 17643a5..51459a5 100644 --- a/user/papermc-plugin-essentialsx/APKBUILD +++ b/user/papermc-plugin-essentialsx/APKBUILD @@ -6,7 +6,8 @@ _gittag=$pkgver pkgrel=0 pkgdesc="EssentialsX is the essential plugin suite for Minecraft servers, with over 130 commands for servers of all size and scale." # blocked by luckperms -#arch='noarch' +# armv7: blocked my openjdk21-jdk +#arch='noarch !armv7' url="https://essentialsx.net/" license="GPL-3.0" depends=" diff --git a/user/papermc-plugin-luckperms/APKBUILD b/user/papermc-plugin-luckperms/APKBUILD index d480f40..6b7a4e4 100644 --- a/user/papermc-plugin-luckperms/APKBUILD +++ b/user/papermc-plugin-luckperms/APKBUILD @@ -6,7 +6,8 @@ _gittag=0fef481d480737528491fc0b3b8487eb1612f955 pkgrel=0 pkgdesc="An advanced permissions plugin for Bukkit/Spigot, BungeeCord and Sponge." # dependency not available upstream anymore -#arch='noarch' +# armv7: blocked by openjdk21-jdk +#arch='noarch !armv7' url="https://github.com/lucko/LuckPerms" license="MIT" depends="papermc>=1.8.8" diff --git a/user/papermc-plugin-vault/APKBUILD b/user/papermc-plugin-vault/APKBUILD index dbb0be1..21897eb 100644 --- a/user/papermc-plugin-vault/APKBUILD +++ b/user/papermc-plugin-vault/APKBUILD @@ -4,7 +4,8 @@ pkgname=papermc-plugin-vault pkgver=1.7.3 pkgrel=0 pkgdesc="Vault of common APIs for Bukkit Plugins" -arch='noarch' +# armv7: blocked by openjdk21-jdk +arch='noarch !armv7' url="https://github.com/MilkBowl/Vault" license="MIT" depends="papermc>=1.8.8" diff --git a/user/papermc-plugin-worldedit/APKBUILD b/user/papermc-plugin-worldedit/APKBUILD index 6949ab5..3962797 100644 --- a/user/papermc-plugin-worldedit/APKBUILD +++ b/user/papermc-plugin-worldedit/APKBUILD @@ -5,7 +5,8 @@ pkgver=7.3.13 _pkgver=$pkgver pkgrel=0 pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" -arch='noarch !aarch64' +# armv7: blocked by openjdk21-jdk +arch='noarch !armv7' url="https://github.com/EngineHub/WorldEdit" license="GPL-3.0" depends="papermc>=1.13.2" diff --git a/user/papermc-plugin-worldguard/APKBUILD b/user/papermc-plugin-worldguard/APKBUILD index 4fb9957..ba13b1d 100644 --- a/user/papermc-plugin-worldguard/APKBUILD +++ b/user/papermc-plugin-worldguard/APKBUILD @@ -5,7 +5,8 @@ pkgver=7.0.13_beta1 _gittag=2f13ae0444409376feb6c7674591142fe854e12e pkgrel=0 pkgdesc="WorldGuard lets you and players guard areas of land against griefers and undesirables" -arch='noarch' +# armv7: blocked by openjdk21-jdk +arch='noarch !armv7' url="https://github.com/EngineHub/WorldGuard" license="GPL-3.0" depends="papermc>=1.17.0" diff --git a/user/papermc/APKBUILD b/user/papermc/APKBUILD index c93d3a2..f6522f5 100644 --- a/user/papermc/APKBUILD +++ b/user/papermc/APKBUILD @@ -5,7 +5,8 @@ pkgver=1.21.4 _gittag=${pkgver/.0} pkgrel=0 pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" -arch='noarch' +# armv7: blocked by openjdk21-jdk +arch='noarch !armv7' url="https://papermc.io/" license='custom' depends='openjdk21-jdk screen sudo bash gawk sed netcat-openbsd' diff --git a/user/rmfakecloud/APKBUILD b/user/rmfakecloud/APKBUILD index d9402ab..e37b955 100644 --- a/user/rmfakecloud/APKBUILD +++ b/user/rmfakecloud/APKBUILD @@ -7,7 +7,8 @@ _gittag=v$pkgver pkgrel=0 pkgdesc="A selfhosted cloud for the Remarkable Tablet" url="https://github.com/ddvk/rmfakecloud" -arch="all" +# armv7: oom +arch="all !armv7" license="AGPL-3.0-only" makedepends="go yarn" options="chmod-clean net" diff --git a/user/tandoor-recipes/APKBUILD b/user/tandoor-recipes/APKBUILD index 75ecd85..8a680e0 100644 --- a/user/tandoor-recipes/APKBUILD +++ b/user/tandoor-recipes/APKBUILD @@ -4,7 +4,8 @@ pkgname=tandoor-recipes pkgver=1.5.12 pkgrel=1 pkgdesc="Application for managing recipes, planning meals, building shopping lists, etc." -arch="noarch" +# armv7: oom +arch="noarch !armv7" url="https://github.com/TandoorRecipes/recipes" license="AGPL-3.0-only" depends=" From 6fceb422547974a56a957efdbea2958e1417b8b4 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 1 Dec 2025 22:03:51 -0500 Subject: [PATCH 287/313] user/papermc-plugin-worldedit: disable due to missing dependencies --- user/papermc-plugin-worldedit/APKBUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/papermc-plugin-worldedit/APKBUILD b/user/papermc-plugin-worldedit/APKBUILD index 3962797..f487664 100644 --- a/user/papermc-plugin-worldedit/APKBUILD +++ b/user/papermc-plugin-worldedit/APKBUILD @@ -5,8 +5,9 @@ pkgver=7.3.13 _pkgver=$pkgver pkgrel=0 pkgdesc="WorldEdit is an easy-to-use in-game Minecraft map editor" +# missingupstream dependencies # armv7: blocked by openjdk21-jdk -arch='noarch !armv7' +#arch='noarch !armv7' url="https://github.com/EngineHub/WorldEdit" license="GPL-3.0" depends="papermc>=1.13.2" From 7ce80a2dd7349a34518c17f9fb85b6d36793eb49 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 1 Dec 2025 22:18:41 -0500 Subject: [PATCH 288/313] ci: add armv7 builder --- .forgejo/workflows/build-armv7.yaml | 54 +++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .forgejo/workflows/build-armv7.yaml diff --git a/.forgejo/workflows/build-armv7.yaml b/.forgejo/workflows/build-armv7.yaml new file mode 100644 index 0000000..aaf4029 --- /dev/null +++ b/.forgejo/workflows/build-armv7.yaml @@ -0,0 +1,54 @@ +on: + pull_request: + types: [ assigned, opened, synchronize, reopened ] + +jobs: + build-armv7: + runs-on: armv7 + container: + image: alpinelinux/alpine-gitlab-ci:latest + env: + CI_PROJECT_DIR: ${{ github.workspace }} + CI_DEBUG_BUILD: ${{ runner.debug }} + CI_MERGE_REQUEST_PROJECT_URL: ${{ github.server_url }}/${{ github.repository }} + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} + steps: + - name: Environment setup + run: | + doas apk upgrade -a + doas apk add nodejs git patch curl + cd /etc/apk/keys + doas curl -JO https://ayakael.net/api/packages/forge/alpine/key + - name: Repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 500 + - name: Package build + run: | + ${{ github.workspace }}/.forgejo/bin/build.sh + touch packages/dummy + - name: Package upload + uses: actions/upload-artifact@v3 + with: + name: package + path: packages + + deploy-armv7: + needs: [build-armv7] + runs-on: armv7 + container: + image: alpine:latest + env: + CI_ALPINE_REPO: 'https://ayakael.net/api/packages/forge/alpine' + CI_MERGE_REQUEST_TARGET_BRANCH_NAME: ${{ github.base_ref }} + FORGE_REPO_TOKEN: ${{ secrets.FORGE_REPO_TOKEN }} + FORGE_REPO_USER: ${{ vars.FORGE_REPO_USER }} + steps: + - name: Setting up environment + run: apk add nodejs curl findutils git gawk + - name: Repo pull + uses: actions/checkout@v4 + - name: Package download + uses: actions/download-artifact@v3 + - name: Package deployment + run: ${{ github.workspace }}/.forgejo/bin/deploy.sh From 16a4ebc1e48dcbe86bee604769387b5565f2ec46 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 8 Dec 2025 09:15:34 -0500 Subject: [PATCH 289/313] ci: track v3.23, drop v3.19 --- .forgejo/workflows/check-community.yml | 6 ++-- .forgejo/workflows/check-main.yml | 43 +++++++++++++------------- .forgejo/workflows/check-pmos.yml | 2 +- .forgejo/workflows/check-testing.yml | 2 +- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index fe1d9ad..a5e81c1 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -25,13 +25,13 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh - check-community-3.22: - name: Check community(3.22) repo + check-community-3.23: + name: Check community(3.23) repo runs-on: aarch64 container: image: alpine:latest env: - downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.23/community ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all -git-annex diff --git a/.forgejo/workflows/check-main.yml b/.forgejo/workflows/check-main.yml index 6730130..276feb5 100644 --- a/.forgejo/workflows/check-main.yml +++ b/.forgejo/workflows/check-main.yml @@ -25,6 +25,27 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-main-3.23: + name: Check main(3.23) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.23/main + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh check-main-3.22: name: Check main(3.22) repo runs-on: aarch64 @@ -88,24 +109,4 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh - check-main-3.19: - name: Check main(3.19) repo - runs-on: aarch64 - container: - image: alpine:latest - env: - downstream: https://dl-cdn.alpinelinux.org/alpine/v3.19/main - ISSUE_TOKEN: ${{ secrets.issue_token }} - LABEL_NUMBER: 13 - fix_only: all - steps: - - name: Environment setup - run: apk add grep coreutils gawk curl wget bash nodejs git jq sed - - name: Get scripts - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - name: Check out-of-date packages - run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - - name: Create issues - run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index 0785667..119383b 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -5,7 +5,7 @@ on: - cron: '0 5 * * *' jobs: - check-community-pmos: + check-pmos-edge: name: Check pmos(edge) repo runs-on: aarch64 container: diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml index a778500..71ad18e 100644 --- a/.forgejo/workflows/check-testing.yml +++ b/.forgejo/workflows/check-testing.yml @@ -5,7 +5,7 @@ on: - cron: '0 5 * * *' jobs: - check-community: + check-testing: name: Check testing repo runs-on: aarch64 container: From cacd6ba22bf06bdf7539edfa954e60942fb08fbc Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 8 Dec 2025 09:25:21 -0500 Subject: [PATCH 290/313] ci: add special rules for tracking dotnet --- .forgejo/bin/check_ver.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index d0a9bc0..aa2665a 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -145,6 +145,12 @@ for pkg in $owned_by_you; do upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1) upstream_version=${upstream_version/-*} ;; + dotnet*-sdk|dotnet*-stage0) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/141853" | jq -r ".stable_versions.[] | match(\"${downstream_version::-2}.*\").string" | head -n 1) + ;; + dotnet*-runtime) + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/220385" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n 1) + ;; # removes last bit in github tag from usbboot release, as not needed raspberrypi-usbboot) curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1 | sed 's|-.*||';; *) From 8791fcb06c90423a6c887f8c25282a76fcbe23ef Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 8 Dec 2025 11:57:42 -0500 Subject: [PATCH 291/313] ci: track arm-trusted-firmware LTS on edge correctly --- .forgejo/bin/check_ver.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index aa2665a..8c3d5bb 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -126,8 +126,14 @@ for pkg in $owned_by_you; do pkg="$pkg(${upstream_version/.*})" fi ;; - # we want to track LTS rather than latest - arm-trusted-firmware) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1);; + # we want to track LTS (even releases) rather than latest + arm-trusted-firmware) + if [[ "$fix_only" == *all* || "$fix_only" == *$pkg* ]] || [[ "$minor_only" == *all* || "$minor_only" == *$pkg* ]]; then + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1) + else + upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[] | select(test("^[0-9]+\\.[0-9]+\\.[0-9]+$")) | select(split(".") | .[1] | tonumber | . % 2 == 0)' | head -n1) + fi + ;; # track linux-pine64-pinenote against latest linux-pine64-pinenote) upstream_version=$(curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/315000" | jq -r ".stable_versions.[] | match(\"${downstream_version%.*}.*\").string" | head -n1) @@ -155,7 +161,7 @@ for pkg in $owned_by_you; do raspberrypi-usbboot) curl --fail -X GET -s -H 'Content-Type: application/json' "https://release-monitoring.org/api/project/Alpine/$pkg" | jq -r '.stable_versions.[]' | head -n1 | sed 's|-.*||';; *) - if [[ "$minor_only" == *all* || "$minor_only" == *$pkg* ]] && [[ "$minor_only" != *-$pkg* ]] then + if [[ "$minor_only" == *all* || "$minor_only" == *$pkg* ]] && [[ "$minor_only" != *-$pkg* ]]; then # continues when package version scheme is not semantic, but minor_only or fix_only is set if ! is_semantic $downstream_version; then echo "$pkg is not semantic, and minor_only is set" From 7be7e19fc9d8ae4754c685fb830bdc8ef5c837fb Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 11 Dec 2025 09:57:27 -0500 Subject: [PATCH 292/313] ci: check_ver can now exclude packages from skip_package when set as all --- .forgejo/bin/check_ver.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh index 8c3d5bb..ee9ed3c 100755 --- a/.forgejo/bin/check_ver.sh +++ b/.forgejo/bin/check_ver.sh @@ -20,7 +20,7 @@ # # optional env variables # ALL_PACKAGES: when true, ignore is package is owned by me -# skip_package: array of packages to skip +# skip_package: array of packages to skip, place a - in front of package name to not exclude it # add_package: array of additional packages to check # @@ -63,7 +63,7 @@ for pkg in $owned_by_you; do downstream_version=${downstream_version/-*} # skip package if in $skip_package array - if [[ "$skip_package" == *$pkg* ]]; then + if [[ "$skip_package" == *all* || "$skip_package" == *$pkg* ]] && [[ "$skip_package" != *-$pkg* ]]; then echo "$pkg skipped" continue fi From 273730b1b9a7ff799e6e8207073f46b7adaa4815 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Thu, 11 Dec 2025 09:58:38 -0500 Subject: [PATCH 293/313] ci: track dotnet8 and 9 on previous releases of Alpine to backport security fixes --- .forgejo/workflows/check-community.yml | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index a5e81c1..9c96c47 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -47,3 +47,70 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-community-3.22: + name: Check community(3.22) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.22/community + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + skip_package: 'all -dotnet8-runtime -dotnet9-runtime' + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-community-3.21: + name: Check community(3.21) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.21/community + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + skip_package: 'all -dotnet8-runtime -dotnet9-runtime' + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-community-3.20: + name: Check community(3.20) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/v3.20/community + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 13 + skip_package: 'all -dotnet8-runtime' + fix_only: all + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + From 55135b73b1338d78e9b61991577d2f59a29e0b83 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 13:10:24 -0500 Subject: [PATCH 294/313] user/rmfakecloud: upgrade to 0.0.27 --- user/rmfakecloud/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/rmfakecloud/APKBUILD b/user/rmfakecloud/APKBUILD index e37b955..d4ecc74 100644 --- a/user/rmfakecloud/APKBUILD +++ b/user/rmfakecloud/APKBUILD @@ -2,7 +2,7 @@ # Contributor: Antoine Martin (ayakael) pkgname=rmfakecloud -pkgver=0.0.24 +pkgver=0.0.27 _gittag=v$pkgver pkgrel=0 pkgdesc="A selfhosted cloud for the Remarkable Tablet" @@ -38,7 +38,7 @@ package() { install -Dm755 "$srcdir"/rmfakecloud.openrc "$pkgdir"/etc/init.d/rmfakecloud } sha512sums=" -c0c96cb9168b8152da3842fac095a6bd33e74b5f7a5cefe72e44853f4059c966336e98cd4c62235f7a2fe625acdd93452f718c19a1bf65f5dd7dbd8bb5cd1f8c rmfakecloud-0.0.24.tar.gz +b215295c8779f9820e9751e5cbfb8804d6cdeb0d71ffaa60d46fd803760e63227352f55a8b5a2e75d990b20a6a19c43a4ffaa03a1857e6fb37990a8b191a3ea2 rmfakecloud-0.0.27.tar.gz d5677cef282085cd6642a034dd258ffa294862aeb0ce81d6485a524a15564849bc4eb90a9d1fa4dbcf4eab69dcd893302aa06493fc8fad74d69200c2bdf246c0 rmfakecloud.conf 891d0945886796132f951293e081046334857563b4ebae28a3aa5b6bc37768767c49ce102de645ed8340af2518de606be8bf6ecafeb6d189dd937970aa3e6498 rmfakecloud.openrc " From ed788403aa5a00c175bc766e7c076cf3e553b965 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 13:24:39 -0500 Subject: [PATCH 295/313] ci: run lint on x86_64 --- .forgejo/workflows/lint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/lint.yaml b/.forgejo/workflows/lint.yaml index ec79090..743cefc 100644 --- a/.forgejo/workflows/lint.yaml +++ b/.forgejo/workflows/lint.yaml @@ -5,7 +5,7 @@ on: jobs: lint: run-name: lint - runs-on: aarch64 + runs-on: x86_64 container: image: alpinelinux/apkbuild-lint-tools:latest env: From 35e7f126cee86a264ab50bb1dc53e99106025985 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:41:04 -0500 Subject: [PATCH 296/313] user/kb: upgrade to 0.1.8 --- user/kb/APKBUILD | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/user/kb/APKBUILD b/user/kb/APKBUILD index a8f9c74..db1d678 100644 --- a/user/kb/APKBUILD +++ b/user/kb/APKBUILD @@ -1,9 +1,8 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=kb -_pkgreal=kb-manager -pkgver=0.1.7 -pkgrel=2 +pkgver=0.1.8 +pkgrel=0 pkgdesc="A command line minimalist knowledge base manager" arch="noarch" url="https://github.com/gnebbia/kb" @@ -11,9 +10,8 @@ license="GPL-3.0-only" depends="py3-attrs py3-colored py3-gitpython py3-toml" makedepends="py3-setuptools py3-gpep517 py3-wheel" checkdepends="py3-pytest-cov" -source="https://files.pythonhosted.org/packages/source/k/kb-manager/kb-manager-$pkgver.tar.gz" +source="$pkgname-$pkgver.tar.gz::https://github.com/gnebbia/kb/archive/refs/tags/v$pkgver.tar.gz" subpackages="$pkgname-pyc" -builddir="$srcdir"/$_pkgreal-$pkgver build() { gpep517 build-wheel \ @@ -30,5 +28,5 @@ package() { .dist/*.whl } sha512sums=" -f0dff69a5e95339ea22d0a9d1260473f7b0b6ace184936896e164172aecb77672e9e0a228159abc95e50f30de2ec9ca5185ffbd825dce87edfec267bc56c75dc kb-manager-0.1.7.tar.gz +95fab9b5baa728795a6ce1e126fe90dd599528bc13f2274c5484dc43bdbca8fd5807e8ed4ec4e9ffa8382c5ec71662022d792e8ae941bd1629ed47c72d87d7a2 kb-0.1.8.tar.gz " From ac2f1855dba851f5c43a7ac7d5dda2ab738459a4 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:49:59 -0500 Subject: [PATCH 297/313] user/calibre-web: upgrade to 0.6.25 --- {unmaintained => user}/calibre-web/APKBUILD | 23 ++++++++++--------- .../calibre-web/calibre-web.conf | 0 .../calibre-web/calibre-web.initd | 0 .../calibre-web/calibre-web.service | 0 .../calibre-web/calibre-web.sysusers | 0 .../calibre-web/calibre-web.tmpfiles | 0 6 files changed, 12 insertions(+), 11 deletions(-) rename {unmaintained => user}/calibre-web/APKBUILD (82%) rename {unmaintained => user}/calibre-web/calibre-web.conf (100%) rename {unmaintained => user}/calibre-web/calibre-web.initd (100%) rename {unmaintained => user}/calibre-web/calibre-web.service (100%) rename {unmaintained => user}/calibre-web/calibre-web.sysusers (100%) rename {unmaintained => user}/calibre-web/calibre-web.tmpfiles (100%) diff --git a/unmaintained/calibre-web/APKBUILD b/user/calibre-web/APKBUILD similarity index 82% rename from unmaintained/calibre-web/APKBUILD rename to user/calibre-web/APKBUILD index df1b79a..37f5ea0 100644 --- a/unmaintained/calibre-web/APKBUILD +++ b/user/calibre-web/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Antoine Martin (ayakael) # Maintainer: Antoine Martin (ayakael) pkgname=calibre-web -pkgver=0.6.21 -pkgrel=1 +pkgver=0.6.25 +pkgrel=0 pkgdesc="Web app for browsing, reading and downloading eBooks stored in a Calibre database" arch='noarch' url="https://github.com/janeczku/calibre-web" @@ -10,26 +10,27 @@ license='GPL-3.0-only' depends=" py3-apscheduler py3-babel - py3-backports_abc - py3-blinker + py3-bleach py3-chardet + py3-cryptography py3-flask-babel - py3-flask-login py3-flask-limiter py3-flask-principal py3-flask-wtf - py3-goodreads - py3-levenshtein - py3-iso639 + py3-flask-httpauth py3-lxml - py3-pypdf2 + py3-magic + py3-netifaces + py3-pypdf + py3-pycountry + py3-regex py3-requests py3-sqlalchemy py3-tornado py3-tz py3-unidecode + py3-urllib3 py3-wand - py3-werkzeug " source=" $pkgname-$pkgver.tar.gz::https://github.com/janeczku/calibre-web/archive/$pkgver.tar.gz @@ -56,7 +57,7 @@ package() { install -D -m 644 "$srcdir"/calibre-web.conf "$pkgdir"/etc/conf.d/calibre-web } sha512sums=" -d2f07eec0b6c9f65e68ae0b72fddd14444eb8be8b0fee997ec7caaa1feebb8a26603844752347547becde501669af5bce69e9eab466a28fd4b10624b65c9afcf calibre-web-0.6.21.tar.gz +878d057613b7f89e57ad536c415bb4dc346d5f8c4ca2660517b68c70c4eefa5358317fe0e917738d468cb003358a0341411155289d952b1aa6cd4a022a84c8f0 calibre-web-0.6.25.tar.gz 4aba825eb12f44eb0912cc6981b46bec9b77ad114627564c9c7585862a099c7d1ff8deec5f15d047319805e2b9a3e2d128b2d1292dd92293a7e72359009a480f calibre-web.conf 62859a8a304216dc0dbfb7f2e8144a50d348c6621f5b292c08aa97a872ada67b52d36b567546fd0f4c439dbefe0bbe0e4fb1e1affbe507278b4a8d36ed3fa2a9 calibre-web.initd " diff --git a/unmaintained/calibre-web/calibre-web.conf b/user/calibre-web/calibre-web.conf similarity index 100% rename from unmaintained/calibre-web/calibre-web.conf rename to user/calibre-web/calibre-web.conf diff --git a/unmaintained/calibre-web/calibre-web.initd b/user/calibre-web/calibre-web.initd similarity index 100% rename from unmaintained/calibre-web/calibre-web.initd rename to user/calibre-web/calibre-web.initd diff --git a/unmaintained/calibre-web/calibre-web.service b/user/calibre-web/calibre-web.service similarity index 100% rename from unmaintained/calibre-web/calibre-web.service rename to user/calibre-web/calibre-web.service diff --git a/unmaintained/calibre-web/calibre-web.sysusers b/user/calibre-web/calibre-web.sysusers similarity index 100% rename from unmaintained/calibre-web/calibre-web.sysusers rename to user/calibre-web/calibre-web.sysusers diff --git a/unmaintained/calibre-web/calibre-web.tmpfiles b/user/calibre-web/calibre-web.tmpfiles similarity index 100% rename from unmaintained/calibre-web/calibre-web.tmpfiles rename to user/calibre-web/calibre-web.tmpfiles From 2e181afd1971ad35af51ed6ac45023c2d81c55bb Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:50:26 -0500 Subject: [PATCH 298/313] backports/py3-flask-httpauth: backport for calibre-web --- backports/py3-flask-httpauth/APKBUILD | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 backports/py3-flask-httpauth/APKBUILD diff --git a/backports/py3-flask-httpauth/APKBUILD b/backports/py3-flask-httpauth/APKBUILD new file mode 100644 index 0000000..7cbc2de --- /dev/null +++ b/backports/py3-flask-httpauth/APKBUILD @@ -0,0 +1,39 @@ +# Contributor: Fabian Affolter +# Maintainer: Fabian Affolter +pkgname=py3-flask-httpauth +pkgver=4.8.0 +pkgrel=3 +pkgdesc="Basic and Digest HTTP authentication for Flask routes" +url="https://pypi.org/project/Flask-HTTPAuth" +arch="noarch" +license="MIT" +depends="py3-flask python3" +makedepends="py3-gpep517 py3-setuptools py3-wheel" +checkdepends="py3-pytest py3-pytest-asyncio py3-asgiref" +subpackages="$pkgname-pyc" +source="https://files.pythonhosted.org/packages/source/F/Flask-HTTPAuth/Flask-HTTPAuth-$pkgver.tar.gz" +builddir="$srcdir"/Flask-HTTPAuth-$pkgver + +replaces="py-flask-httpauth" # Backwards compatibility +provides="py-flask-httpauth=$pkgver-r$pkgrel" # Backwards compatibility + +build() { + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 +} + +check() { + python3 -m venv --clear --without-pip --system-site-packages .testenv + .testenv/bin/python3 -m installer .dist/*.whl + .testenv/bin/python3 -m pytest +} + +package() { + python3 -m installer -d "$pkgdir" \ + .dist/flask_httpauth*.whl +} + +sha512sums=" +15878f45faf6bdde43d7b588539b044d621ba1ba590880e3d0a3bccf4e9bd04b898b3372775e99577b7e7955c4b6d2d7cc80df19ba30415c6b7c1d3183b7e5f4 Flask-HTTPAuth-4.8.0.tar.gz +" From 7ef8cfa070214a5ad293355fe6dbfb31005108ed Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:50:37 -0500 Subject: [PATCH 299/313] backports/py3-flask-limiter: backport for calibre-web --- backports/py3-flask-limiter/APKBUILD | 55 +++++++++++++++++++ .../our-std-is-good-enough.patch | 22 ++++++++ 2 files changed, 77 insertions(+) create mode 100644 backports/py3-flask-limiter/APKBUILD create mode 100644 backports/py3-flask-limiter/our-std-is-good-enough.patch diff --git a/backports/py3-flask-limiter/APKBUILD b/backports/py3-flask-limiter/APKBUILD new file mode 100644 index 0000000..cd15f22 --- /dev/null +++ b/backports/py3-flask-limiter/APKBUILD @@ -0,0 +1,55 @@ +# Contributor: lauren n. liberda +maintainer="lauren n. liberda " +pkgname=py3-flask-limiter +pkgver=3.10.1 +pkgrel=0 +pkgdesc="Rate Limiting extension for Flask" +url="https://github.com/alisaifee/flask-limiter" +arch="noarch" +license="MIT" +depends=" + py3-flask + py3-limits + py3-ordered-set + py3-rich + python3 + " +makedepends="py3-setuptools py3-gpep517" +checkdepends=" + py3-flask-restful + py3-flask-restx + py3-limits-mongodb + py3-limits-redis + py3-pytest + py3-pytest-cov + " +subpackages="$pkgname-pyc" +source=" + https://github.com/alisaifee/flask-limiter/archive/refs/tags/$pkgver/flask-limiter-$pkgver.tar.gz + + our-std-is-good-enough.patch + " +builddir="$srcdir/flask-limiter-$pkgver" +options="!check" # tests depend on unpackaged modules + +build() { + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 +} + +check() { + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest +} + +package() { + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl +} + +sha512sums=" +a0d3af6f93d4283309d6df46ddb7fed4c358bbc712c2bd9e6897362c6d086c395cb9587c3d9da283ad757b574fd8c09d909f3c4b76d02ae8aade3e61dbea6aa0 flask-limiter-3.10.1.tar.gz +1b90e9134076cda249695d5ea741db9d205a2ae452c7d6edfe01eb37a221ce6f64b0e8ddcdbbee9b0e0fb16a28e5eabf14f1c1e41e965c7e3b93ea4f42caf553 our-std-is-good-enough.patch +" diff --git a/backports/py3-flask-limiter/our-std-is-good-enough.patch b/backports/py3-flask-limiter/our-std-is-good-enough.patch new file mode 100644 index 0000000..664143f --- /dev/null +++ b/backports/py3-flask-limiter/our-std-is-good-enough.patch @@ -0,0 +1,22 @@ +--- ./flask_limiter/typing.py.orig ++++ ./flask_limiter/typing.py +@@ -11,7 +11,7 @@ + cast, + ) + +-from typing_extensions import ParamSpec ++from typing import ParamSpec + + R = TypeVar("R") + P = ParamSpec("P") +--- ./flask_limiter/commands.py.orig ++++ ./flask_limiter/commands.py +@@ -14,7 +14,7 @@ + from rich.table import Table + from rich.theme import Theme + from rich.tree import Tree +-from typing_extensions import TypedDict ++from typing import TypedDict + from werkzeug.exceptions import MethodNotAllowed, NotFound + from werkzeug.routing import Rule + From a7a531a637a413f7c5d8838c694e690c6d4feded Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:52:18 -0500 Subject: [PATCH 300/313] user/scantopl: upgrade to 1.0.1 --- user/scantopl/APKBUILD | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/user/scantopl/APKBUILD b/user/scantopl/APKBUILD index dea4f1e..a68b668 100644 --- a/user/scantopl/APKBUILD +++ b/user/scantopl/APKBUILD @@ -1,8 +1,7 @@ -# Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) - +# Maintainer: Antoine Martin (ayakael) pkgname=scantopl -pkgver=1.0.0 +pkgver=1.0.1 pkgrel=0 pkgdesc="Automatically send scanservjs scanned document to paperless-ng" _gittag="v$pkgver" @@ -31,7 +30,7 @@ package() { install -Dm644 "$srcdir"/scantopl.conf "$pkgdir"/etc/conf.d/scantopl } sha512sums=" -d4eca1adc326f1e730ae195bd44f1cf05d404488ce20fd612467c572ea7fa718034bb7b16d3e007976349f6852e83569aa17727dcc61f9e7ab1934995b3bc3e6 scantopl-1.0.0.tar.gz +e5238c4f8e727e80c5c66441e8de5eeb775fdfe05ee85509c942c2516e8996243cd1b72c7c87c8bbee2e0475cc0075244aa28164a746f6e7eded253bcb707ba7 scantopl-1.0.1.tar.gz 8238411fe8881be6690a583a6bfc71e52f3131320f5d92bb36f8af61802980265a8cf5250eb699d9214f7c6c168d14c39867a09587fb07841a8504a6a28db74b scantopl.initd ee2e631901b1d88c0dede6587318e44884255a7c82e090371f017dbb91563c16f0567c0d45b3183d0a8abb3ee4b71a33f3d79258ad2b2f6d8930a5bc7625070a scantopl.conf " From 3d599aff1745c360bec9fe8ff8ec92a327929d73 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 14:53:50 -0500 Subject: [PATCH 301/313] user/scanservjs: upgrade to 3.0.4 --- user/scanservjs/APKBUILD | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/user/scanservjs/APKBUILD b/user/scanservjs/APKBUILD index 4aeb67d..9effbf6 100644 --- a/user/scanservjs/APKBUILD +++ b/user/scanservjs/APKBUILD @@ -1,8 +1,7 @@ -# Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) - +# Maintainer: Antoine Martin (ayakael) pkgname=scanservjs -pkgver=3.0.3 +pkgver=3.0.4 pkgrel=0 pkgdesc="SANE scanner nodejs web ui" arch="noarch" @@ -63,7 +62,7 @@ package() { install -Dm 644 "$srcdir"/scanservjs.conf "$pkgdir"/etc/conf.d/scanservjs } sha512sums=" -e3746cfab118b08b75fe5a862e1b06d35bce3fafe7b5cf482ddfd28aad8ac9879981eef5bdadc35a783607aac49eef95b966ff1d2ddf431eaf6e2d7e335623fb scanservjs-3.0.3.tar.gz +f19b1bd5acb01f82fa98bc79f9d401f1b6c19aa9e4319d75efd4b82a6db44a348784953ae1542d362d3b8e328a1a469e9320fd7c937e6aa102a19a36cd8ce9e8 scanservjs-3.0.4.tar.gz f58dd5e1c4936d7e25065a295f5d01e64189cdefe92ba54fc875348a59a30b2055c93464d510a52820e66b42a69d0626d3513c93ab60b0768e1e8d5b3538bb13 scanservjs.initd 9d4fdab3803a598c729bf703369d8594b383163b05045f31e516f184a87d8deef8c8b40942d324e04bdf751ac9d63f7de25b13364f9f30888eba2af873369b36 scanservjs.conf " From 946a011b61836f9598a82c07a76b4f7d997c0555 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 15:49:12 -0500 Subject: [PATCH 302/313] backports/electron: upgrade to 38.2.7 --- backports/electron/APKBUILD | 14 ++++++++------ .../electron/electron_use-system-yarn.patch | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 backports/electron/electron_use-system-yarn.patch diff --git a/backports/electron/APKBUILD b/backports/electron/APKBUILD index ab1603d..c57c98e 100644 --- a/backports/electron/APKBUILD +++ b/backports/electron/APKBUILD @@ -1,10 +1,10 @@ # Contributor: lauren n. liberda # Maintainer: Antoine Martin (ayakael) pkgname=electron -pkgver=39.2.3 +pkgver=39.2.7 _gittag=v"${pkgver/_beta/-beta.}" pkgrel=0 -_chromium=142.0.7444.175 +_chromium=142.0.7444.235 _copium_tag=142.0 _depot_tools=495b23b39aaba2ca3b55dd27cadc523f1cb17ee6 pkgdesc="Electron cross-platform desktop toolkit" @@ -109,7 +109,7 @@ makedepends=" sqlite-dev woff2-dev xcb-proto - yarn + yarn-berry zlib-dev zstd-dev " @@ -147,6 +147,7 @@ source=" electron_system-zlib-headers.patch electron_do-not-strip-binaries.patch electron_shell-file-dialog-drop-glibc.patch + electron_use-system-yarn.patch default.conf electron.desktop @@ -310,7 +311,7 @@ prepare() { git commit -m "init" git tag "$_gittag" git pack-refs - yarn install --frozen-lockfile --ignore-scripts + yarn install --immutable --mode=skip-build ) ( @@ -490,7 +491,7 @@ _configure() { safe_browsing_use_unrar=false symbol_level=$symbol_level treat_warnings_as_errors=false - se_clang_modules=false + use_clang_modules=false use_custom_libcxx=true use_lld=true use_pulseaudio=true @@ -564,7 +565,7 @@ lang() { } sha512sums=" -7c4c33570bf6c0ff0d1d2606b64e25e9b8f64f399e49dd03632ee712de5551eb7757ac999ff1206d0c70057b4bf0ce535ac228ddbb88ffd9b1585d7abd483266 electron-v39.2.3-142.0.7444.175.tar.zst +6dc7161f6df396e2b7569b0a607e264b43a2d7215de65164dc2ca04c019df93ea0a67dec2490071c09c8a03f90605faaf3880f2d843f838bb5d841bba204c298 electron-v39.2.7-142.0.7444.235.tar.zst 30b298549804e7753b0b639b72417ba081e964676862b6c7d73ad73cdf806883f20e4a4b36e67a6c375eaf2dd97686cf21b90b062400d3b61fba86da4d239bfa copium-142.0.tar.gz 69b45005451ccd69c354b4c2910e92371cb801665f5e300dbecd36f8bc4ce68e77a431b5dac07c0937787debb4e93b7aadefa0a1e76c4ae334d2547ca3ca14ff 0001-hotfix-ignore-a-new-warning-in-rust-1.89.patch dc254dd79e135aeac3e9c03eb055e3bc17980fc213f8c4d8d7921a575be7f9c26b91f110a6dcb01c0a824a7d9375c09f8a61c8858c20c11d79c03f873e2cb3f9 compiler.patch @@ -594,6 +595,7 @@ c7f57929943a86f9e5f333da9d5691da88038770eeb46dd0a0719962c934deb2879f0e7a1ed714e9 4d9287d4cdfe27fbfb7be3d4b26c0c40edbd6a0c3ff926d60f2093ca09c15bcb58e20c2ccc8c0606aafd66c6d25a54225bc329cb056d8c5b297db4c6d0e768e6 electron_system-zlib-headers.patch 7031ddb61a858e95d83366185a53b5a2e4be9abe0aa4957543e0621cad57175ffef31bd87b8be25255184bb4cb30ec4fbced055407c6c8c7940c9e240b25d498 electron_do-not-strip-binaries.patch 0f8f36c21cc50c80e378691265845ff10fa53953d6cd5352fe71efcba489f956e50d374d8f634dadc3569c4901a81a1f308a3e69140c0f9136e0777022b9520f electron_shell-file-dialog-drop-glibc.patch +3fd20144ed171cf9706899a1481141c7fa3e98b17d600cdc5a3a68ba39059cebd9e5ccb5534af3e262f689df381bc3cb630ac24e46dd6f6c72eac4f4b6b14b35 electron_use-system-yarn.patch e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e default.conf 191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463 electron.desktop 5f7ba5ad005f196facec1c0f26108356b64cafb1e5cfa462ff714a33b8a4c757ac00bfcb080da09eb5b65032f8eb245d9676a61ec554515d125ed63912708648 electron-launcher.sh diff --git a/backports/electron/electron_use-system-yarn.patch b/backports/electron/electron_use-system-yarn.patch new file mode 100644 index 0000000..eaa8a8c --- /dev/null +++ b/backports/electron/electron_use-system-yarn.patch @@ -0,0 +1,17 @@ +diff --git a/electron/.yarnrc.yml.orig b/electron/.yarnrc.yml +index ca0a580..a388ff9 100644 +--- a/electron/.yarnrc.yml.orig ++++ b/electron/.yarnrc.yml +@@ -1,12 +1,3 @@ + enableScripts: false + +-nmHoistingLimits: workspaces +- + nodeLinker: node-modules +- +-npmMinimalAgeGate: 10080 +- +-npmPreapprovedPackages: +- - "@electron/*" +- +-yarnPath: .yarn/releases/yarn-4.12.0.cjs From 094222021c509f68055bc9610c8a3c04671734f3 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 15:49:48 -0500 Subject: [PATCH 303/313] backports/yarn-berry: backport for electron --- backports/electron/yarn-berry/APKBUILD | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backports/electron/yarn-berry/APKBUILD diff --git a/backports/electron/yarn-berry/APKBUILD b/backports/electron/yarn-berry/APKBUILD new file mode 100644 index 0000000..715d16c --- /dev/null +++ b/backports/electron/yarn-berry/APKBUILD @@ -0,0 +1,33 @@ +maintainer="Fabricio Silva " +pkgname=yarn-berry +pkgver=4.9.1 +pkgrel=0 +pkgdesc="Fast, reliable, and secure dependency management for Node.js - Active development version" +url="https://yarnpkg.com/" +license="BSD-2-Clause" +arch="noarch" +depends="!yarn nodejs" # not backward compatible with yarn classic (v1) +source="$pkgname-$pkgver.tgz::https://registry.npmjs.org/@yarnpkg/cli-dist/-/cli-dist-$pkgver.tgz" +builddir="$srcdir/package" +replaces="yarn" + +check() { + ./bin/yarn.js --version + ./bin/yarn.js --help +} + +package() { + local destdir="usr/share/node_modules/@yarnpkg/cli-dist" + + mkdir -p "$pkgdir"/$destdir/bin + install -Dm0644 package.json -t "$pkgdir"/$destdir + install -Dm0755 bin/yarn.js -t "$pkgdir"/$destdir/bin + + mkdir -p "$pkgdir"/usr/bin + ln -s ../share/node_modules/@yarnpkg/cli-dist/bin/yarn.js "$pkgdir"/usr/bin/yarn + ln -s yarn "$pkgdir"/usr/bin/yarnpkg +} + +sha512sums=" +cae0bcb10349af010b472ef7fa1023c33c0afd60a54dc29d18797e6bb771bd6c0d3d06aefa801c56363bcc6ecf6133988d1f943543293e7335ede60618fb28e8 yarn-berry-4.9.1.tgz +" From 7a023d00241f6d6ec489d87d5e653913eb37c902 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 15:44:17 -0500 Subject: [PATCH 304/313] user/papermc: upgrade to 1.21.7 --- user/papermc/APKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/papermc/APKBUILD b/user/papermc/APKBUILD index f6522f5..f4a7f7b 100644 --- a/user/papermc/APKBUILD +++ b/user/papermc/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Antoine Martin (ayakael) # Contributor: Antoine Martin (ayakael) pkgname=papermc -pkgver=1.21.4 +pkgver=1.21.7 _gittag=${pkgver/.0} pkgrel=0 pkgdesc="Next generation of Minecraft server, compatible with Spigot plugins and offering uncompromising performance" @@ -44,7 +44,7 @@ package() { chmod g+ws "$pkgdir"/var/lib/$pkgname } sha512sums=" -5e815c4ee4f9d99ecb173d2b81131d0531359f1d2d48dee429476a7b39c37140fe2085d9a657435e347ca1bc5930402bac1a533692cd8387811b2577384c827b papermc-1.21.4.tar.zst +90c3017f7e4031816f6d4e30612a88d7b15d9e99cfb4e887b868e3d0d55ec5db0e9e71dc433dd399959da9b099e7fc4fd3768635ccabcce84d1adfc48837309a papermc-1.21.7.tar.zst c5d1bf85ceb74162aaaf2bcd2d06dc2e3dd2e37c39f0cee2be7c8dbff9970a6aff1e48a43e6d1e83e6a0ac610bd89f62b1279bf27b64afa88d9831a36aebbd3e papermc.initd 9b8e267428731ee9255f82a93f1e8674d7e917a0f154bd395cd2280a49aa248a4b8427520b08dbb4b3a74a5471dac0e439eedc8ab94bf2e53bb8d411d2d8a789 papermc.conf 943ba0d4c10173246bdc6497dcedd54da0788f966841c8d3381398711d79f8d5eb07a24ce28f519b6f24f59d99fa9e74bc6bb882059f343df4eeda5de3660ac7 papermc.sh From 5a29004820ccebd980edebd6827174748f353ef3 Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 16:06:10 -0500 Subject: [PATCH 305/313] backports/py3-limits: backport for py3-flask-limiter --- backports/py3-limits/APKBUILD | 58 +++++++++++++++++++ .../py3-limits/our-std-is-good-enough.patch | 11 ++++ .../tests-drop-etcd3-and-k-argument.patch | 24 ++++++++ 3 files changed, 93 insertions(+) create mode 100644 backports/py3-limits/APKBUILD create mode 100644 backports/py3-limits/our-std-is-good-enough.patch create mode 100644 backports/py3-limits/tests-drop-etcd3-and-k-argument.patch diff --git a/backports/py3-limits/APKBUILD b/backports/py3-limits/APKBUILD new file mode 100644 index 0000000..af4516d --- /dev/null +++ b/backports/py3-limits/APKBUILD @@ -0,0 +1,58 @@ +# Contributor: lauren n. liberda +# Maintainer: lauren n. liberda +pkgname=py3-limits +pkgver=3.14.1 +pkgrel=0 +pkgdesc="Rate limiting using various strategies and storage backends such as redis & memcached" +url="https://github.com/alisaifee/limits" +arch="noarch" +license="MIT" +depends=" + py3-deprecated + python3 + " +makedepends="py3-setuptools py3-gpep517" +checkdepends=" + py3-flaky + py3-mongo + py3-pytest + py3-pytest-asyncio + py3-pytest-benchmark + py3-pytest-cov + py3-pytest-lazy-fixtures + py3-pymemcache + py3-redis + " +subpackages="$pkgname-pyc" +source=" + https://github.com/alisaifee/limits/archive/refs/tags/$pkgver/limits-$pkgver.tar.gz + + our-std-is-good-enough.patch + tests-drop-etcd3-and-k-argument.patch + " +builddir="$srcdir/limits-$pkgver" + +build() { + gpep517 build-wheel \ + --wheel-dir .dist \ + --output-fd 3 3>&1 >&2 +} + +check() { + python3 -m venv --clear --without-pip --system-site-packages .testenv + gpep517 install-wheel --destdir .testenv --prefix '' .dist/*.whl + .testenv/bin/python3 -m pytest -W ignore::DeprecationWarning \ + -m 'not benchmark and not etcd and not integration and not memcached' \ + -k 'not aio and not Storage and not strategy' -v +} + +package() { + gpep517 install-wheel --destdir "$pkgdir" \ + .dist/*.whl +} + +sha512sums=" +f30c7ec19c2d1edad9ed77dc590ae35717efa3956a4d97e465793e1923a4af08dc9921d90ee95d3c54ce3364b867ca67a9de62c61d627e07a3f50da20bdabd0f limits-3.14.1.tar.gz +271e3b0501f9f144eda8d2e96c93b285714e339b9217385e38cdbce1f4dec88f9c949e9419f8be94885092e7977f7dca29b86b5499e9fead678b42a686c337db our-std-is-good-enough.patch +e84f4db49349a6feba0f701b9d4357c5f66d64c4a23f8ce512528b0f44b5bbef55041c02d92aae3a4cc8d5340846f9e909217beb869a5aeb49df166dd29ae9e3 tests-drop-etcd3-and-k-argument.patch +" diff --git a/backports/py3-limits/our-std-is-good-enough.patch b/backports/py3-limits/our-std-is-good-enough.patch new file mode 100644 index 0000000..32d7d73 --- /dev/null +++ b/backports/py3-limits/our-std-is-good-enough.patch @@ -0,0 +1,11 @@ +--- ./limits/typing.py.orig ++++ ./limits/typing.py +@@ -13,7 +13,7 @@ + Union, + ) + +-from typing_extensions import ClassVar, Counter, ParamSpec, Protocol, TypeAlias ++from typing import ClassVar, Counter, ParamSpec, Protocol, TypeAlias + + Serializable = Union[int, str, float] + diff --git a/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch b/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch new file mode 100644 index 0000000..cab3a06 --- /dev/null +++ b/backports/py3-limits/tests-drop-etcd3-and-k-argument.patch @@ -0,0 +1,24 @@ +diff --git a/tests/conftest.py.orig b/tests/conftest.py +index 2aeb758dda6..a9b2b8b2bd1 100644 +--- a/tests/conftest.py.orig ++++ b/tests/conftest.py +@@ -3,7 +3,6 @@ import platform + import socket + import time + +-import etcd3 + import pymemcache + import pymemcache.client + import pymongo +diff --git a/pytest.ini.orig b/pytest.ini +index 38c40a713d0..8c6659e21c2 100644 +--- a/pytest.ini.orig ++++ b/pytest.ini +@@ -17,7 +17,6 @@ addopts = + -rfEsxX + --cov=limits + -m "not benchmark" +- -K + filterwarnings = + error + module::ResourceWarning From 839fa112c7c7028fccfda99c7650f8797041bdca Mon Sep 17 00:00:00 2001 From: ayakael Date: Mon, 15 Dec 2025 16:07:26 -0500 Subject: [PATCH 306/313] backports/yarn-berry: move to correct dir --- backports/{electron => }/yarn-berry/APKBUILD | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backports/{electron => }/yarn-berry/APKBUILD (100%) diff --git a/backports/electron/yarn-berry/APKBUILD b/backports/yarn-berry/APKBUILD similarity index 100% rename from backports/electron/yarn-berry/APKBUILD rename to backports/yarn-berry/APKBUILD From 88d7b4e8c7b855b3f5b439aa5d28212349b85970 Mon Sep 17 00:00:00 2001 From: ayakael Date: Tue, 16 Dec 2025 13:34:44 -0500 Subject: [PATCH 307/313] user/filebrowser: new aport --- user/filebrowser/APKBUILD | 53 + user/filebrowser/filebrowser.openrc | 30 + user/filebrowser/filebrowser.post-upgrade | 1 + user/filebrowser/filebrowser.pre-install | 47 + user/filebrowser/frontend-package-lock.json | 7568 +++++++++++++++++++ 5 files changed, 7699 insertions(+) create mode 100644 user/filebrowser/APKBUILD create mode 100644 user/filebrowser/filebrowser.openrc create mode 120000 user/filebrowser/filebrowser.post-upgrade create mode 100644 user/filebrowser/filebrowser.pre-install create mode 100644 user/filebrowser/frontend-package-lock.json diff --git a/user/filebrowser/APKBUILD b/user/filebrowser/APKBUILD new file mode 100644 index 0000000..7ff2627 --- /dev/null +++ b/user/filebrowser/APKBUILD @@ -0,0 +1,53 @@ +# Maintainer: Antoine Martin (ayakael) +pkgname=filebrowser +pkgver=1.0.3 +_gittag="v$pkgver-stable" +pkgrel=0 +pkgdesc="Standalone web file manager" +arch="all" +url="https://github.com/gtsteffaniak/filebrowser" +license="Apache-2.0" +depends="libcap-setcap" +makedepends="go nodejs npm" +source=" + $pkgname-$_gittag.tar.gz::https://github.com/gtsteffaniak/filebrowser/archive/refs/tags/$_gittag.tar.gz + frontend-package-lock.json + filebrowser.openrc + " +builddir="$srcdir"/$pkgname-${_gittag/v} +options="!check" # TODO: setup test suite +subpackages="$pkgname-openrc" +install="$pkgname.pre-install $pkgname.post-upgrade" + +prepare() { + default_prepare + ( + cd "$builddir"/frontend + cp "$srcdir"/frontend-package-lock.json package-lock.json + npm ci + ) +} + +build() { + ( + cd "$builddir"/frontend + npm run build + ) + ( + cd "$builddir"/backend + go build -o filebrowser \ + --ldflags="-w -s -X 'github.com/gtsteffaniak/filebrowser/backend/common/version.CommitSHA=production' \ + -X 'github.com/gtsteffaniak/filebrowser/backend/common/version.Version=$pkgver'" + ) +} + +package() { + install -Dm755 "$builddir"/backend/filebrowser "$pkgdir"/usr/bin/filebrowser + install -Dm755 "$srcdir"/filebrowser.openrc "$pkgdir"/etc/init.d/filebrowser + install -Dm644 "$builddir"/frontend/public/config.generated.yaml "$pkgdir"/etc/filebrowser/filebrowser.yaml +} +sha512sums=" +7919d391e45c7a88bcbff61f6d63963fe559afe21170c2940ae7895e6b794ce68af0742d4ce81584437b14e603a4ff8b95fb1fb16d72a032a40b76986ed8981b filebrowser-v1.0.3-stable.tar.gz +4ffe0c2ae7d6d972950fb38c9c777c20e3f507da6b4562231e09843b3ae618362ffdfbaf6dbb60959b3811c1856eb326d608e9d32e236bac405c65974e6e1e50 frontend-package-lock.json +06319bc67b088b5ffdad01a575691d82c5319730b4e46975bfc09ebb7466d6913eaca73e93f8db7b8c8bc374e6b9e35634ff1a69e701d24a5d2eae444de6bdf7 filebrowser.openrc +" diff --git a/user/filebrowser/filebrowser.openrc b/user/filebrowser/filebrowser.openrc new file mode 100644 index 0000000..3282368 --- /dev/null +++ b/user/filebrowser/filebrowser.openrc @@ -0,0 +1,30 @@ +#!/sbin/openrc-run + +description="File browser for ${RC_SVCNAME/*.}" +supervisor=supervise-daemon +respawn_max=0 +respawn_delay=10 + + +# Change $directory to path to middleware scripts +directory=${directory:-/var/lib/${RC_SVCNAME/.*}/${RC_SVCNAME/*.}} +pidfile=${pidfile:-/run/$RC_SVCNAME.pid} + +log_dir="/var/log/${RC_SVCNAME/.*}/" +logfile=${logfile:-$log_dir/${RC_SVCNAME/*.}.log} +output_log="${output_log:-$logfile}" +error_log="${error_log:-$logfile}" + +command=${command:-/usr/bin/filebrowser} +command_args="-c /etc/filebrowser/${RC_SVCNAME/*.}.yaml" +command_user=${command_user:-filebrowser:filebrowser} +command_background=true + +depend() { + need net +} + +start_pre() { + checkpath --owner=$command_user --directory $log_dir /var/lib/filebrowser $directory + cd $directory +} diff --git a/user/filebrowser/filebrowser.post-upgrade b/user/filebrowser/filebrowser.post-upgrade new file mode 120000 index 0000000..85089dd --- /dev/null +++ b/user/filebrowser/filebrowser.post-upgrade @@ -0,0 +1 @@ +filebrowser.pre-install \ No newline at end of file diff --git a/user/filebrowser/filebrowser.pre-install b/user/filebrowser/filebrowser.pre-install new file mode 100644 index 0000000..b79bd82 --- /dev/null +++ b/user/filebrowser/filebrowser.pre-install @@ -0,0 +1,47 @@ +#!/bin/sh + +setcap 'cap_net_bind_service=+ep' /usr/bin/filebrowser + +if [ "${0##*.}" = 'pre-install' ]; then + cat >&2 <<-EOF + +1. Generate filebrowser config file + + cd /etc/filebrowser + filebrowser setup + +2. Rename config.yaml to $service.yaml (i.e. movies.yaml) and adjust as desired (see https://filebrowserquantum.com/en/docs/configuration/configuration-overview/ for more information) +3. Create symbolic link for service file, enable, and start + + ln -s /etc/init.d/filebrowser /etc/init.d/filebrowser.$service + rc-update add filebrowser.$service + service filebrowser.$service + +You should now be able to go to http://ip-address:port (default 80) + +For more documentation, go to https://filebrowserquantum.com/en/docs + + EOF + + if ! getent group filebrowser 1>/dev/null; then + echo 'Creating group filebrowser' 1>&2 + + addgroup -S filebrowser + fi + + if ! id filebrowser 2>/dev/null 1>&2; then + echo 'Creating user filebrowser' 1>&2 + + adduser -DHS -G filebrowser -h "$DATADIR" -s /bin/sh \ + -g "added by apk for filebrowser" filebrowser + passwd -u filebrowser 1>/dev/null # unlock + fi + + if ! id -Gn filebrowser | grep -Fq www-data; then + echo 'Adding user filebrowser to group www-data' 1>&2 + + addgroup filebrowser www-data + fi + + exit 0 +fi diff --git a/user/filebrowser/frontend-package-lock.json b/user/filebrowser/frontend-package-lock.json new file mode 100644 index 0000000..fca845b --- /dev/null +++ b/user/filebrowser/frontend-package-lock.json @@ -0,0 +1,7568 @@ +{ + "name": "filebrowser-frontend", + "version": "3.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "filebrowser-frontend", + "version": "3.0.0", + "dependencies": { + "@onlyoffice/document-editor-vue": "^1.4.0", + "@skjnldsv/vue-plyr": "^7.5.0", + "ace-builds": "^1.24.2", + "axios": "^1.7.9", + "clipboard": "^2.0.4", + "css-vars-ponyfill": "^2.4.3", + "dompurify": "^3.2.4", + "epubjs": "^0.3.93", + "file-loader": "^6.2.0", + "glob": "^9.3.5", + "highlight.js": "^11.11.1", + "mammoth": "^1.9.1", + "marked": "^15.0.6", + "normalize.css": "^8.0.1", + "qrcode.vue": "^3.4.1", + "srt-support-for-html5-videos": "^2.6.11", + "vue": "^3.4.21", + "vue-i18n": "^9.10.2", + "vue-lazyload": "^3.0.0", + "vue-router": "^4.3.0" + }, + "devDependencies": { + "@intlify/eslint-plugin-vue-i18n": "^3.2.0", + "@intlify/unplugin-vue-i18n": "^4.0.0", + "@playwright/test": "^1.54.1", + "@types/node": "^24.1.0", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/eslint-config-typescript": "^13.0.0", + "deepl-node": "^1.18.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-vue": "^9.24.0", + "fs-extra": "^11.3.0", + "jsdom": "^25.0.1", + "vite": "^6.2.0", + "vite-plugin-checker": "^0.10.3", + "vite-plugin-compression2": "^1.0.0", + "vitest": "^3.0.7", + "vue-tsc": "^2.0.7" + }, + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@intlify/bundle-utils": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-8.0.0.tgz", + "integrity": "sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "^9.4.0", + "@intlify/shared": "^9.4.0", + "acorn": "^8.8.2", + "escodegen": "^2.1.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core-base": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz", + "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.14.5", + "@intlify/shared": "9.14.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/eslint-plugin-vue-i18n": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-3.2.0.tgz", + "integrity": "sha512-TOIrD4tJE48WMyVIB8bNeQJJPYo1Prpqnm9Xpn1UZmcqlELhm8hmP8QyJnkgesfbG7hyiX/kvo63W7ClEQmhpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/eslintrc": "^3.0.0", + "@intlify/core-base": "^9.12.0", + "@intlify/message-compiler": "^9.12.0", + "debug": "^4.3.4", + "eslint-compat-utils": "^0.6.0", + "glob": "^10.3.3", + "globals": "^15.0.0", + "ignore": "^6.0.0", + "import-fresh": "^3.3.0", + "is-language-code": "^3.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "jsonc-eslint-parser": "^2.3.0", + "lodash": "^4.17.21", + "parse5": "^7.1.2", + "semver": "^7.5.4", + "synckit": "^0.9.0", + "vue-eslint-parser": "^9.3.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0-0" + } + }, + "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", + "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.14.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz", + "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-4.0.0.tgz", + "integrity": "sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/bundle-utils": "^8.0.0", + "@intlify/shared": "^9.4.0", + "@rollup/pluginutils": "^5.1.0", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@onlyoffice/document-editor-vue": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@onlyoffice/document-editor-vue/-/document-editor-vue-1.6.1.tgz", + "integrity": "sha512-sdU7h684ESSdXvGNDcMf73UmToiZGMVO5QRIazTmGfm+bKOnT5ildomeagYFdnQaHQH0J28EJqc4jqXOcQbicA==", + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@playwright/test": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", + "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", + "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz", + "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz", + "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz", + "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz", + "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz", + "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz", + "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz", + "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz", + "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz", + "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz", + "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz", + "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz", + "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", + "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz", + "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz", + "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz", + "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@skjnldsv/vue-plyr": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@skjnldsv/vue-plyr/-/vue-plyr-7.5.0.tgz", + "integrity": "sha512-JmbKPe8Eh0yTP+7w4VYeqGhrUqDKM4qSsCn37CbADAvvwMvceBwYC0IBXil0RBtyzStxwXPtOj1oI//lQ5DeTw==", + "license": "MIT", + "dependencies": { + "plyr": "^3.7.8", + "vue": "^3.3.4" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0", + "npm": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/localforage": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", + "integrity": "sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==", + "deprecated": "This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed!", + "license": "MIT", + "dependencies": { + "localforage": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": ">=4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/ace-builds": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.5.tgz", + "integrity": "sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==", + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.8.tgz", + "integrity": "sha512-Y1fOuNDowLfgKOypdc9SPABfoWXuZHBOyCS4cD52IeZBhr4Md6CLLs6atcxVrzRmQ06E7hSlm5bHHApPKR/byA==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT", + "peer": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "license": "MIT", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-vars-ponyfill": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/css-vars-ponyfill/-/css-vars-ponyfill-2.4.9.tgz", + "integrity": "sha512-aZyLue5bdiGVNCiCclNjo123D8I7kyoYNUaAvz+H1JalX1ye4Ilz7jNRRH5YbM+dYD6ucejiydGwk7lol/GCXQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.2", + "get-css-data": "^2.0.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/custom-event-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", + "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepl-node": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/deepl-node/-/deepl-node-1.24.0.tgz", + "integrity": "sha512-vZ9jUpzJRvFamgVOfm1LDy3YYJ7k8FhxtAX9whR92EFshLIP9JlYS0HFwXL5yYsfqzXdb/wssGRSWvR48t7nSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=12.0", + "adm-zip": "^0.5.16", + "axios": "^1.7.4", + "form-data": "^3.0.0", + "loglevel": ">=1.6.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/deepl-node/node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "license": "MIT" + }, + "node_modules/dingbat-to-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz", + "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==", + "license": "BSD-2-Clause" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/duck": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/duck/-/duck-0.1.12.tgz", + "integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==", + "license": "BSD", + "dependencies": { + "underscore": "^1.13.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/epubjs": { + "version": "0.3.93", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", + "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", + "license": "BSD-2-Clause", + "dependencies": { + "@types/localforage": "0.0.34", + "@xmldom/xmldom": "^0.7.5", + "core-js": "^3.18.3", + "event-emitter": "^0.3.5", + "jszip": "^3.7.1", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "marks-pane": "^1.0.9", + "path-webpack": "0.0.3" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-css-data": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-css-data/-/get-css-data-2.1.1.tgz", + "integrity": "sha512-JpMa/f5P4mDXKg6l5/2cHL5xNY77Jap7tHyduMa6BF0E2a7bQ6Tvaz2BIMjeVYZYLcmOZ5w2Ro0yVJEI41tMbw==", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "license": "MIT", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-language-code": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-language-code/-/is-language-code-3.1.0.tgz", + "integrity": "sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.14.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loadjs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.3.0.tgz", + "integrity": "sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==", + "license": "MIT" + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lop": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/lop/-/lop-0.4.2.tgz", + "integrity": "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==", + "license": "BSD-2-Clause", + "dependencies": { + "duck": "^0.1.12", + "option": "~0.2.1", + "underscore": "^1.13.1" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mammoth": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.11.0.tgz", + "integrity": "sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==", + "license": "BSD-2-Clause", + "dependencies": { + "@xmldom/xmldom": "^0.8.6", + "argparse": "~1.0.3", + "base64-js": "^1.5.1", + "bluebird": "~3.4.0", + "dingbat-to-unicode": "^1.0.1", + "jszip": "^3.7.1", + "lop": "^0.4.2", + "path-is-absolute": "^1.0.0", + "underscore": "^1.13.1", + "xmlbuilder": "^10.0.0" + }, + "bin": { + "mammoth": "bin/mammoth" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mammoth/node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mammoth/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marks-pane": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.9.tgz", + "integrity": "sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT", + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT", + "peer": true + }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/option": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz", + "integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==", + "license": "BSD-2-Clause" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-webpack": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/path-webpack/-/path-webpack-0.0.3.tgz", + "integrity": "sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/playwright": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/plyr": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/plyr/-/plyr-3.8.3.tgz", + "integrity": "sha512-0+iI5uw0WRvtKBpgPCkmQQv7ucHVQKTEo6UFJjgJ8cy/JZhy0dQqshHQVitHXV6l2O3MzhgnuvQ95VSkWcWeSw==", + "license": "MIT", + "dependencies": { + "core-js": "^3.45.1", + "custom-event-polyfill": "^1.0.7", + "loadjs": "^4.3.0", + "rangetouch": "^2.0.1", + "url-polyfill": "^1.1.13" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.vue": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.6.0.tgz", + "integrity": "sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rangetouch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz", + "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", + "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.5", + "@rollup/rollup-android-arm64": "4.53.5", + "@rollup/rollup-darwin-arm64": "4.53.5", + "@rollup/rollup-darwin-x64": "4.53.5", + "@rollup/rollup-freebsd-arm64": "4.53.5", + "@rollup/rollup-freebsd-x64": "4.53.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.5", + "@rollup/rollup-linux-arm-musleabihf": "4.53.5", + "@rollup/rollup-linux-arm64-gnu": "4.53.5", + "@rollup/rollup-linux-arm64-musl": "4.53.5", + "@rollup/rollup-linux-loong64-gnu": "4.53.5", + "@rollup/rollup-linux-ppc64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-musl": "4.53.5", + "@rollup/rollup-linux-s390x-gnu": "4.53.5", + "@rollup/rollup-linux-x64-gnu": "4.53.5", + "@rollup/rollup-linux-x64-musl": "4.53.5", + "@rollup/rollup-openharmony-arm64": "4.53.5", + "@rollup/rollup-win32-arm64-msvc": "4.53.5", + "@rollup/rollup-win32-ia32-msvc": "4.53.5", + "@rollup/rollup-win32-x64-gnu": "4.53.5", + "@rollup/rollup-win32-x64-msvc": "4.53.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srt-support-for-html5-videos": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/srt-support-for-html5-videos/-/srt-support-for-html5-videos-2.6.11.tgz", + "integrity": "sha512-rHsP8iaE7vwhPHpaJPj178YZn6ak1jZvjtEA+XrRm9hhOfC3KZVK/TdNyZIi+fBFtSC+EkscWkyNFKiMuLE4IQ==" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", + "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-mini": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tar-mini/-/tar-mini-0.2.0.tgz", + "integrity": "sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-polyfill": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.14.tgz", + "integrity": "sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-checker": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.10.3.tgz", + "integrity": "sha512-f4sekUcDPF+T+GdbbE8idb1i2YplBAoH+SfRS0e/WRBWb2rYb1Jf5Pimll0Rj+3JgIYWwG2K5LtBPCXxoibkLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", + "strip-ansi": "^7.1.0", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.14", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=7", + "meow": "^13.2.0", + "optionator": "^0.9.4", + "stylelint": ">=16", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.10 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/vite-plugin-compression2": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-compression2/-/vite-plugin-compression2-1.4.0.tgz", + "integrity": "sha512-UEk0Bq1IkkwqbDLoLOHZ8WTmN1QbvR28fvNl2liB88/6SG1oLrTVkxfjqW3pdla/rKQ6QXn+pJpv3GBbl+k56g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "tar-mini": "^0.2.0" + }, + "peerDependencies": { + "vite": "^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-i18n": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz", + "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "9.14.5", + "@intlify/shared": "9.14.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-lazyload": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-3.0.0.tgz", + "integrity": "sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==", + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.104.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.0.tgz", + "integrity": "sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT", + "peer": true + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From e14a8dc1e62f022fe8c7e5f2101ddaef5eaadb85 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 16 Dec 2025 16:27:31 -0500 Subject: [PATCH 308/313] ci: check backports of v3.23 --- .forgejo/workflows/check-backports.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml index f1d016d..99bb71d 100644 --- a/.forgejo/workflows/check-backports.yml +++ b/.forgejo/workflows/check-backports.yml @@ -11,7 +11,7 @@ jobs: container: image: alpine:latest env: - downstream: https://ayakael.net/api/packages/forge/alpine/v3.22/backports + downstream: https://ayakael.net/api/packages/forge/alpine/v3.23/backports ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 1 ALL_PACKAGES: true From dfd170283552b8e045522a00cd0d67db92097f39 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 16 Dec 2025 21:17:59 -0500 Subject: [PATCH 309/313] ci: skip dotnet10-stage0 for community --- .forgejo/workflows/check-community.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml index 9c96c47..ee6d624 100644 --- a/.forgejo/workflows/check-community.yml +++ b/.forgejo/workflows/check-community.yml @@ -35,7 +35,7 @@ jobs: ISSUE_TOKEN: ${{ secrets.issue_token }} LABEL_NUMBER: 13 fix_only: all -git-annex - skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore + skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore dotnet10-stage0 steps: - name: Environment setup run: apk add grep coreutils gawk curl wget bash nodejs git jq sed From 206336bdd1bfcc95888d59ac235bb66d5c9f0924 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 22 Dec 2025 00:05:59 -0500 Subject: [PATCH 310/313] ci: track latest stable for pmos --- .forgejo/workflows/check-pmos.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index 119383b..4b83e93 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -26,3 +26,25 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh + check-pmos-edge: + name: Check pmos(v25.12) repo + runs-on: aarch64 + container: + image: alpine:latest + env: + downstream: http://mirror.postmarketos.org/postmarketos/v25.12 + ISSUE_TOKEN: ${{ secrets.issue_token }} + LABEL_NUMBER: 14 + fix_only: all + skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote u-boot-radxa-cm5 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh From 797de7c2a9535f54ee3326029ef51f884a67a238 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 22 Dec 2025 00:06:56 -0500 Subject: [PATCH 311/313] ci: fix pmos check --- .forgejo/workflows/check-pmos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/check-pmos.yml b/.forgejo/workflows/check-pmos.yml index 4b83e93..750f608 100644 --- a/.forgejo/workflows/check-pmos.yml +++ b/.forgejo/workflows/check-pmos.yml @@ -26,7 +26,7 @@ jobs: run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh - name: Create issues run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh - check-pmos-edge: + check-pmos-latest: name: Check pmos(v25.12) repo runs-on: aarch64 container: From 6a81c77cf881cbc0df77ae9e4a423f7c33031821 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 21 Dec 2025 23:59:08 -0500 Subject: [PATCH 312/313] backports/openterface-qt: upgrade to 0.5.7 --- .../348_address-use-of-deleted-function.patch | 23 + ...ng-categories-and-remove-backslashes.patch | 586 ++++++++++++++++++ .../51-openterface-permissions.rules | 0 {user => backports}/openterface-qt/APKBUILD | 46 +- .../openterface-qt.post-install | 0 .../openterface-qt/openterfaceQT.desktop | 0 .../openterface-qt/use-system-libs.patch | 72 +++ 7 files changed, 720 insertions(+), 7 deletions(-) create mode 100644 backports/openterface-qt/348_address-use-of-deleted-function.patch create mode 100644 backports/openterface-qt/423_deduplicate-logging-categories-and-remove-backslashes.patch rename {user => backports}/openterface-qt/51-openterface-permissions.rules (100%) rename {user => backports}/openterface-qt/APKBUILD (50%) rename {user => backports}/openterface-qt/openterface-qt.post-install (100%) rename {user => backports}/openterface-qt/openterfaceQT.desktop (100%) create mode 100644 backports/openterface-qt/use-system-libs.patch diff --git a/backports/openterface-qt/348_address-use-of-deleted-function.patch b/backports/openterface-qt/348_address-use-of-deleted-function.patch new file mode 100644 index 0000000..2783740 --- /dev/null +++ b/backports/openterface-qt/348_address-use-of-deleted-function.patch @@ -0,0 +1,23 @@ +diff --git a/serial/SerialPortManager.cpp.orig b/serial/SerialPortManager.cpp +index 22565b5..d444eee 100644 +--- a/serial/SerialPortManager.cpp.orig ++++ b/serial/SerialPortManager.cpp +@@ -1945,8 +1945,9 @@ void SerialPortManager::attemptRecovery() + } + } else { + qCWarning(log_core_serial) << "Serial port recovery attempt failed"; +- if (eventCallback) { +- eventCallback->onStatusUpdate(QString("Recovery attempt %1 failed").arg(m_connectionRetryCount)); ++ if (eventCallback) { ++ int crc = m_connectionRetryCount; ++ eventCallback->onStatusUpdate(QString("Recovery attempt %1 failed").arg(crc)); + } + + // Try again if we haven't exceeded max attempts +@@ -2034,4 +2035,4 @@ void SerialPortManager::applyCommandBasedBaudrateChange(int baudRate, const QStr + } else { + qCWarning(log_core_serial) << logPrefix << "Failed to apply user selected baudrate:" << baudRate; + } +-} +\ No newline at end of file ++} diff --git a/backports/openterface-qt/423_deduplicate-logging-categories-and-remove-backslashes.patch b/backports/openterface-qt/423_deduplicate-logging-categories-and-remove-backslashes.patch new file mode 100644 index 0000000..5e762ff --- /dev/null +++ b/backports/openterface-qt/423_deduplicate-logging-categories-and-remove-backslashes.patch @@ -0,0 +1,586 @@ +From 4478cfb004d3db7797e99fd3bdb23bf880a9c85b Mon Sep 17 00:00:00 2001 +From: John Lane <1786613+johnlane@users.noreply.github.com> +Date: Wed, 3 Dec 2025 21:19:33 +0000 +Subject: [PATCH 1/2] Remove additional backslashes and add missing cpp and h + files + +--- + openterfaceQT.pro | 28 +++++++++++++++++++--------- + 1 file changed, 19 insertions(+), 9 deletions(-) + +diff --git a/openterfaceQT.pro b/openterfaceQT.pro +index 3460dbac..f0d878e8 100644 +--- a/openterfaceQT.pro ++++ b/openterfaceQT.pro +@@ -84,16 +84,26 @@ SOURCES += main.cpp \ + !win32 { + SOURCES += host/backend/ffmpegbackendhandler.cpp \ + host/backend/gstreamerbackendhandler.cpp \ +- host/backend/gstreamer/sinkselector.cpp \\ +- host/backend/gstreamer/queueconfigurator.cpp \\ +- host/backend/gstreamer/videooverlaymanager.cpp \\ +- host/backend/gstreamer/pipelinebuilder.cpp ++ host/backend/gstreamer/pipelinefactory.cpp \ ++ host/backend/gstreamer/externalgstrunner.cpp \ ++ host/backend/gstreamer/inprocessgstrunner.cpp \ ++ host/backend/gstreamer/sinkselector.cpp \ ++ host/backend/gstreamer/queueconfigurator.cpp \ ++ host/backend/gstreamer/videooverlaymanager.cpp \ ++ host/backend/gstreamer/pipelinebuilder.cpp \ ++ host/backend/gstreamer/recordingmanager.cpp \ ++ host/backend/gstreamer/gstreamerhelpers.cpp + HEADERS += host/backend/ffmpegbackendhandler.h \ + host/backend/gstreamerbackendhandler.h \ +- host/backend/gstreamer/sinkselector.h \\ +- host/backend/gstreamer/queueconfigurator.h \\ +- host/backend/gstreamer/videooverlaymanager.h \\ +- host/backend/gstreamer/pipelinebuilder.h ++ host/backend/gstreamer/pipelinefactory.h \ ++ host/backend/gstreamer/externalgstrunner.h \ ++ host/backend/gstreamer/inprocessgstrunner.h \ ++ host/backend/gstreamer/sinkselector.h \ ++ host/backend/gstreamer/queueconfigurator.h \ ++ host/backend/gstreamer/videooverlaymanager.h \ ++ host/backend/gstreamer/pipelinebuilder.h \ ++ host/backend/gstreamer/recordingmanager.h \ ++ host/backend/gstreamer/gstreamerhelpers.h + } + + +@@ -263,4 +273,4 @@ TRANSLATIONS += config/languages/openterface_en.ts \ + config/languages/openterface_se.ts \ + config/languages/openterface_de.ts \ + config/languages/openterface_zh.ts +- # Add more languages here +\ No newline at end of file ++ # Add more languages here + +From ccd8f51fe510684439edf0d5f8083e4dd1423836 Mon Sep 17 00:00:00 2001 +From: John Lane <1786613+johnlane@users.noreply.github.com> +Date: Wed, 3 Dec 2025 21:26:20 +0000 +Subject: [PATCH 2/2] De-duplicate logging categories + +--- + host/backend/gstreamer/gstreamerhelpers.cpp | 22 ++-- + host/backend/gstreamer/queueconfigurator.cpp | 8 +- + .../backend/gstreamer/videooverlaymanager.cpp | 118 +++++++++--------- + 3 files changed, 74 insertions(+), 74 deletions(-) + +diff --git a/host/backend/gstreamer/gstreamerhelpers.cpp b/host/backend/gstreamer/gstreamerhelpers.cpp +index 6fc1dd6e..4739da17 100644 +--- a/host/backend/gstreamer/gstreamerhelpers.cpp ++++ b/host/backend/gstreamer/gstreamerhelpers.cpp +@@ -4,7 +4,7 @@ + #include + #include + +-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer") ++Q_LOGGING_CATEGORY(log_gstreamer_gstreamerhelpers, "opf.backend.gstreamerhelpers") + + using namespace Openterface::GStreamer::GstHelpers; + +@@ -16,7 +16,7 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme + { + if (!elementPtr) { + if (outError) *outError = QStringLiteral("Element pointer is null"); +- qCWarning(log_gstreamer_backend) << "setPipelineStateWithTimeout: element pointer is null"; ++ qCWarning(log_gstreamer_gstreamerhelpers) << "setPipelineStateWithTimeout: element pointer is null"; + return false; + } + +@@ -24,7 +24,7 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme + + GstStateChangeReturn ret = gst_element_set_state(element, static_cast(targetState)); + if (ret == GST_STATE_CHANGE_FAILURE) { +- qCCritical(log_gstreamer_backend) << "Failed to set element state to" << targetState; ++ qCCritical(log_gstreamer_gstreamerhelpers) << "Failed to set element state to" << targetState; + // Try to pull any error from the bus for diagnostics + // Caller may pass a bus to parseAndLogGstErrorMessage, but we don't have it here. + if (outError) *outError = QStringLiteral("Failed to set state (GST_STATE_CHANGE_FAILURE)"); +@@ -35,13 +35,13 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme + ret = gst_element_get_state(element, &state, &pending, static_cast(timeoutMs) * GST_MSECOND); + if (ret == GST_STATE_CHANGE_FAILURE) { + if (outError) *outError = QStringLiteral("State change failure"); +- qCCritical(log_gstreamer_backend) << "State change failure waiting for target state"; ++ qCCritical(log_gstreamer_gstreamerhelpers) << "State change failure waiting for target state"; + return false; + } + + if (state != static_cast(targetState)) { + if (outError) *outError = QStringLiteral("Element did not reach target state in timeout"); +- qCCritical(log_gstreamer_backend) << "Element failed to reach state" << targetState << "(current:" << state << ", pending:" << pending << ")"; ++ qCCritical(log_gstreamer_gstreamerhelpers) << "Element failed to reach state" << targetState << "(current:" << state << ", pending:" << pending << ")"; + return false; + } + +@@ -51,14 +51,14 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme + void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr, const char* context) + { + if (!busPtr) { +- qCWarning(log_gstreamer_backend) << "Bus not available for error details" << (context ? context : ""); ++ qCWarning(log_gstreamer_gstreamerhelpers) << "Bus not available for error details" << (context ? context : ""); + return; + } + + GstBus* bus = static_cast(busPtr); + GstMessage* msg = gst_bus_pop_filtered(bus, GST_MESSAGE_ERROR); + if (!msg) { +- qCDebug(log_gstreamer_backend) << "No error message available on bus" << (context ? context : ""); ++ qCDebug(log_gstreamer_gstreamerhelpers) << "No error message available on bus" << (context ? context : ""); + return; + } + +@@ -66,8 +66,8 @@ void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr + gchar* debug_info = nullptr; + gst_message_parse_error(msg, &error, &debug_info); + +- qCCritical(log_gstreamer_backend) << "GStreamer Error:" << (error ? error->message : "Unknown") << (context ? context : ""); +- qCCritical(log_gstreamer_backend) << "Debug info:" << (debug_info ? debug_info : "None"); ++ qCCritical(log_gstreamer_gstreamerhelpers) << "GStreamer Error:" << (error ? error->message : "Unknown") << (context ? context : ""); ++ qCCritical(log_gstreamer_gstreamerhelpers) << "Debug info:" << (debug_info ? debug_info : "None"); + + if (error) g_error_free(error); + if (debug_info) g_free(debug_info); +@@ -79,13 +79,13 @@ void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr + bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* /*elementPtr*/, int /*targetState*/, int /*timeoutMs*/, QString* outError) + { + if (outError) *outError = QStringLiteral("GStreamer not available in this build"); +- qCWarning(log_gstreamer_backend) << "setPipelineStateWithTimeout called but GStreamer is not compiled in"; ++ qCWarning(log_gstreamer_gstreamerhelpers) << "setPipelineStateWithTimeout called but GStreamer is not compiled in"; + return false; + } + + void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* /*busPtr*/, const char* context) + { +- qCDebug(log_gstreamer_backend) << "GStreamer not compiled in - no bus to parse" << (context ? context : ""); ++ qCDebug(log_gstreamer_gstreamerhelpers) << "GStreamer not compiled in - no bus to parse" << (context ? context : ""); + } + + #endif // HAVE_GSTREAMER +diff --git a/host/backend/gstreamer/queueconfigurator.cpp b/host/backend/gstreamer/queueconfigurator.cpp +index b7bea42e..12290193 100644 +--- a/host/backend/gstreamer/queueconfigurator.cpp ++++ b/host/backend/gstreamer/queueconfigurator.cpp +@@ -8,7 +8,7 @@ + #include + #endif + +-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer") ++Q_LOGGING_CATEGORY(log_gstreamer_queueconfigurator, "opf.backend.queueconfigurator") + + using namespace Openterface::GStreamer; + +@@ -26,10 +26,10 @@ void QueueConfigurator::configureDisplayQueue(void* pipeline) + "max-size-time", G_GUINT64_CONSTANT(100000000), // 100ms + "leaky", 2, // GST_QUEUE_LEAK_DOWNSTREAM + NULL); +- qCDebug(log_gstreamer_backend) << "✓ Configured display queue with higher priority for qtsink"; ++ qCDebug(log_gstreamer_queueconfigurator) << "✓ Configured display queue with higher priority for qtsink"; + gst_object_unref(displayQueue); + } else { +- qCDebug(log_gstreamer_backend) << "Display queue element not found (no named display-queue)"; ++ qCDebug(log_gstreamer_queueconfigurator) << "Display queue element not found (no named display-queue)"; + } + #else + Q_UNUSED(pipeline); +@@ -50,7 +50,7 @@ void QueueConfigurator::configureRecordingQueue(void* pipeline) + "max-size-time", G_GUINT64_CONSTANT(500000000), // 500ms + "leaky", 1, // GST_QUEUE_LEAK_UPSTREAM + NULL); +- qCDebug(log_gstreamer_backend) << "✓ Configured recording queue with lower priority relative to display"; ++ qCDebug(log_gstreamer_queueconfigurator) << "✓ Configured recording queue with lower priority relative to display"; + gst_object_unref(recordingQueue); + } + #else +diff --git a/host/backend/gstreamer/videooverlaymanager.cpp b/host/backend/gstreamer/videooverlaymanager.cpp +index d8bf42f3..2dbe3bbf 100644 +--- a/host/backend/gstreamer/videooverlaymanager.cpp ++++ b/host/backend/gstreamer/videooverlaymanager.cpp +@@ -22,7 +22,7 @@ static int x11_overlay_error_handler_local(Display* display, XErrorEvent* error) + } + #endif + +-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer") ++Q_LOGGING_CATEGORY(log_gstreamer_videooverlaymanager, "opf.backend.videooverlaymanager") + + using namespace Openterface::GStreamer; + +@@ -30,36 +30,36 @@ bool VideoOverlayManager::embedVideoInWidget(void* pipeline, QWidget* widget) + { + #ifdef HAVE_GSTREAMER + if (!widget || !pipeline) { +- qCWarning(log_gstreamer_backend) << "Cannot embed video: widget or pipeline is null"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: widget or pipeline is null"; + return false; + } + + GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink"); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline"; + videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either"; + return false; + } + } + + WId winId = widget->winId(); + if (winId) { +- qCDebug(log_gstreamer_backend) << "Embedding video in widget with window ID:" << winId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in widget with window ID:" << winId; + gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId); + gst_object_unref(videoSink); +- qCDebug(log_gstreamer_backend) << "Video embedded in widget successfully"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in widget successfully"; + return true; + } else { +- qCWarning(log_gstreamer_backend) << "Widget window ID is null, cannot embed video"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Widget window ID is null, cannot embed video"; + gst_object_unref(videoSink); + return false; + } + #else + Q_UNUSED(pipeline) + Q_UNUSED(widget) +- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)"; + return true; + #endif + } +@@ -68,36 +68,36 @@ bool VideoOverlayManager::embedVideoInGraphicsView(void* pipeline, QGraphicsView + { + #ifdef HAVE_GSTREAMER + if (!view || !pipeline) { +- qCWarning(log_gstreamer_backend) << "Cannot embed video: graphics view or pipeline is null"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: graphics view or pipeline is null"; + return false; + } + + GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink"); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline"; + videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either"; + return false; + } + } + + WId winId = view->winId(); + if (winId) { +- qCDebug(log_gstreamer_backend) << "Embedding video in graphics view with window ID:" << winId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in graphics view with window ID:" << winId; + gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId); + gst_object_unref(videoSink); +- qCDebug(log_gstreamer_backend) << "Video embedded in graphics view successfully"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in graphics view successfully"; + return true; + } else { +- qCWarning(log_gstreamer_backend) << "Graphics view window ID is null, cannot embed video"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics view window ID is null, cannot embed video"; + gst_object_unref(videoSink); + return false; + } + #else + Q_UNUSED(pipeline) + Q_UNUSED(view) +- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)"; + return true; + #endif + } +@@ -106,36 +106,36 @@ bool VideoOverlayManager::embedVideoInVideoPane(void* pipeline, ::VideoPane* vid + { + #ifdef HAVE_GSTREAMER + if (!videoPane || !pipeline) { +- qCWarning(log_gstreamer_backend) << "Cannot embed video: VideoPane or pipeline is null"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: VideoPane or pipeline is null"; + return false; + } + + GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink"); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline"; + videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY); + if (!videoSink) { +- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either"; + return false; + } + } + + WId winId = videoPane->getVideoOverlayWindowId(); + if (winId) { +- qCDebug(log_gstreamer_backend) << "Embedding video in VideoPane overlay with window ID:" << winId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in VideoPane overlay with window ID:" << winId; + gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId); + gst_object_unref(videoSink); +- qCDebug(log_gstreamer_backend) << "Video embedded in VideoPane overlay successfully"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in VideoPane overlay successfully"; + return true; + } else { +- qCWarning(log_gstreamer_backend) << "VideoPane overlay window ID is null, cannot embed video"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "VideoPane overlay window ID is null, cannot embed video"; + gst_object_unref(videoSink); + return false; + } + #else + Q_UNUSED(pipeline) + Q_UNUSED(videoPane) +- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)"; + return true; + #endif + } +@@ -144,7 +144,7 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + { + #ifdef HAVE_GSTREAMER + if (!videoSinkPtr || windowId == 0) { +- qCWarning(log_gstreamer_backend) << "Invalid parameters for overlay setup: sink=" << videoSinkPtr << "windowId=" << windowId; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Invalid parameters for overlay setup: sink=" << videoSinkPtr << "windowId=" << windowId; + return false; + } + +@@ -152,7 +152,7 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + + // Check if the sink supports video overlay interface + if (GST_IS_VIDEO_OVERLAY(videoSink)) { +- qCDebug(log_gstreamer_backend) << "Sink supports video overlay - setting up overlay with window ID:" << windowId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Sink supports video overlay - setting up overlay with window ID:" << windowId; + + #ifdef Q_OS_LINUX + // Add X11 error handling to prevent segmentation fault +@@ -175,12 +175,12 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + if (g_object_class_find_property(G_OBJECT_GET_CLASS(videoSink), "force-aspect-ratio")) { + // Allow the sink to stretch to the configured render rectangle so overlay scales to widget size + g_object_set(videoSink, "force-aspect-ratio", FALSE, NULL); +- qCDebug(log_gstreamer_backend) << "Disabled force-aspect-ratio on video sink to allow fill scaling"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Disabled force-aspect-ratio on video sink to allow fill scaling"; + } + + if (g_object_class_find_property(G_OBJECT_GET_CLASS(videoSink), "pixel-aspect-ratio")) { + g_object_set(videoSink, "pixel-aspect-ratio", "1/1", NULL); +- qCDebug(log_gstreamer_backend) << "Set pixel-aspect-ratio to 1:1 on video sink"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Set pixel-aspect-ratio to 1:1 on video sink"; + } + + // Configure render rectangle based on provided targets +@@ -188,13 +188,13 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + QSize widgetSize = videoWidget->size(); + if (widgetSize.width() > 0 && widgetSize.height() > 0) { + gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(videoSink), 0, 0, widgetSize.width(), widgetSize.height()); +- qCDebug(log_gstreamer_backend) << "Set render rectangle to widget size:" << widgetSize; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to widget size:" << widgetSize; + } + } else if (graphicsVideoItem) { + QRectF itemRect = graphicsVideoItem->boundingRect(); + if (itemRect.width() > 0 && itemRect.height() > 0) { + gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(videoSink), 0, 0, (gint)itemRect.width(), (gint)itemRect.height()); +- qCDebug(log_gstreamer_backend) << "Set render rectangle to video item size:" << itemRect.size(); ++ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to video item size:" << itemRect.size(); + } + } + +@@ -205,18 +205,18 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + XCloseDisplay(display); + + if (x11_overlay_error_occurred_local) { +- qCWarning(log_gstreamer_backend) << "X11 error occurred during overlay setup - continuing without embedding"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "X11 error occurred during overlay setup - continuing without embedding"; + } else { +- qCDebug(log_gstreamer_backend) << "Video overlay setup completed successfully"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Video overlay setup completed successfully"; + } + } else if (!old_handler) { +- qCDebug(log_gstreamer_backend) << "Video overlay setup completed (no X11 error handling)"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Video overlay setup completed (no X11 error handling)"; + } + #endif + +- qCDebug(log_gstreamer_backend) << "Overlay setup completed"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Overlay setup completed"; + } catch (...) { +- qCCritical(log_gstreamer_backend) << "Exception during video overlay setup - continuing without embedding"; ++ qCCritical(log_gstreamer_videooverlaymanager) << "Exception during video overlay setup - continuing without embedding"; + #ifdef Q_OS_LINUX + if (display && old_handler) { + XSetErrorHandler(old_handler); +@@ -242,17 +242,17 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + if (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) { + actualSink = GST_ELEMENT(g_value_get_object(&item)); + if (actualSink && GST_IS_VIDEO_OVERLAY(actualSink)) { +- qCDebug(log_gstreamer_backend) << "Found overlay-capable sink inside autovideosink"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Found overlay-capable sink inside autovideosink"; + gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(actualSink), windowId); + // Use target widget size if available to set explicit render rectangle so scaling works + if (videoWidget) { + QSize widgetSize = videoWidget->size(); + if (widgetSize.width() > 0 && widgetSize.height() > 0) { + gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(actualSink), 0, 0, widgetSize.width(), widgetSize.height()); +- qCDebug(log_gstreamer_backend) << "Set render rectangle to widget size for autovideosink child sink:" << widgetSize; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to widget size for autovideosink child sink:" << widgetSize; + if (g_object_class_find_property(G_OBJECT_GET_CLASS(actualSink), "force-aspect-ratio")) { + g_object_set(actualSink, "force-aspect-ratio", FALSE, NULL); +- qCDebug(log_gstreamer_backend) << "Disabled force-aspect-ratio on autovideosink child sink"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Disabled force-aspect-ratio on autovideosink child sink"; + } + } else { + gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(actualSink), 0, 0, -1, -1); +@@ -269,18 +269,18 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW + } + gst_iterator_free(iter); + } +- qCDebug(log_gstreamer_backend) << "autovideosink selected sink doesn't support overlay - video will display in separate window"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "autovideosink selected sink doesn't support overlay - video will display in separate window"; + return false; + } + +- qCWarning(log_gstreamer_backend) << "Sink does not support video overlay:" << sinkName; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Sink does not support video overlay:" << sinkName; + return false; + #else + Q_UNUSED(videoSinkPtr) + Q_UNUSED(windowId) + Q_UNUSED(videoWidget) + Q_UNUSED(graphicsVideoItem) +- qCDebug(log_gstreamer_backend) << "No in-process GStreamer - overlay unavailable"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "No in-process GStreamer - overlay unavailable"; + return false; + #endif + } +@@ -300,7 +300,7 @@ bool VideoOverlayManager::setupVideoOverlayForPipeline(void* pipeline, WId windo + gst_object_unref(videoSink); + return ok; + } +- qCWarning(log_gstreamer_backend) << "No video sink found in pipeline"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink found in pipeline"; + return false; + #else + Q_UNUSED(pipeline) +@@ -315,10 +315,10 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + ::VideoPane* videoPane, + bool &pendingFlag) + { +- qCDebug(log_gstreamer_backend) << "VideoOverlayManager: Completing pending overlay setup..."; ++ qCDebug(log_gstreamer_videooverlaymanager) << "VideoOverlayManager: Completing pending overlay setup..."; + + if (!pendingFlag || !pipeline) { +- qCDebug(log_gstreamer_backend) << "No pending setup or no pipeline"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "No pending setup or no pipeline"; + return false; + } + +@@ -326,7 +326,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + const bool isXcb = platform.contains("xcb", Qt::CaseInsensitive); + const bool hasXDisplay = !qgetenv("DISPLAY").isEmpty(); + if (!isXcb || !hasXDisplay) { +- qCWarning(log_gstreamer_backend) << "Skipping deferred overlay setup: platform is" << platform << "(DISPLAY set:" << hasXDisplay << ")"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Skipping deferred overlay setup: platform is" << platform << "(DISPLAY set:" << hasXDisplay << ")"; + pendingFlag = false; + return false; + } +@@ -335,7 +335,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + + if (videoPane) { + windowId = videoPane->getVideoOverlayWindowId(); +- qCDebug(log_gstreamer_backend) << "Completing overlay setup with VideoPane window ID:" << windowId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with VideoPane window ID:" << windowId; + } else if (graphicsVideoItem) { + if (graphicsVideoItem->scene()) { + QList views = graphicsVideoItem->scene()->views(); +@@ -344,21 +344,21 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + if (auto pane = qobject_cast(view)) { + if (pane->isDirectGStreamerModeEnabled() && pane->getOverlayWidget()) { + windowId = pane->getVideoOverlayWindowId(); +- qCDebug(log_gstreamer_backend) << "Completing overlay setup with VideoPane overlay widget window ID:" << windowId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with VideoPane overlay widget window ID:" << windowId; + } else { +- qCDebug(log_gstreamer_backend) << "VideoPane overlay widget still not ready"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "VideoPane overlay widget still not ready"; + return false; + } + } else { + windowId = view->winId(); +- qCDebug(log_gstreamer_backend) << "Completing overlay setup with graphics view window ID:" << windowId; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with graphics view window ID:" << windowId; + } + } else { +- qCWarning(log_gstreamer_backend) << "Graphics video item has no associated view"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics video item has no associated view"; + return false; + } + } else { +- qCWarning(log_gstreamer_backend) << "Graphics video item has no scene"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics video item has no scene"; + return false; + } + } +@@ -367,7 +367,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink"); + if (!videoSink) { + videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY); +- if (videoSink) qCDebug(log_gstreamer_backend) << "Deferred path: found sink by overlay interface"; ++ if (videoSink) qCDebug(log_gstreamer_videooverlaymanager) << "Deferred path: found sink by overlay interface"; + } + + if (videoSink) { +@@ -384,14 +384,14 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + targetWidget = videoWidget; + } + if (targetWidget) { +- qCDebug(log_gstreamer_backend) << "Deferred: binding qt6videosink to QWidget" << targetWidget; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred: binding qt6videosink to QWidget" << targetWidget; + g_object_set(G_OBJECT(videoSink), "widget", (gpointer)targetWidget, nullptr); + gst_object_unref(videoSink); + pendingFlag = false; +- qCDebug(log_gstreamer_backend) << "Deferred qt6videosink binding completed"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred qt6videosink binding completed"; + return true; + } else { +- qCWarning(log_gstreamer_backend) << "Deferred: no target QWidget available to bind qt6videosink"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred: no target QWidget available to bind qt6videosink"; + } + } + +@@ -399,30 +399,30 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline, + const bool looksLikeXSink = sinkNameBA.contains("xvimage") || sinkNameBA.contains("ximage"); + + if (!supportsOverlay) { +- qCWarning(log_gstreamer_backend) << "Deferred overlay skipped: sink does not support overlay interface (" << sinkName << ")"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred overlay skipped: sink does not support overlay interface (" << sinkName << ")"; + gst_object_unref(videoSink); + pendingFlag = false; + return false; + } + + if (!looksLikeXSink) { +- qCWarning(log_gstreamer_backend) << "Deferred overlay skipped: sink is not an X sink (" << sinkName << ") on platform" << QGuiApplication::platformName(); ++ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred overlay skipped: sink is not an X sink (" << sinkName << ") on platform" << QGuiApplication::platformName(); + gst_object_unref(videoSink); + pendingFlag = false; + return false; + } + +- qCDebug(log_gstreamer_backend) << "Setting up deferred video overlay with window ID:" << windowId << "using sink" << sinkName; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Setting up deferred video overlay with window ID:" << windowId << "using sink" << sinkName; + gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), windowId); + gst_object_unref(videoSink); + pendingFlag = false; +- qCDebug(log_gstreamer_backend) << "Deferred overlay setup completed successfully"; ++ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred overlay setup completed successfully"; + return true; + } else { +- qCWarning(log_gstreamer_backend) << "Could not find video sink for deferred overlay setup"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Could not find video sink for deferred overlay setup"; + } + } else { +- qCWarning(log_gstreamer_backend) << "Still no valid window ID available for deferred overlay setup"; ++ qCWarning(log_gstreamer_videooverlaymanager) << "Still no valid window ID available for deferred overlay setup"; + } + + return false; diff --git a/user/openterface-qt/51-openterface-permissions.rules b/backports/openterface-qt/51-openterface-permissions.rules similarity index 100% rename from user/openterface-qt/51-openterface-permissions.rules rename to backports/openterface-qt/51-openterface-permissions.rules diff --git a/user/openterface-qt/APKBUILD b/backports/openterface-qt/APKBUILD similarity index 50% rename from user/openterface-qt/APKBUILD rename to backports/openterface-qt/APKBUILD index cf753a7..a96e328 100644 --- a/user/openterface-qt/APKBUILD +++ b/backports/openterface-qt/APKBUILD @@ -1,29 +1,54 @@ # Maintainer: Antoine Martin (ayakael) pkgname=openterface-qt -pkgver=0.3.13 +pkgver=0.5.7 pkgrel=0 pkgdesc="Openterface Mini-KVM Host Application" -arch="all !armhf" # missing qt6-qtmultimedia +# armhf: missing qt6-qtmultimedia +# riscv64: missing libgtk-3 +arch="all !armhf !riscv64" url="https://openterface.com/" license="AGPL-3.0-only" -depends="qt6-qtmultimedia-ffmpeg hicolor-icon-theme" -makedepends="qt6-qtbase-dev qt6-qtmultimedia-dev qt6-qtserialport-dev qt6-qtsvg-dev qt6-qtmultimedia-dev libusb-dev" +depends=" + gst-plugins-good-qt + hicolor-icon-theme + qt6-qtmultimedia-ffmpeg + " +makedepends=" + cmake + ffmpeg-dev + libgudev-dev + libjpeg-turbo-dev + libusb-dev + libx11-dev + libxv-dev + patchelf + qt6-qtbase-dev + qt6-qtmultimedia-dev + qt6-qtserialport-dev + samurai + v4l-utils-dev +" install="$pkgname.post-install" builddir="$srcdir"/Openterface_QT-$pkgver +options="!check" # No testsuite source=" $pkgname-$pkgver.tar.gz::https://github.com/TechxArtisanStudio/Openterface_QT/archive/$pkgver.tar.gz openterfaceQT.desktop 51-openterface-permissions.rules + 348_address-use-of-deleted-function.patch + 423_deduplicate-logging-categories-and-remove-backslashes.patch + use-system-libs.patch " prepare() { default_prepare mkdir build && cd build - qmake6 .. + # OPENTERFACE_BUILD_STATIC: do not build vendored dependencies + cmake -DOPENTERFACE_BUILD_STATIC=OFF .. } build() { - make -C build + ninja -C build } package() { @@ -33,9 +58,16 @@ package() { install -Dm644 "$builddir"/images/icon_32.png "$pkgdir"/usr/share/icons/hicolor/32x32/apps/openterfaceQT.png install -Dm644 "$builddir"/images/icon_64.png "$pkgdir"/usr/share/icons/hicolor/64x64/apps/openterfaceQT.png install -Dm644 "$builddir"/images/icon_128.png "$pkgdir"/usr/share/icons/hicolor/128x128/apps/openterfaceQT.png + + # vanilla build does not set rpath, since it usually wants to use vendored libs + patchelf --set-rpath '/usr/lib' "$pkgdir"/usr/bin/openterfaceQT } + sha512sums=" -7261ce2875b1617d27945de591c72779d2305889b7f53bb6758cb5e1d4dc01c969fef1638726d868f75e995c44a8e2c453cac45c90cfb3d140b8120523c4038d openterface-qt-0.3.13.tar.gz +996415d6f7d3ed950901c380a0520ddab8c31e8d3c2e2bb3a5f631a5600cace6bcf6bf89871e4e4ef818009eeb08c448fd793e1e4758ecccf1e1a21ff04fd560 openterface-qt-0.5.7.tar.gz e39cfa04cbcb59e8ba54110a28eff41854f73fa7c4baeeed5433907c79781946f12bd3a731763caa1d591e664eab0650bdbd2a844954baa12bb96a76a17c6e4f openterfaceQT.desktop f50d721a6a2d1e0183c81e99230e91e127ee6c6f3243af1cff3e3cb78e2913ebab3346ec8b461a4710220d1ce2e12a7cc960ded6e0dc2def539375c6e737b647 51-openterface-permissions.rules +69b5556ec9e56792e848ea1ff9374e12e6901da821ecd9d6f2f521ea30f48e564c2cd0631fc1360acd6c8c6249cfa718d5baf7ed6929e1e92f63eeaea578bcb3 348_address-use-of-deleted-function.patch +47580d07a2d971ad2010e78373d1abbcbc05b3fbd3a7e466faed50dc9a0d632db30c0a7622e7324aeb0eb38d49e3241cb6cebc835f7adeed977b1dd7b48ea5f6 423_deduplicate-logging-categories-and-remove-backslashes.patch +22ecac74fe0923f39f538a5d587f8c100d9709631a1584bd20646e09dcf777cd3042670d08195626220f0494e5efa9549a299c5e1fd8c42f991ec5746b42cc86 use-system-libs.patch " diff --git a/user/openterface-qt/openterface-qt.post-install b/backports/openterface-qt/openterface-qt.post-install similarity index 100% rename from user/openterface-qt/openterface-qt.post-install rename to backports/openterface-qt/openterface-qt.post-install diff --git a/user/openterface-qt/openterfaceQT.desktop b/backports/openterface-qt/openterfaceQT.desktop similarity index 100% rename from user/openterface-qt/openterfaceQT.desktop rename to backports/openterface-qt/openterfaceQT.desktop diff --git a/backports/openterface-qt/use-system-libs.patch b/backports/openterface-qt/use-system-libs.patch new file mode 100644 index 0000000..a220d5f --- /dev/null +++ b/backports/openterface-qt/use-system-libs.patch @@ -0,0 +1,72 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e0e8ea1..c861725 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -244,7 +244,7 @@ endif() + # Add XCB cursor library for static linking (Linux only) - Legacy support + if(UNIX AND NOT APPLE AND XCB_CURSOR_FOUND) + # This is redundant now but keeping for compatibility +- message(STATUS "XCB cursor already linked via static approach above") ++ target_link_libraries(openterfaceQT PRIVATE X11) + endif() + + # Add TurboJPEG if available +@@ -307,4 +307,4 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") + endif() + endif() + +-# Qt components already found above +\ No newline at end of file ++# Qt components already found above +diff --git a/cmake/FFmpeg.cmake b/cmake/FFmpeg.cmake +index ef0699e..660e765 100644 +--- a/cmake/FFmpeg.cmake ++++ b/cmake/FFmpeg.cmake +@@ -19,7 +19,7 @@ if(NOT DEFINED FFMPEG_PREFIX) + if(WIN32) + set(FFMPEG_PREFIX "C:/ffmpeg-static" CACHE PATH "FFmpeg installation directory") + else() +- set(FFMPEG_PREFIX "/opt/ffmpeg" CACHE PATH "FFmpeg installation directory") ++ set(FFMPEG_PREFIX "/usr" CACHE PATH "FFmpeg installation directory") + endif() + message(STATUS "Using default FFMPEG_PREFIX: ${FFMPEG_PREFIX}") + endif() +@@ -116,7 +116,7 @@ if(NOT FFMPEG_FOUND) + message(STATUS "FFmpeg search paths: ${FFMPEG_SEARCH_PATHS}") + foreach(SEARCH_PATH ${FFMPEG_SEARCH_PATHS}) + # For static builds, prefer .a files; check common lib directories +- set(LIB_EXTENSIONS ".a") ++ set(LIB_EXTENSIONS ".so") + + # Platform-specific library paths + if(WIN32) +diff --git a/cmake/GStreamer.cmake b/cmake/GStreamer.cmake +index 220e9f5..576535f 100644 +--- a/cmake/GStreamer.cmake ++++ b/cmake/GStreamer.cmake +@@ -316,10 +316,11 @@ else() + # Check for Qt6 plugin availability in system + message(STATUS "Checking for Qt6 GStreamer plugin in system...") + find_file(GSTREAMER_QT6_PLUGIN +- NAMES libgstqt6.so ++ NAMES libgstqml6.so + PATHS + /usr/lib/x86_64-linux-gnu/gstreamer-1.0 + /usr/lib/aarch64-linux-gnu/gstreamer-1.0 ++ /usr/lib/gstreamer-1.0 + /usr/local/lib/gstreamer-1.0 + NO_DEFAULT_PATH + ) +diff --git a/cmake/Resources.cmake b/cmake/Resources.cmake +index 2d28b89..e2009e3 100644 +--- a/cmake/Resources.cmake ++++ b/cmake/Resources.cmake +@@ -336,7 +336,7 @@ install(FILES ${CMAKE_SOURCE_DIR}/com.openterface.openterfaceQT.metainfo.xml + if(COMMAND qt_generate_deploy_app_script) + qt_generate_deploy_app_script( + TARGET openterfaceQT +- FILENAME_VARIABLE deploy_script ++ OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR + ) + install(SCRIPT ${deploy_script}) From f98506d3bbd4db6516f81098f0b56578ec41c6fa Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 22 Dec 2025 00:16:33 -0500 Subject: [PATCH 313/313] pmos/*: drop --- .../50-touchscreen.conf | 11 - .../81-libinput-pinenote.rules | 9 - .../82-ebc-rockchip.rules | 2 - pmos/device-pine64-pinenote/APKBUILD | 77 - pmos/device-pine64-pinenote/deviceinfo | 37 - .../local-overrides.quirks | 5 - pmos/device-pine64-pinenote/modules-initfs | 5 - pmos/device-pine64-pinenote/panfrost.conf | 2 - pmos/device-pine64-pinenote/phoc.ini | 6 - pmos/device-pine64-pinenote/rockchip_ebc.conf | 5 - pmos/linux-pine64-pinenote/APKBUILD | 59 - .../config-pine64-pinenote.aarch64 | 7666 ----------------- pmos/pinenote-dbus-service/APKBUILD | 34 - pmos/pinenote-dbus-service/pinenote.initd | 10 - 14 files changed, 7928 deletions(-) delete mode 100644 pmos/device-pine64-pinenote/50-touchscreen.conf delete mode 100644 pmos/device-pine64-pinenote/81-libinput-pinenote.rules delete mode 100644 pmos/device-pine64-pinenote/82-ebc-rockchip.rules delete mode 100644 pmos/device-pine64-pinenote/APKBUILD delete mode 100644 pmos/device-pine64-pinenote/deviceinfo delete mode 100644 pmos/device-pine64-pinenote/local-overrides.quirks delete mode 100644 pmos/device-pine64-pinenote/modules-initfs delete mode 100644 pmos/device-pine64-pinenote/panfrost.conf delete mode 100644 pmos/device-pine64-pinenote/phoc.ini delete mode 100644 pmos/device-pine64-pinenote/rockchip_ebc.conf delete mode 100644 pmos/linux-pine64-pinenote/APKBUILD delete mode 100644 pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 delete mode 100644 pmos/pinenote-dbus-service/APKBUILD delete mode 100644 pmos/pinenote-dbus-service/pinenote.initd diff --git a/pmos/device-pine64-pinenote/50-touchscreen.conf b/pmos/device-pine64-pinenote/50-touchscreen.conf deleted file mode 100644 index f2d643b..0000000 --- a/pmos/device-pine64-pinenote/50-touchscreen.conf +++ /dev/null @@ -1,11 +0,0 @@ -Section "InputClass" - Identifier "evdev touchscreen" - MatchProduct "tt21000" - MatchIsTouchscreen "on" - Driver "evdev" -EndSection -Section "InputClass" - Identifier "RotateTouch" - MatchProduct "w9013" - Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1" -EndSection diff --git a/pmos/device-pine64-pinenote/81-libinput-pinenote.rules b/pmos/device-pine64-pinenote/81-libinput-pinenote.rules deleted file mode 100644 index 700c71c..0000000 --- a/pmos/device-pine64-pinenote/81-libinput-pinenote.rules +++ /dev/null @@ -1,9 +0,0 @@ -ACTION=="remove", GOTO="libinput_device_group_end" -KERNEL!="event[0-9]*", GOTO="libinput_device_group_end" - -ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch" -ATTRS{phys}=="?*", ATTRS{name}=="w9013 2D1F:0095 Stylus", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch" - -ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_CALIBRATION_MATRIX}="-1 0 1 0 -1 1" - -LABEL="libinput_device_group_end" diff --git a/pmos/device-pine64-pinenote/82-ebc-rockchip.rules b/pmos/device-pine64-pinenote/82-ebc-rockchip.rules deleted file mode 100644 index 56c673d..0000000 --- a/pmos/device-pine64-pinenote/82-ebc-rockchip.rules +++ /dev/null @@ -1,2 +0,0 @@ -SUBSYSTEM=="module", KERNEL=="rockchip_ebc", RUN+="/bin/chgrp video /sys/module/%k/parameters/dclk_select /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/split_area_limit /sys/module/%k/parameters/default_waveform", RUN+="/bin/chmod g+w /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/default_waveform /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/split_area_limit" -DRIVER=="rockchip-ebc", RUN+="/bin/chgrp video /sys/%p/power/control", RUN+="/bin/chmod g+w /sys/%p/power/control" diff --git a/pmos/device-pine64-pinenote/APKBUILD b/pmos/device-pine64-pinenote/APKBUILD deleted file mode 100644 index 1cf2b3c..0000000 --- a/pmos/device-pine64-pinenote/APKBUILD +++ /dev/null @@ -1,77 +0,0 @@ -# Maintainer: Petr Hodina -pkgname=device-pine64-pinenote -pkgdesc="Pine64 PineNote" -pkgver=2 -pkgrel=9 -url="https://postmarketos.org" -license="MIT" -arch="aarch64" -options="!check !archcheck" -depends=" - u-boot-pine64-pinenote - linux-pine64-pinenote - postmarketos-base -" -makedepends="devicepkg-dev" -source=" - deviceinfo - modules-initfs - phoc.ini - local-overrides.quirks - 50-touchscreen.conf - 81-libinput-pinenote.rules - 82-ebc-rockchip.rules - panfrost.conf - rockchip_ebc.conf -" -subpackages=" - $pkgname-nonfree-firmware:nonfree_firmware - $pkgname-phosh -" - -build() { - devicepkg_build $startdir $pkgname -} - -package() { - devicepkg_package $startdir $pkgname - - install -Dm644 "$srcdir"/local-overrides.quirks \ - -t "$pkgdir"/etc/libinput/ - install -Dm644 "$srcdir"/50-touchscreen.conf \ - -t "$pkgdir"/etc/X11/xorg.conf.d - install -Dm644 "$srcdir"/81-libinput-pinenote.rules \ - -t "$pkgdir"/usr/lib/udev/rules.d - install -Dm644 "$srcdir"/82-ebc-rockchip.rules \ - "$pkgdir"/usr/lib/udev/rules.d - install -Dm644 "$srcdir"/panfrost.conf \ - -t "$pkgdir"/etc/modprobe.d - install -Dm644 "$srcdir"/rockchip_ebc.conf \ - "$pkgdir"/etc/modprobe.d -} - -phosh() { - install_if="$pkgname=$pkgver-r$pkgrel phosh" - depends="postmarketos-theme" - - install -Dm644 "$srcdir"/phoc.ini \ - -t "$subpkgdir"/etc/phosh -} - -nonfree_firmware() { - pkgdesc="WiFi, Bluetooth and display firmware" - depends="firmware-pine64-pinenote linux-firmware" - mkdir "$subpkgdir" -} - -sha512sums=" -5829b9b52206a7520066e4bb3c08c2535d98002a3940664a0239344f5e7522fe7b6a9cb0c0074f9846c7e42c40746f2991f6aeeefeba8efa9140c16630b2893e deviceinfo -473accb3497244742dd9fd15f8a02957a13e08fa4d4393fec185ecbb27f1f17726e4b5ece22da861151f9d358d3266206c647def8aa75adb672b6f1f1904c66f modules-initfs -4bf5158fbd53274a7429e825bb66225001f2403a4851e2d6803323b77d9095738ee3e5340ac85baf3e86bb4f47d38af8cbd78d8a5055c59a62f5b06e722e19cb phoc.ini -1123720962c9c8fec3c50302ca6a3dd56e2907dc9eea361a7b8eb4201b042476633d41a0ee4f6ab61d9c60eeccc894f83491ba9fa309a9bce2f1db0b0341d79d local-overrides.quirks -ac433eebbc35a48561837495997aee4e55510b979bc0d8e3bafb761bc1be5b4bdeed2f456369dcbc582688aefd07c63966b0d72b6ffa99e84cfd868e677f02c8 50-touchscreen.conf -2bc51f200baefc37abfaaad368a911244999e906bdca4b728ac233f49a8fb3ae7206ee3c95cdb20d7dceae2a31d25a57f4e1da4fd67057fd64724b8232e42aed 81-libinput-pinenote.rules -19e922eec89dba419798c4e1dc9b39c040db33986d0969a39a8220c642fa081763f15ff2418115d5a748af4054a1be0784927d1712ea79942c2b237ebab47728 82-ebc-rockchip.rules -6ba6638754e00908243de2f73ed6898dac03638a200dcf7b7cd9684757355ee1eb0ac874af0f971ad2e054c1a8c471867bdaea4d9aaf7eea6d3cf81ac7dd73a2 panfrost.conf -b52d2e7f0c62d7c313b6db9aeb706cdb2596b6aa637aeddb862abf1e256103377fb6267e38cd4285e25d32112acf8d03bbf32ecff7be3dfbb9176209ea7ae283 rockchip_ebc.conf -" diff --git a/pmos/device-pine64-pinenote/deviceinfo b/pmos/device-pine64-pinenote/deviceinfo deleted file mode 100644 index 22b6d1c..0000000 --- a/pmos/device-pine64-pinenote/deviceinfo +++ /dev/null @@ -1,37 +0,0 @@ -# Reference: -# Please use double quotes only. You can source this file in shell -# scripts. - -deviceinfo_format_version="0" -deviceinfo_name="Pine64 PineNote" -deviceinfo_manufacturer="Pine64" -deviceinfo_codename="pine64-pinenote" -deviceinfo_year="2021" -deviceinfo_dtb="rockchip/rk3566-pinenote-v1.2" -deviceinfo_arch="aarch64" -deviceinfo_gpu_accelerated="true" - -# Device related -deviceinfo_chassis="tablet" -deviceinfo_keyboard="false" -deviceinfo_external_storage="false" -deviceinfo_screen_width="1404" -deviceinfo_screen_height="1872" -deviceinfo_getty="ttyS2;1500000" - -# initfs - -# Bootloader related -deviceinfo_flash_method="rkdeveloptool" -deviceinfo_flash_sparse="true" - -deviceinfo_boot_part_start="65536" - -deviceinfo_sd_embed_firmware="u-boot/pine64-pinenote/u-boot-rockchip.bin:1" -deviceinfo_sd_embed_firmware_step_size="32768" - -deviceinfo_flash_rk_partition_kernel="boot" -deviceinfo_flash_rk_partition_rootfs="os1" - -deviceinfo_generate_extlinux_config="true" -deviceinfo_kernel_cmdline="drm.debug=0x0 vt.color=0xf earlycon console=tty0 console=ttyS2,1500000n8 PMOS_FORCE_PARTITION_RESIZE" diff --git a/pmos/device-pine64-pinenote/local-overrides.quirks b/pmos/device-pine64-pinenote/local-overrides.quirks deleted file mode 100644 index 030ca8b..0000000 --- a/pmos/device-pine64-pinenote/local-overrides.quirks +++ /dev/null @@ -1,5 +0,0 @@ -[PineNote] -MatchName=cyttsp5 -AttrPalmPressureThreshold=28 -AttrThumbPressureThreshold=27 -AttrSizeHint=210x157 diff --git a/pmos/device-pine64-pinenote/modules-initfs b/pmos/device-pine64-pinenote/modules-initfs deleted file mode 100644 index 1b49e53..0000000 --- a/pmos/device-pine64-pinenote/modules-initfs +++ /dev/null @@ -1,5 +0,0 @@ -tps65185-regulator -rockchip_ebc -drm_kms_helper -drm_shmem_helper -pvi_waveform diff --git a/pmos/device-pine64-pinenote/panfrost.conf b/pmos/device-pine64-pinenote/panfrost.conf deleted file mode 100644 index 31a1750..0000000 --- a/pmos/device-pine64-pinenote/panfrost.conf +++ /dev/null @@ -1,2 +0,0 @@ -softdep panfrost pre: rockchip_ebc -# blacklist rockchip_ebc diff --git a/pmos/device-pine64-pinenote/phoc.ini b/pmos/device-pine64-pinenote/phoc.ini deleted file mode 100644 index 90d53d8..0000000 --- a/pmos/device-pine64-pinenote/phoc.ini +++ /dev/null @@ -1,6 +0,0 @@ -# /etc/phosh/phoc.ini -# Overwrites values set in /usr/share/phosh/phoc.ini - -# e-ink is an "Unknown" display type for now in mainline -[output:Unknown-1] -scale = 2.0 diff --git a/pmos/device-pine64-pinenote/rockchip_ebc.conf b/pmos/device-pine64-pinenote/rockchip_ebc.conf deleted file mode 100644 index e457ac9..0000000 --- a/pmos/device-pine64-pinenote/rockchip_ebc.conf +++ /dev/null @@ -1,5 +0,0 @@ -# rockchip-rga will crash the kernel on unload at the moment -blacklist rockchip-rga -blacklist ws8100_pen - -options rockchip_ebc direct_mode=0 auto_refresh=1 refresh_threshold=60 split_area_limit=0 panel_reflection=1 prepare_prev_before_a2=0 dclk_select=0 diff --git a/pmos/linux-pine64-pinenote/APKBUILD b/pmos/linux-pine64-pinenote/APKBUILD deleted file mode 100644 index 84f8643..0000000 --- a/pmos/linux-pine64-pinenote/APKBUILD +++ /dev/null @@ -1,59 +0,0 @@ -# Reference: -# Kernel config based on: arch/arm64/configs/(CHANGEME!) - -pkgname=linux-pine64-pinenote -pkgver=6.12.0 -pkgrel=0 -pkgdesc="Pine64 PineNote kernel fork" -arch="aarch64" -_carch="arm64" -_flavor="pine64-pinenote" -url="https://kernel.org" -license="GPL-2.0-only" -options="!strip !check !tracedeps pmb:cross-native" -makedepends=" - bash - bc - bison - devicepkg-dev - findutils - flex - openssl-dev - perl -" - -# Source -_repository="linux" -_commit="9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac" -_config="config-$_flavor.$arch" -source=" - $pkgname-$_commit.tar.gz::https://github.com/m-weigand/linux/archive/$_commit.tar.gz - $_config -" -builddir="$srcdir/$_repository-$_commit" - -prepare() { - default_prepare - REPLACE_GCCH=0 \ - . downstreamkernel_prepare -} - -build() { - unset LDFLAGS - make ARCH="$_carch" CC="${CC:-gcc}" \ - KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS" -} - -package() { - downstreamkernel_package "$builddir" "$pkgdir" "$_carch" "$_flavor" - - make modules_install dtbs_install \ - ARCH="$_carch" \ - INSTALL_MOD_PATH="$pkgdir" \ - INSTALL_DTBS_PATH="$pkgdir/boot/dtbs" -} - -sha512sums=" -d3c2510f9f835a0570fbb812cec2f9e12e402878c1f9f214364ae1918bc4c00f69a1fc5e005cf6b85c0690e6fd5f6ce9e61efd88145a83725ed12b6b8c07b97e linux-pine64-pinenote-9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac.tar.gz -99294bd6c53b1cf3832addbc80ea23b9089bb03463e2a9ebe93ab5feb1b2ff9ee38f158032705429230765bae2df23bb3401ec14902134c80d9dd6e58e188be5 config-pine64-pinenote.aarch64 -" diff --git a/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 b/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 deleted file mode 100644 index 8e3fb39..0000000 --- a/pmos/linux-pine64-pinenote/config-pine64-pinenote.aarch64 +++ /dev/null @@ -1,7666 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm64 6.12.0 Kernel Configuration -# -CONFIG_CC_VERSION_TEXT="aarch64-alpine-linux-musl-gcc (Alpine 14.2.0) 14.2.0" -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=140200 -CONFIG_CLANG_VERSION=0 -CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=24200 -CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=24200 -CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=0 -CONFIG_RUSTC_LLVM_VERSION=0 -CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y -CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y -CONFIG_CC_HAS_ASM_INLINE=y -CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y -CONFIG_PAHOLE_VERSION=0 -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_TABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -# CONFIG_WERROR is not set -CONFIG_LOCALVERSION="" -CONFIG_LOCALVERSION_AUTO=y -CONFIG_BUILD_SALT="" -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_HOSTNAME="pinenote" -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -CONFIG_SYSVIPC_COMPAT=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -# CONFIG_WATCH_QUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -# CONFIG_AUDIT is not set -CONFIG_HAVE_ARCH_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_IRQ_INJECTION=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_GENERIC_IRQ_IPI=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_IRQ_MSI_IOMMU=y -CONFIG_GENERIC_IRQ_STAT_SNAPSHOT=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -CONFIG_GENERIC_IRQ_DEBUGFS=y -# end of IRQ subsystem - -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_HAS_TICK_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y -CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y -CONFIG_CONTEXT_TRACKING=y -CONFIG_CONTEXT_TRACKING_IDLE=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set -CONFIG_NO_HZ_IDLE=y -# CONFIG_NO_HZ_FULL is not set -# CONFIG_NO_HZ is not set -CONFIG_HIGH_RES_TIMERS=y -# end of Timers subsystem - -CONFIG_BPF=y -CONFIG_HAVE_EBPF_JIT=y -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y - -# -# BPF subsystem -# -CONFIG_BPF_SYSCALL=y -CONFIG_BPF_JIT=y -CONFIG_BPF_JIT_ALWAYS_ON=y -CONFIG_BPF_JIT_DEFAULT_ON=y -CONFIG_BPF_UNPRIV_DEFAULT_OFF=y -# CONFIG_BPF_PRELOAD is not set -# end of BPF subsystem - -CONFIG_PREEMPT_NONE_BUILD=y -CONFIG_PREEMPT_NONE=y -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PREEMPT is not set -# CONFIG_PREEMPT_RT is not set -# CONFIG_PREEMPT_DYNAMIC is not set - -# -# CPU/Task time and stats accounting -# -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -CONFIG_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_SCHED_AVG_IRQ=y -CONFIG_SCHED_HW_PRESSURE=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y -CONFIG_PSI=y -CONFIG_PSI_DEFAULT_DISABLED=y -# end of CPU/Task time and stats accounting - -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -# CONFIG_RCU_EXPERT is not set -CONFIG_TREE_SRCU=y -CONFIG_TASKS_RCU_GENERIC=y -CONFIG_NEED_TASKS_RCU=y -CONFIG_TASKS_RUDE_RCU=y -CONFIG_TASKS_TRACE_RCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -# end of RCU Subsystem - -CONFIG_IKCONFIG=m -CONFIG_IKCONFIG_PROC=y -# CONFIG_IKHEADERS is not set -CONFIG_LOG_BUF_SHIFT=18 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=0 -# CONFIG_PRINTK_INDEX is not set -CONFIG_GENERIC_SCHED_CLOCK=y - -# -# Scheduler features -# -# CONFIG_UCLAMP_TASK is not set -# end of Scheduler features - -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y -CONFIG_CC_HAS_INT128=y -CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" -CONFIG_GCC10_NO_ARRAY_BOUNDS=y -CONFIG_CC_NO_ARRAY_BOUNDS=y -CONFIG_GCC_NO_STRINGOP_OVERFLOW=y -CONFIG_CC_NO_STRINGOP_OVERFLOW=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_SLAB_OBJ_EXT=y -CONFIG_CGROUPS=y -CONFIG_PAGE_COUNTER=y -# CONFIG_CGROUP_FAVOR_DYNMODS is not set -CONFIG_MEMCG=y -# CONFIG_MEMCG_V1 is not set -CONFIG_BLK_CGROUP=y -CONFIG_CGROUP_WRITEBACK=y -CONFIG_CGROUP_SCHED=y -CONFIG_GROUP_SCHED_WEIGHT=y -CONFIG_FAIR_GROUP_SCHED=y -CONFIG_CFS_BANDWIDTH=y -CONFIG_RT_GROUP_SCHED=y -CONFIG_SCHED_MM_CID=y -CONFIG_CGROUP_PIDS=y -CONFIG_CGROUP_RDMA=y -CONFIG_CGROUP_FREEZER=y -CONFIG_CGROUP_HUGETLB=y -CONFIG_CPUSETS=y -# CONFIG_CPUSETS_V1 is not set -# CONFIG_PROC_PID_CPUSET is not set -CONFIG_CGROUP_DEVICE=y -CONFIG_CGROUP_CPUACCT=y -CONFIG_CGROUP_PERF=y -CONFIG_CGROUP_BPF=y -CONFIG_CGROUP_MISC=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y -CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_TIME_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -CONFIG_CHECKPOINT_RESTORE=y -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_RELAY is not set -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_RD_GZIP=y -# CONFIG_RD_BZIP2 is not set -# CONFIG_RD_LZMA is not set -# CONFIG_RD_XZ is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_LZ4 is not set -CONFIG_RD_ZSTD=y -# CONFIG_BOOT_CONFIG is not set -CONFIG_INITRAMFS_PRESERVE_MTIME=y -CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_LD_ORPHAN_WARN=y -CONFIG_LD_ORPHAN_WARN_LEVEL="warn" -CONFIG_SYSCTL=y -CONFIG_HAVE_UID16=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_EXPERT=y -# CONFIG_UID16 is not set -CONFIG_MULTIUSER=y -# CONFIG_SGETMASK_SYSCALL is not set -# CONFIG_SYSFS_SYSCALL is not set -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_BUG=y -# CONFIG_BASE_SMALL is not set -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -CONFIG_IO_URING=y -CONFIG_ADVISE_SYSCALLS=y -CONFIG_MEMBARRIER=y -CONFIG_KCMP=y -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set -CONFIG_CACHESTAT_SYSCALL=y -# CONFIG_PC104 is not set -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_SELFTEST is not set -CONFIG_KALLSYMS_ALL=y -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -CONFIG_HAVE_PERF_EVENTS=y - -# -# Kernel Performance Events And Counters -# -CONFIG_PERF_EVENTS=y -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -# end of Kernel Performance Events And Counters - -# CONFIG_PROFILING is not set -CONFIG_TRACEPOINTS=y - -# -# Kexec and crash features -# -CONFIG_CRASH_RESERVE=y -CONFIG_VMCORE_INFO=y -CONFIG_KEXEC_CORE=y -CONFIG_KEXEC=y -CONFIG_KEXEC_FILE=y -# CONFIG_KEXEC_SIG is not set -CONFIG_CRASH_DUMP=y -# end of Kexec and crash features -# end of General setup - -CONFIG_ARM64=y -CONFIG_RUSTC_SUPPORTS_ARM64=y -CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y -CONFIG_64BIT=y -CONFIG_MMU=y -CONFIG_ARM64_CONT_PTE_SHIFT=4 -CONFIG_ARM64_CONT_PMD_SHIFT=4 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=18 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_SMP=y -CONFIG_KERNEL_MODE_NEON=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=5 -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y - -# -# Platform selection -# -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_AIROHA is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_APPLE is not set -# CONFIG_ARCH_BCM is not set -# CONFIG_ARCH_BERLIN is not set -# CONFIG_ARCH_BITMAIN is not set -# CONFIG_ARCH_EXYNOS is not set -# CONFIG_ARCH_SPARX5 is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_LG1K is not set -# CONFIG_ARCH_HISI is not set -# CONFIG_ARCH_KEEMBAY is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_NXP is not set -# CONFIG_ARCH_MA35 is not set -# CONFIG_ARCH_NPCM is not set -# CONFIG_ARCH_PENSANDO is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_REALTEK is not set -# CONFIG_ARCH_RENESAS is not set -CONFIG_ARCH_ROCKCHIP=y -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_INTEL_SOCFPGA is not set -# CONFIG_ARCH_STM32 is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_VISCONTI is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZYNQMP is not set -# end of Platform selection - -# -# Kernel Features -# - -# -# ARM errata workarounds via the alternatives framework -# -CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y -# CONFIG_ARM64_ERRATUM_826319 is not set -# CONFIG_ARM64_ERRATUM_827319 is not set -# CONFIG_ARM64_ERRATUM_824069 is not set -# CONFIG_ARM64_ERRATUM_819472 is not set -# CONFIG_ARM64_ERRATUM_832075 is not set -CONFIG_ARM64_ERRATUM_1742098=y -# CONFIG_ARM64_ERRATUM_845719 is not set -# CONFIG_ARM64_ERRATUM_843419 is not set -CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_1024718=y -# CONFIG_ARM64_ERRATUM_1418040 is not set -CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y -# CONFIG_ARM64_ERRATUM_1165522 is not set -# CONFIG_ARM64_ERRATUM_1319367 is not set -CONFIG_ARM64_ERRATUM_1530923=y -# CONFIG_ARM64_ERRATUM_2441007 is not set -# CONFIG_ARM64_ERRATUM_1286807 is not set -# CONFIG_ARM64_ERRATUM_1463225 is not set -# CONFIG_ARM64_ERRATUM_1542419 is not set -# CONFIG_ARM64_ERRATUM_1508412 is not set -# CONFIG_ARM64_ERRATUM_2051678 is not set -CONFIG_ARM64_ERRATUM_2077057=y -CONFIG_ARM64_ERRATUM_2658417=y -# CONFIG_ARM64_ERRATUM_2054223 is not set -# CONFIG_ARM64_ERRATUM_2067961 is not set -# CONFIG_ARM64_ERRATUM_2441009 is not set -CONFIG_ARM64_ERRATUM_2645198=y -CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y -CONFIG_ARM64_ERRATUM_2966298=y -CONFIG_ARM64_ERRATUM_3117295=y -CONFIG_ARM64_ERRATUM_3194386=y -# CONFIG_CAVIUM_ERRATUM_22375 is not set -# CONFIG_CAVIUM_ERRATUM_23154 is not set -# CONFIG_CAVIUM_ERRATUM_27456 is not set -# CONFIG_CAVIUM_ERRATUM_30115 is not set -# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set -# CONFIG_FUJITSU_ERRATUM_010001 is not set -# CONFIG_HISILICON_ERRATUM_161600802 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set -# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set -# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set -CONFIG_ROCKCHIP_ERRATUM_3588001=y -# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set -# end of ARM errata workarounds via the alternatives framework - -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -# CONFIG_ARM64_VA_BITS_39 is not set -# CONFIG_ARM64_VA_BITS_48 is not set -CONFIG_ARM64_VA_BITS_52=y -# CONFIG_ARM64_FORCE_52BIT is not set -CONFIG_ARM64_VA_BITS=52 -CONFIG_ARM64_PA_BITS_52=y -CONFIG_ARM64_PA_BITS=52 -CONFIG_ARM64_LPA2=y -# CONFIG_CPU_BIG_ENDIAN is not set -CONFIG_CPU_LITTLE_ENDIAN=y -CONFIG_SCHED_MC=y -# CONFIG_SCHED_CLUSTER is not set -# CONFIG_SCHED_SMT is not set -CONFIG_NR_CPUS=4 -CONFIG_HOTPLUG_CPU=y -# CONFIG_NUMA is not set -# CONFIG_HZ_100 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_300 is not set -CONFIG_HZ_1000=y -CONFIG_HZ=1000 -CONFIG_SCHED_HRTICK=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_HW_PERF_EVENTS=y -CONFIG_CC_HAVE_SHADOW_CALL_STACK=y -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -CONFIG_ARCH_SUPPORTS_KEXEC=y -CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y -CONFIG_ARCH_SELECTS_KEXEC_FILE=y -CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y -CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y -CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y -CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y -CONFIG_ARCH_DEFAULT_CRASH_DUMP=y -CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y -CONFIG_TRANS_TABLE=y -# CONFIG_XEN is not set -CONFIG_ARCH_FORCE_MAX_ORDER=10 -# CONFIG_UNMAP_KERNEL_AT_EL0 is not set -CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y -CONFIG_RODATA_FULL_DEFAULT_ENABLED=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set -# CONFIG_ARM64_TAGGED_ADDR_ABI is not set -CONFIG_COMPAT=y -CONFIG_KUSER_HELPERS=y -# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set -CONFIG_ARMV8_DEPRECATED=y -# CONFIG_SWP_EMULATION is not set -CONFIG_CP15_BARRIER_EMULATION=y -# CONFIG_SETEND_EMULATION is not set - -# -# ARMv8.1 architectural features -# -# CONFIG_ARM64_HW_AFDBM is not set -CONFIG_ARM64_PAN=y -CONFIG_AS_HAS_LSE_ATOMICS=y -CONFIG_ARM64_LSE_ATOMICS=y -CONFIG_ARM64_USE_LSE_ATOMICS=y -# end of ARMv8.1 architectural features - -# -# ARMv8.2 architectural features -# -CONFIG_AS_HAS_ARMV8_2=y -CONFIG_AS_HAS_SHA3=y -# CONFIG_ARM64_PMEM is not set -CONFIG_ARM64_RAS_EXTN=y -CONFIG_ARM64_CNP=y -# end of ARMv8.2 architectural features - -# -# ARMv8.3 architectural features -# -# CONFIG_ARM64_PTR_AUTH is not set -CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y -CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y -CONFIG_AS_HAS_ARMV8_3=y -CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y -CONFIG_AS_HAS_LDAPR=y -# end of ARMv8.3 architectural features - -# -# ARMv8.4 architectural features -# -# CONFIG_ARM64_AMU_EXTN is not set -CONFIG_AS_HAS_ARMV8_4=y -CONFIG_ARM64_TLB_RANGE=y -# end of ARMv8.4 architectural features - -# -# ARMv8.5 architectural features -# -CONFIG_AS_HAS_ARMV8_5=y -# CONFIG_ARM64_BTI is not set -CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y -# CONFIG_ARM64_E0PD is not set -CONFIG_ARM64_AS_HAS_MTE=y -# end of ARMv8.5 architectural features - -# -# ARMv8.7 architectural features -# -# CONFIG_ARM64_EPAN is not set -# end of ARMv8.7 architectural features - -# -# ARMv8.9 architectural features -# -CONFIG_ARM64_POE=y -CONFIG_ARCH_PKEY_BITS=3 -# end of ARMv8.9 architectural features - -# CONFIG_ARM64_SVE is not set -# CONFIG_ARM64_PSEUDO_NMI is not set -CONFIG_RELOCATABLE=y -# CONFIG_RANDOMIZE_BASE is not set -CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y -# end of Kernel Features - -# -# Boot options -# -CONFIG_CMDLINE="" -CONFIG_EFI_STUB=y -CONFIG_EFI=y -# CONFIG_COMPRESSED_INSTALL is not set -CONFIG_DMI=y -# end of Boot options - -# -# Power management options -# -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -# CONFIG_SUSPEND_SKIP_SYNC is not set -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PM_AUTOSLEEP=y -# CONFIG_PM_USERSPACE_AUTOSLEEP is not set -CONFIG_PM_WAKELOCKS=y -CONFIG_PM_WAKELOCKS_LIMIT=100 -CONFIG_PM_WAKELOCKS_GC=y -CONFIG_PM=y -CONFIG_PM_DEBUG=y -CONFIG_PM_ADVANCED_DEBUG=y -CONFIG_PM_TEST_SUSPEND=y -CONFIG_PM_SLEEP_DEBUG=y -CONFIG_PM_CLK=y -CONFIG_PM_GENERIC_DOMAINS=y -CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y -CONFIG_PM_GENERIC_DOMAINS_SLEEP=y -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_CPU_PM=y -CONFIG_ENERGY_MODEL=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -# end of Power management options - -# -# CPU Power Management -# - -# -# CPU Idle -# -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y -# CONFIG_CPU_IDLE_GOV_LADDER is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CPU_IDLE_GOV_TEO=y -CONFIG_DT_IDLE_STATES=y -CONFIG_DT_IDLE_GENPD=y - -# -# ARM CPU Idle Drivers -# -CONFIG_ARM_PSCI_CPUIDLE=y -CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y -# end of ARM CPU Idle Drivers -# end of CPU Idle - -# -# CPU Frequency scaling -# -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -CONFIG_CPU_FREQ_STAT=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y - -# -# CPU frequency scaling drivers -# -CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -CONFIG_ARM_SCMI_CPUFREQ=y -# end of CPU Frequency scaling -# end of CPU Power Management - -CONFIG_ARCH_SUPPORTS_ACPI=y -# CONFIG_ACPI is not set -# CONFIG_VIRTUALIZATION is not set -CONFIG_CPU_MITIGATIONS=y - -# -# General architecture-dependent options -# -CONFIG_HOTPLUG_CORE_SYNC=y -CONFIG_HOTPLUG_CORE_SYNC_DEAD=y -# CONFIG_KPROBES is not set -CONFIG_JUMP_LABEL=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_HAVE_IOREMAP_PROT=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y -CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y -CONFIG_HAVE_NMI=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_KEEPINITRD=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_ARCH_HAS_SET_DIRECT_MAP=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_ARCH_WANTS_NO_INSTR=y -CONFIG_HAVE_ASM_MODVERSIONS=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_RUST=y -CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y -CONFIG_HAVE_HW_BREAKPOINT=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_MMU_LAZY_TLB_REFCOUNT=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_HAVE_ARCH_SECCOMP=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP=y -CONFIG_SECCOMP_FILTER=y -# CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_HAVE_ARCH_STACKLEAK=y -CONFIG_HAVE_STACKPROTECTOR=y -# CONFIG_STACKPROTECTOR is not set -CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y -# CONFIG_SHADOW_CALL_STACK is not set -CONFIG_ARCH_SUPPORTS_LTO_CLANG=y -CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y -CONFIG_LTO_NONE=y -CONFIG_ARCH_SUPPORTS_CFI_CLANG=y -CONFIG_HAVE_CONTEXT_TRACKING_USER=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_MOVE_PUD=y -CONFIG_HAVE_MOVE_PMD=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_HAVE_ARCH_HUGE_VMALLOC=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_WANTS_EXECMEM_LATE=y -CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y -CONFIG_SOFTIRQ_ON_OWN_STACK=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 -CONFIG_HAVE_PAGE_SIZE_4KB=y -CONFIG_PAGE_SIZE_4KB=y -CONFIG_PAGE_SIZE_LESS_THAN_64KB=y -CONFIG_PAGE_SIZE_LESS_THAN_256KB=y -CONFIG_PAGE_SHIFT=12 -CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_ARCH_SUPPORTS_RT=y -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y -CONFIG_RANDOMIZE_KSTACK_OFFSET=y -# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_HAVE_ARCH_COMPILER_H=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y -CONFIG_ARCH_USE_MEMREMAP_PROT=y -# CONFIG_LOCK_EVENT_COUNTS is not set -CONFIG_ARCH_HAS_RELR=y -CONFIG_ARCH_HAS_MEM_ENCRYPT=y -CONFIG_HAVE_PREEMPT_DYNAMIC=y -CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y -CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y -CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y -CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y -CONFIG_ARCH_HAS_HW_PTE_YOUNG=y -CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -# end of GCOV-based kernel profiling - -CONFIG_HAVE_GCC_PLUGINS=y -CONFIG_GCC_PLUGINS=y -# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_FUNCTION_ALIGNMENT_4B=y -CONFIG_FUNCTION_ALIGNMENT_8B=y -CONFIG_FUNCTION_ALIGNMENT=8 -CONFIG_CC_HAS_MIN_FUNCTION_ALIGNMENT=y -CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y -# end of General architecture-dependent options - -CONFIG_RT_MUTEXES=y -CONFIG_MODULES=y -# CONFIG_MODULE_DEBUG is not set -CONFIG_MODULE_FORCE_LOAD=y -CONFIG_MODULE_UNLOAD=y -CONFIG_MODULE_FORCE_UNLOAD=y -# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set -CONFIG_MODVERSIONS=y -CONFIG_ASM_MODVERSIONS=y -# CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_MODPROBE_PATH="/sbin/modprobe" -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLOCK_LEGACY_AUTOLOAD=y -CONFIG_BLK_CGROUP_RWSTAT=y -CONFIG_BLK_CGROUP_PUNT_BIO=y -CONFIG_BLK_DEV_BSG_COMMON=m -CONFIG_BLK_ICQ=y -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_INTEGRITY is not set -CONFIG_BLK_DEV_WRITE_MOUNTED=y -# CONFIG_BLK_DEV_ZONED is not set -CONFIG_BLK_DEV_THROTTLING=y -# CONFIG_BLK_WBT is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -# CONFIG_BLK_CGROUP_IOCOST is not set -# CONFIG_BLK_CGROUP_IOPRIO is not set -# CONFIG_BLK_DEBUG_FS is not set -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_MSDOS_PARTITION=y -CONFIG_EFI_PARTITION=y -# end of Partition Types - -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_PM=y -CONFIG_BLOCK_HOLDER_DEPRECATED=y -CONFIG_BLK_MQ_STACKING=y - -# -# IO Schedulers -# -# CONFIG_MQ_IOSCHED_DEADLINE is not set -# CONFIG_MQ_IOSCHED_KYBER is not set -CONFIG_IOSCHED_BFQ=y -CONFIG_BFQ_GROUP_IOSCHED=y -# CONFIG_BFQ_CGROUP_DEBUG is not set -# end of IO Schedulers - -CONFIG_PADATA=y -CONFIG_ASN1=m -CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK=y -CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_READ_LOCK=y -CONFIG_ARCH_INLINE_READ_LOCK_BH=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_READ_UNLOCK=y -CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_WRITE_LOCK=y -CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y -CONFIG_INLINE_SPIN_TRYLOCK=y -CONFIG_INLINE_SPIN_TRYLOCK_BH=y -CONFIG_INLINE_SPIN_LOCK=y -CONFIG_INLINE_SPIN_LOCK_BH=y -CONFIG_INLINE_SPIN_LOCK_IRQ=y -CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y -CONFIG_INLINE_SPIN_UNLOCK_BH=y -CONFIG_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y -CONFIG_INLINE_READ_LOCK=y -CONFIG_INLINE_READ_LOCK_BH=y -CONFIG_INLINE_READ_LOCK_IRQ=y -CONFIG_INLINE_READ_LOCK_IRQSAVE=y -CONFIG_INLINE_READ_UNLOCK=y -CONFIG_INLINE_READ_UNLOCK_BH=y -CONFIG_INLINE_READ_UNLOCK_IRQ=y -CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y -CONFIG_INLINE_WRITE_LOCK=y -CONFIG_INLINE_WRITE_LOCK_BH=y -CONFIG_INLINE_WRITE_LOCK_IRQ=y -CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y -CONFIG_INLINE_WRITE_UNLOCK=y -CONFIG_INLINE_WRITE_UNLOCK_BH=y -CONFIG_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y -CONFIG_FREEZER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_ARCH_BINFMT_ELF_STATE=y -CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y -CONFIG_ARCH_HAVE_ELF_PROT=y -CONFIG_ARCH_USE_GNU_PROPERTY=y -CONFIG_ELFCORE=y -CONFIG_BINFMT_SCRIPT=y -# CONFIG_BINFMT_MISC is not set -# CONFIG_COREDUMP is not set -# end of Executable file formats - -# -# Memory Management options -# -# CONFIG_SWAP is not set - -# -# Slab allocator options -# -CONFIG_SLUB=y -# CONFIG_SLUB_TINY is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SLAB_BUCKETS is not set -# CONFIG_SLUB_STATS is not set -CONFIG_SLUB_CPU_PARTIAL=y -# CONFIG_RANDOM_KMALLOC_CACHES is not set -# end of Slab allocator options - -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -# CONFIG_COMPAT_BRK is not set -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_GUP_FAST=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y -# CONFIG_MEMORY_HOTPLUG is not set -CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y -CONFIG_SPLIT_PTE_PTLOCKS=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -CONFIG_SPLIT_PMD_PTLOCKS=y -CONFIG_COMPACTION=y -CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 -# CONFIG_PAGE_REPORTING is not set -CONFIG_MIGRATION=y -CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y -CONFIG_CONTIG_ALLOC=y -CONFIG_PCP_BATCH_SCALE_MAX=5 -CONFIG_PHYS_ADDR_T_64BIT=y -# CONFIG_KSM is not set -CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y -# CONFIG_MEMORY_FAILURE is not set -CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set -CONFIG_PGTABLE_HAS_HUGE_LEAVES=y -CONFIG_CMA=y -CONFIG_CMA_DEBUGFS=y -CONFIG_CMA_SYSFS=y -CONFIG_CMA_AREAS=8 -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y -CONFIG_ARCH_HAS_PTE_DEVMAP=y -CONFIG_ARCH_HAS_ZONE_DMA_SET=y -CONFIG_ZONE_DMA=y -CONFIG_ZONE_DMA32=y -CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y -CONFIG_ARCH_HAS_PKEYS=y -CONFIG_VM_EVENT_COUNTERS=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_TEST is not set -# CONFIG_DMAPOOL_TEST is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y -CONFIG_MEMFD_CREATE=y -CONFIG_SECRETMEM=y -# CONFIG_ANON_VMA_NAME is not set -CONFIG_HAVE_ARCH_USERFAULTFD_WP=y -CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y -CONFIG_USERFAULTFD=y -CONFIG_PTE_MARKER_UFFD_WP=y -# CONFIG_LRU_GEN is not set -CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y -CONFIG_PER_VMA_LOCK=y -CONFIG_LOCK_MM_AND_FIND_VMA=y -CONFIG_EXECMEM=y - -# -# Data Access Monitoring -# -# CONFIG_DAMON is not set -# end of Data Access Monitoring -# end of Memory Management options - -CONFIG_NET=y -CONFIG_COMPAT_NETLINK_MESSAGES=y -CONFIG_NET_INGRESS=y -CONFIG_NET_EGRESS=y -CONFIG_NET_XGRESS=y -CONFIG_SKB_EXTENSIONS=y -CONFIG_NET_DEVMEM=y - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_DIAG is not set -CONFIG_UNIX=y -CONFIG_AF_UNIX_OOB=y -# CONFIG_UNIX_DIAG is not set -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=m -CONFIG_XFRM_USER=m -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_STATISTICS is not set -CONFIG_XFRM_ESP=m -# CONFIG_NET_KEY is not set -# CONFIG_XDP_SOCKETS is not set -CONFIG_NET_HANDSHAKE=y -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -# CONFIG_IP_PNP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE_DEMUX is not set -CONFIG_NET_IP_TUNNEL=m -CONFIG_SYN_COOKIES=y -# CONFIG_NET_IPVTI is not set -CONFIG_NET_UDP_TUNNEL=m -# CONFIG_NET_FOU is not set -# CONFIG_INET_AH is not set -CONFIG_INET_ESP=m -# CONFIG_INET_ESP_OFFLOAD is not set -# CONFIG_INET_ESPINTCP is not set -# CONFIG_INET_IPCOMP is not set -CONFIG_INET_TABLE_PERTURB_ORDER=16 -# CONFIG_INET_DIAG is not set -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -# CONFIG_TCP_AO is not set -# CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_IPV6_ILA is not set -# CONFIG_IPV6_VTI is not set -# CONFIG_IPV6_SIT is not set -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -# CONFIG_IPV6_IOAM6_LWTUNNEL is not set -# CONFIG_MPTCP is not set -# CONFIG_NETWORK_SECMARK is not set -CONFIG_NET_PTP_CLASSIFY=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=y -CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=m - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_EGRESS=y -CONFIG_NETFILTER_NETLINK=m -CONFIG_NETFILTER_FAMILY_BRIDGE=y -CONFIG_NETFILTER_BPF_LINK=y -# CONFIG_NETFILTER_NETLINK_HOOK is not set -# CONFIG_NETFILTER_NETLINK_ACCT is not set -# CONFIG_NETFILTER_NETLINK_QUEUE is not set -# CONFIG_NETFILTER_NETLINK_LOG is not set -# CONFIG_NETFILTER_NETLINK_OSF is not set -CONFIG_NF_CONNTRACK=m -# CONFIG_NF_LOG_SYSLOG is not set -CONFIG_NETFILTER_CONNCOUNT=m -# CONFIG_NF_CONNTRACK_MARK is not set -# CONFIG_NF_CONNTRACK_ZONES is not set -# CONFIG_NF_CONNTRACK_PROCFS is not set -# CONFIG_NF_CONNTRACK_EVENTS is not set -# CONFIG_NF_CONNTRACK_TIMEOUT is not set -# CONFIG_NF_CONNTRACK_TIMESTAMP is not set -# CONFIG_NF_CONNTRACK_LABELS is not set -CONFIG_NF_CT_PROTO_DCCP=y -CONFIG_NF_CT_PROTO_SCTP=y -CONFIG_NF_CT_PROTO_UDPLITE=y -# CONFIG_NF_CONNTRACK_AMANDA is not set -# CONFIG_NF_CONNTRACK_FTP is not set -# CONFIG_NF_CONNTRACK_H323 is not set -# CONFIG_NF_CONNTRACK_IRC is not set -# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set -# CONFIG_NF_CONNTRACK_SNMP is not set -# CONFIG_NF_CONNTRACK_PPTP is not set -# CONFIG_NF_CONNTRACK_SANE is not set -# CONFIG_NF_CONNTRACK_SIP is not set -# CONFIG_NF_CONNTRACK_TFTP is not set -# CONFIG_NF_CT_NETLINK is not set -CONFIG_NF_NAT=m -CONFIG_NF_NAT_REDIRECT=y -CONFIG_NF_NAT_MASQUERADE=y -CONFIG_NF_TABLES=m -# CONFIG_NF_TABLES_INET is not set -# CONFIG_NF_TABLES_NETDEV is not set -# CONFIG_NFT_NUMGEN is not set -CONFIG_NFT_CT=m -CONFIG_NFT_CONNLIMIT=m -# CONFIG_NFT_LOG is not set -# CONFIG_NFT_LIMIT is not set -CONFIG_NFT_MASQ=m -CONFIG_NFT_REDIR=m -# CONFIG_NFT_TUNNEL is not set -# CONFIG_NFT_QUOTA is not set -CONFIG_NFT_REJECT=m -CONFIG_NFT_COMPAT=m -CONFIG_NFT_HASH=m -# CONFIG_NFT_XFRM is not set -# CONFIG_NFT_SOCKET is not set -# CONFIG_NFT_OSF is not set -# CONFIG_NFT_TPROXY is not set -# CONFIG_NFT_SYNPROXY is not set -# CONFIG_NF_FLOW_TABLE is not set -CONFIG_NETFILTER_XTABLES=y -# CONFIG_NETFILTER_XTABLES_COMPAT is not set - -# -# Xtables combined modules -# -CONFIG_NETFILTER_XT_MARK=m -# CONFIG_NETFILTER_XT_CONNMARK is not set - -# -# Xtables targets -# -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m -# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set -# CONFIG_NETFILTER_XT_TARGET_CT is not set -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set -# CONFIG_NETFILTER_XT_TARGET_HL is not set -# CONFIG_NETFILTER_XT_TARGET_HMARK is not set -# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set -# CONFIG_NETFILTER_XT_TARGET_LED is not set -# CONFIG_NETFILTER_XT_TARGET_LOG is not set -CONFIG_NETFILTER_XT_TARGET_MARK=m -CONFIG_NETFILTER_XT_NAT=m -# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set -# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set -# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -CONFIG_NETFILTER_XT_TARGET_REDIRECT=m -CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m -# CONFIG_NETFILTER_XT_TARGET_TEE is not set -# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set -# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set -# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set - -# -# Xtables matches -# -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m -# CONFIG_NETFILTER_XT_MATCH_BPF is not set -# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set -# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m -# CONFIG_NETFILTER_XT_MATCH_CPU is not set -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set -# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set -# CONFIG_NETFILTER_XT_MATCH_ECN is not set -# CONFIG_NETFILTER_XT_MATCH_ESP is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HELPER is not set -# CONFIG_NETFILTER_XT_MATCH_HL is not set -# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set -# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set -CONFIG_NETFILTER_XT_MATCH_IPVS=m -# CONFIG_NETFILTER_XT_MATCH_L2TP is not set -# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set -# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_MAC is not set -# CONFIG_NETFILTER_XT_MATCH_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set -# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set -# CONFIG_NETFILTER_XT_MATCH_OSF is not set -# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set -# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set -# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -# CONFIG_NETFILTER_XT_MATCH_REALM is not set -# CONFIG_NETFILTER_XT_MATCH_RECENT is not set -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set -# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set -# CONFIG_NETFILTER_XT_MATCH_STATE is not set -# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set -# CONFIG_NETFILTER_XT_MATCH_STRING is not set -# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set -# CONFIG_NETFILTER_XT_MATCH_TIME is not set -# CONFIG_NETFILTER_XT_MATCH_U32 is not set -# end of Core Netfilter Configuration - -# CONFIG_IP_SET is not set -CONFIG_IP_VS=m -# CONFIG_IP_VS_IPV6 is not set -# CONFIG_IP_VS_DEBUG is not set -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -# CONFIG_IP_VS_PROTO_ESP is not set -# CONFIG_IP_VS_PROTO_AH is not set -# CONFIG_IP_VS_PROTO_SCTP is not set - -# -# IPVS scheduler -# -CONFIG_IP_VS_RR=m -# CONFIG_IP_VS_WRR is not set -# CONFIG_IP_VS_LC is not set -# CONFIG_IP_VS_WLC is not set -# CONFIG_IP_VS_FO is not set -# CONFIG_IP_VS_OVF is not set -# CONFIG_IP_VS_LBLC is not set -# CONFIG_IP_VS_LBLCR is not set -# CONFIG_IP_VS_DH is not set -# CONFIG_IP_VS_SH is not set -# CONFIG_IP_VS_MH is not set -# CONFIG_IP_VS_SED is not set -# CONFIG_IP_VS_NQ is not set -# CONFIG_IP_VS_TWOS is not set - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -CONFIG_IP_VS_NFCT=y - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=m -CONFIG_IP_NF_IPTABLES_LEGACY=m -# CONFIG_NF_SOCKET_IPV4 is not set -# CONFIG_NF_TPROXY_IPV4 is not set -# CONFIG_NF_TABLES_IPV4 is not set -# CONFIG_NF_TABLES_ARP is not set -# CONFIG_NF_DUP_IPV4 is not set -# CONFIG_NF_LOG_ARP is not set -# CONFIG_NF_LOG_IPV4 is not set -# CONFIG_NF_REJECT_IPV4 is not set -CONFIG_IP_NF_IPTABLES=m -# CONFIG_IP_NF_MATCH_AH is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_RPFILTER is not set -# CONFIG_IP_NF_MATCH_TTL is not set -CONFIG_IP_NF_FILTER=m -# CONFIG_IP_NF_TARGET_REJECT is not set -# CONFIG_IP_NF_TARGET_SYNPROXY is not set -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_TARGET_MASQUERADE=m -# CONFIG_IP_NF_TARGET_NETMAP is not set -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_MANGLE=m -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_NF_RAW is not set -# CONFIG_IP_NF_ARPFILTER is not set -# end of IP: Netfilter Configuration - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_SOCKET_IPV6 is not set -# CONFIG_NF_TPROXY_IPV6 is not set -# CONFIG_NF_TABLES_IPV6 is not set -# CONFIG_NF_DUP_IPV6 is not set -# CONFIG_NF_REJECT_IPV6 is not set -# CONFIG_NF_LOG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=m -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_RPFILTER is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_TARGET_SYNPROXY is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_NAT is not set -# CONFIG_IP6_NF_TARGET_NPT is not set -# end of IPv6: Netfilter Configuration - -CONFIG_NF_DEFRAG_IPV6=m -# CONFIG_NF_TABLES_BRIDGE is not set -# CONFIG_NF_CONNTRACK_BRIDGE is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -# CONFIG_IP_DCCP is not set -# CONFIG_IP_SCTP is not set -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -# CONFIG_L2TP is not set -CONFIG_STP=m -CONFIG_BRIDGE=m -CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_BRIDGE_VLAN_FILTERING=y -# CONFIG_BRIDGE_MRP is not set -# CONFIG_BRIDGE_CFM is not set -# CONFIG_NET_DSA is not set -CONFIG_VLAN_8021Q=m -# CONFIG_VLAN_8021Q_GVRP is not set -# CONFIG_VLAN_8021Q_MVRP is not set -CONFIG_LLC=m -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -CONFIG_NET_SCHED=y - -# -# Queueing/Scheduling -# -# CONFIG_NET_SCH_HTB is not set -# CONFIG_NET_SCH_HFSC is not set -# CONFIG_NET_SCH_PRIO is not set -# CONFIG_NET_SCH_MULTIQ is not set -# CONFIG_NET_SCH_RED is not set -# CONFIG_NET_SCH_SFB is not set -# CONFIG_NET_SCH_SFQ is not set -# CONFIG_NET_SCH_TEQL is not set -# CONFIG_NET_SCH_TBF is not set -# CONFIG_NET_SCH_CBS is not set -# CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_TAPRIO is not set -# CONFIG_NET_SCH_GRED is not set -# CONFIG_NET_SCH_NETEM is not set -# CONFIG_NET_SCH_DRR is not set -# CONFIG_NET_SCH_MQPRIO is not set -# CONFIG_NET_SCH_SKBPRIO is not set -# CONFIG_NET_SCH_CHOKE is not set -# CONFIG_NET_SCH_QFQ is not set -# CONFIG_NET_SCH_CODEL is not set -# CONFIG_NET_SCH_FQ_CODEL is not set -# CONFIG_NET_SCH_CAKE is not set -# CONFIG_NET_SCH_FQ is not set -# CONFIG_NET_SCH_HHF is not set -# CONFIG_NET_SCH_PIE is not set -# CONFIG_NET_SCH_PLUG is not set -# CONFIG_NET_SCH_ETS is not set -# CONFIG_NET_SCH_DEFAULT is not set - -# -# Classification -# -CONFIG_NET_CLS=y -# CONFIG_NET_CLS_BASIC is not set -# CONFIG_NET_CLS_ROUTE4 is not set -# CONFIG_NET_CLS_FW is not set -# CONFIG_NET_CLS_U32 is not set -# CONFIG_NET_CLS_FLOW is not set -CONFIG_NET_CLS_CGROUP=m -# CONFIG_NET_CLS_BPF is not set -# CONFIG_NET_CLS_FLOWER is not set -# CONFIG_NET_CLS_MATCHALL is not set -# CONFIG_NET_EMATCH is not set -# CONFIG_NET_CLS_ACT is not set -CONFIG_NET_SCH_FIFO=y -# CONFIG_DCB is not set -CONFIG_DNS_RESOLVER=m -# CONFIG_BATMAN_ADV is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_VSOCKETS is not set -CONFIG_NETLINK_DIAG=y -# CONFIG_MPLS is not set -# CONFIG_NET_NSH is not set -# CONFIG_HSR is not set -# CONFIG_NET_SWITCHDEV is not set -CONFIG_NET_L3_MASTER_DEV=y -# CONFIG_QRTR is not set -# CONFIG_NET_NCSI is not set -CONFIG_PCPU_DEV_REFCNT=y -CONFIG_MAX_SKB_FRAGS=17 -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_SOCK_RX_QUEUE_MAPPING=y -CONFIG_XPS=y -CONFIG_CGROUP_NET_PRIO=y -CONFIG_CGROUP_NET_CLASSID=y -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -# CONFIG_BPF_STREAM_PARSER is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# end of Network testing -# end of Networking options - -# CONFIG_HAMRADIO is not set -# CONFIG_CAN is not set -CONFIG_BT=m -CONFIG_BT_BREDR=y -CONFIG_BT_RFCOMM=y -CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=m -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -CONFIG_BT_HIDP=m -CONFIG_BT_LE=y -CONFIG_BT_LE_L2CAP_ECRED=y -CONFIG_BT_LEDS=y -# CONFIG_BT_MSFTEXT is not set -# CONFIG_BT_AOSPEXT is not set -CONFIG_BT_DEBUGFS=y -# CONFIG_BT_SELFTEST is not set - -# -# Bluetooth device drivers -# -CONFIG_BT_BCM=m -# CONFIG_BT_HCIBTUSB is not set -# CONFIG_BT_HCIBTSDIO is not set -CONFIG_BT_HCIUART=m -CONFIG_BT_HCIUART_SERDEV=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_NOKIA is not set -# CONFIG_BT_HCIUART_BCSP is not set -# CONFIG_BT_HCIUART_ATH3K is not set -# CONFIG_BT_HCIUART_LL is not set -# CONFIG_BT_HCIUART_3WIRE is not set -# CONFIG_BT_HCIUART_INTEL is not set -CONFIG_BT_HCIUART_BCM=y -# CONFIG_BT_HCIUART_RTL is not set -# CONFIG_BT_HCIUART_QCA is not set -# CONFIG_BT_HCIUART_AG6XX is not set -# CONFIG_BT_HCIUART_MRVL is not set -# CONFIG_BT_HCIUART_AML is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBCM4377 is not set -# CONFIG_BT_HCIBPA10X is not set -# CONFIG_BT_HCIBFUSB is not set -# CONFIG_BT_HCIVHCI is not set -# CONFIG_BT_MRVL is not set -# CONFIG_BT_MTKSDIO is not set -# CONFIG_BT_MTKUART is not set -# CONFIG_BT_NXPUART is not set -# CONFIG_BT_INTEL_PCIE is not set -# end of Bluetooth device drivers - -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -# CONFIG_MCTP is not set -CONFIG_WIRELESS=y -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PROC=y -CONFIG_CFG80211=m -# CONFIG_NL80211_TESTMODE is not set -# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set -CONFIG_CFG80211_CERTIFICATION_ONUS=y -# CONFIG_CFG80211_REQUIRE_SIGNED_REGDB is not set -# CONFIG_CFG80211_REG_CELLULAR_HINTS is not set -# CONFIG_CFG80211_REG_RELAX_NO_IR is not set -CONFIG_CFG80211_DEFAULT_PS=y -CONFIG_CFG80211_DEBUGFS=y -# CONFIG_CFG80211_CRDA_SUPPORT is not set -CONFIG_CFG80211_WEXT=y -CONFIG_MAC80211=m -# CONFIG_MAC80211_RC_MINSTREL is not set -CONFIG_MAC80211_RC_DEFAULT="" - -# -# Some wireless drivers require a rate control algorithm -# -# CONFIG_MAC80211_MESH is not set -CONFIG_MAC80211_LEDS=y -CONFIG_MAC80211_DEBUGFS=y -# CONFIG_MAC80211_MESSAGE_TRACING is not set -# CONFIG_MAC80211_DEBUG_MENU is not set -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -CONFIG_RFKILL=m -CONFIG_RFKILL_LEDS=y -CONFIG_RFKILL_INPUT=y -# CONFIG_RFKILL_GPIO is not set -# CONFIG_NET_9P is not set -# CONFIG_CAIF is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -# CONFIG_LWTUNNEL is not set -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -CONFIG_NET_SELFTESTS=y -CONFIG_NET_SOCK_MSG=y -CONFIG_PAGE_POOL=y -# CONFIG_PAGE_POOL_STATS is not set -# CONFIG_FAILOVER is not set -# CONFIG_ETHTOOL_NETLINK is not set - -# -# Device Drivers -# -CONFIG_ARM_AMBA=y -CONFIG_HAVE_PCI=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_SYSCALL=y -# CONFIG_PCIEPORTBUS is not set -CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -# CONFIG_PCIE_PTM is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_NPEM is not set -# CONFIG_PCI_PRI is not set -# CONFIG_PCI_PASID is not set -CONFIG_PCI_LABEL=y -# CONFIG_PCI_DYNAMIC_OF_NODES is not set -# CONFIG_PCIE_BUS_TUNE_OFF is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_PEER2PEER is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 -# CONFIG_HOTPLUG_PCI is not set - -# -# PCI controller drivers -# -# CONFIG_PCIE_ALTERA is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCIE_ROCKCHIP_HOST is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCIE_XILINX is not set - -# -# Cadence-based PCIe controllers -# -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# end of Cadence-based PCIe controllers - -# -# DesignWare-based PCIe controllers -# -CONFIG_PCIE_DW=y -CONFIG_PCIE_DW_HOST=y -# CONFIG_PCIE_AL is not set -# CONFIG_PCI_MESON is not set -# CONFIG_PCI_HISI is not set -# CONFIG_PCIE_KIRIN is not set -# CONFIG_PCIE_DW_PLAT_HOST is not set -CONFIG_PCIE_ROCKCHIP_DW=y -CONFIG_PCIE_ROCKCHIP_DW_HOST=y -# end of DesignWare-based PCIe controllers - -# -# Mobiveil-based PCIe controllers -# -# end of Mobiveil-based PCIe controllers - -# -# PLDA-based PCIe controllers -# -# CONFIG_PCIE_MICROCHIP_HOST is not set -# end of PLDA-based PCIe controllers -# end of PCI controller drivers - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set -# end of PCI Endpoint - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set -# end of PCI switch controller drivers - -# CONFIG_CXL_BUS is not set -# CONFIG_PCCARD is not set -# CONFIG_RAPIDIO is not set - -# -# Generic Driver Options -# -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" -CONFIG_DEVTMPFS=y -CONFIG_DEVTMPFS_MOUNT=y -# CONFIG_DEVTMPFS_SAFE is not set -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y - -# -# Firmware loader -# -CONFIG_FW_LOADER=y -CONFIG_FW_LOADER_DEBUG=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -CONFIG_FW_LOADER_COMPRESS=y -CONFIG_FW_LOADER_COMPRESS_XZ=y -CONFIG_FW_LOADER_COMPRESS_ZSTD=y -# CONFIG_FW_CACHE is not set -# CONFIG_FW_UPLOAD is not set -# end of Firmware loader - -CONFIG_WANT_DEV_COREDUMP=y -# CONFIG_ALLOW_DEV_COREDUMP is not set -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_GENERIC_CPU_DEVICES=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_SPI=m -CONFIG_REGMAP_MMIO=y -CONFIG_REGMAP_IRQ=y -CONFIG_DMA_SHARED_BUFFER=y -# CONFIG_DMA_FENCE_TRACE is not set -CONFIG_GENERIC_ARCH_TOPOLOGY=y -# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set -# end of Generic Driver Options - -# -# Bus devices -# -# CONFIG_MOXTET is not set -# CONFIG_VEXPRESS_CONFIG is not set -# CONFIG_MHI_BUS is not set -# CONFIG_MHI_BUS_EP is not set -# end of Bus devices - -# -# Cache Drivers -# -# end of Cache Drivers - -# CONFIG_CONNECTOR is not set - -# -# Firmware Drivers -# - -# -# ARM System Control and Management Interface Protocol -# -CONFIG_ARM_SCMI_PROTOCOL=y -# CONFIG_ARM_SCMI_RAW_MODE_SUPPORT is not set -# CONFIG_ARM_SCMI_DEBUG_COUNTERS is not set - -# -# SCMI Transport Drivers -# -CONFIG_ARM_SCMI_HAVE_TRANSPORT=y -CONFIG_ARM_SCMI_HAVE_SHMEM=y -# CONFIG_ARM_SCMI_TRANSPORT_MAILBOX is not set -CONFIG_ARM_SCMI_TRANSPORT_SMC=y -# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set -# end of SCMI Transport Drivers - -# -# ARM SCMI NXP i.MX Vendor Protocols -# -# CONFIG_IMX_SCMI_BBM_EXT is not set -# CONFIG_IMX_SCMI_MISC_EXT is not set -# end of ARM SCMI NXP i.MX Vendor Protocols - -# CONFIG_ARM_SCMI_POWER_CONTROL is not set -# end of ARM System Control and Management Interface Protocol - -# CONFIG_ARM_SCPI_PROTOCOL is not set -CONFIG_FIRMWARE_MEMMAP=y -CONFIG_DMIID=y -CONFIG_DMI_SYSFS=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_ROCKCHIP_SIP=y -# CONFIG_SYSFB_SIMPLEFB is not set -# CONFIG_ARM_FFA_TRANSPORT is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# EFI (Extensible Firmware Interface) Support -# -CONFIG_EFI_ESRT=y -CONFIG_EFI_PARAMS_FROM_FDT=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_GENERIC_STUB=y -# CONFIG_EFI_ZBOOT is not set -CONFIG_EFI_ARMSTUB_DTB_LOADER=y -CONFIG_EFI_BOOTLOADER_CONTROL=y -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_RESET_ATTACK_MITIGATION is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -# CONFIG_EFI_DISABLE_RUNTIME is not set -# CONFIG_EFI_COCO_SECRET is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_PSCI_CHECKER is not set - -# -# Qualcomm firmware drivers -# -# end of Qualcomm firmware drivers - -CONFIG_HAVE_ARM_SMCCC=y -CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y -# CONFIG_ARM_SMCCC_SOC_ID is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - -# CONFIG_GNSS is not set -# CONFIG_MTD is not set -CONFIG_DTC=y -CONFIG_OF=y -# CONFIG_OF_UNITTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_KOBJ=y -CONFIG_OF_DYNAMIC=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_RESERVED_MEM=y -CONFIG_OF_RESOLVE=y -CONFIG_OF_OVERLAY=y -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -CONFIG_CDROM=m -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_ZRAM is not set -CONFIG_ZRAM_DEF_COMP="unset-value" -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_RAM is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_UBLK is not set - -# -# NVME Support -# -# CONFIG_BLK_DEV_NVME is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TCP is not set -# CONFIG_NVME_TARGET is not set -# end of NVME Support - -# -# Misc devices -# -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_PHANTOM is not set -# CONFIG_RPMB is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set -# CONFIG_SRAM is not set -# CONFIG_DW_XDATA_PCIE is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_HISI_HIKEY_USB is not set -# CONFIG_OPEN_DICE is not set -# CONFIG_VCPU_STALL_DETECTOR is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set -# end of EEPROM support - -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# CONFIG_TI_ST is not set -# end of Texas Instruments shared transport line discipline - -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set -# CONFIG_VMWARE_VMCI is not set -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_BCM_VK is not set -# CONFIG_MISC_ALCOR_PCI is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_UACCE is not set -# CONFIG_PVPANIC is not set -# CONFIG_GP_PCI1XXXX is not set -# CONFIG_KEBA_CP500 is not set -# end of Misc devices - -# -# SCSI device support -# -CONFIG_SCSI_MOD=m -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI_COMMON=m -CONFIG_SCSI=m -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_PROC_FS is not set - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=m -# CONFIG_CHR_DEV_ST is not set -CONFIG_BLK_DEV_SR=m -CONFIG_CHR_DEV_SG=m -CONFIG_BLK_DEV_BSG=y -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -CONFIG_SCSI_SCAN_ASYNC=y - -# -# SCSI Transports -# -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -# end of SCSI Transports - -# CONFIG_SCSI_LOWLEVEL is not set -# CONFIG_SCSI_DH is not set -# end of SCSI device support - -CONFIG_ATA=m -CONFIG_SATA_HOST=y -CONFIG_ATA_VERBOSE_ERROR=y -CONFIG_ATA_FORCE=y -CONFIG_SATA_PMP=y - -# -# Controllers with non-SFF native interface -# -CONFIG_SATA_AHCI=m -CONFIG_SATA_MOBILE_LPM_POLICY=3 -CONFIG_SATA_AHCI_PLATFORM=m -CONFIG_AHCI_DWC=m -# CONFIG_AHCI_CEVA is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -CONFIG_ATA_SFF=y - -# -# SFF controllers with custom DMA interface -# -# CONFIG_PDC_ADMA is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_SX4 is not set -CONFIG_ATA_BMDMA=y - -# -# SATA SFF controllers with BMDMA -# -# CONFIG_ATA_PIIX is not set -# CONFIG_SATA_DWC is not set -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set - -# -# PATA SFF controllers with BMDMA -# -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -# CONFIG_PATA_SIS is not set -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set - -# -# PIO-only SFF controllers -# -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_OF_PLATFORM is not set -# CONFIG_PATA_RZ1000 is not set - -# -# Generic fallback / legacy drivers -# -# CONFIG_ATA_GENERIC is not set -# CONFIG_PATA_LEGACY is not set -CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -CONFIG_MD_BITMAP_FILE=y -# CONFIG_BCACHE is not set -CONFIG_BLK_DEV_DM_BUILTIN=y -CONFIG_BLK_DEV_DM=m -# CONFIG_DM_DEBUG is not set -CONFIG_DM_BUFIO=m -# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set -CONFIG_DM_BIO_PRISON=m -CONFIG_DM_PERSISTENT_DATA=m -# CONFIG_DM_UNSTRIPED is not set -CONFIG_DM_CRYPT=m -# CONFIG_DM_SNAPSHOT is not set -CONFIG_DM_THIN_PROVISIONING=m -# CONFIG_DM_CACHE is not set -# CONFIG_DM_WRITECACHE is not set -# CONFIG_DM_EBS is not set -# CONFIG_DM_ERA is not set -# CONFIG_DM_CLONE is not set -# CONFIG_DM_MIRROR is not set -# CONFIG_DM_RAID is not set -# CONFIG_DM_ZERO is not set -# CONFIG_DM_MULTIPATH is not set -# CONFIG_DM_DELAY is not set -# CONFIG_DM_DUST is not set -# CONFIG_DM_UEVENT is not set -# CONFIG_DM_FLAKEY is not set -# CONFIG_DM_VERITY is not set -# CONFIG_DM_SWITCH is not set -# CONFIG_DM_LOG_WRITES is not set -# CONFIG_DM_INTEGRITY is not set -# CONFIG_DM_VDO is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_FUSION is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# end of IEEE 1394 (FireWire) support - -CONFIG_NETDEVICES=y -CONFIG_MII=y -CONFIG_NET_CORE=y -# CONFIG_BONDING is not set -CONFIG_DUMMY=m -CONFIG_WIREGUARD=m -# CONFIG_WIREGUARD_DEBUG is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_TEAM is not set -CONFIG_MACVLAN=m -# CONFIG_MACVTAP is not set -CONFIG_IPVLAN_L3S=y -CONFIG_IPVLAN=m -# CONFIG_IPVTAP is not set -CONFIG_VXLAN=m -# CONFIG_GENEVE is not set -# CONFIG_BAREUDP is not set -# CONFIG_GTP is not set -# CONFIG_PFCP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=m -# CONFIG_TUN_VNET_CROSS_LE is not set -CONFIG_VETH=m -# CONFIG_NLMON is not set -# CONFIG_NETKIT is not set -# CONFIG_ARCNET is not set -CONFIG_ETHERNET=y -CONFIG_NET_VENDOR_3COM=y -# CONFIG_VORTEX is not set -# CONFIG_TYPHOON is not set -CONFIG_NET_VENDOR_ADAPTEC=y -# CONFIG_ADAPTEC_STARFIRE is not set -CONFIG_NET_VENDOR_AGERE=y -# CONFIG_ET131X is not set -CONFIG_NET_VENDOR_ALACRITECH=y -# CONFIG_SLICOSS is not set -CONFIG_NET_VENDOR_ALTEON=y -# CONFIG_ACENIC is not set -# CONFIG_ALTERA_TSE is not set -CONFIG_NET_VENDOR_AMAZON=y -# CONFIG_ENA_ETHERNET is not set -CONFIG_NET_VENDOR_AMD=y -# CONFIG_AMD8111_ETH is not set -# CONFIG_PCNET32 is not set -# CONFIG_AMD_XGBE is not set -# CONFIG_PDS_CORE is not set -CONFIG_NET_VENDOR_AQUANTIA=y -# CONFIG_AQTION is not set -CONFIG_NET_VENDOR_ARC=y -# CONFIG_EMAC_ROCKCHIP is not set -CONFIG_NET_VENDOR_ASIX=y -# CONFIG_SPI_AX88796C is not set -CONFIG_NET_VENDOR_ATHEROS=y -# CONFIG_ATL2 is not set -# CONFIG_ATL1 is not set -# CONFIG_ATL1E is not set -# CONFIG_ATL1C is not set -# CONFIG_ALX is not set -CONFIG_NET_VENDOR_BROADCOM=y -# CONFIG_B44 is not set -# CONFIG_BCMGENET is not set -# CONFIG_BNX2 is not set -# CONFIG_CNIC is not set -# CONFIG_TIGON3 is not set -# CONFIG_BNX2X is not set -# CONFIG_SYSTEMPORT is not set -# CONFIG_BNXT is not set -CONFIG_NET_VENDOR_CADENCE=y -# CONFIG_MACB is not set -CONFIG_NET_VENDOR_CAVIUM=y -# CONFIG_THUNDER_NIC_PF is not set -# CONFIG_THUNDER_NIC_VF is not set -# CONFIG_THUNDER_NIC_BGX is not set -# CONFIG_THUNDER_NIC_RGX is not set -# CONFIG_CAVIUM_PTP is not set -# CONFIG_LIQUIDIO is not set -# CONFIG_LIQUIDIO_VF is not set -CONFIG_NET_VENDOR_CHELSIO=y -# CONFIG_CHELSIO_T1 is not set -# CONFIG_CHELSIO_T3 is not set -# CONFIG_CHELSIO_T4 is not set -# CONFIG_CHELSIO_T4VF is not set -CONFIG_NET_VENDOR_CISCO=y -# CONFIG_ENIC is not set -CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_GEMINI_ETHERNET is not set -CONFIG_NET_VENDOR_DAVICOM=y -# CONFIG_DM9051 is not set -# CONFIG_DNET is not set -CONFIG_NET_VENDOR_DEC=y -# CONFIG_NET_TULIP is not set -CONFIG_NET_VENDOR_DLINK=y -# CONFIG_DL2K is not set -# CONFIG_SUNDANCE is not set -CONFIG_NET_VENDOR_EMULEX=y -# CONFIG_BE2NET is not set -CONFIG_NET_VENDOR_ENGLEDER=y -# CONFIG_TSNEP is not set -CONFIG_NET_VENDOR_EZCHIP=y -# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set -CONFIG_NET_VENDOR_FUNGIBLE=y -# CONFIG_FUN_ETH is not set -CONFIG_NET_VENDOR_GOOGLE=y -# CONFIG_GVE is not set -CONFIG_NET_VENDOR_HISILICON=y -# CONFIG_HIX5HD2_GMAC is not set -# CONFIG_HISI_FEMAC is not set -# CONFIG_HIP04_ETH is not set -# CONFIG_HNS_DSAF is not set -# CONFIG_HNS_ENET is not set -# CONFIG_HNS3 is not set -CONFIG_NET_VENDOR_HUAWEI=y -# CONFIG_HINIC is not set -CONFIG_NET_VENDOR_I825XX=y -CONFIG_NET_VENDOR_INTEL=y -# CONFIG_E100 is not set -# CONFIG_E1000 is not set -# CONFIG_E1000E is not set -# CONFIG_IGB is not set -# CONFIG_IGBVF is not set -# CONFIG_IXGBE is not set -# CONFIG_IXGBEVF is not set -# CONFIG_I40E is not set -# CONFIG_I40EVF is not set -# CONFIG_ICE is not set -# CONFIG_FM10K is not set -# CONFIG_IGC is not set -# CONFIG_IDPF is not set -# CONFIG_JME is not set -CONFIG_NET_VENDOR_ADI=y -CONFIG_NET_VENDOR_LITEX=y -# CONFIG_LITEX_LITEETH is not set -CONFIG_NET_VENDOR_MARVELL=y -# CONFIG_MVMDIO is not set -# CONFIG_SKGE is not set -# CONFIG_SKY2 is not set -# CONFIG_OCTEONTX2_AF is not set -# CONFIG_OCTEONTX2_PF is not set -# CONFIG_OCTEON_EP is not set -# CONFIG_OCTEON_EP_VF is not set -CONFIG_NET_VENDOR_MELLANOX=y -# CONFIG_MLX4_EN is not set -# CONFIG_MLX5_CORE is not set -# CONFIG_MLXSW_CORE is not set -# CONFIG_MLXFW is not set -CONFIG_NET_VENDOR_META=y -CONFIG_NET_VENDOR_MICREL=y -# CONFIG_KS8842 is not set -# CONFIG_KS8851 is not set -# CONFIG_KS8851_MLL is not set -# CONFIG_KSZ884X_PCI is not set -CONFIG_NET_VENDOR_MICROCHIP=y -# CONFIG_ENC28J60 is not set -# CONFIG_ENCX24J600 is not set -# CONFIG_LAN743X is not set -# CONFIG_LAN865X is not set -# CONFIG_VCAP is not set -CONFIG_NET_VENDOR_MICROSEMI=y -CONFIG_NET_VENDOR_MICROSOFT=y -CONFIG_NET_VENDOR_MYRI=y -# CONFIG_MYRI10GE is not set -# CONFIG_FEALNX is not set -CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set -CONFIG_NET_VENDOR_NATSEMI=y -# CONFIG_NATSEMI is not set -# CONFIG_NS83820 is not set -CONFIG_NET_VENDOR_NETERION=y -# CONFIG_S2IO is not set -CONFIG_NET_VENDOR_NETRONOME=y -# CONFIG_NFP is not set -CONFIG_NET_VENDOR_8390=y -# CONFIG_NE2K_PCI is not set -CONFIG_NET_VENDOR_NVIDIA=y -# CONFIG_FORCEDETH is not set -CONFIG_NET_VENDOR_OKI=y -# CONFIG_ETHOC is not set -# CONFIG_OA_TC6 is not set -CONFIG_NET_VENDOR_PACKET_ENGINES=y -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set -CONFIG_NET_VENDOR_PENSANDO=y -# CONFIG_IONIC is not set -CONFIG_NET_VENDOR_QLOGIC=y -# CONFIG_QLA3XXX is not set -# CONFIG_QLCNIC is not set -# CONFIG_NETXEN_NIC is not set -# CONFIG_QED is not set -CONFIG_NET_VENDOR_BROCADE=y -# CONFIG_BNA is not set -CONFIG_NET_VENDOR_QUALCOMM=y -# CONFIG_QCA7000_SPI is not set -# CONFIG_QCA7000_UART is not set -# CONFIG_QCOM_EMAC is not set -# CONFIG_RMNET is not set -CONFIG_NET_VENDOR_RDC=y -# CONFIG_R6040 is not set -CONFIG_NET_VENDOR_REALTEK=y -# CONFIG_8139CP is not set -# CONFIG_8139TOO is not set -# CONFIG_R8169 is not set -# CONFIG_RTASE is not set -CONFIG_NET_VENDOR_RENESAS=y -CONFIG_NET_VENDOR_ROCKER=y -CONFIG_NET_VENDOR_SAMSUNG=y -# CONFIG_SXGBE_ETH is not set -CONFIG_NET_VENDOR_SEEQ=y -CONFIG_NET_VENDOR_SILAN=y -# CONFIG_SC92031 is not set -CONFIG_NET_VENDOR_SIS=y -# CONFIG_SIS900 is not set -# CONFIG_SIS190 is not set -CONFIG_NET_VENDOR_SOLARFLARE=y -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set -# CONFIG_SFC_SIENA is not set -CONFIG_NET_VENDOR_SMSC=y -# CONFIG_SMC91X is not set -# CONFIG_EPIC100 is not set -# CONFIG_SMSC911X is not set -# CONFIG_SMSC9420 is not set -CONFIG_NET_VENDOR_SOCIONEXT=y -CONFIG_NET_VENDOR_STMICRO=y -CONFIG_STMMAC_ETH=y -# CONFIG_STMMAC_SELFTESTS is not set -CONFIG_STMMAC_PLATFORM=y -# CONFIG_DWMAC_DWC_QOS_ETH is not set -CONFIG_DWMAC_GENERIC=y -CONFIG_DWMAC_ROCKCHIP=y -# CONFIG_DWMAC_INTEL_PLAT is not set -# CONFIG_STMMAC_PCI is not set -CONFIG_NET_VENDOR_SUN=y -# CONFIG_HAPPYMEAL is not set -# CONFIG_SUNGEM is not set -# CONFIG_CASSINI is not set -# CONFIG_NIU is not set -CONFIG_NET_VENDOR_SYNOPSYS=y -# CONFIG_DWC_XLGMAC is not set -CONFIG_NET_VENDOR_TEHUTI=y -# CONFIG_TEHUTI is not set -# CONFIG_TEHUTI_TN40 is not set -CONFIG_NET_VENDOR_TI=y -# CONFIG_TI_CPSW_PHY_SEL is not set -# CONFIG_TLAN is not set -CONFIG_NET_VENDOR_VERTEXCOM=y -# CONFIG_MSE102X is not set -CONFIG_NET_VENDOR_VIA=y -# CONFIG_VIA_RHINE is not set -# CONFIG_VIA_VELOCITY is not set -CONFIG_NET_VENDOR_WANGXUN=y -# CONFIG_NGBE is not set -CONFIG_NET_VENDOR_WIZNET=y -# CONFIG_WIZNET_W5100 is not set -# CONFIG_WIZNET_W5300 is not set -CONFIG_NET_VENDOR_XILINX=y -# CONFIG_XILINX_EMACLITE is not set -# CONFIG_XILINX_LL_TEMAC is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -CONFIG_PHYLINK=y -CONFIG_PHYLIB=y -CONFIG_SWPHY=y -# CONFIG_LED_TRIGGER_PHY is not set -CONFIG_PHYLIB_LEDS=y -CONFIG_FIXED_PHY=y -# CONFIG_SFP is not set - -# -# MII PHY device drivers -# -# CONFIG_AIR_EN8811H_PHY is not set -# CONFIG_AMD_PHY is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_ADIN1100_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MARVELL_88Q2XXX_PHY is not set -# CONFIG_MARVELL_88X2222_PHY is not set -# CONFIG_MAXLINEAR_GPHY is not set -# CONFIG_MEDIATEK_GE_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_T1S_PHY is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -CONFIG_MOTORCOMM_PHY=y -# CONFIG_NATIONAL_PHY is not set -# CONFIG_NXP_CBTX_PHY is not set -# CONFIG_NXP_C45_TJA11XX_PHY is not set -# CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_NCN26000_PHY is not set -# CONFIG_AT803X_PHY is not set -# CONFIG_QCA83XX_PHY is not set -# CONFIG_QCA808X_PHY is not set -# CONFIG_QCA807X_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_ROCKCHIP_PHY is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_DP83TD510_PHY is not set -# CONFIG_DP83TG720_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_MICREL_KS8995MA is not set -# CONFIG_PSE_CONTROLLER is not set -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_BUS=y -CONFIG_FWNODE_MDIO=y -CONFIG_OF_MDIO=y -CONFIG_MDIO_DEVRES=y -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_IPQ4019 is not set -# CONFIG_MDIO_IPQ8064 is not set -# CONFIG_MDIO_THUNDER is not set - -# -# MDIO Multiplexers -# -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set - -# -# PCS device drivers -# -CONFIG_PCS_XPCS=y -# end of PCS device drivers - -# CONFIG_PPP is not set -# CONFIG_SLIP is not set -CONFIG_USB_NET_DRIVERS=m -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set -# CONFIG_USB_LAN78XX is not set -CONFIG_USB_USBNET=m -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_AX88179_178A is not set -CONFIG_USB_NET_CDCETHER=m -CONFIG_USB_NET_CDC_EEM=m -CONFIG_USB_NET_CDC_NCM=m -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_CDC_MBIM is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_MCS7830 is not set -# CONFIG_USB_NET_RNDIS_HOST is not set -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_KALMIA is not set -# CONFIG_USB_NET_QMI_WWAN is not set -# CONFIG_USB_HSO is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_VL600 is not set -# CONFIG_USB_NET_CH9200 is not set -# CONFIG_USB_NET_AQC111 is not set -CONFIG_USB_RTL8153_ECM=m -CONFIG_WLAN=y -# CONFIG_WLAN_VENDOR_ADMTEK is not set -# CONFIG_WLAN_VENDOR_ATH is not set -# CONFIG_WLAN_VENDOR_ATMEL is not set -CONFIG_WLAN_VENDOR_BROADCOM=y -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -CONFIG_BRCMUTIL=m -# CONFIG_BRCMSMAC is not set -CONFIG_BRCMFMAC=m -CONFIG_BRCMFMAC_PROTO_BCDC=y -CONFIG_BRCMFMAC_SDIO=y -# CONFIG_BRCMFMAC_USB is not set -# CONFIG_BRCMFMAC_PCIE is not set -# CONFIG_BRCM_TRACING is not set -# CONFIG_BRCMDBG is not set -# CONFIG_WLAN_VENDOR_INTEL is not set -# CONFIG_WLAN_VENDOR_INTERSIL is not set -# CONFIG_WLAN_VENDOR_MARVELL is not set -# CONFIG_WLAN_VENDOR_MEDIATEK is not set -# CONFIG_WLAN_VENDOR_MICROCHIP is not set -CONFIG_WLAN_VENDOR_PURELIFI=y -# CONFIG_PLFXLC is not set -# CONFIG_WLAN_VENDOR_RALINK is not set -# CONFIG_WLAN_VENDOR_REALTEK is not set -# CONFIG_WLAN_VENDOR_RSI is not set -CONFIG_WLAN_VENDOR_SILABS=y -# CONFIG_WFX is not set -# CONFIG_WLAN_VENDOR_ST is not set -# CONFIG_WLAN_VENDOR_TI is not set -# CONFIG_WLAN_VENDOR_ZYDAS is not set -# CONFIG_WLAN_VENDOR_QUANTENNA is not set -# CONFIG_MAC80211_HWSIM is not set -# CONFIG_VIRT_WIFI is not set -# CONFIG_WAN is not set - -# -# Wireless WAN -# -# CONFIG_WWAN is not set -# end of Wireless WAN - -# CONFIG_VMXNET3 is not set -# CONFIG_NETDEVSIM is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_ISDN is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_LEDS=y -CONFIG_INPUT_FF_MEMLESS=y -# CONFIG_INPUT_SPARSEKMAP is not set -# CONFIG_INPUT_MATRIXKMAP is not set - -# -# Userland interfaces -# -CONFIG_INPUT_MOUSEDEV=m -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -# CONFIG_INPUT_JOYDEV is not set -CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y -CONFIG_KEYBOARD_ADC=m -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -# CONFIG_KEYBOARD_ATKBD is not set -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_LKKBD is not set -CONFIG_KEYBOARD_GPIO=y -# CONFIG_KEYBOARD_GPIO_POLLED is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_PINEPHONE is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_BCM is not set -# CONFIG_KEYBOARD_CYPRESS_SF is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TABLET is not set -CONFIG_INPUT_TOUCHSCREEN=y -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_ADC is not set -# CONFIG_TOUCHSCREEN_AR1021_I2C is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_BU21029 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set -# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -CONFIG_TOUCHSCREEN_CYTTSP5=m -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -# CONFIG_TOUCHSCREEN_EXC3000 is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_GOODIX is not set -# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set -# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set -# CONFIG_TOUCHSCREEN_HIDEEP is not set -# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set -# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_ILITEK is not set -# CONFIG_TOUCHSCREEN_S6SY761 is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_EKTF2127 is not set -# CONFIG_TOUCHSCREEN_ELAN is not set -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_WACOM_I2C is not set -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MMS114 is not set -# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set -# CONFIG_TOUCHSCREEN_MSG2638 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set -# CONFIG_TOUCHSCREEN_IMAGIS is not set -# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set -# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_TSC2004 is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_RM_TS is not set -# CONFIG_TOUCHSCREEN_SILEAD is not set -# CONFIG_TOUCHSCREEN_SIS_I2C is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_STMFTS is not set -# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set -# CONFIG_TOUCHSCREEN_SX8654 is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -# CONFIG_TOUCHSCREEN_ZET6223 is not set -# CONFIG_TOUCHSCREEN_ZFORCE is not set -# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set -# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -# CONFIG_TOUCHSCREEN_IQS5XX is not set -# CONFIG_TOUCHSCREEN_IQS7211 is not set -# CONFIG_TOUCHSCREEN_ZINITIX is not set -# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_GPIO_VIBRA is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -# CONFIG_INPUT_REGULATOR_HAPTIC is not set -CONFIG_INPUT_UINPUT=m -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set -CONFIG_INPUT_RK805_PWRKEY=y -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_DA7280_HAPTICS is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_IMS_PCU is not set -# CONFIG_INPUT_IQS269A is not set -# CONFIG_INPUT_IQS626A is not set -# CONFIG_INPUT_IQS7222 is not set -# CONFIG_INPUT_CMA3000 is not set -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -CONFIG_INPUT_WS8100_PEN=m -# CONFIG_RMI4_CORE is not set - -# -# Hardware I/O ports -# -# CONFIG_SERIO is not set -# CONFIG_GAMEPORT is not set -# end of Hardware I/O ports -# end of Input device support - -# -# Character devices -# -CONFIG_TTY=y -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y -# CONFIG_LEGACY_PTYS is not set -CONFIG_LEGACY_TIOCSTI=y -# CONFIG_LDISC_AUTOLOAD is not set - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y -CONFIG_SERIAL_8250=y -# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set -CONFIG_SERIAL_8250_16550A_VARIANTS=y -# CONFIG_SERIAL_8250_FINTEK is not set -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_DMA=y -CONFIG_SERIAL_8250_PCILIB=y -CONFIG_SERIAL_8250_PCI=y -CONFIG_SERIAL_8250_EXAR=y -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_PCI1XXXX is not set -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_8250_DW=y -# CONFIG_SERIAL_8250_RT288X is not set -CONFIG_SERIAL_8250_PERICOM=y -CONFIG_SERIAL_OF_PLATFORM=y - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_SIFIVE is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set -# CONFIG_SERIAL_SPRD is not set -# end of Serial drivers - -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_N_GSM is not set -# CONFIG_NOZOMI is not set -# CONFIG_NULL_TTY is not set -# CONFIG_HVC_DCC is not set -CONFIG_SERIAL_DEV_BUS=y -CONFIG_SERIAL_DEV_CTRL_TTYPORT=y -# CONFIG_TTY_PRINTK is not set -# CONFIG_VIRTIO_CONSOLE is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_APPLICOM is not set -CONFIG_DEVMEM=y -CONFIG_DEVPORT=y -# CONFIG_TCG_TPM is not set -# CONFIG_XILLYBUS is not set -# CONFIG_XILLYUSB is not set -# end of Character devices - -# -# I2C support -# -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_CHARDEV=y -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_DESIGNWARE_CORE is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_HISI is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -CONFIG_I2C_RK3X=y -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_CP2615 is not set -# CONFIG_I2C_PCI1XXXX is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_VIRTIO is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# end of I2C support - -# CONFIG_I3C is not set -CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y -# CONFIG_SPI_MEM is not set - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -CONFIG_SPI_BITBANG=y -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_CADENCE_QUADSPI is not set -# CONFIG_SPI_CH341 is not set -# CONFIG_SPI_DESIGNWARE is not set -CONFIG_SPI_GPIO=y -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_MICROCHIP_CORE is not set -# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_PCI1XXXX is not set -# CONFIG_SPI_PL022 is not set -CONFIG_SPI_ROCKCHIP=y -# CONFIG_SPI_ROCKCHIP_SFC is not set -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_SIFIVE is not set -# CONFIG_SPI_MXIC is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_AMD is not set - -# -# SPI Multiplexer support -# -# CONFIG_SPI_MUX is not set - -# -# SPI Protocol Masters -# -CONFIG_SPI_SPIDEV=y -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_SLAVE is not set -CONFIG_SPI_DYNAMIC=y -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# - -# -# PTP clock support -# -CONFIG_PTP_1588_CLOCK=y -CONFIG_PTP_1588_CLOCK_OPTIONAL=y - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -CONFIG_PTP_1588_CLOCK_KVM=y -# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set -# CONFIG_PTP_1588_CLOCK_IDTCM is not set -# CONFIG_PTP_1588_CLOCK_FC3W is not set -# CONFIG_PTP_1588_CLOCK_MOCK is not set -# end of PTP clock support - -CONFIG_PINCTRL=y -CONFIG_PINMUX=y -CONFIG_PINCONF=y -CONFIG_GENERIC_PINCONF=y -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_PINCTRL_AW9523 is not set -# CONFIG_PINCTRL_CY8C95X0 is not set -# CONFIG_PINCTRL_MCP23S08 is not set -# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set -# CONFIG_PINCTRL_OCELOT is not set -# CONFIG_PINCTRL_RK805 is not set -CONFIG_PINCTRL_ROCKCHIP=y -# CONFIG_PINCTRL_SCMI is not set -# CONFIG_PINCTRL_SINGLE is not set -# CONFIG_PINCTRL_STMFX is not set -# CONFIG_PINCTRL_SX150X is not set -# CONFIG_PINCTRL_IMX_SCMI is not set - -# -# Renesas pinctrl drivers -# -# end of Renesas pinctrl drivers - -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -CONFIG_OF_GPIO=y -CONFIG_GPIOLIB_IRQCHIP=y -# CONFIG_DEBUG_GPIO is not set -CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_CDEV=y -CONFIG_GPIO_CDEV_V1=y - -# -# Memory mapped GPIO drivers -# -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_CADENCE is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_EXAR is not set -# CONFIG_GPIO_FTGPIO010 is not set -# CONFIG_GPIO_GENERIC_PLATFORM is not set -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_HISI is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_LOGICVC is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_PL061 is not set -CONFIG_GPIO_ROCKCHIP=y -# CONFIG_GPIO_SIFIVE is not set -# CONFIG_GPIO_SYSCON is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_AMD_FCH is not set -# end of Memory mapped GPIO drivers - -# -# I2C GPIO expanders -# -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_FXL6408 is not set -# CONFIG_GPIO_DS4520 is not set -# CONFIG_GPIO_GW_PLD is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCA9570 is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_TPIC2810 is not set -# end of I2C GPIO expanders - -# -# MFD GPIO expanders -# -# end of MFD GPIO expanders - -# -# PCI GPIO expanders -# -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_RDC321X is not set -# end of PCI GPIO expanders - -# -# SPI GPIO expanders -# -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_XRA1403 is not set -# end of SPI GPIO expanders - -# -# USB GPIO expanders -# -# end of USB GPIO expanders - -# -# Virtual GPIO drivers -# -# CONFIG_GPIO_AGGREGATOR is not set -# CONFIG_GPIO_LATCH is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_GPIO_SIM is not set -# end of Virtual GPIO drivers - -# -# GPIO Debugging utilities -# -# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set -# CONFIG_GPIO_VIRTUSER is not set -# end of GPIO Debugging utilities - -# CONFIG_W1 is not set -CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_GPIO is not set -# CONFIG_POWER_RESET_GPIO_RESTART is not set -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_REGULATOR is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -# CONFIG_SYSCON_REBOOT_MODE is not set -# CONFIG_NVMEM_REBOOT_MODE is not set -# CONFIG_POWER_SEQUENCING is not set -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -CONFIG_POWER_SUPPLY_HWMON=y -# CONFIG_GENERIC_ADC_BATTERY is not set -# CONFIG_IP5XXX_POWER is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SAMSUNG_SDI is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_BATTERY_MAX1720X is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_LT3651 is not set -# CONFIG_CHARGER_LTC4162L is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_MAX77976 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set -# CONFIG_CHARGER_BQ24735 is not set -# CONFIG_CHARGER_BQ2515X is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_BQ25980 is not set -# CONFIG_CHARGER_BQ256XX is not set -CONFIG_CHARGER_RK817=y -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_BATTERY_GOLDFISH is not set -# CONFIG_BATTERY_RT5033 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_RT9467 is not set -# CONFIG_CHARGER_RT9471 is not set -# CONFIG_CHARGER_UCS1002 is not set -# CONFIG_CHARGER_BD99954 is not set -# CONFIG_BATTERY_UG3105 is not set -# CONFIG_FUEL_GAUGE_MM8013 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM1177 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7310 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_AHT10 is not set -# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set -# CONFIG_SENSORS_AS370 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set -# CONFIG_SENSORS_AXI_FAN_CONTROL is not set -# CONFIG_SENSORS_ARM_SCMI is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_CHIPCAP2 is not set -# CONFIG_SENSORS_CORSAIR_CPRO is not set -# CONFIG_SENSORS_CORSAIR_PSU is not set -# CONFIG_SENSORS_DRIVETEMP is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FTSTEUTATES is not set -# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_HS3001 is not set -# CONFIG_SENSORS_IIO_HWMON is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_POWERZ is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2947_I2C is not set -# CONFIG_SENSORS_LTC2947_SPI is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC2991 is not set -# CONFIG_SENSORS_LTC2992 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_LTC4282 is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX127 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX31722 is not set -# CONFIG_SENSORS_MAX31730 is not set -# CONFIG_SENSORS_MAX31760 is not set -# CONFIG_MAX31827 is not set -# CONFIG_SENSORS_MAX6620 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MC34VR500 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_TPS23861 is not set -# CONFIG_SENSORS_MR75203 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT6775_I2C is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_NZXT_KRAKEN2 is not set -# CONFIG_SENSORS_NZXT_KRAKEN3 is not set -# CONFIG_SENSORS_NZXT_SMART2 is not set -# CONFIG_SENSORS_OCC_P8_I2C is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_PT5161L is not set -# CONFIG_SENSORS_PWM_FAN is not set -# CONFIG_SENSORS_SBTSI is not set -# CONFIG_SENSORS_SBRMI is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHT4x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC2305 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA238 is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_SPD5118 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_TMP464 is not set -# CONFIG_SENSORS_TMP513 is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set -CONFIG_THERMAL=y -CONFIG_THERMAL_NETLINK=y -CONFIG_THERMAL_STATISTICS=y -# CONFIG_THERMAL_DEBUGFS is not set -# CONFIG_THERMAL_CORE_TESTING is not set -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set -# CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG is not set -CONFIG_THERMAL_GOV_FAIR_SHARE=y -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THERMAL_GOV_BANG_BANG=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y -CONFIG_CPU_THERMAL=y -CONFIG_CPU_FREQ_THERMAL=y -# CONFIG_DEVFREQ_THERMAL is not set -CONFIG_THERMAL_EMULATION=y -# CONFIG_THERMAL_MMIO is not set -CONFIG_ROCKCHIP_THERMAL=y -# CONFIG_GENERIC_ADC_THERMAL is not set -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y -CONFIG_WATCHDOG_OPEN_TIMEOUT=0 -CONFIG_WATCHDOG_SYSFS=y -# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set - -# -# Watchdog Pretimeout Governors -# -# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set - -# -# Watchdog Device Drivers -# -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_GPIO_WATCHDOG is not set -# CONFIG_XILINX_WATCHDOG is not set -# CONFIG_XILINX_WINDOW_WATCHDOG is not set -# CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_ARM_SBSA_WATCHDOG is not set -# CONFIG_CADENCE_WATCHDOG is not set -CONFIG_DW_WATCHDOG=y -# CONFIG_MAX63XX_WATCHDOG is not set -# CONFIG_ARM_SMC_WATCHDOG is not set -# CONFIG_ALIM7101_WDT is not set -# CONFIG_I6300ESB_WDT is not set -# CONFIG_HP_WATCHDOG is not set -# CONFIG_MEN_A21_WDT is not set - -# -# PCI-based Watchdog Cards -# -# CONFIG_PCIPCWATCHDOG is not set -# CONFIG_WDTPCI is not set - -# -# USB-based Watchdog Cards -# -# CONFIG_USBPCWATCHDOG is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -CONFIG_MFD_CORE=y -# CONFIG_MFD_ADP5585 is not set -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_SMPRO is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_CS42L43_I2C is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_MFD_MAX5970 is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_GATEWORKS_GSC is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_88PM886_PMIC is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77541 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77650 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77714 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6370 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_MFD_OCELOT is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_NTXEC is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_SY7636A is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT4831 is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RT5120 is not set -# CONFIG_MFD_RC5T583 is not set -CONFIG_MFD_RK8XX=y -CONFIG_MFD_RK8XX_I2C=y -# CONFIG_MFD_RK8XX_SPI is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_STMPE is not set -CONFIG_MFD_SYSCON=y -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TPS65218 is not set -# CONFIG_MFD_TPS65219 is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_TPS6594_I2C is not set -# CONFIG_MFD_TPS6594_SPI is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_TQMX86 is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_LOCHNAGAR is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_MFD_ROHM_BD71828 is not set -# CONFIG_MFD_ROHM_BD957XMUF is not set -# CONFIG_MFD_ROHM_BD96801 is not set -# CONFIG_MFD_STPMIC1 is not set -# CONFIG_MFD_STMFX is not set -# CONFIG_MFD_ATC260X_I2C is not set -# CONFIG_MFD_KHADAS_MCU is not set -# CONFIG_MFD_QCOM_PM8008 is not set -# CONFIG_MFD_CS40L50_I2C is not set -# CONFIG_MFD_CS40L50_SPI is not set -# CONFIG_RAVE_SP_CORE is not set -# CONFIG_MFD_INTEL_M10_BMC_SPI is not set -# CONFIG_MFD_RSMU_I2C is not set -# CONFIG_MFD_RSMU_SPI is not set -# end of Multifunction device drivers - -CONFIG_REGULATOR=y -# CONFIG_REGULATOR_DEBUG is not set -CONFIG_REGULATOR_FIXED_VOLTAGE=y -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_NETLINK_EVENTS is not set -# CONFIG_REGULATOR_88PG86X is not set -# CONFIG_REGULATOR_ACT8865 is not set -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ARM_SCMI is not set -# CONFIG_REGULATOR_AW37503 is not set -# CONFIG_REGULATOR_DA9121 is not set -# CONFIG_REGULATOR_DA9210 is not set -# CONFIG_REGULATOR_DA9211 is not set -CONFIG_REGULATOR_FAN53555=y -# CONFIG_REGULATOR_FAN53880 is not set -# CONFIG_REGULATOR_GPIO is not set -# CONFIG_REGULATOR_ISL9305 is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_LP872X is not set -# CONFIG_REGULATOR_LP8755 is not set -# CONFIG_REGULATOR_LTC3589 is not set -# CONFIG_REGULATOR_LTC3676 is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX77503 is not set -# CONFIG_REGULATOR_MAX77857 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8893 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_MAX8973 is not set -# CONFIG_REGULATOR_MAX20086 is not set -# CONFIG_REGULATOR_MAX20411 is not set -# CONFIG_REGULATOR_MAX77826 is not set -# CONFIG_REGULATOR_MCP16502 is not set -# CONFIG_REGULATOR_MP5416 is not set -# CONFIG_REGULATOR_MP8859 is not set -# CONFIG_REGULATOR_MP886X is not set -# CONFIG_REGULATOR_MPQ7920 is not set -# CONFIG_REGULATOR_MT6311 is not set -# CONFIG_REGULATOR_PCA9450 is not set -# CONFIG_REGULATOR_PF8X00 is not set -# CONFIG_REGULATOR_PFUZE100 is not set -# CONFIG_REGULATOR_PV88060 is not set -# CONFIG_REGULATOR_PV88080 is not set -# CONFIG_REGULATOR_PV88090 is not set -# CONFIG_REGULATOR_PWM is not set -# CONFIG_REGULATOR_RAA215300 is not set -# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set -CONFIG_REGULATOR_RK808=y -# CONFIG_REGULATOR_RT4801 is not set -# CONFIG_REGULATOR_RT4803 is not set -# CONFIG_REGULATOR_RT5190A is not set -# CONFIG_REGULATOR_RT5739 is not set -# CONFIG_REGULATOR_RT5759 is not set -# CONFIG_REGULATOR_RT6160 is not set -# CONFIG_REGULATOR_RT6190 is not set -# CONFIG_REGULATOR_RT6245 is not set -# CONFIG_REGULATOR_RTQ2134 is not set -# CONFIG_REGULATOR_RTMV20 is not set -# CONFIG_REGULATOR_RTQ6752 is not set -# CONFIG_REGULATOR_RTQ2208 is not set -# CONFIG_REGULATOR_SLG51000 is not set -# CONFIG_REGULATOR_SY8106A is not set -# CONFIG_REGULATOR_SY8824X is not set -# CONFIG_REGULATOR_SY8827N is not set -# CONFIG_REGULATOR_TPS51632 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS6286X is not set -# CONFIG_REGULATOR_TPS6287X is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -# CONFIG_REGULATOR_TPS65132 is not set -CONFIG_REGULATOR_TPS65185=m -# CONFIG_REGULATOR_TPS6524X is not set -# CONFIG_REGULATOR_VCTRL is not set -# CONFIG_RC_CORE is not set - -# -# CEC support -# -# CONFIG_MEDIA_CEC_SUPPORT is not set -# end of CEC support - -CONFIG_MEDIA_SUPPORT=m -# CONFIG_MEDIA_SUPPORT_FILTER is not set -# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set - -# -# Media device types -# -CONFIG_MEDIA_CAMERA_SUPPORT=y -CONFIG_MEDIA_ANALOG_TV_SUPPORT=y -CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y -CONFIG_MEDIA_RADIO_SUPPORT=y -CONFIG_MEDIA_SDR_SUPPORT=y -CONFIG_MEDIA_PLATFORM_SUPPORT=y -CONFIG_MEDIA_TEST_SUPPORT=y -# end of Media device types - -# -# Media core support -# -CONFIG_VIDEO_DEV=m -CONFIG_MEDIA_CONTROLLER=y -CONFIG_DVB_CORE=m -# end of Media core support - -# -# Video4Linux options -# -CONFIG_VIDEO_V4L2_I2C=y -CONFIG_VIDEO_V4L2_SUBDEV_API=y -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -CONFIG_V4L2_JPEG_HELPER=m -CONFIG_V4L2_H264=m -CONFIG_V4L2_VP9=m -CONFIG_V4L2_MEM2MEM_DEV=m -# CONFIG_V4L2_FLASH_LED_CLASS is not set -CONFIG_V4L2_FWNODE=m -CONFIG_V4L2_ASYNC=m -# end of Video4Linux options - -# -# Media controller options -# -# CONFIG_MEDIA_CONTROLLER_DVB is not set -# end of Media controller options - -# -# Digital TV options -# -# CONFIG_DVB_MMAP is not set -# CONFIG_DVB_NET is not set -CONFIG_DVB_MAX_ADAPTERS=16 -# CONFIG_DVB_DYNAMIC_MINORS is not set -# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set -# CONFIG_DVB_ULE_DEBUG is not set -# end of Digital TV options - -# -# Media drivers -# - -# -# Media drivers -# -# CONFIG_MEDIA_USB_SUPPORT is not set -# CONFIG_MEDIA_PCI_SUPPORT is not set -# CONFIG_RADIO_ADAPTERS is not set -CONFIG_MEDIA_PLATFORM_DRIVERS=y -# CONFIG_V4L_PLATFORM_DRIVERS is not set -# CONFIG_SDR_PLATFORM_DRIVERS is not set -# CONFIG_DVB_PLATFORM_DRIVERS is not set -CONFIG_V4L_MEM2MEM_DRIVERS=y -# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set - -# -# Allegro DVT media platform drivers -# - -# -# Amlogic media platform drivers -# - -# -# Amphion drivers -# - -# -# Aspeed media platform drivers -# - -# -# Atmel media platform drivers -# - -# -# Cadence media platform drivers -# -# CONFIG_VIDEO_CADENCE_CSI2RX is not set -# CONFIG_VIDEO_CADENCE_CSI2TX is not set - -# -# Chips&Media media platform drivers -# - -# -# Intel media platform drivers -# - -# -# Marvell media platform drivers -# - -# -# Mediatek media platform drivers -# - -# -# Microchip Technology, Inc. media platform drivers -# - -# -# Nuvoton media platform drivers -# - -# -# NVidia media platform drivers -# - -# -# NXP media platform drivers -# - -# -# Qualcomm media platform drivers -# - -# -# Raspberry Pi media platform drivers -# - -# -# Renesas media platform drivers -# - -# -# Rockchip media platform drivers -# -CONFIG_VIDEO_ROCKCHIP_RGA=m - -# -# Samsung media platform drivers -# - -# -# STMicroelectronics media platform drivers -# - -# -# Sunxi media platform drivers -# - -# -# Texas Instruments drivers -# - -# -# Verisilicon media platform drivers -# -CONFIG_VIDEO_HANTRO=m -# CONFIG_VIDEO_HANTRO_HEVC_RFC is not set -CONFIG_VIDEO_HANTRO_ROCKCHIP=y - -# -# VIA media platform drivers -# - -# -# Xilinx media platform drivers -# - -# -# MMC/SDIO DVB adapters -# -# CONFIG_SMS_SDIO_DRV is not set -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_DVB_TEST_DRIVERS is not set -CONFIG_UVC_COMMON=m -CONFIG_VIDEOBUF2_CORE=m -CONFIG_VIDEOBUF2_V4L2=m -CONFIG_VIDEOBUF2_MEMOPS=m -CONFIG_VIDEOBUF2_DMA_CONTIG=m -CONFIG_VIDEOBUF2_VMALLOC=m -CONFIG_VIDEOBUF2_DMA_SG=m -# end of Media drivers - -# -# Media ancillary drivers -# -CONFIG_MEDIA_ATTACH=y -CONFIG_VIDEO_CAMERA_SENSOR=y -# CONFIG_VIDEO_ALVIUM_CSI2 is not set -# CONFIG_VIDEO_AR0521 is not set -# CONFIG_VIDEO_GC0308 is not set -# CONFIG_VIDEO_GC05A2 is not set -# CONFIG_VIDEO_GC08A3 is not set -# CONFIG_VIDEO_GC2145 is not set -# CONFIG_VIDEO_HI556 is not set -# CONFIG_VIDEO_HI846 is not set -# CONFIG_VIDEO_HI847 is not set -# CONFIG_VIDEO_IMX208 is not set -# CONFIG_VIDEO_IMX214 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX283 is not set -# CONFIG_VIDEO_IMX290 is not set -# CONFIG_VIDEO_IMX296 is not set -# CONFIG_VIDEO_IMX319 is not set -# CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX335 is not set -# CONFIG_VIDEO_IMX355 is not set -# CONFIG_VIDEO_IMX412 is not set -# CONFIG_VIDEO_IMX415 is not set -# CONFIG_VIDEO_MT9M001 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9M114 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_OG01A1B is not set -# CONFIG_VIDEO_OV01A10 is not set -# CONFIG_VIDEO_OV02A10 is not set -# CONFIG_VIDEO_OV08D10 is not set -# CONFIG_VIDEO_OV08X40 is not set -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_OV13B10 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV4689 is not set -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5648 is not set -# CONFIG_VIDEO_OV5670 is not set -# CONFIG_VIDEO_OV5675 is not set -# CONFIG_VIDEO_OV5693 is not set -# CONFIG_VIDEO_OV5695 is not set -# CONFIG_VIDEO_OV64A40 is not set -# CONFIG_VIDEO_OV6650 is not set -# CONFIG_VIDEO_OV7251 is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV8856 is not set -# CONFIG_VIDEO_OV8858 is not set -# CONFIG_VIDEO_OV8865 is not set -# CONFIG_VIDEO_OV9282 is not set -# CONFIG_VIDEO_OV9640 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_RDACM20 is not set -# CONFIG_VIDEO_RDACM21 is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_VGXY61 is not set -# CONFIG_VIDEO_CCS is not set -# CONFIG_VIDEO_ET8EK8 is not set - -# -# Camera ISPs -# -# CONFIG_VIDEO_THP7312 is not set -# end of Camera ISPs - -# -# Lens drivers -# -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9719 is not set -# CONFIG_VIDEO_DW9768 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# end of Lens drivers - -# -# Flash devices -# -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# end of Flash devices - -# -# Audio decoders, processors and mixers -# -# CONFIG_VIDEO_CS3308 is not set -# CONFIG_VIDEO_CS5345 is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_SONY_BTF_MPX is not set -# CONFIG_VIDEO_TDA1997X is not set -# CONFIG_VIDEO_TDA7432 is not set -# CONFIG_VIDEO_TDA9840 is not set -# CONFIG_VIDEO_TEA6415C is not set -# CONFIG_VIDEO_TEA6420 is not set -# CONFIG_VIDEO_TLV320AIC23B is not set -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_UDA1342 is not set -# CONFIG_VIDEO_VP27SMPX is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_WM8775 is not set -# end of Audio decoders, processors and mixers - -# -# RDS decoders -# -# CONFIG_VIDEO_SAA6588 is not set -# end of RDS decoders - -# -# Video decoders -# -# CONFIG_VIDEO_ADV7180 is not set -# CONFIG_VIDEO_ADV7183 is not set -# CONFIG_VIDEO_ADV748X is not set -# CONFIG_VIDEO_ADV7604 is not set -# CONFIG_VIDEO_ADV7842 is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_ISL7998X is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_ML86V7667 is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_TC358743 is not set -# CONFIG_VIDEO_TC358746 is not set -# CONFIG_VIDEO_TVP514X is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_TVP7002 is not set -# CONFIG_VIDEO_TW2804 is not set -# CONFIG_VIDEO_TW9900 is not set -# CONFIG_VIDEO_TW9903 is not set -# CONFIG_VIDEO_TW9906 is not set -# CONFIG_VIDEO_TW9910 is not set -# CONFIG_VIDEO_VPX3220 is not set - -# -# Video and audio decoders -# -# CONFIG_VIDEO_SAA717X is not set -# CONFIG_VIDEO_CX25840 is not set -# end of Video decoders - -# -# Video encoders -# -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV7343 is not set -# CONFIG_VIDEO_ADV7393 is not set -# CONFIG_VIDEO_ADV7511 is not set -# CONFIG_VIDEO_AK881X is not set -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_THS8200 is not set -# end of Video encoders - -# -# Video improvement chips -# -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set -# end of Video improvement chips - -# -# Audio/Video compression chips -# -# CONFIG_VIDEO_SAA6752HS is not set -# end of Audio/Video compression chips - -# -# SDR tuner chips -# -# CONFIG_SDR_MAX2175 is not set -# end of SDR tuner chips - -# -# Miscellaneous helper chips -# -# CONFIG_VIDEO_I2C is not set -# CONFIG_VIDEO_M52790 is not set -# CONFIG_VIDEO_ST_MIPID02 is not set -# CONFIG_VIDEO_THS7303 is not set -# end of Miscellaneous helper chips - -# -# Video serializers and deserializers -# -# CONFIG_VIDEO_DS90UB913 is not set -# CONFIG_VIDEO_DS90UB953 is not set -# CONFIG_VIDEO_DS90UB960 is not set -# CONFIG_VIDEO_MAX96714 is not set -# CONFIG_VIDEO_MAX96717 is not set -# end of Video serializers and deserializers - -# -# Media SPI Adapters -# -# CONFIG_CXD2880_SPI_DRV is not set -# CONFIG_VIDEO_GS1662 is not set -# end of Media SPI Adapters - -CONFIG_MEDIA_TUNER=m - -# -# Customize TV tuners -# -# CONFIG_MEDIA_TUNER_E4000 is not set -# CONFIG_MEDIA_TUNER_FC0011 is not set -# CONFIG_MEDIA_TUNER_FC0012 is not set -# CONFIG_MEDIA_TUNER_FC0013 is not set -# CONFIG_MEDIA_TUNER_FC2580 is not set -# CONFIG_MEDIA_TUNER_IT913X is not set -# CONFIG_MEDIA_TUNER_M88RS6000T is not set -# CONFIG_MEDIA_TUNER_MAX2165 is not set -# CONFIG_MEDIA_TUNER_MC44S803 is not set -# CONFIG_MEDIA_TUNER_MSI001 is not set -# CONFIG_MEDIA_TUNER_MT2060 is not set -# CONFIG_MEDIA_TUNER_MT2063 is not set -# CONFIG_MEDIA_TUNER_MT20XX is not set -# CONFIG_MEDIA_TUNER_MT2131 is not set -# CONFIG_MEDIA_TUNER_MT2266 is not set -# CONFIG_MEDIA_TUNER_MXL301RF is not set -# CONFIG_MEDIA_TUNER_MXL5005S is not set -# CONFIG_MEDIA_TUNER_MXL5007T is not set -# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set -# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set -# CONFIG_MEDIA_TUNER_QT1010 is not set -# CONFIG_MEDIA_TUNER_R820T is not set -# CONFIG_MEDIA_TUNER_SI2157 is not set -# CONFIG_MEDIA_TUNER_SIMPLE is not set -# CONFIG_MEDIA_TUNER_TDA18212 is not set -# CONFIG_MEDIA_TUNER_TDA18218 is not set -# CONFIG_MEDIA_TUNER_TDA18250 is not set -# CONFIG_MEDIA_TUNER_TDA18271 is not set -# CONFIG_MEDIA_TUNER_TDA827X is not set -# CONFIG_MEDIA_TUNER_TDA8290 is not set -# CONFIG_MEDIA_TUNER_TDA9887 is not set -# CONFIG_MEDIA_TUNER_TEA5761 is not set -# CONFIG_MEDIA_TUNER_TEA5767 is not set -# CONFIG_MEDIA_TUNER_TUA9001 is not set -# CONFIG_MEDIA_TUNER_XC2028 is not set -# CONFIG_MEDIA_TUNER_XC4000 is not set -# CONFIG_MEDIA_TUNER_XC5000 is not set -# end of Customize TV tuners - -# -# Customise DVB Frontends -# - -# -# Multistandard (satellite) frontends -# -# CONFIG_DVB_MXL5XX is not set -# CONFIG_DVB_STB0899 is not set -# CONFIG_DVB_STB6100 is not set -# CONFIG_DVB_STV090x is not set -# CONFIG_DVB_STV0910 is not set -# CONFIG_DVB_STV6110x is not set -# CONFIG_DVB_STV6111 is not set - -# -# Multistandard (cable + terrestrial) frontends -# -# CONFIG_DVB_DRXK is not set -# CONFIG_DVB_MN88472 is not set -# CONFIG_DVB_MN88473 is not set -# CONFIG_DVB_SI2165 is not set -# CONFIG_DVB_TDA18271C2DD is not set - -# -# DVB-S (satellite) frontends -# -# CONFIG_DVB_CX24110 is not set -# CONFIG_DVB_CX24116 is not set -# CONFIG_DVB_CX24117 is not set -# CONFIG_DVB_CX24120 is not set -# CONFIG_DVB_CX24123 is not set -# CONFIG_DVB_DS3000 is not set -# CONFIG_DVB_MB86A16 is not set -# CONFIG_DVB_MT312 is not set -# CONFIG_DVB_S5H1420 is not set -# CONFIG_DVB_SI21XX is not set -# CONFIG_DVB_STB6000 is not set -# CONFIG_DVB_STV0288 is not set -# CONFIG_DVB_STV0299 is not set -# CONFIG_DVB_STV0900 is not set -# CONFIG_DVB_STV6110 is not set -# CONFIG_DVB_TDA10071 is not set -# CONFIG_DVB_TDA10086 is not set -# CONFIG_DVB_TDA8083 is not set -# CONFIG_DVB_TDA8261 is not set -# CONFIG_DVB_TDA826X is not set -# CONFIG_DVB_TS2020 is not set -# CONFIG_DVB_TUA6100 is not set -# CONFIG_DVB_TUNER_CX24113 is not set -# CONFIG_DVB_TUNER_ITD1000 is not set -# CONFIG_DVB_VES1X93 is not set -# CONFIG_DVB_ZL10036 is not set -# CONFIG_DVB_ZL10039 is not set - -# -# DVB-T (terrestrial) frontends -# -# CONFIG_DVB_CX22700 is not set -# CONFIG_DVB_CX22702 is not set -# CONFIG_DVB_CXD2820R is not set -# CONFIG_DVB_CXD2841ER is not set -# CONFIG_DVB_DIB3000MB is not set -# CONFIG_DVB_DIB3000MC is not set -# CONFIG_DVB_DIB7000M is not set -# CONFIG_DVB_DIB7000P is not set -# CONFIG_DVB_DIB9000 is not set -# CONFIG_DVB_DRXD is not set -# CONFIG_DVB_EC100 is not set -# CONFIG_DVB_L64781 is not set -# CONFIG_DVB_MT352 is not set -# CONFIG_DVB_NXT6000 is not set -# CONFIG_DVB_S5H1432 is not set -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_STV0367 is not set -# CONFIG_DVB_TDA10048 is not set -# CONFIG_DVB_TDA1004X is not set -# CONFIG_DVB_ZD1301_DEMOD is not set -# CONFIG_DVB_ZL10353 is not set -# CONFIG_DVB_CXD2880 is not set - -# -# DVB-C (cable) frontends -# -# CONFIG_DVB_STV0297 is not set -# CONFIG_DVB_TDA10021 is not set -# CONFIG_DVB_TDA10023 is not set -# CONFIG_DVB_VES1820 is not set - -# -# ATSC (North American/Korean Terrestrial/Cable DTV) frontends -# -# CONFIG_DVB_AU8522_DTV is not set -# CONFIG_DVB_AU8522_V4L is not set -# CONFIG_DVB_BCM3510 is not set -# CONFIG_DVB_LG2160 is not set -# CONFIG_DVB_LGDT3305 is not set -# CONFIG_DVB_LGDT330X is not set -# CONFIG_DVB_MXL692 is not set -# CONFIG_DVB_NXT200X is not set -# CONFIG_DVB_OR51132 is not set -# CONFIG_DVB_OR51211 is not set -# CONFIG_DVB_S5H1409 is not set -# CONFIG_DVB_S5H1411 is not set - -# -# ISDB-T (terrestrial) frontends -# -# CONFIG_DVB_DIB8000 is not set -# CONFIG_DVB_MB86A20S is not set -# CONFIG_DVB_S921 is not set - -# -# ISDB-S (satellite) & ISDB-T (terrestrial) frontends -# -# CONFIG_DVB_MN88443X is not set -# CONFIG_DVB_TC90522 is not set - -# -# Digital terrestrial only tuners/PLL -# -# CONFIG_DVB_PLL is not set -# CONFIG_DVB_TUNER_DIB0070 is not set -# CONFIG_DVB_TUNER_DIB0090 is not set - -# -# SEC control devices for DVB-S -# -# CONFIG_DVB_A8293 is not set -# CONFIG_DVB_AF9033 is not set -# CONFIG_DVB_ASCOT2E is not set -# CONFIG_DVB_ATBM8830 is not set -# CONFIG_DVB_HELENE is not set -# CONFIG_DVB_HORUS3A is not set -# CONFIG_DVB_ISL6405 is not set -# CONFIG_DVB_ISL6421 is not set -# CONFIG_DVB_ISL6423 is not set -# CONFIG_DVB_IX2505V is not set -# CONFIG_DVB_LGS8GL5 is not set -# CONFIG_DVB_LGS8GXX is not set -# CONFIG_DVB_LNBH25 is not set -# CONFIG_DVB_LNBH29 is not set -# CONFIG_DVB_LNBP21 is not set -# CONFIG_DVB_LNBP22 is not set -# CONFIG_DVB_M88RS2000 is not set -# CONFIG_DVB_TDA665x is not set -# CONFIG_DVB_DRX39XYJ is not set - -# -# Common Interface (EN50221) controller drivers -# -# CONFIG_DVB_CXD2099 is not set -# CONFIG_DVB_SP2 is not set -# end of Customise DVB Frontends - -# -# Tools to develop new frontends -# -# CONFIG_DVB_DUMMY_FE is not set -# end of Media ancillary drivers - -# -# Graphics support -# -CONFIG_VIDEO=y -# CONFIG_AUXDISPLAY is not set -CONFIG_DRM=m -CONFIG_DRM_MIPI_DSI=y -# CONFIG_DRM_DEBUG_MM is not set -CONFIG_DRM_KMS_HELPER=m -# CONFIG_DRM_PANIC is not set -# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set -# CONFIG_DRM_DEBUG_MODESET_LOCK is not set -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set -# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set -CONFIG_DRM_DISPLAY_HELPER=m -CONFIG_DRM_BRIDGE_CONNECTOR=y -# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set -# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set -CONFIG_DRM_DISPLAY_HDMI_HELPER=y -CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y -CONFIG_DRM_EPD_HELPER=m -CONFIG_DRM_TTM=m -CONFIG_DRM_TTM_HELPER=m -CONFIG_DRM_GEM_DMA_HELPER=m -CONFIG_DRM_GEM_SHMEM_HELPER=m -CONFIG_DRM_SCHED=m - -# -# I2C encoder or helper chips -# -# CONFIG_DRM_I2C_CH7006 is not set -# CONFIG_DRM_I2C_SIL164 is not set -# CONFIG_DRM_I2C_NXP_TDA998X is not set -# CONFIG_DRM_I2C_NXP_TDA9950 is not set -# end of I2C encoder or helper chips - -# -# ARM devices -# -# CONFIG_DRM_HDLCD is not set -# CONFIG_DRM_MALI_DISPLAY is not set -# CONFIG_DRM_KOMEDA is not set -# end of ARM devices - -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_AMDGPU is not set -# CONFIG_DRM_NOUVEAU is not set -# CONFIG_DRM_XE is not set -CONFIG_DRM_VGEM=m -# CONFIG_DRM_VKMS is not set -CONFIG_DRM_ROCKCHIP=m -CONFIG_ROCKCHIP_VOP=y -CONFIG_ROCKCHIP_VOP2=y -# CONFIG_ROCKCHIP_ANALOGIX_DP is not set -# CONFIG_ROCKCHIP_CDN_DP is not set -CONFIG_ROCKCHIP_DW_HDMI=y -CONFIG_ROCKCHIP_DW_MIPI_DSI=y -CONFIG_ROCKCHIP_INNO_HDMI=y -CONFIG_ROCKCHIP_LVDS=y -# CONFIG_ROCKCHIP_RGB is not set -# CONFIG_ROCKCHIP_RK3066_HDMI is not set -CONFIG_DRM_ROCKCHIP_EBC=m -# CONFIG_DRM_VMWGFX is not set -# CONFIG_DRM_UDL is not set -# CONFIG_DRM_AST is not set -# CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_QXL is not set -CONFIG_DRM_PANEL=y - -# -# Display Panels -# -# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set -# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set -# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set -# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set -# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set -# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set -# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set -# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set -# CONFIG_DRM_PANEL_EBBG_FT8719 is not set -# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set -# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set -# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set -# CONFIG_DRM_PANEL_DSI_CM is not set -# CONFIG_DRM_PANEL_LVDS is not set -# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set -# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set -# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set -# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set -# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set -# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set -# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set -# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set -# CONFIG_DRM_PANEL_JDI_R63452 is not set -# CONFIG_DRM_PANEL_KHADAS_TS050 is not set -# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set -# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set -# CONFIG_DRM_PANEL_LG_LB035Q02 is not set -# CONFIG_DRM_PANEL_LG_LG4573 is not set -# CONFIG_DRM_PANEL_LG_SW43408 is not set -# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set -# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set -# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set -# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set -# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set -# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set -# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set -# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set -# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set -# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set -# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set -# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set -# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set -# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set -# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set -# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set -# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set -# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set -# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set -# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set -# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set -# CONFIG_DRM_PANEL_EDP is not set -CONFIG_DRM_PANEL_SIMPLE=m -# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set -# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set -# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set -# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set -# CONFIG_DRM_PANEL_TPO_TPG110 is not set -# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set -# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set -# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set -# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set -# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set -# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set -# end of Display Panels - -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_PANEL_BRIDGE=y - -# -# Display Interface Bridges -# -# CONFIG_DRM_CHIPONE_ICN6211 is not set -# CONFIG_DRM_CHRONTEL_CH7033 is not set -# CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_ITE_IT6505 is not set -# CONFIG_DRM_LONTIUM_LT8912B is not set -# CONFIG_DRM_LONTIUM_LT9211 is not set -# CONFIG_DRM_LONTIUM_LT9611 is not set -# CONFIG_DRM_LONTIUM_LT9611UXC is not set -# CONFIG_DRM_ITE_IT66121 is not set -# CONFIG_DRM_LVDS_CODEC is not set -# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -# CONFIG_DRM_NWL_MIPI_DSI is not set -# CONFIG_DRM_NXP_PTN3460 is not set -# CONFIG_DRM_PARADE_PS8622 is not set -# CONFIG_DRM_PARADE_PS8640 is not set -# CONFIG_DRM_SAMSUNG_DSIM is not set -# CONFIG_DRM_SIL_SII8620 is not set -# CONFIG_DRM_SII902X is not set -# CONFIG_DRM_SII9234 is not set -# CONFIG_DRM_SIMPLE_BRIDGE is not set -# CONFIG_DRM_THINE_THC63LVD1024 is not set -# CONFIG_DRM_TOSHIBA_TC358762 is not set -# CONFIG_DRM_TOSHIBA_TC358764 is not set -# CONFIG_DRM_TOSHIBA_TC358767 is not set -# CONFIG_DRM_TOSHIBA_TC358768 is not set -# CONFIG_DRM_TOSHIBA_TC358775 is not set -# CONFIG_DRM_TI_DLPC3433 is not set -# CONFIG_DRM_TI_TFP410 is not set -# CONFIG_DRM_TI_SN65DSI83 is not set -# CONFIG_DRM_TI_SN65DSI86 is not set -# CONFIG_DRM_TI_TPD12S015 is not set -# CONFIG_DRM_ANALOGIX_ANX6345 is not set -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_ANALOGIX_ANX7625 is not set -# CONFIG_DRM_I2C_ADV7511 is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_CDNS_MHDP8546 is not set -CONFIG_DRM_DW_HDMI=m -# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set -# CONFIG_DRM_DW_HDMI_I2S_AUDIO is not set -# CONFIG_DRM_DW_HDMI_GP_AUDIO is not set -# CONFIG_DRM_DW_HDMI_CEC is not set -CONFIG_DRM_DW_MIPI_DSI=m -# end of Display Interface Bridges - -# CONFIG_DRM_ETNAVIV is not set -# CONFIG_DRM_HISI_HIBMC is not set -# CONFIG_DRM_HISI_KIRIN is not set -# CONFIG_DRM_LOGICVC is not set -# CONFIG_DRM_ARCPGU is not set -# CONFIG_DRM_BOCHS is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_GM12U320 is not set -# CONFIG_DRM_PANEL_MIPI_DBI is not set -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_TINYDRM_HX8357D is not set -# CONFIG_TINYDRM_ILI9163 is not set -# CONFIG_TINYDRM_ILI9225 is not set -# CONFIG_TINYDRM_ILI9341 is not set -# CONFIG_TINYDRM_ILI9486 is not set -# CONFIG_TINYDRM_MI0283QT is not set -# CONFIG_TINYDRM_REPAPER is not set -# CONFIG_TINYDRM_ST7586 is not set -# CONFIG_TINYDRM_ST7735R is not set -# CONFIG_DRM_PL111 is not set -# CONFIG_DRM_LIMA is not set -CONFIG_DRM_PANFROST=m -# CONFIG_DRM_PANTHOR is not set -# CONFIG_DRM_TIDSS is not set -# CONFIG_DRM_GUD is not set -# CONFIG_DRM_SSD130X is not set -# CONFIG_DRM_POWERVR is not set -# CONFIG_DRM_WERROR is not set -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m - -# -# Frame buffer Devices -# -CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_EFI is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_NEOMAGIC is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SM712 is not set -CONFIG_FB_CORE=y -CONFIG_FB_NOTIFY=y -# CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_DEVICE=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYSMEM_FOPS=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_DMAMEM_HELPERS=y -CONFIG_FB_SYSMEM_HELPERS=y -CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set -# end of Frame buffer Devices - -# -# Backlight & LCD device support -# -# CONFIG_LCD_CLASS_DEVICE is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=y -# CONFIG_BACKLIGHT_KTD253 is not set -# CONFIG_BACKLIGHT_KTD2801 is not set -# CONFIG_BACKLIGHT_KTZ8866 is not set -# CONFIG_BACKLIGHT_PWM is not set -# CONFIG_BACKLIGHT_QCOM_WLED is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3509 is not set -CONFIG_BACKLIGHT_LM3630A=y -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LP855X is not set -# CONFIG_BACKLIGHT_MP3309C is not set -# CONFIG_BACKLIGHT_GPIO is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set -# CONFIG_BACKLIGHT_LED is not set -# end of Backlight & LCD device support - -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_HDMI=y - -# -# Console display driver support -# -CONFIG_DUMMY_CONSOLE=y -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -CONFIG_FRAMEBUFFER_CONSOLE=y -# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y -# end of Console display driver support - -# CONFIG_LOGO is not set -# end of Graphics support - -# CONFIG_DRM_ACCEL is not set -CONFIG_SOUND=m -CONFIG_SND=m -CONFIG_SND_TIMER=m -CONFIG_SND_PCM=m -CONFIG_SND_DMAENGINE_PCM=m -CONFIG_SND_HWDEP=m -CONFIG_SND_RAWMIDI=m -CONFIG_SND_UMP=m -CONFIG_SND_UMP_LEGACY_RAWMIDI=y -CONFIG_SND_JACK=y -CONFIG_SND_JACK_INPUT_DEV=y -# CONFIG_SND_OSSEMUL is not set -CONFIG_SND_PCM_TIMER=y -CONFIG_SND_HRTIMER=m -CONFIG_SND_DYNAMIC_MINORS=y -CONFIG_SND_MAX_CARDS=32 -# CONFIG_SND_SUPPORT_OLD_API is not set -CONFIG_SND_PROC_FS=y -CONFIG_SND_VERBOSE_PROCFS=y -CONFIG_SND_CTL_FAST_LOOKUP=y -CONFIG_SND_DEBUG=y -CONFIG_SND_DEBUG_VERBOSE=y -# CONFIG_SND_PCM_XRUN_DEBUG is not set -# CONFIG_SND_CTL_INPUT_VALIDATION is not set -# CONFIG_SND_CTL_DEBUG is not set -# CONFIG_SND_JACK_INJECTION_DEBUG is not set -# CONFIG_SND_UTIMER is not set -CONFIG_SND_VMASTER=y -# CONFIG_SND_SEQUENCER is not set -# CONFIG_SND_DRIVERS is not set -CONFIG_SND_PCI=y -# CONFIG_SND_AD1889 is not set -# CONFIG_SND_ALS300 is not set -# CONFIG_SND_ALI5451 is not set -# CONFIG_SND_ATIIXP is not set -# CONFIG_SND_ATIIXP_MODEM is not set -# CONFIG_SND_AU8810 is not set -# CONFIG_SND_AU8820 is not set -# CONFIG_SND_AU8830 is not set -# CONFIG_SND_AW2 is not set -# CONFIG_SND_AZT3328 is not set -# CONFIG_SND_BT87X is not set -# CONFIG_SND_CA0106 is not set -# CONFIG_SND_CMIPCI is not set -# CONFIG_SND_OXYGEN is not set -# CONFIG_SND_CS4281 is not set -# CONFIG_SND_CS46XX is not set -# CONFIG_SND_CTXFI is not set -# CONFIG_SND_DARLA20 is not set -# CONFIG_SND_GINA20 is not set -# CONFIG_SND_LAYLA20 is not set -# CONFIG_SND_DARLA24 is not set -# CONFIG_SND_GINA24 is not set -# CONFIG_SND_LAYLA24 is not set -# CONFIG_SND_MONA is not set -# CONFIG_SND_MIA is not set -# CONFIG_SND_ECHO3G is not set -# CONFIG_SND_INDIGO is not set -# CONFIG_SND_INDIGOIO is not set -# CONFIG_SND_INDIGODJ is not set -# CONFIG_SND_INDIGOIOX is not set -# CONFIG_SND_INDIGODJX is not set -# CONFIG_SND_EMU10K1 is not set -# CONFIG_SND_EMU10K1X is not set -# CONFIG_SND_ENS1370 is not set -# CONFIG_SND_ENS1371 is not set -# CONFIG_SND_ES1938 is not set -# CONFIG_SND_ES1968 is not set -# CONFIG_SND_FM801 is not set -# CONFIG_SND_HDSP is not set -# CONFIG_SND_HDSPM is not set -# CONFIG_SND_ICE1712 is not set -# CONFIG_SND_ICE1724 is not set -# CONFIG_SND_INTEL8X0 is not set -# CONFIG_SND_INTEL8X0M is not set -# CONFIG_SND_KORG1212 is not set -# CONFIG_SND_LOLA is not set -# CONFIG_SND_LX6464ES is not set -# CONFIG_SND_MAESTRO3 is not set -# CONFIG_SND_MIXART is not set -# CONFIG_SND_NM256 is not set -# CONFIG_SND_PCXHR is not set -# CONFIG_SND_RIPTIDE is not set -# CONFIG_SND_RME32 is not set -# CONFIG_SND_RME96 is not set -# CONFIG_SND_RME9652 is not set -# CONFIG_SND_SE6X is not set -# CONFIG_SND_SONICVIBES is not set -# CONFIG_SND_TRIDENT is not set -# CONFIG_SND_VIA82XX is not set -# CONFIG_SND_VIA82XX_MODEM is not set -# CONFIG_SND_VIRTUOSO is not set -# CONFIG_SND_VX222 is not set -# CONFIG_SND_YMFPCI is not set - -# -# HD-Audio -# -# CONFIG_SND_HDA_INTEL is not set -# end of HD-Audio - -CONFIG_SND_HDA_PREALLOC_SIZE=64 -# CONFIG_SND_SPI is not set -CONFIG_SND_USB=y -CONFIG_SND_USB_AUDIO=m -CONFIG_SND_USB_AUDIO_MIDI_V2=y -CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y -CONFIG_SND_USB_UA101=m -CONFIG_SND_USB_CAIAQ=m -CONFIG_SND_USB_CAIAQ_INPUT=y -CONFIG_SND_USB_6FIRE=m -CONFIG_SND_USB_HIFACE=m -# CONFIG_SND_BCD2000 is not set -CONFIG_SND_USB_LINE6=m -CONFIG_SND_USB_POD=m -CONFIG_SND_USB_PODHD=m -CONFIG_SND_USB_TONEPORT=m -CONFIG_SND_USB_VARIAX=m -CONFIG_SND_SOC=m -CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y -# CONFIG_SND_SOC_ADI is not set -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_AMD_ACP_CONFIG is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set -# CONFIG_SND_DESIGNWARE_I2S is not set - -# -# SoC Audio for Freescale CPUs -# - -# -# Common SoC Audio options for Freescale CPUs: -# -# CONFIG_SND_SOC_FSL_ASRC is not set -# CONFIG_SND_SOC_FSL_SAI is not set -# CONFIG_SND_SOC_FSL_AUDMIX is not set -# CONFIG_SND_SOC_FSL_SSI is not set -# CONFIG_SND_SOC_FSL_SPDIF is not set -# CONFIG_SND_SOC_FSL_ESAI is not set -# CONFIG_SND_SOC_FSL_MICFIL is not set -# CONFIG_SND_SOC_FSL_XCVR is not set -# CONFIG_SND_SOC_IMX_AUDMUX is not set -# end of SoC Audio for Freescale CPUs - -# CONFIG_SND_SOC_CHV3_I2S is not set -# CONFIG_SND_I2S_HI6210_I2S is not set -# CONFIG_SND_SOC_IMG is not set -# CONFIG_SND_SOC_MTK_BTCVSD is not set -CONFIG_SND_SOC_ROCKCHIP=m -# CONFIG_SND_SOC_ROCKCHIP_I2S is not set -CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=m -CONFIG_SND_SOC_ROCKCHIP_PDM=m -# CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set -# CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set -# CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set -# CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set -# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set -# CONFIG_SND_SOC_SOF_TOPLEVEL is not set - -# -# STMicroelectronics STM32 SOC audio support -# -# end of STMicroelectronics STM32 SOC audio support - -# CONFIG_SND_SOC_XILINX_I2S is not set -# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set -# CONFIG_SND_SOC_XILINX_SPDIF is not set -# CONFIG_SND_SOC_XTFPGA_I2S is not set -CONFIG_SND_SOC_I2C_AND_SPI=m - -# -# CODEC drivers -# -# CONFIG_SND_SOC_AC97_CODEC is not set -# CONFIG_SND_SOC_ADAU1372_I2C is not set -# CONFIG_SND_SOC_ADAU1372_SPI is not set -# CONFIG_SND_SOC_ADAU1701 is not set -# CONFIG_SND_SOC_ADAU1761_I2C is not set -# CONFIG_SND_SOC_ADAU1761_SPI is not set -# CONFIG_SND_SOC_ADAU7002 is not set -# CONFIG_SND_SOC_ADAU7118_HW is not set -# CONFIG_SND_SOC_ADAU7118_I2C is not set -# CONFIG_SND_SOC_AK4104 is not set -# CONFIG_SND_SOC_AK4118 is not set -# CONFIG_SND_SOC_AK4375 is not set -# CONFIG_SND_SOC_AK4458 is not set -# CONFIG_SND_SOC_AK4554 is not set -# CONFIG_SND_SOC_AK4613 is not set -# CONFIG_SND_SOC_AK4619 is not set -# CONFIG_SND_SOC_AK4642 is not set -# CONFIG_SND_SOC_AK5386 is not set -# CONFIG_SND_SOC_AK5558 is not set -# CONFIG_SND_SOC_ALC5623 is not set -# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set -# CONFIG_SND_SOC_AW8738 is not set -# CONFIG_SND_SOC_AW88395 is not set -# CONFIG_SND_SOC_AW88261 is not set -# CONFIG_SND_SOC_AW87390 is not set -# CONFIG_SND_SOC_AW88399 is not set -# CONFIG_SND_SOC_BD28623 is not set -CONFIG_SND_SOC_BT_SCO=m -# CONFIG_SND_SOC_CHV3_CODEC is not set -# CONFIG_SND_SOC_CS35L32 is not set -# CONFIG_SND_SOC_CS35L33 is not set -# CONFIG_SND_SOC_CS35L34 is not set -# CONFIG_SND_SOC_CS35L35 is not set -# CONFIG_SND_SOC_CS35L36 is not set -# CONFIG_SND_SOC_CS35L41_SPI is not set -# CONFIG_SND_SOC_CS35L41_I2C is not set -# CONFIG_SND_SOC_CS35L45_SPI is not set -# CONFIG_SND_SOC_CS35L45_I2C is not set -# CONFIG_SND_SOC_CS35L56_I2C is not set -# CONFIG_SND_SOC_CS35L56_SPI is not set -# CONFIG_SND_SOC_CS42L42 is not set -# CONFIG_SND_SOC_CS42L51_I2C is not set -# CONFIG_SND_SOC_CS42L52 is not set -# CONFIG_SND_SOC_CS42L56 is not set -# CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS42L83 is not set -# CONFIG_SND_SOC_CS4234 is not set -# CONFIG_SND_SOC_CS4265 is not set -# CONFIG_SND_SOC_CS4270 is not set -# CONFIG_SND_SOC_CS4271_I2C is not set -# CONFIG_SND_SOC_CS4271_SPI is not set -# CONFIG_SND_SOC_CS42XX8_I2C is not set -# CONFIG_SND_SOC_CS43130 is not set -# CONFIG_SND_SOC_CS4341 is not set -# CONFIG_SND_SOC_CS4349 is not set -# CONFIG_SND_SOC_CS53L30 is not set -# CONFIG_SND_SOC_CS530X_I2C is not set -# CONFIG_SND_SOC_CX2072X is not set -# CONFIG_SND_SOC_DA7213 is not set -CONFIG_SND_SOC_DMIC=m -# CONFIG_SND_SOC_ES7134 is not set -# CONFIG_SND_SOC_ES7241 is not set -# CONFIG_SND_SOC_ES8311 is not set -# CONFIG_SND_SOC_ES8316 is not set -# CONFIG_SND_SOC_ES8326 is not set -# CONFIG_SND_SOC_ES8328_I2C is not set -# CONFIG_SND_SOC_ES8328_SPI is not set -# CONFIG_SND_SOC_GTM601 is not set -# CONFIG_SND_SOC_HDA is not set -# CONFIG_SND_SOC_ICS43432 is not set -# CONFIG_SND_SOC_IDT821034 is not set -# CONFIG_SND_SOC_INNO_RK3036 is not set -# CONFIG_SND_SOC_MAX98088 is not set -# CONFIG_SND_SOC_MAX98090 is not set -# CONFIG_SND_SOC_MAX98357A is not set -# CONFIG_SND_SOC_MAX98504 is not set -# CONFIG_SND_SOC_MAX9867 is not set -# CONFIG_SND_SOC_MAX98927 is not set -# CONFIG_SND_SOC_MAX98520 is not set -# CONFIG_SND_SOC_MAX98373_I2C is not set -# CONFIG_SND_SOC_MAX98388 is not set -# CONFIG_SND_SOC_MAX98390 is not set -# CONFIG_SND_SOC_MAX98396 is not set -# CONFIG_SND_SOC_MAX9860 is not set -# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -# CONFIG_SND_SOC_PCM1681 is not set -# CONFIG_SND_SOC_PCM1789_I2C is not set -# CONFIG_SND_SOC_PCM179X_I2C is not set -# CONFIG_SND_SOC_PCM179X_SPI is not set -# CONFIG_SND_SOC_PCM186X_I2C is not set -# CONFIG_SND_SOC_PCM186X_SPI is not set -# CONFIG_SND_SOC_PCM3060_I2C is not set -# CONFIG_SND_SOC_PCM3060_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set -# CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM5102A is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set -# CONFIG_SND_SOC_PCM6240 is not set -# CONFIG_SND_SOC_PEB2466 is not set -# CONFIG_SND_SOC_RK3308 is not set -# CONFIG_SND_SOC_RK3328 is not set -CONFIG_SND_SOC_RK817=m -# CONFIG_SND_SOC_RT5616 is not set -# CONFIG_SND_SOC_RT5631 is not set -# CONFIG_SND_SOC_RT5640 is not set -# CONFIG_SND_SOC_RT5659 is not set -# CONFIG_SND_SOC_RT9120 is not set -# CONFIG_SND_SOC_RTQ9128 is not set -# CONFIG_SND_SOC_SGTL5000 is not set -CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m -# CONFIG_SND_SOC_SIMPLE_MUX is not set -# CONFIG_SND_SOC_SMA1303 is not set -# CONFIG_SND_SOC_SPDIF is not set -# CONFIG_SND_SOC_SRC4XXX_I2C is not set -# CONFIG_SND_SOC_SSM2305 is not set -# CONFIG_SND_SOC_SSM2518 is not set -# CONFIG_SND_SOC_SSM2602_SPI is not set -# CONFIG_SND_SOC_SSM2602_I2C is not set -# CONFIG_SND_SOC_SSM3515 is not set -# CONFIG_SND_SOC_SSM4567 is not set -# CONFIG_SND_SOC_STA32X is not set -# CONFIG_SND_SOC_STA350 is not set -# CONFIG_SND_SOC_STI_SAS is not set -# CONFIG_SND_SOC_TAS2552 is not set -# CONFIG_SND_SOC_TAS2562 is not set -# CONFIG_SND_SOC_TAS2764 is not set -# CONFIG_SND_SOC_TAS2770 is not set -# CONFIG_SND_SOC_TAS2780 is not set -# CONFIG_SND_SOC_TAS2781_I2C is not set -# CONFIG_SND_SOC_TAS5086 is not set -# CONFIG_SND_SOC_TAS571X is not set -# CONFIG_SND_SOC_TAS5720 is not set -# CONFIG_SND_SOC_TAS5805M is not set -# CONFIG_SND_SOC_TAS6424 is not set -# CONFIG_SND_SOC_TDA7419 is not set -# CONFIG_SND_SOC_TFA9879 is not set -# CONFIG_SND_SOC_TFA989X is not set -# CONFIG_SND_SOC_TLV320ADC3XXX is not set -# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -# CONFIG_SND_SOC_TLV320AIC31XX is not set -# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set -# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set -# CONFIG_SND_SOC_TLV320ADCX140 is not set -# CONFIG_SND_SOC_TS3A227E is not set -# CONFIG_SND_SOC_TSCS42XX is not set -# CONFIG_SND_SOC_TSCS454 is not set -# CONFIG_SND_SOC_UDA1334 is not set -# CONFIG_SND_SOC_WM8510 is not set -# CONFIG_SND_SOC_WM8523 is not set -# CONFIG_SND_SOC_WM8524 is not set -# CONFIG_SND_SOC_WM8580 is not set -# CONFIG_SND_SOC_WM8711 is not set -# CONFIG_SND_SOC_WM8728 is not set -# CONFIG_SND_SOC_WM8731_I2C is not set -# CONFIG_SND_SOC_WM8731_SPI is not set -# CONFIG_SND_SOC_WM8737 is not set -# CONFIG_SND_SOC_WM8741 is not set -# CONFIG_SND_SOC_WM8750 is not set -# CONFIG_SND_SOC_WM8753 is not set -# CONFIG_SND_SOC_WM8770 is not set -# CONFIG_SND_SOC_WM8776 is not set -# CONFIG_SND_SOC_WM8782 is not set -# CONFIG_SND_SOC_WM8804_I2C is not set -# CONFIG_SND_SOC_WM8804_SPI is not set -# CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8904 is not set -# CONFIG_SND_SOC_WM8940 is not set -# CONFIG_SND_SOC_WM8960 is not set -# CONFIG_SND_SOC_WM8961 is not set -# CONFIG_SND_SOC_WM8962 is not set -# CONFIG_SND_SOC_WM8974 is not set -# CONFIG_SND_SOC_WM8978 is not set -# CONFIG_SND_SOC_WM8985 is not set -# CONFIG_SND_SOC_ZL38060 is not set -# CONFIG_SND_SOC_MAX9759 is not set -# CONFIG_SND_SOC_MT6351 is not set -# CONFIG_SND_SOC_MT6357 is not set -# CONFIG_SND_SOC_MT6358 is not set -# CONFIG_SND_SOC_MT6660 is not set -# CONFIG_SND_SOC_NAU8315 is not set -# CONFIG_SND_SOC_NAU8540 is not set -# CONFIG_SND_SOC_NAU8810 is not set -# CONFIG_SND_SOC_NAU8821 is not set -# CONFIG_SND_SOC_NAU8822 is not set -# CONFIG_SND_SOC_NAU8824 is not set -# CONFIG_SND_SOC_TPA6130A2 is not set -# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set -# CONFIG_SND_SOC_LPASS_VA_MACRO is not set -# CONFIG_SND_SOC_LPASS_RX_MACRO is not set -# CONFIG_SND_SOC_LPASS_TX_MACRO is not set -# end of CODEC drivers - -CONFIG_SND_SIMPLE_CARD_UTILS=m -CONFIG_SND_SIMPLE_CARD=m -# CONFIG_SND_AUDIO_GRAPH_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set -# CONFIG_SND_TEST_COMPONENT is not set -CONFIG_HID_SUPPORT=y -CONFIG_HID=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HIDRAW=y -CONFIG_UHID=m -CONFIG_HID_GENERIC=y - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_ASUS is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_BIGBEN_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CORSAIR is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_MACALLY is not set -# CONFIG_HID_PRODIKEYS is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CP2112 is not set -# CONFIG_HID_CREATIVE_SB0540 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_ELAN is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EVISION is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_FT260 is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_GLORIOUS is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_GOODIX_SPI is not set -# CONFIG_HID_GOOGLE_STADIA_FF is not set -# CONFIG_HID_VIVALDI is not set -# CONFIG_HID_GT683R is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_VIEWSONIC is not set -# CONFIG_HID_VRC2 is not set -# CONFIG_HID_XIAOMI is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LED is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_LETSKETCH is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MALTRON is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_MEGAWORLD_FF is not set -# CONFIG_HID_REDRAGON is not set -CONFIG_HID_MICROSOFT=y -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_MULTITOUCH is not set -# CONFIG_HID_NINTENDO is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_NVIDIA_SHIELD is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PLAYSTATION is not set -# CONFIG_HID_PXRC is not set -# CONFIG_HID_RAZER is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SEMITEK is not set -# CONFIG_HID_SIGMAMICRO is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_TOPRE is not set -# CONFIG_HID_THINGM is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_WIIMOTE is not set -# CONFIG_HID_WINWING is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_ALPS is not set -# CONFIG_HID_MCP2200 is not set -# CONFIG_HID_MCP2221 is not set -# end of Special HID drivers - -# -# HID-BPF support -# -# CONFIG_HID_BPF is not set -# end of HID-BPF support - -# -# USB HID support -# -CONFIG_USB_HID=y -# CONFIG_HID_PID is not set -CONFIG_USB_HIDDEV=y -# end of USB HID support - -CONFIG_I2C_HID=y -CONFIG_I2C_HID_OF=m -# CONFIG_I2C_HID_OF_ELAN is not set -CONFIG_I2C_HID_OF_GOODIX=m -CONFIG_I2C_HID_CORE=m -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -CONFIG_USB_LED_TRIG=y -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_USB_CONN_GPIO is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -CONFIG_USB_PCI=y -# CONFIG_USB_PCI_AMD is not set -CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_FEW_INIT_RETRIES is not set -CONFIG_USB_DYNAMIC_MINORS=y -CONFIG_USB_OTG=y -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -CONFIG_USB_OTG_FSM=m -CONFIG_USB_LEDS_TRIGGER_USBPORT=y -CONFIG_USB_AUTOSUSPEND_DELAY=2 -CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 -# CONFIG_USB_MON is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set -CONFIG_USB_XHCI_HCD=y -# CONFIG_USB_XHCI_DBGCAP is not set -CONFIG_USB_XHCI_PCI=y -# CONFIG_USB_XHCI_PCI_RENESAS is not set -CONFIG_USB_XHCI_PLATFORM=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_EHCI_PCI=y -# CONFIG_USB_EHCI_FSL is not set -CONFIG_USB_EHCI_HCD_PLATFORM=y -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_MAX3421_HCD is not set -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PCI=y -CONFIG_USB_OHCI_HCD_PLATFORM=y -# CONFIG_USB_UHCI_HCD is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -CONFIG_USB_UAS=m - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set - -# -# USB dual-mode controller drivers -# -# CONFIG_USB_CDNS_SUPPORT is not set -# CONFIG_USB_MUSB_HDRC is not set -CONFIG_USB_DWC3=y -# CONFIG_USB_DWC3_HOST is not set -# CONFIG_USB_DWC3_GADGET is not set -CONFIG_USB_DWC3_DUAL_ROLE=y - -# -# Platform Glue Driver Support -# -CONFIG_USB_DWC3_HAPS=y -CONFIG_USB_DWC3_OF_SIMPLE=y -# CONFIG_USB_DWC2 is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# -CONFIG_USB_SERIAL=y -# CONFIG_USB_SERIAL_CONSOLE is not set -CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -# CONFIG_USB_SERIAL_CH341 is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -CONFIG_USB_SERIAL_CP210X=m -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_EMPEG is not set -# CONFIG_USB_SERIAL_FTDI_SIO is not set -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_GARMIN is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -# CONFIG_USB_SERIAL_KEYSPAN is not set -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set -# CONFIG_USB_SERIAL_PL2303 is not set -# CONFIG_USB_SERIAL_OTI6858 is not set -# CONFIG_USB_SERIAL_QCAUX is not set -# CONFIG_USB_SERIAL_QUALCOMM is not set -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SAFE is not set -# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_XR is not set -# CONFIG_USB_SERIAL_DEBUG is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_ONBOARD_DEV is not set - -# -# USB Physical Layer drivers -# -CONFIG_USB_PHY=y -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ULPI is not set -# end of USB Physical Layer drivers - -CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG is not set -# CONFIG_USB_GADGET_DEBUG_FILES is not set -# CONFIG_USB_GADGET_DEBUG_FS is not set -CONFIG_USB_GADGET_VBUS_DRAW=2 -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -# CONFIG_U_SERIAL_CONSOLE is not set - -# -# USB Peripheral Controller -# -# CONFIG_USB_GR_UDC is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_PXA27X is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_MV_U3D is not set -# CONFIG_USB_SNP_UDC_PLAT is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_BDC_UDC is not set -# CONFIG_USB_AMD5536UDC is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_NET2280 is not set -# CONFIG_USB_GOKU is not set -# CONFIG_USB_EG20T is not set -# CONFIG_USB_GADGET_XILINX is not set -# CONFIG_USB_MAX3420_UDC is not set -# CONFIG_USB_DUMMY_HCD is not set -# end of USB Peripheral Controller - -CONFIG_USB_LIBCOMPOSITE=m -CONFIG_USB_F_ACM=m -CONFIG_USB_U_SERIAL=m -CONFIG_USB_U_ETHER=m -CONFIG_USB_U_AUDIO=m -CONFIG_USB_F_SERIAL=m -CONFIG_USB_F_OBEX=m -CONFIG_USB_F_NCM=m -CONFIG_USB_F_ECM=m -CONFIG_USB_F_EEM=m -CONFIG_USB_F_SUBSET=m -CONFIG_USB_F_MASS_STORAGE=m -CONFIG_USB_F_FS=m -CONFIG_USB_F_UAC1=m -CONFIG_USB_F_UAC2=m -CONFIG_USB_F_UVC=m -CONFIG_USB_F_MIDI=m -CONFIG_USB_F_MIDI2=m -CONFIG_USB_F_HID=m -CONFIG_USB_CONFIGFS=m -CONFIG_USB_CONFIGFS_SERIAL=y -CONFIG_USB_CONFIGFS_ACM=y -CONFIG_USB_CONFIGFS_OBEX=y -CONFIG_USB_CONFIGFS_NCM=y -CONFIG_USB_CONFIGFS_ECM=y -CONFIG_USB_CONFIGFS_ECM_SUBSET=y -# CONFIG_USB_CONFIGFS_RNDIS is not set -CONFIG_USB_CONFIGFS_EEM=y -CONFIG_USB_CONFIGFS_MASS_STORAGE=y -# CONFIG_USB_CONFIGFS_F_LB_SS is not set -CONFIG_USB_CONFIGFS_F_FS=y -CONFIG_USB_CONFIGFS_F_UAC1=y -# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set -CONFIG_USB_CONFIGFS_F_UAC2=y -CONFIG_USB_CONFIGFS_F_MIDI=y -CONFIG_USB_CONFIGFS_F_MIDI2=y -CONFIG_USB_CONFIGFS_F_HID=y -CONFIG_USB_CONFIGFS_F_UVC=y -# CONFIG_USB_CONFIGFS_F_PRINTER is not set - -# -# USB Gadget precomposed configurations -# -# CONFIG_USB_ZERO is not set -# CONFIG_USB_AUDIO is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_G_NCM is not set -CONFIG_USB_GADGETFS=y -CONFIG_USB_FUNCTIONFS=m -CONFIG_USB_FUNCTIONFS_ETH=y -# CONFIG_USB_FUNCTIONFS_RNDIS is not set -CONFIG_USB_FUNCTIONFS_GENERIC=y -# CONFIG_USB_MASS_STORAGE is not set -# CONFIG_USB_G_SERIAL is not set -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_G_PRINTER is not set -CONFIG_USB_CDC_COMPOSITE=m -# CONFIG_USB_G_ACM_MS is not set -CONFIG_USB_G_MULTI=m -# CONFIG_USB_G_MULTI_RNDIS is not set -CONFIG_USB_G_MULTI_CDC=y -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_WEBCAM is not set -# CONFIG_USB_RAW_GADGET is not set -# end of USB Gadget precomposed configurations - -CONFIG_TYPEC=y -# CONFIG_TYPEC_TCPM is not set -# CONFIG_TYPEC_UCSI is not set -# CONFIG_TYPEC_TPS6598X is not set -# CONFIG_TYPEC_ANX7411 is not set -# CONFIG_TYPEC_RT1719 is not set -# CONFIG_TYPEC_HD3SS3220 is not set -# CONFIG_TYPEC_STUSB160X is not set -CONFIG_TYPEC_WUSB3801=m - -# -# USB Type-C Multiplexer/DeMultiplexer Switch support -# -# CONFIG_TYPEC_MUX_FSA4480 is not set -# CONFIG_TYPEC_MUX_GPIO_SBU is not set -# CONFIG_TYPEC_MUX_PI3USB30532 is not set -# CONFIG_TYPEC_MUX_IT5205 is not set -# CONFIG_TYPEC_MUX_NB7VPQ904M is not set -# CONFIG_TYPEC_MUX_PTN36502 is not set -# CONFIG_TYPEC_MUX_WCD939X_USBSS is not set -# end of USB Type-C Multiplexer/DeMultiplexer Switch support - -# -# USB Type-C Alternate Mode drivers -# -# CONFIG_TYPEC_DP_ALTMODE is not set -# end of USB Type-C Alternate Mode drivers - -CONFIG_USB_ROLE_SWITCH=y -CONFIG_MMC=y -CONFIG_PWRSEQ_EMMC=y -CONFIG_PWRSEQ_SIMPLE=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_BLOCK_MINORS=32 -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_ARMMMCI is not set -CONFIG_MMC_SDHCI=y -# CONFIG_MMC_SDHCI_PCI is not set -CONFIG_MMC_SDHCI_PLTFM=y -# CONFIG_MMC_SDHCI_OF_ARASAN is not set -# CONFIG_MMC_SDHCI_OF_AT91 is not set -CONFIG_MMC_SDHCI_OF_DWCMSHC=y -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_SDHCI_MILBEAUT is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_SPI is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set -CONFIG_MMC_DW=y -CONFIG_MMC_DW_PLTFM=y -# CONFIG_MMC_DW_BLUEFIELD is not set -# CONFIG_MMC_DW_EXYNOS is not set -# CONFIG_MMC_DW_HI3798CV200 is not set -# CONFIG_MMC_DW_HI3798MV200 is not set -# CONFIG_MMC_DW_K3 is not set -# CONFIG_MMC_DW_PCI is not set -CONFIG_MMC_DW_ROCKCHIP=y -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -CONFIG_MMC_CQHCI=y -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_MEMSTICK is not set -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_CLASS_FLASH=y -CONFIG_LEDS_CLASS_MULTICOLOR=y -# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set - -# -# LED drivers -# -# CONFIG_LEDS_AN30259A is not set -# CONFIG_LEDS_AW200XX is not set -# CONFIG_LEDS_AW2013 is not set -# CONFIG_LEDS_BCM6328 is not set -# CONFIG_LEDS_BCM6358 is not set -# CONFIG_LEDS_CR0014114 is not set -# CONFIG_LEDS_EL15203000 is not set -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_LM3532 is not set -# CONFIG_LEDS_LM3642 is not set -# CONFIG_LEDS_LM3692X is not set -# CONFIG_LEDS_PCA9532 is not set -CONFIG_LEDS_GPIO=y -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP3952 is not set -# CONFIG_LEDS_LP50XX is not set -# CONFIG_LEDS_LP55XX_COMMON is not set -# CONFIG_LEDS_LP8860 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA963X is not set -# CONFIG_LEDS_PCA995X is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_PWM is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_BD2606MVV is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_TLC591XX is not set -# CONFIG_LEDS_LM355x is not set -# CONFIG_LEDS_IS31FL319X is not set -# CONFIG_LEDS_IS31FL32XX is not set - -# -# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) -# -# CONFIG_LEDS_BLINKM is not set -# CONFIG_LEDS_SYSCON is not set -# CONFIG_LEDS_MLXREG is not set -# CONFIG_LEDS_USER is not set -# CONFIG_LEDS_SPI_BYTE is not set -# CONFIG_LEDS_LM3697 is not set - -# -# Flash and Torch LED drivers -# -# CONFIG_LEDS_AAT1290 is not set -# CONFIG_LEDS_AS3645A is not set -# CONFIG_LEDS_KTD2692 is not set -# CONFIG_LEDS_LM3601X is not set -# CONFIG_LEDS_RT4505 is not set -# CONFIG_LEDS_RT8515 is not set -# CONFIG_LEDS_SGM3140 is not set -# CONFIG_LEDS_SY7802 is not set - -# -# RGB LED drivers -# -# CONFIG_LEDS_GROUP_MULTICOLOR is not set -# CONFIG_LEDS_KTD202X is not set -# CONFIG_LEDS_NCP5623 is not set -# CONFIG_LEDS_PWM_MULTICOLOR is not set - -# -# LED Triggers -# -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_ONESHOT=y -# CONFIG_LEDS_TRIGGER_DISK is not set -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_BACKLIGHT=y -CONFIG_LEDS_TRIGGER_CPU=y -CONFIG_LEDS_TRIGGER_ACTIVITY=y -CONFIG_LEDS_TRIGGER_GPIO=y -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y - -# -# iptables trigger is under Netfilter config (LED target) -# -CONFIG_LEDS_TRIGGER_TRANSIENT=y -CONFIG_LEDS_TRIGGER_CAMERA=y -CONFIG_LEDS_TRIGGER_PANIC=y -CONFIG_LEDS_TRIGGER_NETDEV=y -CONFIG_LEDS_TRIGGER_PATTERN=y -CONFIG_LEDS_TRIGGER_TTY=y -# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set - -# -# Simple LED drivers -# -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_SUPPORT=y -CONFIG_RTC_LIB=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_NVMEM=y - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_HYM8563 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_MAX31335 is not set -# CONFIG_RTC_DRV_NCT3018Y is not set -CONFIG_RTC_DRV_RK808=y -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8111 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD2405AL is not set -# CONFIG_RTC_DRV_SD3078 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_MCP795 is not set -CONFIG_RTC_I2C_AND_SPI=y - -# -# SPI and I2C RTC drivers -# -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set -# CONFIG_RTC_DRV_RX6110 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_EFI is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_ZYNQMP is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_CADENCE is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_R7301 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_RTC_DRV_GOLDFISH is not set -CONFIG_DMADEVICES=y -# CONFIG_DMADEVICES_DEBUG is not set - -# -# DMA Devices -# -CONFIG_DMA_ENGINE=y -CONFIG_DMA_OF=y -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_BCM_SBA_RAID is not set -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_FSL_QDMA is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_MV_XOR_V2 is not set -CONFIG_PL330_DMA=y -# CONFIG_PLX_DMA is not set -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_XDMA is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_XILINX_ZYNQMP_DPDMA is not set -# CONFIG_AMD_QDMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set -# CONFIG_DW_EDMA is not set -# CONFIG_SF_PDMA is not set - -# -# DMA Clients -# -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_DMATEST is not set - -# -# DMABUF options -# -CONFIG_SYNC_FILE=y -# CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_DEBUG is not set -# CONFIG_DMABUF_SELFTESTS is not set -# CONFIG_DMABUF_HEAPS is not set -# CONFIG_DMABUF_SYSFS_STATS is not set -# end of DMABUF options - -# CONFIG_UIO is not set -# CONFIG_VFIO is not set -# CONFIG_VIRT_DRIVERS is not set -# CONFIG_VIRTIO_MENU is not set -# CONFIG_VDPA is not set -# CONFIG_VHOST_MENU is not set - -# -# Microsoft Hyper-V guest support -# -# end of Microsoft Hyper-V guest support - -# CONFIG_GREYBUS is not set -# CONFIG_COMEDI is not set -CONFIG_STAGING=y -# CONFIG_RTLLIB is not set -# CONFIG_RTL8723BS is not set -# CONFIG_R8712U is not set -# CONFIG_RTS5208 is not set -# CONFIG_VT6655 is not set -# CONFIG_VT6656 is not set - -# -# IIO staging drivers -# - -# -# Accelerometers -# -# CONFIG_ADIS16203 is not set -# CONFIG_ADIS16240 is not set -# end of Accelerometers - -# -# Analog to digital converters -# -# CONFIG_AD7816 is not set -# end of Analog to digital converters - -# -# Analog digital bi-direction converters -# -# CONFIG_ADT7316 is not set -# end of Analog digital bi-direction converters - -# -# Direct Digital Synthesis -# -# CONFIG_AD9832 is not set -# CONFIG_AD9834 is not set -# end of Direct Digital Synthesis - -# -# Network Analyzer, Impedance Converters -# -# CONFIG_AD5933 is not set -# end of Network Analyzer, Impedance Converters -# end of IIO staging drivers - -# CONFIG_FB_SM750 is not set -CONFIG_STAGING_MEDIA=y -# CONFIG_DVB_AV7110 is not set -# CONFIG_VIDEO_MAX96712 is not set -CONFIG_VIDEO_ROCKCHIP_VDEC=m - -# -# StarFive media platform drivers -# -# CONFIG_STAGING_MEDIA_DEPRECATED is not set -# CONFIG_LTE_GDM724X is not set -# CONFIG_FB_TFT is not set -# CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_FIELDBUS_DEV is not set -# CONFIG_VME_BUS is not set -# CONFIG_GOLDFISH is not set -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_CZNIC_PLATFORMS is not set -# CONFIG_MELLANOX_PLATFORM is not set -# CONFIG_SURFACE_PLATFORMS is not set -CONFIG_ARM64_PLATFORM_DEVICES=y -CONFIG_HAVE_CLK=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y - -# -# Clock driver for ARM Reference designs -# -# CONFIG_CLK_ICST is not set -# CONFIG_CLK_SP810 is not set -# end of Clock driver for ARM Reference designs - -# CONFIG_LMK04832 is not set -# CONFIG_COMMON_CLK_MAX9485 is not set -CONFIG_COMMON_CLK_RK808=y -CONFIG_COMMON_CLK_SCMI=y -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_COMMON_CLK_AXI_CLKGEN is not set -# CONFIG_COMMON_CLK_XGENE is not set -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_RS9_PCIE is not set -# CONFIG_COMMON_CLK_SI521XX is not set -# CONFIG_COMMON_CLK_VC3 is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_COMMON_CLK_VC7 is not set -# CONFIG_COMMON_CLK_FIXED_MMIO is not set -CONFIG_COMMON_CLK_ROCKCHIP=y -# CONFIG_CLK_PX30 is not set -# CONFIG_CLK_RK3308 is not set -# CONFIG_CLK_RK3328 is not set -# CONFIG_CLK_RK3368 is not set -# CONFIG_CLK_RK3399 is not set -CONFIG_CLK_RK3568=y -CONFIG_CLK_RK3576=y -CONFIG_CLK_RK3588=y -# CONFIG_XILINX_VCU is not set -# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_CLKSRC_MMIO=y -CONFIG_ROCKCHIP_TIMER=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -# CONFIG_FSL_ERRATUM_A008585 is not set -# CONFIG_HISILICON_ERRATUM_161010101 is not set -# CONFIG_ARM64_ERRATUM_858921 is not set -# end of Clock Source drivers - -CONFIG_MAILBOX=y -# CONFIG_ARM_MHU is not set -# CONFIG_ARM_MHU_V2 is not set -# CONFIG_ARM_MHU_V3 is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PL320_MBOX is not set -CONFIG_ROCKCHIP_MBOX=y -# CONFIG_ALTERA_MBOX is not set -# CONFIG_MAILBOX_TEST is not set -CONFIG_IOMMU_IOVA=y -CONFIG_IOMMU_API=y -CONFIG_IOMMU_SUPPORT=y - -# -# Generic IOMMU Pagetable Support -# -CONFIG_IOMMU_IO_PGTABLE=y -CONFIG_IOMMU_IO_PGTABLE_LPAE=y -# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set -# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set -# CONFIG_IOMMU_IO_PGTABLE_DART is not set -# end of Generic IOMMU Pagetable Support - -# CONFIG_IOMMU_DEBUGFS is not set -# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set -# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set -CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y -CONFIG_OF_IOMMU=y -CONFIG_IOMMU_DMA=y -# CONFIG_IOMMUFD is not set -CONFIG_ROCKCHIP_IOMMU=y -# CONFIG_ARM_SMMU is not set -# CONFIG_ARM_SMMU_V3 is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set -# end of Remoteproc drivers - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set -# end of Rpmsg drivers - -# CONFIG_SOUNDWIRE is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# -# end of Amlogic SoC drivers - -# -# Broadcom SoC drivers -# -# end of Broadcom SoC drivers - -# -# NXP/Freescale QorIQ SoC drivers -# -# CONFIG_QUICC_ENGINE is not set -# CONFIG_FSL_RCPM is not set -# end of NXP/Freescale QorIQ SoC drivers - -# -# fujitsu SoC drivers -# -# end of fujitsu SoC drivers - -# -# i.MX SoC drivers -# -# end of i.MX SoC drivers - -# -# Enable LiteX SoC Builder specific drivers -# -# CONFIG_LITEX_SOC_CONTROLLER is not set -# end of Enable LiteX SoC Builder specific drivers - -# CONFIG_WPCM450_SOC is not set - -# -# Qualcomm SoC drivers -# -# end of Qualcomm SoC drivers - -CONFIG_ROCKCHIP_GRF=y -CONFIG_ROCKCHIP_IODOMAIN=y -CONFIG_ROCKCHIP_SUSPEND_MODE=y -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# end of Xilinx SoC drivers -# end of SOC (System On Chip) specific Drivers - -# -# PM Domains -# - -# -# Amlogic PM Domains -# -# end of Amlogic PM Domains - -CONFIG_ARM_SCMI_PERF_DOMAIN=y -CONFIG_ARM_SCMI_POWER_DOMAIN=y - -# -# Broadcom PM Domains -# -# end of Broadcom PM Domains - -# -# i.MX PM Domains -# -# end of i.MX PM Domains - -# -# Qualcomm PM Domains -# -# end of Qualcomm PM Domains - -CONFIG_ROCKCHIP_PM_DOMAINS=y -# end of PM Domains - -CONFIG_PM_DEVFREQ=y - -# -# DEVFREQ Governors -# -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y -CONFIG_DEVFREQ_GOV_PERFORMANCE=y -CONFIG_DEVFREQ_GOV_POWERSAVE=y -CONFIG_DEVFREQ_GOV_USERSPACE=y -# CONFIG_DEVFREQ_GOV_PASSIVE is not set - -# -# DEVFREQ Drivers -# -CONFIG_ARM_RK3399_DMC_DEVFREQ=y -CONFIG_PM_DEVFREQ_EVENT=y -CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y -CONFIG_EXTCON=y - -# -# Extcon Device Drivers -# -# CONFIG_EXTCON_ADC_JACK is not set -# CONFIG_EXTCON_FSA9480 is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_LC824206XA is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_PTN5150 is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USB_GPIO is not set -# CONFIG_EXTCON_USBC_TUSB320 is not set -# CONFIG_MEMORY is not set -CONFIG_IIO=m -CONFIG_IIO_BUFFER=y -# CONFIG_IIO_BUFFER_CB is not set -# CONFIG_IIO_BUFFER_DMA is not set -# CONFIG_IIO_BUFFER_DMAENGINE is not set -# CONFIG_IIO_BUFFER_HW_CONSUMER is not set -CONFIG_IIO_KFIFO_BUF=m -CONFIG_IIO_TRIGGERED_BUFFER=m -CONFIG_IIO_CONFIGFS=m -CONFIG_IIO_TRIGGER=y -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 -# CONFIG_IIO_SW_DEVICE is not set -CONFIG_IIO_SW_TRIGGER=m -CONFIG_IIO_TRIGGERED_EVENT=m - -# -# Accelerometers -# -# CONFIG_ADIS16201 is not set -# CONFIG_ADIS16209 is not set -# CONFIG_ADXL313_I2C is not set -# CONFIG_ADXL313_SPI is not set -# CONFIG_ADXL345_I2C is not set -# CONFIG_ADXL345_SPI is not set -# CONFIG_ADXL355_I2C is not set -# CONFIG_ADXL355_SPI is not set -# CONFIG_ADXL367_SPI is not set -# CONFIG_ADXL367_I2C is not set -# CONFIG_ADXL372_SPI is not set -# CONFIG_ADXL372_I2C is not set -# CONFIG_ADXL380_SPI is not set -# CONFIG_ADXL380_I2C is not set -# CONFIG_BMA180 is not set -# CONFIG_BMA220 is not set -# CONFIG_BMA400 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_BMI088_ACCEL is not set -# CONFIG_DA280 is not set -# CONFIG_DA311 is not set -# CONFIG_DMARD06 is not set -# CONFIG_DMARD09 is not set -# CONFIG_DMARD10 is not set -# CONFIG_FXLS8962AF_I2C is not set -# CONFIG_FXLS8962AF_SPI is not set -CONFIG_IIO_ST_ACCEL_3AXIS=m -CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m -CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m -# CONFIG_IIO_KX022A_SPI is not set -# CONFIG_IIO_KX022A_I2C is not set -# CONFIG_KXSD9 is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_MC3230 is not set -# CONFIG_MMA7455_I2C is not set -# CONFIG_MMA7455_SPI is not set -# CONFIG_MMA7660 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MSA311 is not set -# CONFIG_MXC4005 is not set -# CONFIG_MXC6255 is not set -# CONFIG_SCA3000 is not set -# CONFIG_SCA3300 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set -# end of Accelerometers - -# -# Analog to digital converters -# -# CONFIG_AD4000 is not set -# CONFIG_AD4130 is not set -# CONFIG_AD4695 is not set -# CONFIG_AD7091R5 is not set -# CONFIG_AD7091R8 is not set -# CONFIG_AD7124 is not set -# CONFIG_AD7173 is not set -# CONFIG_AD7192 is not set -# CONFIG_AD7266 is not set -# CONFIG_AD7280 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7292 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7380 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7606_IFACE_PARALLEL is not set -# CONFIG_AD7606_IFACE_SPI is not set -# CONFIG_AD7766 is not set -# CONFIG_AD7768_1 is not set -# CONFIG_AD7780 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD7944 is not set -# CONFIG_AD7949 is not set -# CONFIG_AD799X is not set -# CONFIG_AD9467 is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_ENVELOPE_DETECTOR is not set -# CONFIG_HI8435 is not set -# CONFIG_HX711 is not set -# CONFIG_INA2XX_ADC is not set -# CONFIG_LTC2309 is not set -# CONFIG_LTC2471 is not set -# CONFIG_LTC2485 is not set -# CONFIG_LTC2496 is not set -# CONFIG_LTC2497 is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX11100 is not set -# CONFIG_MAX1118 is not set -# CONFIG_MAX11205 is not set -# CONFIG_MAX11410 is not set -# CONFIG_MAX1241 is not set -# CONFIG_MAX1363 is not set -# CONFIG_MAX34408 is not set -# CONFIG_MAX9611 is not set -# CONFIG_MCP320X is not set -# CONFIG_MCP3422 is not set -# CONFIG_MCP3564 is not set -# CONFIG_MCP3911 is not set -# CONFIG_NAU7802 is not set -# CONFIG_PAC1921 is not set -# CONFIG_PAC1934 is not set -CONFIG_ROCKCHIP_SARADC=m -# CONFIG_RICHTEK_RTQ6056 is not set -# CONFIG_SD_ADC_MODULATOR is not set -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC0832 is not set -# CONFIG_TI_ADC084S021 is not set -# CONFIG_TI_ADC12138 is not set -# CONFIG_TI_ADC108S102 is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_TI_ADC161S626 is not set -# CONFIG_TI_ADS1015 is not set -# CONFIG_TI_ADS1119 is not set -# CONFIG_TI_ADS7924 is not set -# CONFIG_TI_ADS1100 is not set -# CONFIG_TI_ADS1298 is not set -# CONFIG_TI_ADS7950 is not set -# CONFIG_TI_ADS8344 is not set -# CONFIG_TI_ADS8688 is not set -# CONFIG_TI_ADS124S08 is not set -# CONFIG_TI_ADS131E08 is not set -# CONFIG_TI_LMP92064 is not set -# CONFIG_TI_TLC4541 is not set -# CONFIG_TI_TSC2046 is not set -# CONFIG_VF610_ADC is not set -# CONFIG_XILINX_XADC is not set -# end of Analog to digital converters - -# -# Analog to digital and digital to analog converters -# -# CONFIG_AD74115 is not set -# CONFIG_AD74413R is not set -# end of Analog to digital and digital to analog converters - -# -# Analog Front Ends -# -# CONFIG_IIO_RESCALE is not set -# end of Analog Front Ends - -# -# Amplifiers -# -# CONFIG_AD8366 is not set -# CONFIG_ADA4250 is not set -# CONFIG_HMC425 is not set -# end of Amplifiers - -# -# Capacitance to digital converters -# -# CONFIG_AD7150 is not set -# CONFIG_AD7746 is not set -# end of Capacitance to digital converters - -# -# Chemical Sensors -# -# CONFIG_AOSONG_AGS02MA is not set -# CONFIG_ATLAS_PH_SENSOR is not set -# CONFIG_ATLAS_EZO_SENSOR is not set -# CONFIG_BME680 is not set -# CONFIG_CCS811 is not set -# CONFIG_ENS160 is not set -# CONFIG_IAQCORE is not set -# CONFIG_PMS7003 is not set -# CONFIG_SCD30_CORE is not set -# CONFIG_SCD4X is not set -# CONFIG_SENSIRION_SGP30 is not set -# CONFIG_SENSIRION_SGP40 is not set -# CONFIG_SPS30_I2C is not set -# CONFIG_SPS30_SERIAL is not set -# CONFIG_SENSEAIR_SUNRISE_CO2 is not set -# CONFIG_VZ89X is not set -# end of Chemical Sensors - -# -# Hid Sensor IIO Common -# -# end of Hid Sensor IIO Common - -# -# IIO SCMI Sensors -# -# CONFIG_IIO_SCMI is not set -# end of IIO SCMI Sensors - -# -# SSP Sensor Common -# -# CONFIG_IIO_SSP_SENSORHUB is not set -# end of SSP Sensor Common - -CONFIG_IIO_ST_SENSORS_I2C=m -CONFIG_IIO_ST_SENSORS_SPI=m -CONFIG_IIO_ST_SENSORS_CORE=m - -# -# Digital to analog converters -# -# CONFIG_AD3552R is not set -# CONFIG_AD5064 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5592R is not set -# CONFIG_AD5593R is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_AD9739A is not set -# CONFIG_LTC2688 is not set -# CONFIG_AD5686_SPI is not set -# CONFIG_AD5696_I2C is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5758 is not set -# CONFIG_AD5761 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5766 is not set -# CONFIG_AD5770R is not set -# CONFIG_AD5791 is not set -# CONFIG_AD7293 is not set -# CONFIG_AD7303 is not set -# CONFIG_AD8801 is not set -# CONFIG_DPOT_DAC is not set -# CONFIG_DS4424 is not set -# CONFIG_LTC1660 is not set -# CONFIG_LTC2632 is not set -# CONFIG_LTC2664 is not set -# CONFIG_M62332 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5522 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4728 is not set -# CONFIG_MCP4821 is not set -# CONFIG_MCP4922 is not set -# CONFIG_TI_DAC082S085 is not set -# CONFIG_TI_DAC5571 is not set -# CONFIG_TI_DAC7311 is not set -# CONFIG_TI_DAC7612 is not set -# CONFIG_VF610_DAC is not set -# end of Digital to analog converters - -# -# IIO dummy driver -# -# end of IIO dummy driver - -# -# Filters -# -# CONFIG_ADMV8818 is not set -# end of Filters - -# -# Frequency Synthesizers DDS/PLL -# - -# -# Clock Generator/Distribution -# -# CONFIG_AD9523 is not set -# end of Clock Generator/Distribution - -# -# Phase-Locked Loop (PLL) frequency synthesizers -# -# CONFIG_ADF4350 is not set -# CONFIG_ADF4371 is not set -# CONFIG_ADF4377 is not set -# CONFIG_ADMFM2000 is not set -# CONFIG_ADMV1013 is not set -# CONFIG_ADMV1014 is not set -# CONFIG_ADMV4420 is not set -# CONFIG_ADRF6780 is not set -# end of Phase-Locked Loop (PLL) frequency synthesizers -# end of Frequency Synthesizers DDS/PLL - -# -# Digital gyroscope sensors -# -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADXRS290 is not set -# CONFIG_ADXRS450 is not set -# CONFIG_BMG160 is not set -# CONFIG_FXAS21002C is not set -# CONFIG_MPU3050_I2C is not set -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_ITG3200 is not set -# end of Digital gyroscope sensors - -# -# Health Sensors -# - -# -# Heart Rate Monitors -# -# CONFIG_AFE4403 is not set -# CONFIG_AFE4404 is not set -# CONFIG_MAX30100 is not set -# CONFIG_MAX30102 is not set -# end of Heart Rate Monitors -# end of Health Sensors - -# -# Humidity sensors -# -# CONFIG_AM2315 is not set -# CONFIG_DHT11 is not set -# CONFIG_ENS210 is not set -# CONFIG_HDC100X is not set -# CONFIG_HDC2010 is not set -# CONFIG_HDC3020 is not set -# CONFIG_HTS221 is not set -# CONFIG_HTU21 is not set -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set -# end of Humidity sensors - -# -# Inertial measurement units -# -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16460 is not set -# CONFIG_ADIS16475 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_BMI160_I2C is not set -# CONFIG_BMI160_SPI is not set -# CONFIG_BMI323_I2C is not set -# CONFIG_BMI323_SPI is not set -# CONFIG_BOSCH_BNO055_SERIAL is not set -# CONFIG_BOSCH_BNO055_I2C is not set -# CONFIG_FXOS8700_I2C is not set -# CONFIG_FXOS8700_SPI is not set -# CONFIG_KMX61 is not set -# CONFIG_INV_ICM42600_I2C is not set -# CONFIG_INV_ICM42600_SPI is not set -# CONFIG_INV_MPU6050_I2C is not set -# CONFIG_INV_MPU6050_SPI is not set -# CONFIG_IIO_ST_LSM6DSX is not set -# CONFIG_IIO_ST_LSM9DS0 is not set -# end of Inertial measurement units - -# -# Light sensors -# -# CONFIG_ADJD_S311 is not set -# CONFIG_ADUX1020 is not set -# CONFIG_AL3010 is not set -# CONFIG_AL3320A is not set -# CONFIG_APDS9300 is not set -# CONFIG_APDS9306 is not set -# CONFIG_APDS9960 is not set -# CONFIG_AS73211 is not set -# CONFIG_BH1745 is not set -# CONFIG_BH1750 is not set -# CONFIG_BH1780 is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM3605 is not set -# CONFIG_CM36651 is not set -# CONFIG_GP2AP002 is not set -# CONFIG_GP2AP020A00F is not set -# CONFIG_SENSORS_ISL29018 is not set -# CONFIG_SENSORS_ISL29028 is not set -# CONFIG_ISL29125 is not set -# CONFIG_ISL76682 is not set -# CONFIG_JSA1212 is not set -# CONFIG_ROHM_BU27008 is not set -# CONFIG_ROHM_BU27034 is not set -# CONFIG_RPR0521 is not set -# CONFIG_LTR390 is not set -# CONFIG_LTR501 is not set -# CONFIG_LTRF216A is not set -# CONFIG_LV0104CS is not set -# CONFIG_MAX44000 is not set -# CONFIG_MAX44009 is not set -# CONFIG_NOA1305 is not set -# CONFIG_OPT3001 is not set -# CONFIG_OPT4001 is not set -# CONFIG_PA12203001 is not set -# CONFIG_SI1133 is not set -# CONFIG_SI1145 is not set -# CONFIG_STK3310 is not set -# CONFIG_ST_UVIS25 is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set -# CONFIG_SENSORS_TSL2563 is not set -# CONFIG_TSL2583 is not set -# CONFIG_TSL2591 is not set -# CONFIG_TSL2772 is not set -# CONFIG_TSL4531 is not set -# CONFIG_US5182D is not set -# CONFIG_VCNL4000 is not set -# CONFIG_VCNL4035 is not set -# CONFIG_VEML6030 is not set -# CONFIG_VEML6040 is not set -# CONFIG_VEML6070 is not set -# CONFIG_VEML6075 is not set -# CONFIG_VL6180 is not set -# CONFIG_ZOPT2201 is not set -# end of Light sensors - -# -# Magnetometer sensors -# -# CONFIG_AF8133J is not set -# CONFIG_AK8974 is not set -# CONFIG_AK8975 is not set -# CONFIG_AK09911 is not set -# CONFIG_BMC150_MAGN_I2C is not set -# CONFIG_BMC150_MAGN_SPI is not set -# CONFIG_MAG3110 is not set -# CONFIG_MMC35240 is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set -# CONFIG_SENSORS_HMC5843_I2C is not set -# CONFIG_SENSORS_HMC5843_SPI is not set -# CONFIG_SENSORS_RM3100_I2C is not set -# CONFIG_SENSORS_RM3100_SPI is not set -# CONFIG_TI_TMAG5273 is not set -# CONFIG_YAMAHA_YAS530 is not set -# end of Magnetometer sensors - -# -# Multiplexers -# -# CONFIG_IIO_MUX is not set -# end of Multiplexers - -# -# Inclinometer sensors -# -# end of Inclinometer sensors - -# -# Triggers - standalone -# -# CONFIG_IIO_HRTIMER_TRIGGER is not set -# CONFIG_IIO_INTERRUPT_TRIGGER is not set -# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set -# CONFIG_IIO_SYSFS_TRIGGER is not set -# end of Triggers - standalone - -# -# Linear and angular position sensors -# -# end of Linear and angular position sensors - -# -# Digital potentiometers -# -# CONFIG_AD5110 is not set -# CONFIG_AD5272 is not set -# CONFIG_DS1803 is not set -# CONFIG_MAX5432 is not set -# CONFIG_MAX5481 is not set -# CONFIG_MAX5487 is not set -# CONFIG_MCP4018 is not set -# CONFIG_MCP4131 is not set -# CONFIG_MCP4531 is not set -# CONFIG_MCP41010 is not set -# CONFIG_TPL0102 is not set -# CONFIG_X9250 is not set -# end of Digital potentiometers - -# -# Digital potentiostats -# -# CONFIG_LMP91000 is not set -# end of Digital potentiostats - -# -# Pressure sensors -# -# CONFIG_ABP060MG is not set -# CONFIG_ROHM_BM1390 is not set -# CONFIG_BMP280 is not set -# CONFIG_DLHL60D is not set -# CONFIG_DPS310 is not set -# CONFIG_HP03 is not set -# CONFIG_HSC030PA is not set -# CONFIG_ICP10100 is not set -# CONFIG_MPL115_I2C is not set -# CONFIG_MPL115_SPI is not set -# CONFIG_MPL3115 is not set -# CONFIG_MPRLS0025PA is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_SDP500 is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_T5403 is not set -# CONFIG_HP206C is not set -# CONFIG_ZPA2326 is not set -# end of Pressure sensors - -# -# Lightning sensors -# -# CONFIG_AS3935 is not set -# end of Lightning sensors - -# -# Proximity and distance sensors -# -# CONFIG_HX9023S is not set -# CONFIG_IRSD200 is not set -# CONFIG_ISL29501 is not set -# CONFIG_LIDAR_LITE_V2 is not set -# CONFIG_MB1232 is not set -# CONFIG_PING is not set -# CONFIG_RFD77402 is not set -# CONFIG_SRF04 is not set -# CONFIG_SX9310 is not set -# CONFIG_SX9324 is not set -# CONFIG_SX9360 is not set -# CONFIG_SX9500 is not set -# CONFIG_SRF08 is not set -# CONFIG_VCNL3020 is not set -# CONFIG_VL53L0X_I2C is not set -# CONFIG_AW96103 is not set -# end of Proximity and distance sensors - -# -# Resolver to digital converters -# -# CONFIG_AD2S90 is not set -# CONFIG_AD2S1200 is not set -# CONFIG_AD2S1210 is not set -# end of Resolver to digital converters - -# -# Temperature sensors -# -# CONFIG_LTC2983 is not set -# CONFIG_MAXIM_THERMOCOUPLE is not set -# CONFIG_MLX90614 is not set -# CONFIG_MLX90632 is not set -# CONFIG_MLX90635 is not set -# CONFIG_TMP006 is not set -# CONFIG_TMP007 is not set -# CONFIG_TMP117 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set -# CONFIG_MAX30208 is not set -# CONFIG_MAX31856 is not set -# CONFIG_MAX31865 is not set -# CONFIG_MCP9600 is not set -# end of Temperature sensors - -# CONFIG_NTB is not set -CONFIG_PWM=y -# CONFIG_PWM_DEBUG is not set -# CONFIG_PWM_ATMEL_TCB is not set -# CONFIG_PWM_CLK is not set -# CONFIG_PWM_DWC is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_GPIO is not set -# CONFIG_PWM_PCA9685 is not set -CONFIG_PWM_ROCKCHIP=y -# CONFIG_PWM_XILINX is not set - -# -# IRQ chip support -# -CONFIG_IRQCHIP=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_MAX_NR=1 -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_IRQ_MSI_LIB=y -# CONFIG_AL_FIC is not set -# CONFIG_LAN966X_OIC is not set -# CONFIG_XILINX_INTC is not set -CONFIG_PARTITION_PERCPU=y -# end of IRQ chip support - -# CONFIG_IPACK_BUS is not set -CONFIG_ARCH_HAS_RESET_CONTROLLER=y -CONFIG_RESET_CONTROLLER=y -# CONFIG_RESET_GPIO is not set -CONFIG_RESET_SCMI=y -# CONFIG_RESET_SIMPLE is not set -# CONFIG_RESET_TI_SYSCON is not set -# CONFIG_RESET_TI_TPS380X is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_PHY_MIPI_DPHY=y -# CONFIG_PHY_CAN_TRANSCEIVER is not set - -# -# PHY drivers for Broadcom platforms -# -# CONFIG_BCM_KONA_USB2_PHY is not set -# end of PHY drivers for Broadcom platforms - -# CONFIG_PHY_CADENCE_TORRENT is not set -# CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_CADENCE_DPHY_RX is not set -# CONFIG_PHY_CADENCE_SIERRA is not set -# CONFIG_PHY_CADENCE_SALVO is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_LAN966X_SERDES is not set -# CONFIG_PHY_CPCAP_USB is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -# CONFIG_PHY_OCELOT_SERDES is not set -# CONFIG_PHY_ROCKCHIP_DP is not set -# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set -# CONFIG_PHY_ROCKCHIP_EMMC is not set -CONFIG_PHY_ROCKCHIP_INNO_HDMI=y -CONFIG_PHY_ROCKCHIP_INNO_USB2=y -CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y -CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y -CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y -CONFIG_PHY_ROCKCHIP_PCIE=y -# CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX is not set -# CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set -# CONFIG_PHY_ROCKCHIP_TYPEC is not set -# CONFIG_PHY_ROCKCHIP_USB is not set -# CONFIG_PHY_ROCKCHIP_USBDP is not set -# end of PHY Subsystem - -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set - -# -# Performance monitor support -# -# CONFIG_ARM_CCI_PMU is not set -# CONFIG_ARM_CCN is not set -# CONFIG_ARM_CMN is not set -# CONFIG_ARM_NI is not set -CONFIG_ARM_PMU=y -# CONFIG_ARM_SMMU_V3_PMU is not set -CONFIG_ARM_PMUV3=y -# CONFIG_ARM_DSU_PMU is not set -# CONFIG_ARM_SPE_PMU is not set -# CONFIG_HISI_PCIE_PMU is not set -# CONFIG_HNS3_PMU is not set -# CONFIG_DWC_PCIE_PMU is not set -# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set -# end of Performance monitor support - -# CONFIG_RAS is not set -# CONFIG_USB4 is not set - -# -# Android -# -CONFIG_ANDROID_BINDER_IPC=y -CONFIG_ANDROID_BINDERFS=y -CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" -# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set -# end of Android - -# CONFIG_LIBNVDIMM is not set -# CONFIG_DAX is not set -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y -CONFIG_NVMEM_LAYOUTS=y - -# -# Layout Types -# -# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set -# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set -# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set -# end of Layout Types - -# CONFIG_NVMEM_RMEM is not set -# CONFIG_NVMEM_ROCKCHIP_EFUSE is not set -# CONFIG_NVMEM_ROCKCHIP_OTP is not set - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# CONFIG_HISI_PTT is not set -# end of HW tracing support - -# CONFIG_FPGA is not set -# CONFIG_FSI is not set -# CONFIG_TEE is not set -CONFIG_PM_OPP=y -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_COUNTER is not set -# CONFIG_MOST is not set -# CONFIG_PECI is not set -# CONFIG_HTE is not set -# CONFIG_CDX_BUS is not set -# end of Device Drivers - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -# CONFIG_VALIDATE_FS_PARSER is not set -CONFIG_FS_IOMAP=y -CONFIG_FS_STACK=y -CONFIG_BUFFER_HEAD=y -CONFIG_LEGACY_DIRECT_IO=y -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set -CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT2=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -CONFIG_XFS_FS=y -# CONFIG_XFS_SUPPORT_V4 is not set -CONFIG_XFS_SUPPORT_ASCII_CI=y -# CONFIG_XFS_QUOTA is not set -CONFIG_XFS_POSIX_ACL=y -# CONFIG_XFS_RT is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_GFS2_FS is not set -# CONFIG_OCFS2_FS is not set -CONFIG_BTRFS_FS=m -CONFIG_BTRFS_FS_POSIX_ACL=y -# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set -# CONFIG_BTRFS_DEBUG is not set -# CONFIG_BTRFS_ASSERT is not set -# CONFIG_BTRFS_FS_REF_VERIFY is not set -# CONFIG_NILFS2_FS is not set -CONFIG_F2FS_FS=y -CONFIG_F2FS_STAT_FS=y -CONFIG_F2FS_FS_XATTR=y -CONFIG_F2FS_FS_POSIX_ACL=y -CONFIG_F2FS_FS_SECURITY=y -# CONFIG_F2FS_CHECK_FS is not set -# CONFIG_F2FS_FAULT_INJECTION is not set -# CONFIG_F2FS_FS_COMPRESSION is not set -CONFIG_F2FS_IOSTAT=y -# CONFIG_F2FS_UNFAIR_RWSEM is not set -# CONFIG_BCACHEFS_FS is not set -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y -# CONFIG_DNOTIFY is not set -CONFIG_INOTIFY_USER=y -# CONFIG_FANOTIFY is not set -CONFIG_QUOTA=y -# CONFIG_QUOTA_NETLINK_INTERFACE is not set -# CONFIG_QUOTA_DEBUG is not set -# CONFIG_QFMT_V1 is not set -# CONFIG_QFMT_V2 is not set -CONFIG_QUOTACTL=y -CONFIG_AUTOFS_FS=y -CONFIG_FUSE_FS=m -# CONFIG_CUSE is not set -# CONFIG_VIRTIO_FS is not set -CONFIG_FUSE_PASSTHROUGH=y -CONFIG_OVERLAY_FS=m -# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -# CONFIG_OVERLAY_FS_METACOPY is not set -# CONFIG_OVERLAY_FS_DEBUG is not set - -# -# Caches -# -CONFIG_NETFS_SUPPORT=m -CONFIG_NETFS_STATS=y -# CONFIG_NETFS_DEBUG is not set -CONFIG_FSCACHE=y -CONFIG_FSCACHE_STATS=y -CONFIG_CACHEFILES=m -# CONFIG_CACHEFILES_DEBUG is not set -# CONFIG_CACHEFILES_ERROR_INJECTION is not set -# CONFIG_CACHEFILES_ONDEMAND is not set -# end of Caches - -# -# CD-ROM/DVD Filesystems -# -CONFIG_ISO9660_FS=m -CONFIG_JOLIET=y -# CONFIG_ZISOFS is not set -CONFIG_UDF_FS=m -# end of CD-ROM/DVD Filesystems - -# -# DOS/FAT/EXFAT/NT Filesystems -# -CONFIG_FAT_FS=y -# CONFIG_MSDOS_FS is not set -CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -CONFIG_FAT_DEFAULT_UTF8=y -CONFIG_EXFAT_FS=m -CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" -CONFIG_NTFS3_FS=m -# CONFIG_NTFS3_64BIT_CLUSTER is not set -# CONFIG_NTFS3_LZX_XPRESS is not set -# CONFIG_NTFS3_FS_POSIX_ACL is not set -# CONFIG_NTFS_FS is not set -# end of DOS/FAT/EXFAT/NT Filesystems - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_KCORE=y -CONFIG_PROC_VMCORE=y -# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_CHILDREN=y -CONFIG_KERNFS=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y -CONFIG_TMPFS_INODE64=y -# CONFIG_TMPFS_QUOTA is not set -CONFIG_ARCH_SUPPORTS_HUGETLBFS=y -CONFIG_HUGETLBFS=y -CONFIG_HUGETLB_PAGE=y -CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -CONFIG_CONFIGFS_FS=y -CONFIG_EFIVAR_FS=y -# end of Pseudo filesystems - -# CONFIG_MISC_FILESYSTEMS is not set -CONFIG_NETWORK_FILESYSTEMS=y -CONFIG_NFS_FS=m -CONFIG_NFS_V2=m -CONFIG_NFS_V3=m -CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=m -CONFIG_NFS_V4_1=y -CONFIG_NFS_V4_2=y -CONFIG_PNFS_FILE_LAYOUT=m -CONFIG_PNFS_BLOCK=m -CONFIG_PNFS_FLEXFILE_LAYOUT=m -CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" -# CONFIG_NFS_V4_1_MIGRATION is not set -CONFIG_NFS_FSCACHE=y -# CONFIG_NFS_USE_LEGACY_DNS is not set -CONFIG_NFS_USE_KERNEL_DNS=y -CONFIG_NFS_DISABLE_UDP_SUPPORT=y -CONFIG_NFS_V4_2_READ_PLUS=y -# CONFIG_NFSD is not set -CONFIG_GRACE_PERIOD=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_NFS_ACL_SUPPORT=m -CONFIG_NFS_COMMON=y -CONFIG_NFS_V4_2_SSC_HELPER=y -CONFIG_SUNRPC=m -CONFIG_SUNRPC_GSS=m -CONFIG_SUNRPC_BACKCHANNEL=y -CONFIG_RPCSEC_GSS_KRB5=m -# CONFIG_SUNRPC_DEBUG is not set -# CONFIG_CEPH_FS is not set -CONFIG_CIFS=m -CONFIG_CIFS_STATS2=y -CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y -CONFIG_CIFS_UPCALL=y -CONFIG_CIFS_XATTR=y -# CONFIG_CIFS_POSIX is not set -CONFIG_CIFS_DEBUG=y -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set -# CONFIG_CIFS_DFS_UPCALL is not set -# CONFIG_CIFS_SWN_UPCALL is not set -CONFIG_CIFS_FSCACHE=y -# CONFIG_CIFS_COMPRESSION is not set -# CONFIG_SMB_SERVER is not set -CONFIG_SMBFS=m -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_ASCII is not set -CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -CONFIG_NLS_UTF8=y -CONFIG_NLS_UCS2_UTILS=m -# CONFIG_DLM is not set -CONFIG_UNICODE=y -# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set -CONFIG_IO_WQ=y -# end of File systems - -# -# Security options -# -CONFIG_KEYS=y -# CONFIG_KEYS_REQUEST_CACHE is not set -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_KEY_DH_OPERATIONS is not set -# CONFIG_SECURITY_DMESG_RESTRICT is not set -CONFIG_PROC_MEM_ALWAYS_FORCE=y -# CONFIG_PROC_MEM_FORCE_PTRACE is not set -# CONFIG_PROC_MEM_NO_FORCE is not set -# CONFIG_SECURITY is not set -# CONFIG_SECURITYFS is not set -# CONFIG_HARDENED_USERCOPY is not set -# CONFIG_FORTIFY_SOURCE is not set -# CONFIG_STATIC_USERMODEHELPER is not set -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="" - -# -# Kernel hardening options -# - -# -# Memory initialization -# -CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y -CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y -CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y -# CONFIG_INIT_STACK_NONE is not set -# CONFIG_INIT_STACK_ALL_PATTERN is not set -CONFIG_INIT_STACK_ALL_ZERO=y -# CONFIG_GCC_PLUGIN_STACKLEAK is not set -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y -# CONFIG_ZERO_CALL_USED_REGS is not set -# end of Memory initialization - -# -# Hardening of kernel data structures -# -# CONFIG_LIST_HARDENED is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# end of Hardening of kernel data structures - -CONFIG_RANDSTRUCT_NONE=y -# CONFIG_RANDSTRUCT_FULL is not set -# CONFIG_RANDSTRUCT_PERFORMANCE is not set -# end of Kernel hardening options -# end of Security options - -CONFIG_XOR_BLOCKS=m -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_SIG2=y -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -# CONFIG_CRYPTO_USER is not set -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_AUTHENC=m -# CONFIG_CRYPTO_TEST is not set -# end of Crypto core or helper - -# -# Public-key cryptography -# -# CONFIG_CRYPTO_RSA is not set -# CONFIG_CRYPTO_DH is not set -CONFIG_CRYPTO_ECC=y -CONFIG_CRYPTO_ECDH=y -# CONFIG_CRYPTO_ECDSA is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_CURVE25519 is not set -# end of Public-key cryptography - -# -# Block ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_ARIA is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SM4_GENERIC is not set -# CONFIG_CRYPTO_TWOFISH is not set -# end of Block ciphers - -# -# Length-preserving ciphers and modes -# -# CONFIG_CRYPTO_ADIANTUM is not set -# CONFIG_CRYPTO_CHACHA20 is not set -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_CTR=y -# CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=y -# CONFIG_CRYPTO_HCTR2 is not set -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_PCBC is not set -CONFIG_CRYPTO_XTS=y -# end of Length-preserving ciphers and modes - -# -# AEAD (authenticated encryption with associated data) ciphers -# -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_GENIV=y -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_ECHAINIV=m -CONFIG_CRYPTO_ESSIV=m -# end of AEAD (authenticated encryption with associated data) ciphers - -# -# Hashes, digests, and MACs -# -CONFIG_CRYPTO_BLAKE2B=m -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_GHASH=y -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_MD4 is not set -CONFIG_CRYPTO_MD5=y -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_RMD160 is not set -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -CONFIG_CRYPTO_SHA3=y -# CONFIG_CRYPTO_SM3_GENERIC is not set -# CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_VMAC is not set -# CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO_XXHASH=m -# end of Hashes, digests, and MACs - -# -# CRCs (cyclic redundancy checks) -# -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32=y -# CONFIG_CRYPTO_CRCT10DIF is not set -# end of CRCs (cyclic redundancy checks) - -# -# Compression -# -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_LZO is not set -# CONFIG_CRYPTO_842 is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_ZSTD is not set -# end of Compression - -# -# Random number generation -# -# CONFIG_CRYPTO_ANSI_CPRNG is not set -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_DRBG_HMAC=y -CONFIG_CRYPTO_DRBG_HASH=y -CONFIG_CRYPTO_DRBG_CTR=y -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 -CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 -CONFIG_CRYPTO_JITTERENTROPY_OSR=1 -# end of Random number generation - -# -# Userspace interface -# -CONFIG_CRYPTO_USER_API=y -CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_USER_API_SKCIPHER=y -# CONFIG_CRYPTO_USER_API_RNG is not set -# CONFIG_CRYPTO_USER_API_AEAD is not set -# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set -# end of Userspace interface - -# CONFIG_CRYPTO_NHPOLY1305_NEON is not set -CONFIG_CRYPTO_CHACHA20_NEON=m - -# -# Accelerated Cryptographic Algorithms for CPU (arm64) -# -# CONFIG_CRYPTO_GHASH_ARM64_CE is not set -CONFIG_CRYPTO_POLY1305_NEON=m -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA256_ARM64=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -CONFIG_CRYPTO_SHA512_ARM64=y -CONFIG_CRYPTO_SHA512_ARM64_CE=y -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SM3_NEON is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set -# CONFIG_CRYPTO_AES_ARM64 is not set -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set -# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set -# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set -# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set -# end of Accelerated Cryptographic Algorithms for CPU (arm64) - -# CONFIG_CRYPTO_HW is not set -# CONFIG_ASYMMETRIC_KEY_TYPE is not set - -# -# Certificates for signature checking -# -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# end of Certificates for signature checking - -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -CONFIG_RAID6_PQ=m -CONFIG_RAID6_PQ_BENCHMARK=y -CONFIG_LINEAR_RANGES=y -# CONFIG_PACKING is not set -CONFIG_BITREVERSE=y -CONFIG_HAVE_ARCH_BITREVERSE=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -# CONFIG_CORDIC is not set -# CONFIG_PRIME_NUMBERS is not set -CONFIG_RATIONAL=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -CONFIG_ARCH_USE_SYM_ANNOTATIONS=y -# CONFIG_INDIRECT_PIO is not set -# CONFIG_TRACE_MMIO_ACCESS is not set - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_UTILS=y -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=m -CONFIG_CRYPTO_LIB_GF128MUL=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA1=y -CONFIG_CRYPTO_LIB_SHA256=y -# end of Crypto library routines - -# CONFIG_CRC_CCITT is not set -CONFIG_CRC16=y -# CONFIG_CRC_T10DIF is not set -# CONFIG_CRC64_ROCKSOFT is not set -CONFIG_CRC_ITU_T=m -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC7 is not set -CONFIG_LIBCRC32C=y -# CONFIG_CRC8 is not set -CONFIG_XXHASH=y -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m -CONFIG_LZO_COMPRESS=m -CONFIG_LZO_DECOMPRESS=m -CONFIG_ZSTD_COMMON=y -CONFIG_ZSTD_COMPRESS=m -CONFIG_ZSTD_DECOMPRESS=y -CONFIG_XZ_DEC=y -CONFIG_XZ_DEC_X86=y -CONFIG_XZ_DEC_POWERPC=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_ARM64=y -CONFIG_XZ_DEC_SPARC=y -CONFIG_XZ_DEC_RISCV=y -# CONFIG_XZ_DEC_MICROLZMA is not set -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_ZSTD=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_XARRAY_MULTI=y -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_DMA_OPS_HELPERS=y -CONFIG_NEED_SG_DMA_FLAGS=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_DMA_DECLARE_COHERENT=y -CONFIG_ARCH_HAS_SETUP_DMA_OPS=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y -CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y -CONFIG_SWIOTLB=y -# CONFIG_SWIOTLB_DYNAMIC is not set -CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y -CONFIG_DMA_NEED_SYNC=y -# CONFIG_DMA_RESTRICTED_POOL is not set -CONFIG_DMA_NONCOHERENT_MMAP=y -CONFIG_DMA_COHERENT_POOL=y -CONFIG_DMA_DIRECT_REMAP=y -CONFIG_DMA_CMA=y - -# -# Default contiguous memory area size: -# -CONFIG_CMA_SIZE_MBYTES=16 -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_ALIGNMENT=8 -# CONFIG_DMA_API_DEBUG is not set -# CONFIG_DMA_MAP_BENCHMARK is not set -CONFIG_SGL_ALLOC=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -# CONFIG_IRQ_POLL is not set -CONFIG_LIBFDT=y -CONFIG_OID_REGISTRY=m -CONFIG_UCS2_STRING=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_VDSO_TIME_NS=y -CONFIG_VDSO_GETRANDOM=y -CONFIG_FONT_SUPPORT=y -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -CONFIG_SG_POOL=y -CONFIG_ARCH_STACKWALK=y -CONFIG_SBITMAP=y -# CONFIG_LWQ_TEST is not set -# end of Library routines - -CONFIG_GENERIC_IOREMAP=y -CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y - -# -# Kernel hacking -# - -# -# printk and dmesg options -# -CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_CALLER is not set -# CONFIG_STACKTRACE_BUILD_ID is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set -CONFIG_DYNAMIC_DEBUG=y -CONFIG_DYNAMIC_DEBUG_CORE=y -CONFIG_SYMBOLIC_ERRNAME=y -CONFIG_DEBUG_BUGVERBOSE=y -# end of printk and dmesg options - -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -CONFIG_AS_HAS_NON_CONST_ULEB128=y -# CONFIG_DEBUG_INFO_NONE is not set -# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -CONFIG_DEBUG_INFO_DWARF5=y -CONFIG_DEBUG_INFO_REDUCED=y -CONFIG_DEBUG_INFO_COMPRESSED_NONE=y -# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set -# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set -CONFIG_DEBUG_INFO_SPLIT=y -# CONFIG_GDB_SCRIPTS is not set -CONFIG_FRAME_WARN=2048 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set -CONFIG_ARCH_WANT_FRAME_POINTERS=y -CONFIG_FRAME_POINTER=y -# CONFIG_VMLINUX_MAP is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# end of Compile-time checks and compiler options - -# -# Generic Kernel Debugging Instruments -# -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -# CONFIG_MAGIC_SYSRQ_SERIAL is not set -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN=y -# CONFIG_UBSAN is not set -CONFIG_HAVE_ARCH_KCSAN=y -CONFIG_HAVE_KCSAN_COMPILER=y -# CONFIG_KCSAN is not set -# end of Generic Kernel Debugging Instruments - -# -# Networking Debugging -# -# CONFIG_NET_DEV_REFCNT_TRACKER is not set -# CONFIG_NET_NS_REFCNT_TRACKER is not set -# CONFIG_DEBUG_NET is not set -# end of Networking Debugging - -# -# Memory Debugging -# -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_PAGE_OWNER is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -CONFIG_ARCH_HAS_DEBUG_WX=y -# CONFIG_DEBUG_WX is not set -CONFIG_GENERIC_PTDUMP=y -# CONFIG_PTDUMP_DEBUGFS is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_PER_VMA_LOCK_STATS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SHRINKER_DEBUG is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_SCHED_STACK_END_CHECK is not set -CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -# CONFIG_MEM_ALLOC_PROFILING is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y -CONFIG_HAVE_ARCH_KASAN_VMALLOC=y -CONFIG_CC_HAS_KASAN_GENERIC=y -CONFIG_CC_HAS_KASAN_SW_TAGS=y -CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y -# CONFIG_KASAN is not set -CONFIG_HAVE_ARCH_KFENCE=y -# CONFIG_KFENCE is not set -# end of Memory Debugging - -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Oops, Lockups and Hangs -# -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=1 -CONFIG_LOCKUP_DETECTOR=y -CONFIG_SOFTLOCKUP_DETECTOR=y -CONFIG_SOFTLOCKUP_DETECTOR_INTR_STORM=y -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y -# CONFIG_HARDLOCKUP_DETECTOR is not set -# CONFIG_DETECT_HUNG_TASK is not set -CONFIG_WQ_WATCHDOG=y -# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set -# CONFIG_TEST_LOCKUP is not set -# end of Debug Oops, Lockups and Hangs - -# -# Scheduler Debugging -# -CONFIG_SCHED_DEBUG=y -CONFIG_SCHED_INFO=y -CONFIG_SCHEDSTATS=y -# end of Scheduler Debugging - -# CONFIG_DEBUG_TIMEKEEPING is not set - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# end of Lock Debugging (spinlocks, mutexes, etc...) - -# CONFIG_DEBUG_IRQFLAGS is not set -CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set - -# -# Debug kernel data structures -# -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_PLIST is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_DEBUG_MAPLE_TREE is not set -# end of Debug kernel data structures - -# -# RCU Debugging -# -# CONFIG_RCU_SCALE_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=21 -CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 -# CONFIG_RCU_CPU_STALL_CPUTIME is not set -CONFIG_RCU_TRACE=y -# CONFIG_RCU_EQS_DEBUG is not set -# end of RCU Debugging - -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -CONFIG_CPU_HOTPLUG_STATE_CONTROL=y -# CONFIG_LATENCYTOP is not set -CONFIG_USER_STACKTRACE_SUPPORT=y -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -# CONFIG_BOOTTIME_TRACING is not set -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -CONFIG_FUNCTION_GRAPH_RETVAL=y -CONFIG_DYNAMIC_FTRACE=y -CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y -CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS=y -CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y -# CONFIG_FUNCTION_PROFILER is not set -# CONFIG_STACK_TRACER is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_OSNOISE_TRACER is not set -# CONFIG_TIMERLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_BLK_DEV_IO_TRACE is not set -# CONFIG_UPROBE_EVENTS is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y -# CONFIG_SYNTH_EVENTS is not set -# CONFIG_USER_EVENTS is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACE_EVENT_INJECT is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_FTRACE_RECORD_RECURSION is not set -# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_RV is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y -CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y -# CONFIG_STRICT_DEVMEM is not set - -# -# arm64 Debugging -# -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_DEBUG_EFI is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set -# end of arm64 Debugging - -# -# Kernel Testing and Coverage -# -# CONFIG_KUNIT is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_FAULT_INJECTION is not set -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -# CONFIG_RUNTIME_TESTING_MENU is not set -CONFIG_ARCH_USE_MEMTEST=y -# CONFIG_MEMTEST is not set -# end of Kernel Testing and Coverage - -# -# Rust hacking -# -# end of Rust hacking -# end of Kernel hacking diff --git a/pmos/pinenote-dbus-service/APKBUILD b/pmos/pinenote-dbus-service/APKBUILD deleted file mode 100644 index 0136557..0000000 --- a/pmos/pinenote-dbus-service/APKBUILD +++ /dev/null @@ -1,34 +0,0 @@ -# Maintainer: Petr Hodina -pkgname=pinenote-dbus-service -pkgver=0.2.2_pre5 -_gittag=0.2.2-dev5 -pkgrel=1 -pkgdesc="Dbus daemon for controlling driver aspects on Pine64 Pinenote" -url="https://github.com/m-weigand/pinenote_dbus_service" -arch="aarch64" -license="MIT" -makedepends="cargo" -depends="dbus-dev" -source=" - pinenote-dbus-service-$_gittag.tar.gz::https://github.com/m-weigand/pinenote_dbus_service/archive/refs/tags/v$_gittag.tar.gz - pinenote.initd -" - -builddir="$srcdir/pinenote_dbus_service-$_gittag" - -build() { - cargo build --release --locked -} - -package() { - cargo install --path . --root="$pkgdir/usr" - install -Dm644 dbus_security_configuration/pinenote.conf -t "$pkgdir"/usr/share/dbus-1/system.d/ - install -Dm755 "$srcdir"/pinenote.initd $pkgdir/etc/init.d/pinenote - rm "$pkgdir"/usr/.crates.toml - rm "$pkgdir"/usr/.crates2.json -} - -sha512sums=" -10cf05f9e1e8affec97b532611a9bffb86928cabe4eb9bd321b66e8dba340e6a7916fa0c8286f81300bfa655d5596bba09f0316abcafa6c55128823c78acb807 pinenote-dbus-service-0.2.2-dev5.tar.gz -362c20218610e7a5349eef40d54463a05906e258157e590ad1635591a548ddc60050142cfab41a0423797182e5ae392a7fe6476fc71b9c01cece384351e6f148 pinenote.initd -" diff --git a/pmos/pinenote-dbus-service/pinenote.initd b/pmos/pinenote-dbus-service/pinenote.initd deleted file mode 100644 index 0301c53..0000000 --- a/pmos/pinenote-dbus-service/pinenote.initd +++ /dev/null @@ -1,10 +0,0 @@ -#!/sbin/openrc-run - -description="Launch DBus service for driver aspects" -command="/usr/bin/pinenote_dbus_service" -command_background=yes -pidfile="/run/${RC_SVCNAME}.pid" - -depend() { - need dbus -}