From df3021c9e56411a12d9bf8087c2389513beb1c9a Mon Sep 17 00:00:00 2001 From: mickbot-92 <158478736+mickbot-92@users.noreply.github.com> Date: Sat, 9 May 2026 09:53:09 +0200 Subject: [PATCH 1/2] Fix CI & other improvements --- .github/workflows/ci-workflow.yml | 125 +++++++++--------- .github/workflows/metric-workflow.yml | 4 +- README.fr.md | 18 +-- README.md | 20 +-- build/toolchain.android.mak | 8 +- ion/src/shared/storage.cpp | 4 + ion/src/simulator/3ds/assets/banner.png | Bin 9865 -> 6570 bytes ion/src/simulator/3ds/assets/icon.icn | Bin 14016 -> 14016 bytes ion/src/simulator/3ds/assets/logo.png | Bin 10070 -> 4170 bytes ion/src/simulator/3ds/assets/logo24.png | Bin 10010 -> 2048 bytes ion/src/simulator/android/build.gradle | 16 ++- ion/src/simulator/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../sdl/src/render/opengles2/SDL_gles2funcs.h | 6 +- .../src/sensor/android/SDL_androidsensor.c | 2 +- ion/src/simulator/fxcg/Makefile | 2 +- python/port/port.cpp | 15 ++- 17 files changed, 113 insertions(+), 110 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index dd9cc1b71c3..63043796d01 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -17,16 +17,11 @@ on: description: 'Run 3DS tests' required: true default: 'yes' - triggerFxcg: - description: 'Run fxcg tests' - required: true - default: 'no' jobs: - fxcg: # fxcg build is broken for now, disabling it for now to avoid noise - if: github.event.inputs.triggerFxcg == 'yes' + fxcg: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - name: Install dependencies @@ -41,7 +36,7 @@ jobs: id: get-latest-commit-hash - name: Cache gint/fxsdk installation id: cache-gint - uses: actions/cache@v4 + uses: actions/cache@main with: path: | ~/.local/*/* @@ -49,13 +44,10 @@ jobs: key: ${{ runner.os }}-gint-${{ steps.get-latest-commit-hash.outputs.LATEST_COMMIT_HASH }} - name: Install gint/fxsdk if: steps.cache-gint.outputs.cache-hit != 'true' - env: - URL: "https://git.planet-casio.com/Lephenixnoir/GiteaPC/archive/master.tar.gz" run: | export PATH="~/.local/bin:$PATH" cd "$(mktemp -d)" - curl "$URL" -o giteapc-master.tar.gz - tar -xzf giteapc-master.tar.gz + git clone https://git.planet-casio.com/Lephenixnoir/GiteaPC.git giteapc cd giteapc python3 giteapc.py install Lephenixnoir/GiteaPC -y sudo apt-get install python3-pil libusb-1.0-0-dev libudev-dev libsdl2-dev libpng-dev libudisks2-dev libglib2.0-dev libmpfr-dev libmpc-dev libppl-dev -y @@ -64,9 +56,10 @@ jobs: giteapc install Lephenixnoir/gint -y - name: Add fxsdk to PATH run: echo "~/.local/bin" >> $GITHUB_PATH + - run: sed -i "/GINT_RENDER_RGB/d" ~/.local/share/fxsdk/sysroot/sh3eb-elf/include/gint/display-cg.h # WORKAROUND - run: make -j2 PLATFORM=simulator TARGET=fxcg - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -84,38 +77,39 @@ jobs: git pull git commit -m "Update from CI" git push - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon.g3a path: output/release/simulator/fxcg/epsilon.g3a nintendo_3ds: if: github.event.inputs.trigger3DS == 'yes' || github.event.inputs.trigger3DS == '' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm container: devkitpro/devkitarm:latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: true - run: sudo apt-get update - run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config -y - run: yes | sudo dkp-pacman -S --needed devkitARM 3dstools libctru - - run: wget https://github.com/3DSGuy/Project_CTR/releases/download/makerom-v0.18.3/makerom-v0.18.3-ubuntu_x86_64.zip - - run: unzip makerom-v0.18.3-ubuntu_x86_64.zip - - run: rm makerom-v0.18.3-ubuntu_x86_64.zip - - run: chmod +x ./makerom + - name: Compile makerom from source + run: | + git clone https://github.com/3DSGuy/Project_CTR.git + make -C Project_CTR + mv Project_CTR/makerom/bin/makerom . - run: echo "PATH=.:$PATH" >> $GITHUB_ENV - run: make -j2 PLATFORM=simulator TARGET=3ds - run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-3ds.3dsx path: output/release/simulator/3ds/epsilon.3dsx - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-3ds.cia path: output/release/simulator/3ds/epsilon.cia - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -136,22 +130,22 @@ jobs: android: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: | sudo apt-get update sudo apt-get install imagemagick libfreetype-dev libpng-dev - name: Set up JDK 25 - uses: actions/setup-java@v5 + uses: actions/setup-java@main with: java-version: '25' distribution: 'temurin' - - run: wget -nv https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip - - run: unzip -q android-ndk-r21e-linux-x86_64.zip - - run: make -j2 PLATFORM=simulator TARGET=android NDK_PATH=./android-ndk-r21e + - run: wget -nv https://dl.google.com/android/repository/android-ndk-r27d-linux.zip + - run: unzip -q android-ndk-r27d-linux.zip + - run: make -j2 PLATFORM=simulator TARGET=android NDK_PATH=./android-ndk-r27d - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -169,7 +163,7 @@ jobs: git pull git commit -m "Update from CI" git push - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-android.apk path: output/release/simulator/android/epsilon.apk @@ -179,7 +173,7 @@ jobs: - run: | sudo apt-get update sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: mkdir final-output @@ -222,12 +216,12 @@ jobs: - run: mv output/release/device/n0100/flasher.verbose.bin final-output/flasher.verbose.bin - run: find final-output/ -type f -exec bash -c "shasum -a 256 -b {} > {}.sha256" \; - run: tar cvfz binpack-n0100.tgz final-output/* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-binpack-n0100.tgz path: binpack-n0100.tgz - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -251,7 +245,7 @@ jobs: - run: | sudo apt-get update sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: make -j2 MODEL=n0110 epsilon.dfu @@ -268,12 +262,12 @@ jobs: - run: cp output/release/device/n0110/flasher.verbose.bin output/release/device/n0110/binpack/ - run: cd output/release/device/n0110 && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done - run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack/binpack.tgz - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-binpack-n0110.tgz path: output/release/device/n0110/binpack-n0110.tgz - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -297,7 +291,7 @@ jobs: - run: | sudo apt-get update sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: make -j2 MODEL=n0110 bootloader @@ -314,12 +308,12 @@ jobs: - run: cp output/release/device/n0110/bootloader.bin output/release/device/bootloader/ - run: cd output/release/device/bootloader && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done - run: cd output/release/device/bootloader && tar cvfz binpack-bootloader.tgz binpack/* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-binpack-bootloader.tgz path: output/release/device/bootloader/binpack-bootloader.tgz - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -344,7 +338,7 @@ jobs: shell: msys2 {0} steps: - uses: msys2/setup-msys2@v2 - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: pacman -S --noconfirm mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config make mingw-w64-x86_64-python3 mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-libpng git @@ -352,7 +346,7 @@ jobs: - run: make -j2 PLATFORM=simulator test.exe - run: cmd /c output\release\simulator\windows\test.exe --headless - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -370,20 +364,21 @@ jobs: git pull git commit -m "Update from CI" git push - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-windows.exe path: output/release/simulator/windows/epsilon.exe web: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm steps: - - uses: numworks/setup-emscripten@master + - name: Setup emsdk + uses: emscripten-core/setup-emsdk@main with: - sdk: latest - - uses: actions/checkout@v4 + version: 4.0.22 # TODO: Fix for latest releases of Emscripten + - uses: actions/checkout@main with: submodules: 'recursive' - # Install the Linux toolchin to avoid dependancies issues, but maybe only libpng is needed + # Install the Linux toolchain to avoid dependancies issues, but maybe only libpng is needed - run: | sudo apt-get update sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev @@ -391,7 +386,7 @@ jobs: - run: make -j2 PLATFORM=simulator TARGET=web test.js - run: node output/release/simulator/web/test.js --headless - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -409,7 +404,7 @@ jobs: git pull git commit -m "Update from CI" git push - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-web.zip path: output/release/simulator/web/epsilon.zip @@ -419,14 +414,14 @@ jobs: - run: | sudo apt-get update sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev - - uses: actions/checkout@v5 + - uses: actions/checkout@main with: submodules: 'recursive' - run: make -j2 PLATFORM=simulator - run: make -j2 PLATFORM=simulator test.bin - run: output/release/simulator/linux/test.bin --headless - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -444,7 +439,7 @@ jobs: git pull git commit -m "Update from CI" git push - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-linux.bin path: output/release/simulator/linux/epsilon.bin @@ -452,20 +447,22 @@ jobs: if: github.event.inputs.triggerMacos == 'yes' || github.event.inputs.triggerMacos == '' runs-on: macOS-latest steps: - - run: brew install python-setuptools - - run: brew install numworks/tap/epsilon-sdk - - uses: actions/checkout@v5 + - run: | + brew install imagemagick + python3 -m venv .venv + .venv/bin/pip3 install setuptools lz4 pypng stringcase + - uses: actions/checkout@main with: submodules: 'recursive' - run: make -j2 PLATFORM=simulator - run: make -j2 PLATFORM=simulator ARCH=x86_64 test.bin - run: output/release/simulator/macos/x86_64/test.bin --headless - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-macos.zip path: output/release/simulator/macos/epsilon.app - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' @@ -485,21 +482,23 @@ jobs: git push ios: if: github.event.inputs.triggerIos == 'yes' || github.event.inputs.triggerIos == '' - runs-on: macos-14 + runs-on: macos-14 # TODO: Fix for macos-latest runners steps: - - run: brew install python-setuptools - - run: brew install numworks/tap/epsilon-sdk - - uses: actions/checkout@v5 + - run: | + brew install imagemagick + python3 -m venv .venv + .venv/bin/pip3 install setuptools lz4 pypng stringcase + - uses: actions/checkout@main with: submodules: 'recursive' - run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 - run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@main with: name: epsilon-ios.ipa path: output/release/simulator/ios/epsilon.ipa - if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }} - uses: actions/checkout@v5 + uses: actions/checkout@main with: repository: Yaya-Cout/Upsilon-binfiles ref: 'main' diff --git a/.github/workflows/metric-workflow.yml b/.github/workflows/metric-workflow.yml index afa04ab61cb..2c4e3602ec1 100644 --- a/.github/workflows/metric-workflow.yml +++ b/.github/workflows/metric-workflow.yml @@ -10,7 +10,7 @@ jobs: - name: Install ARM toolchain run: sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi - name: Checkout PR base - uses: actions/checkout@v5 + uses: actions/checkout@main with: submodules: recursive ref: ${{ github.event.pull_request.base.sha }} @@ -18,7 +18,7 @@ jobs: - name: Build base run: make -j2 -C base MODEL=n0110 epsilon.elf - name: Checkout PR head - uses: actions/checkout@v5 + uses: actions/checkout@main with: submodules: recursive ref: ${{ github.event.pull_request.head.sha }} diff --git a/README.fr.md b/README.fr.md index 4d89dda95ee..a8d87a39c2c 100644 --- a/README.fr.md +++ b/README.fr.md @@ -1,8 +1,8 @@ -

+

cc by-nc-sa 4.0 - Issues + Issues
Discord

@@ -106,7 +106,9 @@ nix-env -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext pytho Il est recommandé d'utiliser [Homebrew](https://brew.sh/). Une fois installé, utilisez : ```bash -brew install numworks/tap/epsilon-sdk +brew install freetype imagemagick libpng libusb pkg-config python3 +python3 -m venv .venv +.venv/bin/pip3 install setuptools lz4 pypng stringcase ``` Et toutes les dépendances seront installées. @@ -398,8 +400,8 @@ D'abord, installez emsdk : ```bash git clone https://github.com/emscripten-core/emsdk.git cd emsdk -./emsdk install 1.40.1 -./emsdk activate 1.40.1 +./emsdk install 4.0.22 +./emsdk activate 4.0.22 source emsdk_env.sh ``` @@ -419,18 +421,18 @@ Le simulateur se trouve dans `output/release/simulator/web/simulator.zip` Simulateur Android Assurez-vous d'avoir JDK 25 d'installé. -Ensuite, téléchargez la toolchain Android version r21e comme suit : +Ensuite, téléchargez la toolchain Android version r27d comme suit : ``` export ANDROID_HOME=$PWD/android-sdk wget -nv https://gitlab.com/fdroid/sdkmanager/-/raw/master/sdkmanager.py python3 sdkmanager.py --licenses -python3 sdkmanager.py --install "ndk-bundle;r21e" +python3 sdkmanager.py --install "ndk-bundle;r27d" ``` Il ne vous reste plus qu'à lancer cette commande pour compiler Upsilon. ``` make -j$(nproc) PLATFORM=simulator TARGET=android ``` -Le fichier compilé nommé `epsilon.apk` sera celui à installer sur le téléphone depuis votre gestionnaire de fichier. Fonctionne normalement à partir de Android 4. +Le fichier compilé nommé `epsilon.apk` sera celui à installer sur le téléphone depuis votre gestionnaire de fichier. Fonctionne normalement à partir de Android 5. diff --git a/README.md b/README.md index d1a97deeebe..1cf434bc404 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

cc by-nc-sa 4.0 @@ -110,10 +110,12 @@ nix-shell -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext pyt It's recommended to use [Homebrew](https://brew.sh/). Once it's installed, just run: ```bash -brew install numworks/tap/epsilon-sdk +brew install freetype imagemagick libpng libusb pkg-config python3 +python3 -m venv .venv +.venv/bin/pip3 install setuptools lz4 pypng stringcase ``` -and it will install all dependencies. +and all dependencies will be installed.
@@ -405,8 +407,8 @@ First, install emsdk : ```bash git clone https://github.com/emscripten-core/emsdk.git cd emsdk -./emsdk install 1.40.1 -./emsdk activate 1.40.1 +./emsdk install 4.0.22 +./emsdk activate 4.0.22 source emsdk_env.sh ``` @@ -447,18 +449,18 @@ You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink

Android Simulator Make sure you have JDK 25 installed. -Then, download the Android toolchain r21e as following : +Then, download the Android toolchain r27d as following : ``` export ANDROID_HOME=$PWD/android-sdk wget -nv https://gitlab.com/fdroid/sdkmanager/-/raw/master/sdkmanager.py python3 sdkmanager.py --licenses -python3 sdkmanager.py --install "ndk-bundle;r21e" +python3 sdkmanager.py --install "ndk-bundle;r27d" ``` All you have to do is run this command to compile Upsilon. ``` make -j$(nproc) PLATFORM=simulator TARGET=android ``` -The compiled file named `epsilon.apk` will be the one to install on the phone from your file manager. Shoudl work on Android 4.1+. +The compiled file named `epsilon.apk` will be the one to install on the phone from your file manager. Should work on Android 5+. @@ -470,7 +472,7 @@ First, install gint and fxsdk along with a cross compiler for the calculator. Th Next: ```bash git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git -cd Omega +cd Upsilon git checkout upsilon-dev make PLATFORM=simulator TARGET=fxcg -j$(nproc) ``` diff --git a/build/toolchain.android.mak b/build/toolchain.android.mak index c22cfd1b32b..767687c6e19 100644 --- a/build/toolchain.android.mak +++ b/build/toolchain.android.mak @@ -9,22 +9,16 @@ endif NDK_TOOLCHAIN_PATH = $(NDK_PATH)/toolchains/llvm/prebuilt/$(NDK_HOST_TAG)/bin -# No 64 bit device has ever shipped with an API level < 21. Consequently, there -# is no toolchain for those archs on those API levels. Let's enforce NDK_VERSION -# at 21 for these archs, and 16 for the others. +NDK_VERSION = 21 ifeq ($(ARCH),armeabi-v7a) NDK_TARGET = armv7a-linux-androideabi - NDK_VERSION = 16 else ifeq ($(ARCH),arm64-v8a) NDK_TARGET = aarch64-linux-android - NDK_VERSION = 21 else ifeq ($(ARCH),x86) NDK_TARGET = i686-linux-android - NDK_VERSION = 16 else ifeq ($(ARCH),x86_64) NDK_TARGET = x86_64-linux-android - NDK_VERSION = 21 endif ifdef NDK_TARGET diff --git a/ion/src/shared/storage.cpp b/ion/src/shared/storage.cpp index 0a77cfa39aa..7369d02ca7e 100644 --- a/ion/src/shared/storage.cpp +++ b/ion/src/shared/storage.cpp @@ -6,7 +6,11 @@ namespace Ion { +#ifdef __APPLE__ +uint32_t __attribute__((section("__DATA,.static_storage"))) staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0}; +#else uint32_t __attribute__((section(".static_storage"))) staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0}; +#endif Storage * Storage::sharedStorage() { static Storage * storage = new (staticStorageArea) Storage(); diff --git a/ion/src/simulator/3ds/assets/banner.png b/ion/src/simulator/3ds/assets/banner.png index 4ba5507e98f086afd481cee66ccee033371325e3..48637e35e793c0a01abc8c4edc620d32c3c23a38 100644 GIT binary patch literal 6570 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 literal 9865 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 OFCeZdWvkKqL*QSz+;PzW literal 14016 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 KjW^oP(fH#3h3qMjsl|aXa@iQKfIiAHI=uJ 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

8DC~ZT*sx#d(yFl^m!Q~r?jrulq z`Z+6BD$3mycBBhz*~;YdVx|(YseG5H%Gt;oZiNn$JHinhpF&*6x|JTyTOJ?*w^C(mFhf4vf8UV^XDjgov@H_H%>6l-Sw&V3SwK zOU$~54*I?HBydv9}V|B{9IqjGZ@y z^_*QJ(aUSC=~r@F%E28lQ+#LjN4?Vx`gR&4sUb7+qKheDV4J8+HGZ8!>E`Q2BGGIQ zxkBu2SOwmAkO>hcVXM`0lpXKSCPz-DT#6XburkP0Cy|N*KBNn@@DpdQ73$Pn6d^h! zQz90*O>zVZU5!wBS6^pR`ow2in`rs^-XP+`x2JwelDC#Q@FH??X-AifZ5(e++ zXBknFiPc-mEoHKOBpFnwrRRq)<$Mv(N`GOv9>DxQU&Qxz%6`Y3%#VuP1CN=z10~$G%CcepAZ z2EO6%78*>^qh=s87;ZA9>1Of8S}Hf0NziwVRxYfb6Za;?@X4r&9RJ#NgESIS#lnWT z_w*`(S6lq7R=$D28I%*WP_*HAGG@Jwb*v!NaYSSi4l`zc5y653)(h`Shsy+2DkNsV zDzzXV>0l3A{Y>}L0=~nUV$k;Ky3K~G`FKN=W{F>PW~9nHf5wOMcZTpe5yZk15;dzA zSN!2!MuE@VwkWTy$SYTW6(Sh})ndb)O`W5mysf#4Z_dMShm!ky3*kT2i_uVqQKs6Z z5}k2w7P?-GXQ4+wW6r8m0ND_49WEri_LGRuT(wk94QI;B>z0%3jks;ZuysA@uI%pe z*?_UZ*MZ^bPnmKR?u)ntZ)-%DVTLF0SzCR-LknJNcN6`iEQt7i_BISt)I47;uMZ za&|Uvo`?SkEciTTeY~1$bwz$C(_LPlb@?alFVylxUE|Issbf(wbVwBy z($?NdD7#L& zAUnmdE&CjTg>spAyJ#waOIH7olv07j!oSzHl&JSXp2fW@Ta@!dm~w6V(n2PcsF;#ffxWFr-*llBV15kKzo!U8Y9oM zTKk#@h(^luSV-tW^xRcZPG~KE9LmIB-xT5Rf{;e?C@N6N;bjN}ZYVD}5bx%S@sz>K z^PKR?5WXLGgL!}_5HA;b9!ot#peh!J0*Z@>i$Fl?c(f0cM}Z0`heJBZ7^`Xgq9C;7 zd7Qkw+-1OEUteDlUojCZ&JipsEiDa(K*3Nbh=2fj`eD4_co4>u_n6`*hZ@QgfkV4{ zp|Kd?F(=#}>+L1a!$TMc{vs!gBGmDO&R-6W+b8s%UP!Pup&?F~4*>v%LLgEg2owaB z2LEnP7}eAJ(;DOXOGSd7U_9I%EGhy4ySe?%!qZFL=P!T%(!$e}aP9~;MtNeraR`*U z4+`VO`@2(jS8vbXeR_MMj=N6cc11dX2|=BB{@q4XThH)Mn`0Rr(QfW17RTt{kx0a! zICpQH>j?&l0Ha({ZiGNQ3CyB@!+W6}{#u~F&F6UJzXd{Y_b30~(0}N463dCMGHO_a z_pwuLHF=)ncx8}S1R5!G@>L816_=2Npg;(eBoZW!5|skki$fehNGXV zjY=Ei=>^9iP{&jRauGCv2L`hjLrK6PAh@`L7)TrfL4x4Y4sehd)Im%_T2xfjURwG$ z3IiOPPzi9?-=jLFLK3JX;4l~xCPj$B9wh-1mq0jx?2#xW2;m?F6GKVci^3#fCsfDl zAfs%kEzbiLf&A5D=nD68z~bEGd34bjZ~R{arf4^mi5L7>G*Or+6b6-&mXeZyLd2vc z{{oq#aGr!DKjsvLh(MtyBS?gd27wVyNH(+^+z|zK$2gu0950IuVKM|^;m5T>U_R+5 z%tb~Ohk|=yai&;XWwj$r2EB{5gbhf@2&}gx&U6 zsr}K9{ugQNASnTb!5kz(2z$6BNF3=P3X&ou2%#pBQZOVE<{*apnJa&?dtx2DeBn5h zvLhh}2I3Y=u0;NN5MbwUwxL{7Sd~MGpk(f1LbB z`u-!=KXUy?3j9alf3oWzx&9*s{v+@|+4cWTE~>xouu&Mo4?SPP{WC>J+$iDRo7`SU zQw{Lr_?cbzIEm16%3aIKlkm@#f#VmEioiWQp_9T(TTh*0hM1g=144)DT?PP1uWG9) zn>vjyr@OhDn6Whf`2MZ3F4N6oSTF4}^dcfAbRx>IDxHOaUjukny}$?&U{xud1R^@8 zcb`>ZT{%oZKr6M&aSYl7OgiJpnA1-?ev&VP0{Yq?A*N7C!#EdgRMfjwcVQ9==)$3V~1h zV8>ALrPpaML59fe*e)A+f8(o`=9QhESMDq|r&R5YOBLELr|BQKn%(0x37hMlvb#bX zokpksNEF?3w3RCZi$oo9utm}3MBO5Lvs@hcsO4;DEm)d((M)WiBY}F+J5X#Zl(_5&CRC#ABa1bevx)rXN0WE ztzqQmc27JxF^fFXcIyyHSJ4^T+POrRdxyDj^gy6!DO2Y|A~RQ$>b}gwNk0A`ox2!H zivaBpAC=yW6VnyJl3#&ccx6Z4G*Nwd>i>yG?=3{Y%9f-tl^kDZLBHUel#!pNxjmOz zzOn$oLbQsuhNVOXuK@j3bt=zC#sKUENSW_)EEF1Lsi#j-v$*u%x%XwYIo%D`?(^eZ zl~wQ$s&i*Bm+`B2ze$eEdSn$15tkPL&YVjVS8cl$(p~Z~t!7Xs?S;R5d!qQ+${aJH z)@O*GxRnvCiEq#m?y~F!rs#0@tM|sGJu#yz8IOhMw4BCXc-$YUp&m%gOd7$gT_E+= zZ8!Z2m)>C#&*w*Kp`Ye)1~JW-uO}T&@6kp=)@HOX6#z;7Lvnamb9UC7dom#0 zt*c9uTa$;c?(ebn)o+~bBda0%@ScZ$>%kuVq$%GfH;RS06c{s~!^&^vB=9)?t-U@q zQ%YAT$@OOwyRY*Q7jkvURod9-p}CMRqYS4Py+pVf_g`fRQL3*} z;D{dXkZD$OLvgA}dNJ`fq9|&fTwml+$PSm^ez@M5(M2V~&I8a^*HVVX=*w5eh4L})adYZszK?w3mC+B;eo z6@__n!B>=Y7t3p3ifh=X}od=X0Lwc0d`v1r7j!GMPj? zB;)44QdM47|1tH?$1>=jBpspv0NW4%xTyf}Q#RsG1Hfqv0L(G~0ABzAnvo^V?gZIF z{)Ec`qKvZmvF~w`46sO&ceIR*f9HIN<11OC5JRRoDa=B_NUZjT7hT#iv71bEpdD%Z zd@UjJ>IaRC@;}ZNkND^tz|c9xXdXA`qA@5qP5$P)%hyk&IF(lTI78)XcR2Hv_?7QN zE2~~#_qkA?uPSe9#9C!mb1BBOpwKOlz0R2` zk^WKEop8LfudjFHKE-(b0A(ctv24dh8p%O@9JaxG7y@r)$hH@*o|+<4>!}^u^In%C zLGx_`)n3}1>55T5n+^ub%4ny0rj8}WGexU%uy$SOG#eGuo)-bGz?gFb*b4wF#lH#< zfn4j@m_E60KWiZGrFYH%iY~U?Q1{AvVG&M^_-f-8_pdomEL9O?ShTAyxO8Tqj^(uNvJ;F65`^VZoE6Y^tX5$ z!fJ+JYvzL#>4vkse8n2>IPE=3xL`e_N(NU~lzH%HEm?gLcWOD1*HKfNSt9$rf~zUh zjU@!}t?o4@7u^N_VJmiqm$_}#+FT%{UO5Mj>Q?ClY3U!AAk|DdO29`8&*@^m23c_O zctA1?(yZ>L$LejmMjwUsHr=hOF9m|Pie@oXqIn?Cc?%1gZ%NsooY-zsCfCqEXv{rd zy%Cd>Fb$PcCj!(1+v@GL1n)qa;ZMd~*60div6yGXygb2+u51g|gHY_6R|7s!skJ@M zH}vK!O>UtIM1)NsdAKsOyiOl+(|Nrorb5eT&TT91E+UscZ;IqT>GM!h82ZWpw$la_ zeL8puReJHVhQ#o+*!H>BNF(yo{*em^7ZGd8H2R}Z>C`*LfOAC^97MWbk98L>HWd&j zu%wp*MQS%~LT=lKP3YB3+%mpiX<)zWOZ3J%80YTvibE1zdi^Pa_Pae|GomNK6ME;O zNmhsbo{_KLLBb}f_0S`&PkKHV9*UL9E;c~>*g2hzu5hjBD#TEL>{0ru!cA{-<*Wfg8qw9TOgTjd!@`GW>bbrRr;vhZ_Cl_nQ z*TaG%@cr%=PhG7<+wb!m=kG?PwFvsZjT#bn&ppK?qTU&LKU>OX2>S|J{9YJ@?K>eo z=Yb)x$L2?OJ9KfE%a<0DPuI}xo+`D|RTfN2V!aaCRnT?sUy|h_G^Wh_d(8s}+sR|^ z$6b)b{&EAZMpAP4S!&IMx&(CTQ-1JNw%(MW|2X zxy4u=`sla%dR-focre5gt+DF|9TjzYS6$2fAmOFk4Btk~+1DB#-&0sL z{q6V)j?`j$Vu>=osM5ROFW>(C#rR|g{4+;Ne-3x_@g z>#~k@7%JEg9TD!~K33;M!yd6dz7&=Mi6h~JHK&@ZM}-&YFRpK82{SgjuPLue)r7*~ zneH>U2l*fG7`i(0R+w_xfcZcZ&F>GMPcx%i+qWsY`e2G~(Q^hmio%)cT+;C8q7EzNggFnA1RxG6~X zVgE-6i(m!?ocWJnWoCi>OTb|9m_2_BQnZe0r45of+qz?|$dbbI$i~k|!j4?RULv?N#;;`$?>si5@efzp;-b+f?BO zHtp}18F(r7@jMkyjbTam-aoG(O*VCid@X}HU_{ewgp?;#9?9)HepjC7|I#-9Ft%)H z0$=x~?O4|8!_uwY#qHm!KYa`Sw&T|q6!a#rWx9dWkEJhHp>;dN-Zz&@*)+#`F+OZ5 z@GZAv>&qFX;IB@3z6E(){ue5I^R`$xzpP&kpj+sxbMvSTY>0Z0`+j@flzYc{<3pg^ zJ!R9k-*_2co{#kp-&U%>xcf08jnU0)ExtkoE z3Bg|#`P6t9crv90yNtuV%zK0Y2ADT8)|hb3@?Wjgu}FW%G6}3bn5$0~u4$E)5x0=Utn@IOlgSN|Y2gRKFY%PJ(0-?`iJhSpGNrDk2GX{BzT!sT?f-#}+c_LZ^4 zTwB7t!3W=DwLa4Rb5d*OK;j(OHLxZvK#yg63E5^#o-oa?FOLD}KKQFC6-+DDRx!n2TB2fB03v)yM_x z4pP*T)S`Js+m(EC=tYQ9R9f-JZQ1=M=k*fBZy|Z#=hVUNW6LpS5AQn94+G|f-p1C* z<~q9zDzXk)WO<)5EYJN&n7v-73BMi1@#M9o;d{bP(z1zZ*=D1LUrbP&u0j-8v(LFu zRp|!0*fVJET~L-x2l)NWx);W_Uw1jb_9U2}S8&IMmkU~EIO3FlrFu0$?tHY%3HjTP zqyvt}!75ds#Xrw3`_LAGH*O7pwzjg#hf3h%f?w22Y=3l}w6y8CEH9Pey9L^kemgRg zOfn$~10~fUF(G<0S$TQP`DSpMz0q;@#ndSU=E<)7J$u1NAdKx0pN6*(cZ@hZJTCZr zO~LledvVn*2h%p=A@r`-+h(2^{HI3UkQvqanqH=p3-J_2xz1NJHn6V5SEp3bMM*+%p@g;)hWa9WBt;Jy?4W7Gr96^qq@Y)nsic} zxANKep>)td0wtCmlEZIhA;B=6UG?x=xx_P%<3*VUMT_p5JqbBHj#MX8}09Rfn?DD1}CT zWDd2b$z3NP9?raO+_o5YAWQQaKBXd|0a z?@@tpxuC0W}NIpD{CL$6?`NI(9hHfOb5QmqDh`70^@sl=j z7TaeSGkVZ|zLZo?b&syN>g))mXE<;)tVO7ptu6Jip~fr13xIsWgSia@N;iC>G4r)2 zjcCCtg0*}Xsf*I=a&NilWsRsFuV7JvC50O{2 zC+8G~#TJFrZjV8`BUrdOX(?Z?qt5e2S=&kE*oHYBZAoTI%j8*J2*W;>Sj(?4I_u1C zFZ7hp-mhN9PKd#yi_)yEMCHsi&UB6=XTdtcV3EPNsshs>)5o5PF?k}dgmgYQXko+i z?%OieSa1|4wxm}XSjJxK#5i)CDU1C)0U5DX>TWXAtF!RI#h>yWB2F=^4~?Cn@GrYr z$QfWDRE+F+4{PD;$t0QNzYqzgTN}IY89x?ef^0WEzjJz0zBwOI#Hl z^Vf~jC8s>;j#VzYWZnXAmQv+F>dDVuz+fd28n0gDQxrM)O|w#=g5tMk=&iQG@d4 z@;M3YTErGdcKeG_vm#-$wQSbY(^n}TY2rvu<#AKOLf6;iJQ#0Wpz#g5uYgw8v{*jg zt&?H6)ewH`9h<8Vb*!vDqjh?JO0(dJSM-w6h6N!^keF)gYK;GlHv@G7d1fr#9jSMp zDO}^=mrmXsLmO@4BHm4hQD5k~zZkng=r*w*It)WD#2^?<)cbf z%sZ_unK4CVf_g0Jf zr5{%t#1_^O)OIO>g*fCEL#+1Z;0S;3QlM4yB1`kz>m?KZxo1r61Tf@hs(W|STV*bv zMJ*TX@o??7ST?p%iY%XZs#u_awHwO`-sJ{P23=GtkIAFTi=Py=Y9^I>5|s+F-vJX0 zd7eh(2FGWLeI#VH(^)lIfxZ?m*K~$n5h}`Dev)0jqA0vwtcV>p^yG#?jrh%|Y7VVZ{$n%PMG%LX zH03Q?o(0yl@^Csm$(mTL8Y(WM9O;X|MSWh@Dt9I~k-6#OD9EQdZ*gW`x4g<~+NEz4 zk-K*tcR!qOkHab#<-!PdZD<9$t5ZG0(Ig%!0F2(6+ zEo>T8hrB+>X3Gk^wpe|!v+1$6g@(<;JNtapm*bCHvVI?kwa^?mTBS^~AIqMKnc@3f zmfX&>+0|>1Oc&eIwz>8cSxo4y=RBTd@QzZjt%KIhxKf+-m@Cj^V=S$(e>j_>Q8dcm zf?i@as7{In{>*$ZC(5C=0`P1~ePjm2(#e3}0U!;Ara4w@o0;&Q`xPMRtk)EwjdFRc z$AVu`y(thdd#b*wU^do&3Khe!Ke@|&U0pAOB1q&B)5|&CWz^TTO*4mz^_|)i(}+(Fq^M=Y1WnaZYb%=I3YV5vq z@ARc7%$Ejnr^aEy4`Vz&gA=b5Cl~M|tzlOk=wkbvgr_VRI(Pi8!{2Q-b7aInuT9qT zwznWse165DEW;vbUuVQ;>Reu7r`&9^DTC{@7*H>Zh&6b|2Q^GT%4?Am`$dNT+0oI# zFLA1ugXvBxcROft%|6clV9xSJ!`8-+ct>U|86`%o9VRw*;xn8M6ZY=Ik;JRts|25Y zXw=is`{2ePJaaUu@0zetbh!P?{=q?1`E+pH8`s-37LjFqQIn4v5gMVO(10s`%(t6{ zO*(BTRf>wP@~WGkjep)=OO!!KvU+h17}h!npZ9b<>auX8%#Ka?!kk13y>*rDmD3!T zy#y=7Km$$v>*r2#u~w6^-*@HMnc5DUa$E4>RH3eph_c)BfMML5sr`N)o)n=_tHEx~ zs0Fo$GY|G*tzA=zIZq09952-ys>;$Iz5Km)+eum`fY-5l;Ev7AI-|zI`O{KvlbuKP zFw1q42@2s@5SL((mmr8W%R-P%2V$k?KYBJhUWnd-LI?9G*D?Dsk0Pu$~Z6f{PH znZ$_Lm!n+#h)2=95+de1e(el3HFI|MM>!mUrRr=Hx3g__O(0c|*N$4w^)t;s6sQaf zaT6 zC)WMN!b8XEBPm*Pa^BtG6p_wh*Jv+^l4WjYhxS*u-Q1x`$c3I?h||J;<1_j=Xg_kM zQT_$L;VE7%T`i4SeecDgy4Jw28yb8OW*+B7630q+{H?Gn^wBNy50o!IpZl=$6m|76NIOz}OR{u?l$$nb`L^=uH~olBQ7Ef~De{5d zcfJp#zV$ap=2Fs&t6lBsUtEX|;P!+E6r5Y+H#AF29NJCxp?T#lx|$W-SZ8eES9xj` z5!D#oF!sU!UQ#e{c7n4sNj&JBpd50Pkele={S0qpSH%u*irF?fCrvwI+8mMb+Ipa3 zM2?;^!I-zc(2jLAmU;eJn4WleyIS--ozoEJf|RJsmp&gx~!t(~+H!FjX3+njpf(ZGm` z@`$xT18l5E#?*-LjFp z-bpGqTxpf}Yn6*3T+}rxF439vKGM0gK$?vBj5n>k2V0~DxozsN-=bASB8?lxo+~w% zDBMh4l^*xA&p9d;+%d5ftLR1{dR`{g0xdrW941D8lCqGfr zqTN=nO-!GRFbOmn7Pbf~8Wt-p(|Yd}ypvj@(5M+3pU=DjxfgG_Xv8hvqNc2%wpy{* zMY+eL3$%FH!7ZNnF{8fWLN1};WiGm>Fl|^`D$B=hq+FHM$05z2vOqQW6p1_{6>^g-Ft&<1D4EJrWsvcW!DMIATjN9GFBuU18*IR?iG)U87D7n`iUMN)?jf0yx1sj71Nt`o?7)w|PHdtW|W(2~H| z32A;Eaj_qs=DW2%W0^@SJX_-IcU)@z^u^u1*Kg{3!c2LH9q(?kFLEn!PwXz0sifV% z*DzBu^@PWayGzPP{QXytgvpP|q&3Gt|Ea#G6No-T#h@@-Id&@~nPr|LZIjuy2-Tr^5CFife*F`e5m7p^!n!6Amb zh@19%G{z@WIgjf-uAQ3dK)rh0Zfi|vt-<;QaG5|bCthR!e&d*3o1fQ2vM<@4RY1NK ziu6j3;!>l#*sPpfjx86}J=XrH-~?ewaQDr$B5LK15tYEe=J++~RYFM81qD~RN2l5Q z+iib2GFs7`5(tdh^Psm6ff@Zz_Y!t8_(S_$Gt+ST+EF^*oMzPiJF%27&f;mqB7Y zQCJy2cQ5ii9sr=M=I4b(yJCp~D6BKiLq%w{sZ~e-hfxu-Rxkz`dud@W;q;RA{v9NJg{8jtfL;ygVB4mgo0Pj8}%kPvxZ;3qkG7Omq) z7XCDFFg~Ow5HYd_q~+OIA(> zBz42(Qjt|y@DEzBYFE?+(uQt62*aOj_-)BLCa#@u2xMltzu<{D zr#}<)m-QUX{1->a=KkRS3;OqX9r|(@SA@1F+WWw$fwqd!fxifhCmM%A9DW3Ylt2fWTNd^cM zoUp{XV=aitgP_Sl<>aAY5C{%ZfWkm>ihqKvuy_Kw$PYN>Kr-_3hcg&7LYK^lBo`ab z9qEjf_405&oH$4eg1i`VV37yCL1sRblh=aK!efy{PrRk4r<;nj*@=zrlaAsQ(M6{G(j;$-16+|6lA|U@!j|{n(J)aEGB15IEcf z5J>co@Dq?eSj=Gx$Z`BJg}#LJaK@5%+n=rWyBzl~%GgO!K^_Vv7cUxxR0KjWPI5q) zJP1tg2@DL1!9bnB*dMj>2Rp&jiRg>OV>O(~H9*cYxwQ`SEFgYZeG-55#rG1HTq9B- zIRpqK^dr4L)BT@W4+@S&gW)IzAXX6u1wx<@5D+epQ3N7UAeaIc4oAwv6#nYr|9m~l zvIhsm@99!L*g}ns5x*u>`CyAh7#wtxg}0ZN8xD*AYodQI{Qn2;7yX}2_TQ=h3j3k0 z<>}>5-h?g@O?^H7t@(ce{K0SrhsJskJpY~Rze0Y5<(G4m?DG#9`FtiH_p*PS_dm=0 zU?=zwK7O{(f6xM%`X3{IE584P>z{D_tqA-r@ITe{Pq_Y81pXHIpX&Nw3m3zmHwIV_ z@)uWM@_m5Rx%_kFy98R4k)Af-`@u7>xg?D&q4(0aC6IqWG;;8w&=k+|BMa$>2F5yc zbCk5KAcie1v--ULgq@FyG)<^?|Gf0Y7 z?@<+r7eHSM73k=)))UUjunS!|Qf9`fGY$=Blz^Bq1{A;%2vyRJS=jpin`6au=rh%? zy=8p8R~vEzUhLwN7V>RU)h+bzf2I5Kazm<7G*p`7$t@<$P}zj#Eb85(fG0Si#V_>I z8PRfcFt#{NOj~?wZK8S*N7cx055ME(xw0(ozZ$uC4;I=IB~C1!>{lTRm?{# zH$AC-NTT8DG|(bara+yD zh>XDAH%2>%AqmVFREhpXS7&qItxL<$pfm(<(LmomboiCt!c)B-=&A8a2Th6la#^V9 zGlJV)aCwJa>gK|PmOzE~zp=6(7uY}jX%Z(ge>BDMtcfjwYHxt2O&6@Qy(A7NFqD-O z)m#LJ7jM1aR}u-nGkOuzSj(~9J6;;B_F9QS?#7DtZ>l*DtKR4v4_t0#GaUq{^MDy? zAQ}l8#k0>LA0htw6`%Gq=8`0t2JohWYJqqJMydFb52asH&h zu*8C!)rOVSkuciGj%PQQ_|+LBKQ+)jn4e2^>jlu;ozdZDzH^C-^4+lI)e2q8=b2ow z1wPCXVlTNy*>DD}OI#$)AVmg}y@Razwffj8J>wqbenBsk2(!Zs?F&0WDbgj^unIrS f3r%xt`dx})C(1d?^ED~tvIQ9Em}pmOUJU;~ped7p diff --git a/ion/src/simulator/android/build.gradle b/ion/src/simulator/android/build.gradle index bae0bbbcb9a..350e0eab144 100644 --- a/ion/src/simulator/android/build.gradle +++ b/ion/src/simulator/android/build.gradle @@ -16,7 +16,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.android.tools.build:gradle:9.2.0' } } @@ -32,12 +32,11 @@ apply plugin: 'com.android.application' android { namespace = "io.github.upsilon.simulator" - compileSdkVersion 36 + compileSdkVersion 37 defaultConfig { applicationId "io.github.upsilon.simulator" - minSdkVersion 16 + minSdkVersion 21 targetSdkVersion 33 - def d=new Date() versionCode Instant.now().getEpochSecond().toInteger() versionName LocalDate.now().format("yyyyMMdd")+'-'+System.getenv('UPSILON_VERSION') } @@ -52,7 +51,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt') + //proguardFiles getDefaultProguardFile('proguard-android.txt') if (projectVariable('SIGNING_STORE_FILE')) { signingConfig = signingConfigs.environment } else { @@ -73,12 +72,15 @@ android { abortOnError = false checkReleaseBuilds = false } + compileOptions { // currently Kotlin JVM doesn't support target 25 + sourceCompatibility JavaVersion.VERSION_24 + targetCompatibility JavaVersion.VERSION_24 + } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:1.6.0" - implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.2.21")) + implementation "androidx.appcompat:appcompat:1.7.1" } java{toolchain{languageVersion=JavaLanguageVersion.of(25)}} diff --git a/ion/src/simulator/android/gradle.properties b/ion/src/simulator/android/gradle.properties index dbb7bf70d15..5bac8ac5046 100644 --- a/ion/src/simulator/android/gradle.properties +++ b/ion/src/simulator/android/gradle.properties @@ -1,2 +1 @@ -android.enableJetifier=true android.useAndroidX=true diff --git a/ion/src/simulator/android/gradle/wrapper/gradle-wrapper.properties b/ion/src/simulator/android/gradle/wrapper/gradle-wrapper.properties index 6db27b7f298..92ffa27d3b2 100644 --- a/ion/src/simulator/android/gradle/wrapper/gradle-wrapper.properties +++ b/ion/src/simulator/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ion/src/simulator/external/sdl/src/render/opengles2/SDL_gles2funcs.h b/ion/src/simulator/external/sdl/src/render/opengles2/SDL_gles2funcs.h index 34bfb81c36b..e0de76e78f1 100644 --- a/ion/src/simulator/external/sdl/src/render/opengles2/SDL_gles2funcs.h +++ b/ion/src/simulator/external/sdl/src/render/opengles2/SDL_gles2funcs.h @@ -54,10 +54,10 @@ SDL_PROC(void, glPixelStorei, (GLenum, GLint)) SDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*)) SDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei)) SDL_PROC(void, glShaderBinary, (GLsizei, const GLuint *, GLenum, const void *, GLsizei)) -#if __NACL__ || __ANDROID__ -SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar **, const GLint *)) -#else +#if __NACL__ || __ANDROID__ || __APPLE__ SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar* const*, const GLint *)) +#else +SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar **, const GLint *)) #endif SDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)) SDL_PROC(void, glTexParameteri, (GLenum, GLenum, GLint)) diff --git a/ion/src/simulator/external/sdl/src/sensor/android/SDL_androidsensor.c b/ion/src/simulator/external/sdl/src/sensor/android/SDL_androidsensor.c index 06fe6f5e5bb..9bb05fe48fd 100644 --- a/ion/src/simulator/external/sdl/src/sensor/android/SDL_androidsensor.c +++ b/ion/src/simulator/external/sdl/src/sensor/android/SDL_androidsensor.c @@ -162,7 +162,7 @@ SDL_ANDROID_SensorUpdate(SDL_Sensor *sensor) ASensorEvent event; struct android_poll_source* source; - if (ALooper_pollAll(0, NULL, &events, (void**)&source) == LOOPER_ID_USER) { + if (ALooper_pollOnce(0, NULL, &events, (void**)&source) == LOOPER_ID_USER) { SDL_zero(event); while (ASensorEventQueue_getEvents(sensor->hwdata->eventqueue, &event, 1) > 0) { SDL_PrivateSensorUpdate(sensor, event.data, SDL_arraysize(event.data)); diff --git a/ion/src/simulator/fxcg/Makefile b/ion/src/simulator/fxcg/Makefile index 02a9ed71776..c82a4f3abc8 100644 --- a/ion/src/simulator/fxcg/Makefile +++ b/ion/src/simulator/fxcg/Makefile @@ -56,7 +56,7 @@ ion_src := $(filter-out $(sdl_simu_needs_to_be_removed),$(ion_src)) SFLAGS := $(filter-out -Iion/src/simulator/external/sdl/include,$(SFLAGS)) -SFLAGS += -DFXCG50 -DTARGET_FXCG50 -m4-nofpu -mb -ffreestanding -nostdlib -Wa,--dsp -fstrict-volatile-bitfields -g -Os +SFLAGS += -DFXCG50 -DTARGET_FXCG50 -m4-nofpu -mb -nostdlib -Wa,--dsp -fstrict-volatile-bitfields -g -Os LDFLAGS += -nostdlib -Wl,--no-warn-rwx-segments -lgint-cg -lc -lgint-cg -lc -lgcc -lopenlibm -lstdc++ -lgcc ifdef FASTLOAD diff --git a/python/port/port.cpp b/python/port/port.cpp index 93a35dbccf3..64e41a2f5e4 100644 --- a/python/port/port.cpp +++ b/python/port/port.cpp @@ -420,11 +420,6 @@ void nlr_jump_fail(void *val) { #if defined _FXCG || defined NSPIRE_NEWLIB -void do_mp_lexer_new_from_file(const char * filename,mp_lexer_t ** res) { - mp_reader_t reader; - mp_reader_new_file(&reader, filename); - *res=mp_lexer_new(qstr_from_str(filename), reader); -} // Code from MicroPython's reader.c #include @@ -439,7 +434,7 @@ typedef struct _mp_reader_posix_t { byte buf[20]; } mp_reader_posix_t; -STATIC mp_uint_t mp_reader_posix_readbyte(void *data) { +static mp_uint_t mp_reader_posix_readbyte(void *data) { mp_reader_posix_t *reader = (mp_reader_posix_t *)data; if (reader->pos >= reader->len) { if (reader->len == 0) { @@ -459,7 +454,7 @@ STATIC mp_uint_t mp_reader_posix_readbyte(void *data) { return reader->buf[reader->pos++]; } -STATIC void mp_reader_posix_close(void *data) { +static void mp_reader_posix_close(void *data) { mp_reader_posix_t *reader = (mp_reader_posix_t *)data; if (reader->close_fd) { MP_THREAD_GIL_EXIT(); @@ -498,6 +493,12 @@ void mp_reader_new_file(mp_reader_t *reader, const char *filename) { } mp_reader_new_file_from_fd(reader, fd, true); } + +void do_mp_lexer_new_from_file(const char * filename,mp_lexer_t ** res) { + mp_reader_t reader; + mp_reader_new_file(&reader, filename); + *res=mp_lexer_new(qstr_from_str(filename), reader); +} #endif mp_lexer_t * mp_lexer_new_from_file(qstr file_qstr) { From c6e6120b58e726286d35c34bd03c4573d7febaf2 Mon Sep 17 00:00:00 2001 From: mickbot-92 <158478736+mickbot-92@users.noreply.github.com> Date: Sun, 10 May 2026 11:08:15 +0200 Subject: [PATCH 2/2] [CI] Sync APT repos before installing dependencies --- .github/workflows/metric-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/metric-workflow.yml b/.github/workflows/metric-workflow.yml index 2c4e3602ec1..9c22ab3db9c 100644 --- a/.github/workflows/metric-workflow.yml +++ b/.github/workflows/metric-workflow.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-24.04-arm steps: - name: Install dependencies - run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config + run: sudo apt-get update && sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config - name: Install ARM toolchain run: sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi - name: Checkout PR base @@ -34,7 +34,7 @@ jobs: echo EOF } >> "$GITHUB_ENV" - name: Add comment - uses: actions/github-script@v8 + uses: actions/github-script@v9 with: script: | await github.rest.issues.createComment({