From c228c7f053e898655346ace5293aefd0b10ba319 Mon Sep 17 00:00:00 2001 From: Jeff Chung Date: Wed, 3 Jul 2024 11:24:44 +0100 Subject: [PATCH 1/4] init: isolated all the msm out of mopro-core and make it a crate --- .github/workflows/build-and-test.yml | 118 +- .github/workflows/setup-macos.yml | 9 +- .github/workflows/setup-ubuntu.yml | 36 - .gitignore | 3 +- Cargo.lock | 2010 +-- Cargo.toml | 9 +- LICENSE-APACHE | 201 - LICENSE-MIT | 21 - README.md | 12 +- ark-zkey/.gitignore | 14 - ark-zkey/Cargo.toml | 29 - ark-zkey/LICENSE-APACHE | 201 - ark-zkey/LICENSE-MIT | 21 - ark-zkey/README.md | 52 - ark-zkey/src/bin/arkzkey_util.rs | 36 - ark-zkey/src/lib.rs | 270 - config-example.toml | 28 - .../.gitignore | 0 .../LICENSE | 0 .../README.md | 0 .../core/Cargo.lock | 0 .../core/Cargo.toml | 0 .../core/circuits}/.gitignore | 0 .../circuits}/multiplier2/multiplier2.circom | 0 gpu-exploration-app/core/src/lib.rs | 87 + .../image/simulator_benchmark_result.png | Bin .../ios/ExampleApp/.gitignore | 0 .../ios/ExampleApp/Bindings/mopro.swift | 0 .../ExampleApp.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/icon_1024x1024.png | Bin .../AppIcon.appiconset/icon_120x120.png | Bin .../AppIcon.appiconset/icon_180x180.png | Bin .../AppIcon.appiconset/icon_40x40.png | Bin .../AppIcon.appiconset/icon_58x58.png | Bin .../AppIcon.appiconset/icon_60x60.png | Bin .../AppIcon.appiconset/icon_80x80.png | Bin .../AppIcon.appiconset/icon_87x87.png | Bin .../ExampleApp/Assets.xcassets/Contents.json | 0 .../ExampleApp/ExampleApp/ExampleApp.swift | 0 .../ExampleApp/MSMBenchmarkView.swift | 0 .../Preview Assets.xcassets/Contents.json | 0 .../ios/ExampleApp/ExampleApp/Utils.swift | 0 .../ExampleAppTests/ExampleAppTests.swift | 0 .../ExampleAppUITests/ExampleAppUITests.swift | 0 .../ExampleAppUITestsLaunchTests.swift | 0 .../Frameworks/CircuitBindings.podspec | 0 .../ios/ExampleApp/Frameworks/LICENSE | 0 .../Frameworks/MoproBindings.podspec | 0 .../ios/ExampleApp/Info.plist | 0 .../ios/ExampleApp/Podfile | 0 .../mopro-config.toml | 2 +- images/mopro_architecture2.png | Bin 243002 -> 0 bytes images/mopro_architecture2_full.png | Bin 419786 -> 0 bytes mopro-cli/Cargo.lock | 223 - mopro-cli/Cargo.toml | 14 - mopro-cli/README.md | 236 - mopro-cli/src/build.rs | 39 - mopro-cli/src/deps.rs | 22 - mopro-cli/src/export.rs | 98 - mopro-cli/src/init.rs | 69 - mopro-cli/src/main.rs | 110 - mopro-cli/src/prepare.rs | 23 - mopro-cli/src/test.rs | 42 - mopro-cli/src/update.rs | 34 - mopro-cli/src/utils.rs | 15 - mopro-core/Cargo.toml | 103 - mopro-core/README.md | 70 - mopro-core/build.rs | 347 - mopro-core/examples/circom.rs | 46 - mopro-core/examples/circom/.gitignore | 4 - mopro-core/examples/circom/README.md | 9 - .../examples/circom/anonAadhaar/.gitignore | 2 - .../examples/circom/anonAadhaar/LICENSE | 21 - .../examples/circom/anonAadhaar/README.md | 25 - .../anonAadhaar/aadhaar-verifier.circom | 83 - .../anonAadhaar/helpers/constants.circom | 76 - .../anonAadhaar/helpers/extractor.circom | 347 - .../anonAadhaar/helpers/nullifier.circom | 29 - .../circom/anonAadhaar/helpers/rsa/LICENSE | 21 - .../anonAadhaar/helpers/rsa/bigint.circom | 565 - .../helpers/rsa/bigint_func.circom | 442 - .../circom/anonAadhaar/helpers/rsa/fp.circom | 144 - .../circom/anonAadhaar/helpers/rsa/rsa.circom | 156 - .../circom/anonAadhaar/helpers/rsa/sha.circom | 157 - .../anonAadhaar/helpers/signature.circom | 79 - .../examples/circom/anonAadhaar/input.json | 1606 --- .../circom/anonAadhaar/package-lock.json | 21 - .../examples/circom/anonAadhaar/package.json | 9 - .../circom/anonAadhaar/utils/array.circom | 120 - .../circom/anonAadhaar/utils/pack.circom | 144 - .../examples/circom/complex-circuit/README.md | 5 - .../complex-circuit-1000k-1000k.circom | 23 - .../complex-circuit-100k-100k.circom | 23 - .../complex-circuit-1200k-1200k.circom | 23 - .../complex-circuit-1600k-1600k.circom | 23 - .../complex-circuit-200k-200k.circom | 23 - .../complex-circuit-3200k-3200k.circom | 23 - .../complex-circuit-400k-400k.circom | 23 - .../complex-circuit-800k-800k.circom | 23 - .../complex-circuit.circom.template | 23 - .../circom/complex-circuit/package-lock.json | 21 - .../circom/complex-circuit/package.json | 9 - .../examples/circom/keccak256/README.md | 7 - .../examples/circom/keccak256/keccak.circom | 186 - .../keccak256/keccak256_256_test.circom | 5 - .../circom/keccak256/package-lock.json | 21 - .../examples/circom/keccak256/package.json | 9 - .../circom/keccak256/permutations.circom | 799 -- .../examples/circom/keccak256/utils.circom | 118 - .../examples/circom/multiplier2/.gitignore | 2 - .../examples/circom/multiplier2/compile.sh | 4 - .../multiplier2/target/multiplier2.r1cs | Bin 264 -> 0 bytes .../circom/multiplier2/target/multiplier2.sym | 3 - .../target/multiplier2_js/generate_witness.js | 20 - .../target/multiplier2_js/multiplier2.wasm | Bin 34291 -> 0 bytes .../multiplier2_js/witness_calculator.js | 337 - mopro-core/examples/circom/rsa/.gitignore | 2 - mopro-core/examples/circom/rsa/LICENSE | 21 - mopro-core/examples/circom/rsa/README.md | 5 - mopro-core/examples/circom/rsa/bigint.circom | 561 - .../examples/circom/rsa/bigint_func.circom | 442 - mopro-core/examples/circom/rsa/fp.circom | 144 - mopro-core/examples/circom/rsa/input.json | 104 - mopro-core/examples/circom/rsa/main.circom | 5 - .../examples/circom/rsa/package-lock.json | 21 - mopro-core/examples/circom/rsa/package.json | 9 - mopro-core/examples/circom/rsa/rsa.circom | 156 - .../circom/scripts/build_complex_circuits.sh | 89 - mopro-core/examples/circom/scripts/compile.sh | 19 - .../circom/scripts/generate_arkzkey.sh | 41 - .../examples/circom/scripts/trusted_setup.sh | 47 - .../examples/halo2/fibonacci/.gitignore | 2 - .../examples/halo2/fibonacci/Cargo.toml | 21 - mopro-core/examples/halo2/fibonacci/README.md | 30 - .../halo2/fibonacci/src/bin/fibonacci.rs | 56 - .../examples/halo2/fibonacci/src/circuit.rs | 245 - mopro-core/examples/halo2/fibonacci/src/io.rs | 31 - .../examples/halo2/fibonacci/src/lib.rs | 12 - .../examples/halo2/fibonacci/src/mopro.rs | 92 - mopro-core/gpu_explorations/README.md | 66 - .../arkworks_pippenger_benchmark.txt | 7 - .../halo2curve_multicore_msm_benchmark.txt | 7 - .../halo2curve_singlecore_msm_benchmark.txt | 7 - .../benchmarks/metal_msm_benchmark.txt | 6 - .../benchmarks/trapdoor_benchmark.txt | 7 - mopro-core/src/middleware/circom/mod.rs | 796 -- .../src/middleware/circom/serialization.rs | 116 - mopro-core/src/middleware/circom/utils.rs | 33 - mopro-core/src/middleware/halo2/mod.rs | 119 - .../src/middleware/halo2/serialisation.rs | 106 - mopro-core/src/middleware/mod.rs | 8 - mopro-ffi/.gitignore | 18 - mopro-ffi/Cargo.toml | 51 - mopro-ffi/Makefile | 16 - mopro-ffi/README.md | 70 - mopro-ffi/build.rs | 3 - mopro-ffi/src/circom.rs | 496 - mopro-ffi/src/halo2.rs | 93 - mopro-ffi/src/lib.rs | 97 - mopro-ffi/src/mopro.udl | 75 - mopro-ffi/tests/bindings/test_mopro.kts | 33 - mopro-ffi/tests/bindings/test_mopro.swift | 70 - .../bindings/test_mopro_gpu_benchmarks.swift | 42 - .../tests/bindings/test_mopro_keccak.kts | 278 - .../tests/bindings/test_mopro_keccak.swift | 81 - .../bindings/test_mopro_keccak_static.kts | 273 - .../bindings/test_mopro_keccak_static.swift | 83 - mopro-ffi/tests/bindings/test_mopro_rsa.kts | 114 - mopro-ffi/tests/bindings/test_mopro_rsa.swift | 173 - .../bindings/test_mopro_rsa_static.swift | 167 - mopro-ffi/tests/test_generated_bindings.rs | 17 - mopro-ffi/uniffi-bindgen.rs | 3 - mopro-ffi/uniffi.toml | 2 - {mopro-core => mopro-msm}/.gitignore | 0 mopro-msm/Cargo.toml | 55 + mopro-msm/README.md | 22 + .../bucket_wise_msm_benchmark.txt | 4 + .../benchmark_results/metal_msm_benchmark.txt | 5 + {mopro-core => mopro-msm}/src/lib.rs | 2 +- .../src/msm}/arkworks_pippenger.rs | 6 +- .../src/msm}/bucket_wise_msm.rs | 91 +- .../src/msm}/halo2curve_msm.rs | 4 +- .../src/msm}/metal/abstraction/errors.rs | 0 .../metal/abstraction/limbs_conversion.rs | 2 +- .../src/msm}/metal/abstraction/mod.rs | 0 .../msm}/metal/abstraction/mont_reduction.rs | 0 .../src/msm}/metal/abstraction/state.rs | 2 +- .../src/msm}/metal/compile_metal.sh | 0 .../src/msm}/metal/mod.rs | 0 .../src/msm}/metal/msm.rs | 10 +- .../src/msm}/metal/shader/all.metal | 0 .../metal/shader/arithmetics/u128.h.metal | 0 .../metal/shader/arithmetics/u256.h.metal | 0 .../shader/arithmetics/unsigned_int.h.metal | 0 .../msm}/metal/shader/curves/bn254.h.metal | 0 .../msm}/metal/shader/curves/ec_point.h.metal | 0 .../msm}/metal/shader/fields/fp_bn254.h.metal | 0 .../msm}/metal/shader/fields/fp_u256.h.metal | 0 .../msm}/metal/shader/helper/bigint_to_hex.py | 0 .../metal/shader/helper/bn254_addchain.acc | 0 .../src/msm}/metal/shader/helper/mu.py | 0 .../msm}/metal/shader/helper/r_sqr_mod_n.py | 0 .../src/msm}/metal/shader/helper/r_sub_n.py | 0 .../msm}/metal/shader/helper/requirements.txt | 0 .../src/msm}/metal/shader/msm.h.metal | 0 .../src/msm}/metal/shader/msm.metallib | Bin .../metal/shader/tests/test_bn254.h.metal | 0 .../tests/test_unsigned_integer.h.metal | 0 .../src/msm}/metal/tests/mod.rs | 0 .../src/msm}/metal/tests/test_bn254.rs | 2 +- .../src/msm}/mod.rs | 0 .../src/msm}/precompute_msm.rs | 110 +- .../msm}/trapdoortech_zprize_msm/local_msm.rs | 0 .../src/msm}/trapdoortech_zprize_msm/mod.rs | 4 +- .../src/msm}/utils/benchmark.rs | 0 .../src/msm}/utils/mod.rs | 0 .../src/msm}/utils/precomputation.rs | 3 +- .../src/msm}/utils/preprocess.rs | 2 +- mopro-web/.gitignore | 23 - mopro-web/LICENSE | 21 - mopro-web/README.md | 41 - mopro-web/babel.config.js | 3 - mopro-web/blog/2024-04-24-first-blog-post.md | 12 - mopro-web/docs/FAQ.md | 44 - mopro-web/docs/circom/android.md | 191 - mopro-web/docs/circom/configuration.md | 110 - mopro-web/docs/circom/core-api.md | 105 - mopro-web/docs/circom/ios.md | 192 - mopro-web/docs/community.md | 27 - mopro-web/docs/getting-started.md | 125 - mopro-web/docs/halo2/configuration.md | 86 - mopro-web/docs/halo2/introduction.md | 23 - mopro-web/docs/intro.md | 40 - mopro-web/docs/mopro-cli.md | 237 - mopro-web/docs/mopro-core.md | 72 - mopro-web/docs/mopro-ffi.md | 71 - mopro-web/docs/performance.md | 17 - mopro-web/docs/prerequisites.md | 47 - mopro-web/docusaurus.config.ts | 129 - mopro-web/package.json | 49 - mopro-web/sidebars.ts | 95 - .../src/components/HomepageFeatures/index.tsx | 82 - .../HomepageFeatures/styles.module.css | 65 - mopro-web/src/css/custom.css | 150 - mopro-web/src/pages/index.module.css | 82 - mopro-web/src/pages/index.tsx | 37 - .../src/theme/prism-include-languages.js | 24 - mopro-web/static/.nojekyll | 0 mopro-web/static/img/android-bindings.png | Bin 33164 -> 0 bytes mopro-web/static/img/architecture.png | Bin 106576 -> 0 bytes mopro-web/static/img/blue_angle.svg | 3 - mopro-web/static/img/favicon.ico | Bin 3626 -> 0 bytes mopro-web/static/img/gold_arch.svg | 3 - mopro-web/static/img/gold_leaf.svg | 3 - mopro-web/static/img/link_arrow.svg | 10 - mopro-web/static/img/logo_lg.svg | 10 - mopro-web/static/img/logo_sm.svg | 10 - mopro-web/static/img/logo_title.svg | 77 - mopro-web/static/img/mobile.svg | 151 - .../static/img/mopro_adapters_platforms.png | Bin 149409 -> 0 bytes mopro-web/static/img/mopro_architecture2.png | Bin 243002 -> 0 bytes mopro-web/static/img/red_angle.svg | 3 - mopro-web/static/img/roadmap.png | Bin 134800 -> 0 bytes mopro-web/static/img/separator.svg | 5 - mopro-web/static/img/yellow_drop.svg | 3 - mopro-web/tsconfig.json | 7 - mopro-web/yarn.lock | 11810 ---------------- .../core/circuits/.gitignore | 2 - .../circuits/multiplier2/multiplier2.circom | 16 - research/gpu-exploration-app/core/src/lib.rs | 87 - scripts/_prelude.sh | 37 - scripts/cli/build_android.sh | 163 - scripts/cli/build_core.sh | 52 - scripts/cli/build_ios.sh | 362 - scripts/cli/build_web.sh | 73 - scripts/cli/install_deps.sh | 138 - scripts/cli/prepare.sh | 222 - scripts/cli/update.sh | 171 - scripts/prepare.sh | 183 - scripts/prepare_ci.sh | 168 - templates/mopro-example-app/.gitignore | 2 - templates/mopro-example-app/Cargo.toml | 8 - templates/mopro-example-app/README.md | 21 - .../mopro-example-app/android/.gitignore | 10 - .../mopro-example-app/android/app/.gitignore | 3 - .../android/app/build.gradle.kts | 70 - .../android/app/proguard-rules.pro | 21 - .../example/mopro/ExampleInstrumentedTest.kt | 24 - .../android/app/src/main/AndroidManifest.xml | 26 - .../java/com/example/mopro/KeccakComponent.kt | 349 - .../java/com/example/mopro/MainActivity.kt | 32 - .../com/example/mopro/MultiplierComponent.kt | 95 - .../java/com/example/mopro/ui/theme/Color.kt | 11 - .../java/com/example/mopro/ui/theme/Theme.kt | 70 - .../java/com/example/mopro/ui/theme/Type.kt | 34 - .../res/drawable/ic_launcher_background.xml | 170 - .../res/drawable/ic_launcher_foreground.xml | 30 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 - .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes .../app/src/main/res/values/colors.xml | 10 - .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/themes.xml | 5 - .../java/com/example/mopro/ExampleUnitTest.kt | 17 - .../android/build.gradle.kts | 5 - .../android/gradle.properties | 23 - .../android/settings.gradle.kts | 18 - templates/mopro-example-app/core/Cargo.lock | 3101 ---- templates/mopro-example-app/core/Cargo.toml | 27 - .../core/circuits/.gitignore | 2 - .../core/circuits/halo2-fibonacci/.gitignore | 2 - .../core/circuits/halo2-fibonacci/Cargo.toml | 21 - .../core/circuits/halo2-fibonacci/README.md | 30 - .../halo2-fibonacci/src/bin/fibonacci.rs | 56 - .../circuits/halo2-fibonacci/src/circuit.rs | 245 - .../core/circuits/halo2-fibonacci/src/io.rs | 31 - .../core/circuits/halo2-fibonacci/src/lib.rs | 12 - .../circuits/halo2-fibonacci/src/mopro.rs | 92 - .../core/circuits/keccak256/README.md | 7 - .../core/circuits/keccak256/keccak.circom | 186 - .../keccak256/keccak256_256_test.circom | 5 - .../core/circuits/keccak256/package-lock.json | 21 - .../core/circuits/keccak256/package.json | 9 - .../circuits/keccak256/permutations.circom | 799 -- .../core/circuits/keccak256/utils.circom | 118 - .../circuits/multiplier2/multiplier2.circom | 16 - templates/mopro-example-app/core/src/lib.rs | 56 - .../ios/ExampleApp/.gitignore | 41 - .../ios/ExampleApp/Bindings/mopro.swift | 1023 -- .../ExampleApp.xcodeproj/project.pbxproj | 745 - .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 62 - .../AppIcon.appiconset/icon_1024x1024.png | Bin 380025 -> 0 bytes .../AppIcon.appiconset/icon_120x120.png | Bin 13436 -> 0 bytes .../AppIcon.appiconset/icon_180x180.png | Bin 26721 -> 0 bytes .../AppIcon.appiconset/icon_40x40.png | Bin 2267 -> 0 bytes .../AppIcon.appiconset/icon_58x58.png | Bin 4376 -> 0 bytes .../AppIcon.appiconset/icon_60x60.png | Bin 4466 -> 0 bytes .../AppIcon.appiconset/icon_80x80.png | Bin 7195 -> 0 bytes .../AppIcon.appiconset/icon_87x87.png | Bin 8393 -> 0 bytes .../ExampleApp/Assets.xcassets/Contents.json | 6 - .../ExampleApp/ExampleApp/ExampleAppApp.swift | 22 - .../Halo2FibonacciCircuitView.swift | 144 - .../ExampleApp/KeccakCircuitView.swift | 141 - .../ExampleApp/KeccakDylibCircuitView.swift | 152 - .../ExampleApp/MultiplierCircuitView.swift | 145 - .../Preview Assets.xcassets/Contents.json | 6 - .../ios/ExampleApp/ExampleApp/Utils.swift | 44 - .../ExampleAppTests/ExampleAppTests.swift | 60 - .../ExampleAppUITests/ExampleAppUITests.swift | 41 - .../ExampleAppUITestsLaunchTests.swift | 32 - .../Frameworks/CircuitBindings.podspec | 12 - .../ios/ExampleApp/Frameworks/LICENSE | 231 - .../Frameworks/MoproBindings.podspec | 11 - .../ios/ExampleApp/Info.plist | 41 - .../mopro-example-app/ios/ExampleApp/Podfile | 21 - templates/mopro-example-app/mopro-config.toml | 41 - .../mopro-example-app/web/.eslintrc.json | 3 - templates/mopro-example-app/web/.gitignore | 36 - templates/mopro-example-app/web/README.md | 20 - .../mopro-example-app/web/next.config.js | 6 - .../mopro-example-app/web/package-lock.json | 4722 ------ templates/mopro-example-app/web/package.json | 30 - .../mopro-example-app/web/postcss.config.js | 6 - .../mopro-example-app/web/public/next.svg | 1 - .../mopro-example-app/web/public/vercel.svg | 1 - .../mopro-example-app/web/src/app/favicon.ico | Bin 25931 -> 0 bytes .../mopro-example-app/web/src/app/footer.tsx | 45 - .../mopro-example-app/web/src/app/globals.css | 29 - .../mopro-example-app/web/src/app/inputs.json | 133 - .../mopro-example-app/web/src/app/layout.tsx | 22 - .../mopro-example-app/web/src/app/page.tsx | 20 - .../mopro-example-app/web/src/app/prove.tsx | 74 - .../mopro-example-app/web/tailwind.config.ts | 20 - templates/mopro-example-app/web/tsconfig.json | 27 - web-prover/.eslintrc.json | 3 - web-prover/.gitignore | 36 - web-prover/README.md | 25 - web-prover/next.config.js | 6 - web-prover/package-lock.json | 4739 ------- web-prover/package.json | 30 - web-prover/postcss.config.js | 6 - web-prover/public/next.svg | 1 - web-prover/public/vercel.svg | 1 - web-prover/src/app/favicon.ico | Bin 25931 -> 0 bytes web-prover/src/app/footer.tsx | 45 - web-prover/src/app/globals.css | 29 - web-prover/src/app/inputs.json | 133 - web-prover/src/app/layout.tsx | 22 - web-prover/src/app/page.tsx | 21 - web-prover/src/app/prove.tsx | 98 - web-prover/tailwind.config.ts | 20 - web-prover/tsconfig.json | 27 - 413 files changed, 915 insertions(+), 50936 deletions(-) delete mode 100644 .github/workflows/setup-ubuntu.yml delete mode 100644 LICENSE-APACHE delete mode 100644 LICENSE-MIT delete mode 100644 ark-zkey/.gitignore delete mode 100644 ark-zkey/Cargo.toml delete mode 100644 ark-zkey/LICENSE-APACHE delete mode 100644 ark-zkey/LICENSE-MIT delete mode 100644 ark-zkey/README.md delete mode 100644 ark-zkey/src/bin/arkzkey_util.rs delete mode 100644 ark-zkey/src/lib.rs delete mode 100644 config-example.toml rename {research/gpu-exploration-app => gpu-exploration-app}/.gitignore (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/LICENSE (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/README.md (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/core/Cargo.lock (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/core/Cargo.toml (100%) rename {mopro-core/examples/circom/keccak256 => gpu-exploration-app/core/circuits}/.gitignore (100%) rename {mopro-core/examples/circom => gpu-exploration-app/core/circuits}/multiplier2/multiplier2.circom (100%) create mode 100644 gpu-exploration-app/core/src/lib.rs rename {research/gpu-exploration-app => gpu-exploration-app}/image/simulator_benchmark_result.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/.gitignore (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Bindings/mopro.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/ExampleApp.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/MSMBenchmarkView.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleApp/Utils.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Frameworks/CircuitBindings.podspec (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Frameworks/LICENSE (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Frameworks/MoproBindings.podspec (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Info.plist (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/ios/ExampleApp/Podfile (100%) rename {research/gpu-exploration-app => gpu-exploration-app}/mopro-config.toml (94%) delete mode 100644 images/mopro_architecture2.png delete mode 100644 images/mopro_architecture2_full.png delete mode 100644 mopro-cli/Cargo.lock delete mode 100644 mopro-cli/Cargo.toml delete mode 100644 mopro-cli/README.md delete mode 100644 mopro-cli/src/build.rs delete mode 100644 mopro-cli/src/deps.rs delete mode 100644 mopro-cli/src/export.rs delete mode 100644 mopro-cli/src/init.rs delete mode 100644 mopro-cli/src/main.rs delete mode 100644 mopro-cli/src/prepare.rs delete mode 100644 mopro-cli/src/test.rs delete mode 100644 mopro-cli/src/update.rs delete mode 100644 mopro-cli/src/utils.rs delete mode 100644 mopro-core/Cargo.toml delete mode 100644 mopro-core/README.md delete mode 100644 mopro-core/build.rs delete mode 100644 mopro-core/examples/circom.rs delete mode 100644 mopro-core/examples/circom/.gitignore delete mode 100644 mopro-core/examples/circom/README.md delete mode 100644 mopro-core/examples/circom/anonAadhaar/.gitignore delete mode 100644 mopro-core/examples/circom/anonAadhaar/LICENSE delete mode 100644 mopro-core/examples/circom/anonAadhaar/README.md delete mode 100644 mopro-core/examples/circom/anonAadhaar/aadhaar-verifier.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/constants.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/extractor.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/nullifier.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/LICENSE delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/bigint.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/bigint_func.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/fp.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/rsa.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/rsa/sha.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/helpers/signature.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/input.json delete mode 100644 mopro-core/examples/circom/anonAadhaar/package-lock.json delete mode 100644 mopro-core/examples/circom/anonAadhaar/package.json delete mode 100644 mopro-core/examples/circom/anonAadhaar/utils/array.circom delete mode 100644 mopro-core/examples/circom/anonAadhaar/utils/pack.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/README.md delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-1000k-1000k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-100k-100k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-1200k-1200k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-1600k-1600k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-200k-200k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-3200k-3200k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-400k-400k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit-800k-800k.circom delete mode 100644 mopro-core/examples/circom/complex-circuit/complex-circuit.circom.template delete mode 100644 mopro-core/examples/circom/complex-circuit/package-lock.json delete mode 100644 mopro-core/examples/circom/complex-circuit/package.json delete mode 100644 mopro-core/examples/circom/keccak256/README.md delete mode 100644 mopro-core/examples/circom/keccak256/keccak.circom delete mode 100644 mopro-core/examples/circom/keccak256/keccak256_256_test.circom delete mode 100644 mopro-core/examples/circom/keccak256/package-lock.json delete mode 100644 mopro-core/examples/circom/keccak256/package.json delete mode 100644 mopro-core/examples/circom/keccak256/permutations.circom delete mode 100644 mopro-core/examples/circom/keccak256/utils.circom delete mode 100644 mopro-core/examples/circom/multiplier2/.gitignore delete mode 100755 mopro-core/examples/circom/multiplier2/compile.sh delete mode 100644 mopro-core/examples/circom/multiplier2/target/multiplier2.r1cs delete mode 100644 mopro-core/examples/circom/multiplier2/target/multiplier2.sym delete mode 100644 mopro-core/examples/circom/multiplier2/target/multiplier2_js/generate_witness.js delete mode 100644 mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm delete mode 100644 mopro-core/examples/circom/multiplier2/target/multiplier2_js/witness_calculator.js delete mode 100644 mopro-core/examples/circom/rsa/.gitignore delete mode 100644 mopro-core/examples/circom/rsa/LICENSE delete mode 100644 mopro-core/examples/circom/rsa/README.md delete mode 100644 mopro-core/examples/circom/rsa/bigint.circom delete mode 100644 mopro-core/examples/circom/rsa/bigint_func.circom delete mode 100644 mopro-core/examples/circom/rsa/fp.circom delete mode 100644 mopro-core/examples/circom/rsa/input.json delete mode 100644 mopro-core/examples/circom/rsa/main.circom delete mode 100644 mopro-core/examples/circom/rsa/package-lock.json delete mode 100644 mopro-core/examples/circom/rsa/package.json delete mode 100644 mopro-core/examples/circom/rsa/rsa.circom delete mode 100755 mopro-core/examples/circom/scripts/build_complex_circuits.sh delete mode 100755 mopro-core/examples/circom/scripts/compile.sh delete mode 100755 mopro-core/examples/circom/scripts/generate_arkzkey.sh delete mode 100755 mopro-core/examples/circom/scripts/trusted_setup.sh delete mode 100644 mopro-core/examples/halo2/fibonacci/.gitignore delete mode 100644 mopro-core/examples/halo2/fibonacci/Cargo.toml delete mode 100644 mopro-core/examples/halo2/fibonacci/README.md delete mode 100644 mopro-core/examples/halo2/fibonacci/src/bin/fibonacci.rs delete mode 100644 mopro-core/examples/halo2/fibonacci/src/circuit.rs delete mode 100644 mopro-core/examples/halo2/fibonacci/src/io.rs delete mode 100644 mopro-core/examples/halo2/fibonacci/src/lib.rs delete mode 100644 mopro-core/examples/halo2/fibonacci/src/mopro.rs delete mode 100644 mopro-core/gpu_explorations/README.md delete mode 100644 mopro-core/gpu_explorations/benchmarks/arkworks_pippenger_benchmark.txt delete mode 100644 mopro-core/gpu_explorations/benchmarks/halo2curve_multicore_msm_benchmark.txt delete mode 100644 mopro-core/gpu_explorations/benchmarks/halo2curve_singlecore_msm_benchmark.txt delete mode 100644 mopro-core/gpu_explorations/benchmarks/metal_msm_benchmark.txt delete mode 100644 mopro-core/gpu_explorations/benchmarks/trapdoor_benchmark.txt delete mode 100644 mopro-core/src/middleware/circom/mod.rs delete mode 100644 mopro-core/src/middleware/circom/serialization.rs delete mode 100644 mopro-core/src/middleware/circom/utils.rs delete mode 100644 mopro-core/src/middleware/halo2/mod.rs delete mode 100644 mopro-core/src/middleware/halo2/serialisation.rs delete mode 100644 mopro-core/src/middleware/mod.rs delete mode 100644 mopro-ffi/.gitignore delete mode 100644 mopro-ffi/Cargo.toml delete mode 100644 mopro-ffi/Makefile delete mode 100644 mopro-ffi/README.md delete mode 100644 mopro-ffi/build.rs delete mode 100644 mopro-ffi/src/circom.rs delete mode 100644 mopro-ffi/src/halo2.rs delete mode 100644 mopro-ffi/src/lib.rs delete mode 100644 mopro-ffi/src/mopro.udl delete mode 100644 mopro-ffi/tests/bindings/test_mopro.kts delete mode 100644 mopro-ffi/tests/bindings/test_mopro.swift delete mode 100644 mopro-ffi/tests/bindings/test_mopro_gpu_benchmarks.swift delete mode 100644 mopro-ffi/tests/bindings/test_mopro_keccak.kts delete mode 100644 mopro-ffi/tests/bindings/test_mopro_keccak.swift delete mode 100644 mopro-ffi/tests/bindings/test_mopro_keccak_static.kts delete mode 100644 mopro-ffi/tests/bindings/test_mopro_keccak_static.swift delete mode 100644 mopro-ffi/tests/bindings/test_mopro_rsa.kts delete mode 100644 mopro-ffi/tests/bindings/test_mopro_rsa.swift delete mode 100644 mopro-ffi/tests/bindings/test_mopro_rsa_static.swift delete mode 100644 mopro-ffi/tests/test_generated_bindings.rs delete mode 100644 mopro-ffi/uniffi-bindgen.rs delete mode 100644 mopro-ffi/uniffi.toml rename {mopro-core => mopro-msm}/.gitignore (100%) create mode 100644 mopro-msm/Cargo.toml create mode 100644 mopro-msm/README.md create mode 100644 mopro-msm/benchmark_results/bucket_wise_msm_benchmark.txt create mode 100644 mopro-msm/benchmark_results/metal_msm_benchmark.txt rename {mopro-core => mopro-msm}/src/lib.rs (90%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/arkworks_pippenger.rs (95%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/bucket_wise_msm.rs (81%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/halo2curve_msm.rs (97%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/abstraction/errors.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/abstraction/limbs_conversion.rs (97%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/abstraction/mod.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/abstraction/mont_reduction.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/abstraction/state.rs (98%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/compile_metal.sh (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/mod.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/msm.rs (98%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/all.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/arithmetics/u128.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/arithmetics/u256.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/arithmetics/unsigned_int.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/curves/bn254.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/curves/ec_point.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/fields/fp_bn254.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/fields/fp_u256.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/bigint_to_hex.py (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/bn254_addchain.acc (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/mu.py (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/r_sqr_mod_n.py (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/r_sub_n.py (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/helper/requirements.txt (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/msm.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/msm.metallib (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/tests/test_bn254.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/shader/tests/test_unsigned_integer.h.metal (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/tests/mod.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/metal/tests/test_bn254.rs (99%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/mod.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/precompute_msm.rs (74%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/trapdoortech_zprize_msm/local_msm.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/trapdoortech_zprize_msm/mod.rs (96%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/utils/benchmark.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/utils/mod.rs (100%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/utils/precomputation.rs (98%) rename {mopro-core/src/middleware/gpu_explorations => mopro-msm/src/msm}/utils/preprocess.rs (99%) delete mode 100644 mopro-web/.gitignore delete mode 100644 mopro-web/LICENSE delete mode 100644 mopro-web/README.md delete mode 100644 mopro-web/babel.config.js delete mode 100644 mopro-web/blog/2024-04-24-first-blog-post.md delete mode 100644 mopro-web/docs/FAQ.md delete mode 100644 mopro-web/docs/circom/android.md delete mode 100644 mopro-web/docs/circom/configuration.md delete mode 100644 mopro-web/docs/circom/core-api.md delete mode 100644 mopro-web/docs/circom/ios.md delete mode 100644 mopro-web/docs/community.md delete mode 100644 mopro-web/docs/getting-started.md delete mode 100644 mopro-web/docs/halo2/configuration.md delete mode 100644 mopro-web/docs/halo2/introduction.md delete mode 100644 mopro-web/docs/intro.md delete mode 100644 mopro-web/docs/mopro-cli.md delete mode 100644 mopro-web/docs/mopro-core.md delete mode 100644 mopro-web/docs/mopro-ffi.md delete mode 100644 mopro-web/docs/performance.md delete mode 100644 mopro-web/docs/prerequisites.md delete mode 100644 mopro-web/docusaurus.config.ts delete mode 100644 mopro-web/package.json delete mode 100644 mopro-web/sidebars.ts delete mode 100644 mopro-web/src/components/HomepageFeatures/index.tsx delete mode 100644 mopro-web/src/components/HomepageFeatures/styles.module.css delete mode 100644 mopro-web/src/css/custom.css delete mode 100644 mopro-web/src/pages/index.module.css delete mode 100644 mopro-web/src/pages/index.tsx delete mode 100644 mopro-web/src/theme/prism-include-languages.js delete mode 100644 mopro-web/static/.nojekyll delete mode 100644 mopro-web/static/img/android-bindings.png delete mode 100644 mopro-web/static/img/architecture.png delete mode 100644 mopro-web/static/img/blue_angle.svg delete mode 100644 mopro-web/static/img/favicon.ico delete mode 100644 mopro-web/static/img/gold_arch.svg delete mode 100644 mopro-web/static/img/gold_leaf.svg delete mode 100644 mopro-web/static/img/link_arrow.svg delete mode 100644 mopro-web/static/img/logo_lg.svg delete mode 100644 mopro-web/static/img/logo_sm.svg delete mode 100644 mopro-web/static/img/logo_title.svg delete mode 100644 mopro-web/static/img/mobile.svg delete mode 100644 mopro-web/static/img/mopro_adapters_platforms.png delete mode 100644 mopro-web/static/img/mopro_architecture2.png delete mode 100644 mopro-web/static/img/red_angle.svg delete mode 100644 mopro-web/static/img/roadmap.png delete mode 100644 mopro-web/static/img/separator.svg delete mode 100644 mopro-web/static/img/yellow_drop.svg delete mode 100644 mopro-web/tsconfig.json delete mode 100644 mopro-web/yarn.lock delete mode 100644 research/gpu-exploration-app/core/circuits/.gitignore delete mode 100644 research/gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom delete mode 100644 research/gpu-exploration-app/core/src/lib.rs delete mode 100644 scripts/_prelude.sh delete mode 100755 scripts/cli/build_android.sh delete mode 100755 scripts/cli/build_core.sh delete mode 100755 scripts/cli/build_ios.sh delete mode 100644 scripts/cli/build_web.sh delete mode 100755 scripts/cli/install_deps.sh delete mode 100755 scripts/cli/prepare.sh delete mode 100755 scripts/cli/update.sh delete mode 100755 scripts/prepare.sh delete mode 100755 scripts/prepare_ci.sh delete mode 100644 templates/mopro-example-app/.gitignore delete mode 100644 templates/mopro-example-app/Cargo.toml delete mode 100644 templates/mopro-example-app/README.md delete mode 100644 templates/mopro-example-app/android/.gitignore delete mode 100644 templates/mopro-example-app/android/app/.gitignore delete mode 100644 templates/mopro-example-app/android/app/build.gradle.kts delete mode 100644 templates/mopro-example-app/android/app/proguard-rules.pro delete mode 100644 templates/mopro-example-app/android/app/src/androidTest/java/com/example/mopro/ExampleInstrumentedTest.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/AndroidManifest.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/KeccakComponent.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MainActivity.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MultiplierComponent.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Color.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Theme.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Type.kt delete mode 100644 templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 templates/mopro-example-app/android/app/src/main/res/values/colors.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/values/strings.xml delete mode 100644 templates/mopro-example-app/android/app/src/main/res/values/themes.xml delete mode 100644 templates/mopro-example-app/android/app/src/test/java/com/example/mopro/ExampleUnitTest.kt delete mode 100644 templates/mopro-example-app/android/build.gradle.kts delete mode 100644 templates/mopro-example-app/android/gradle.properties delete mode 100644 templates/mopro-example-app/android/settings.gradle.kts delete mode 100644 templates/mopro-example-app/core/Cargo.lock delete mode 100644 templates/mopro-example-app/core/Cargo.toml delete mode 100644 templates/mopro-example-app/core/circuits/.gitignore delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/.gitignore delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/Cargo.toml delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/README.md delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/src/bin/fibonacci.rs delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/src/circuit.rs delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/src/io.rs delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/src/lib.rs delete mode 100644 templates/mopro-example-app/core/circuits/halo2-fibonacci/src/mopro.rs delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/README.md delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/keccak.circom delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/keccak256_256_test.circom delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/package-lock.json delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/package.json delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/permutations.circom delete mode 100644 templates/mopro-example-app/core/circuits/keccak256/utils.circom delete mode 100644 templates/mopro-example-app/core/circuits/multiplier2/multiplier2.circom delete mode 100644 templates/mopro-example-app/core/src/lib.rs delete mode 100644 templates/mopro-example-app/ios/ExampleApp/.gitignore delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Bindings/mopro.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/ExampleAppApp.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Halo2FibonacciCircuitView.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/KeccakCircuitView.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/KeccakDylibCircuitView.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/MultiplierCircuitView.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleApp/Utils.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Frameworks/CircuitBindings.podspec delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Frameworks/LICENSE delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Frameworks/MoproBindings.podspec delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Info.plist delete mode 100644 templates/mopro-example-app/ios/ExampleApp/Podfile delete mode 100644 templates/mopro-example-app/mopro-config.toml delete mode 100644 templates/mopro-example-app/web/.eslintrc.json delete mode 100644 templates/mopro-example-app/web/.gitignore delete mode 100644 templates/mopro-example-app/web/README.md delete mode 100644 templates/mopro-example-app/web/next.config.js delete mode 100644 templates/mopro-example-app/web/package-lock.json delete mode 100644 templates/mopro-example-app/web/package.json delete mode 100644 templates/mopro-example-app/web/postcss.config.js delete mode 100644 templates/mopro-example-app/web/public/next.svg delete mode 100644 templates/mopro-example-app/web/public/vercel.svg delete mode 100644 templates/mopro-example-app/web/src/app/favicon.ico delete mode 100644 templates/mopro-example-app/web/src/app/footer.tsx delete mode 100644 templates/mopro-example-app/web/src/app/globals.css delete mode 100644 templates/mopro-example-app/web/src/app/inputs.json delete mode 100644 templates/mopro-example-app/web/src/app/layout.tsx delete mode 100644 templates/mopro-example-app/web/src/app/page.tsx delete mode 100644 templates/mopro-example-app/web/src/app/prove.tsx delete mode 100644 templates/mopro-example-app/web/tailwind.config.ts delete mode 100644 templates/mopro-example-app/web/tsconfig.json delete mode 100644 web-prover/.eslintrc.json delete mode 100644 web-prover/.gitignore delete mode 100644 web-prover/README.md delete mode 100644 web-prover/next.config.js delete mode 100644 web-prover/package-lock.json delete mode 100644 web-prover/package.json delete mode 100644 web-prover/postcss.config.js delete mode 100644 web-prover/public/next.svg delete mode 100644 web-prover/public/vercel.svg delete mode 100644 web-prover/src/app/favicon.ico delete mode 100644 web-prover/src/app/footer.tsx delete mode 100644 web-prover/src/app/globals.css delete mode 100644 web-prover/src/app/inputs.json delete mode 100644 web-prover/src/app/layout.tsx delete mode 100644 web-prover/src/app/page.tsx delete mode 100644 web-prover/src/app/prove.tsx delete mode 100644 web-prover/tailwind.config.ts delete mode 100644 web-prover/tsconfig.json diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index aa9c755..9a6864d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -17,124 +17,12 @@ env: jobs: # TODO: Add a job to run clippy lint: - runs-on: ubuntu-latest + runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Check formatting run: cargo fmt --all -- --check - - name: Check template formating - run: cd templates/mopro-example-app && cargo fmt --all -- --check - - test-cli: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: "1.77" - override: true - - name: Install circom - run: | - sudo wget -O ~/.cargo/bin/circom https://github.com/iden3/circom/releases/download/v2.1.9/circom-${{runner.os}}-amd64 - sudo chmod +x ~/.cargo/bin/circom - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - name: Install snarkjs - run: npm install -g snarkjs - - name: Install mopro-cli - run: (cd mopro-cli && cargo install --path .) - - name: Prepare CI for Core and FFI - run: ./scripts/prepare_ci.sh - - name: Use mopro-cli - run: | - export MOPRO_ROOT=$(PWD) # Export MOPRO_ROOT path - mopro deps # Install mopro dependencies - mopro init --platforms ios android # Initialize mopro-example-app - cd mopro-example-app - mopro prepare # Prepare your circuit artifacts - mopro build --platforms ios android # Build the project - mopro test # Run end-to-end test (in Rust only) - - name: Test the project for iOS - run: | - cd mopro-example-app/ios/ExampleApp - xcodebuild test -scheme ExampleApp -workspace ExampleApp.xcworkspace -destination "platform=iOS Simulator,OS=17.5,name=iPhone 15 Pro" -quiet - - name: Export bindings - run: | - export MOPRO_ROOT=$(PWD) # Export MOPRO_ROOT path - cd mopro-example-app - mopro export-bindings --platforms ios android --destination out - - test-core: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: "1.77" - override: true - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 - - name: Install circom - run: | - sudo wget -O ~/.cargo/bin/circom https://github.com/iden3/circom/releases/download/v2.1.9/circom-${{runner.os}}-amd64 - sudo chmod +x ~/.cargo/bin/circom - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - name: Install snarkjs - run: npm install -g snarkjs - - name: Prepare CI for Core and FFI - run: ./scripts/prepare_ci.sh - - name: Run circom tests - run: | - cd mopro-core - cargo test -- --nocapture - - name: Run halo2 tests - run: | - cd mopro-core - cargo test --features=halo2 --no-default-features -- --nocapture - test-ffi: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: "1.77" - override: true - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 - - name: Install circom - run: | - sudo wget -O ~/.cargo/bin/circom https://github.com/iden3/circom/releases/download/v2.1.9/circom-${{runner.os}}-amd64 - sudo chmod +x ~/.cargo/bin/circom - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - name: Install snarkjs - run: npm install -g snarkjs - - name: Prepare CI for Core and FFI - run: ./scripts/prepare_ci.sh - - name: Run FFI circom tests - # TODO: Fix this custom jar thing - run: | - cd mopro-ffi/ - curl -L https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar -o jna-5.13.0.jar - CLASSPATH=jna-5.13.0.jar cargo test -- --nocapture - - name: Run FFI halo2 tests - run: | - cd mopro-ffi/ - cargo test --features halo2 --no-default-features -- halo2 - gpu-benchmarks: runs-on: macos-latest steps: @@ -160,5 +48,5 @@ jobs: run: ./scripts/prepare_ci.sh - name: Run GPU Benchmarks tests run: | - cd mopro-core - cargo test --features=gpu-benchmarks test_msm_correctness -- --nocapture + cd mopro-msm + cargo test test_msm_correctness -- --nocapture diff --git a/.github/workflows/setup-macos.yml b/.github/workflows/setup-macos.yml index 5e4566d..af5b7fe 100644 --- a/.github/workflows/setup-macos.yml +++ b/.github/workflows/setup-macos.yml @@ -18,12 +18,6 @@ jobs: override: true - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.3 - - name: Install circom - run: | - sudo wget -O ~/.cargo/bin/circom https://github.com/iden3/circom/releases/download/v2.1.9/circom-macos-amd64 - sudo chmod +x ~/.cargo/bin/circom - - name: Prepare CI for Core and FFI - run: ./scripts/prepare_ci.sh - name: Build run: cargo build - name: Cache build @@ -32,5 +26,4 @@ jobs: key: ${{ github.sha }}-setup-macos path: | ~/.cargo - ./mopro-core/examples - + diff --git a/.github/workflows/setup-ubuntu.yml b/.github/workflows/setup-ubuntu.yml deleted file mode 100644 index b11183f..0000000 --- a/.github/workflows/setup-ubuntu.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Setup env - -on: - workflow_call: - -jobs: - setup-ubuntu: - runs-on: ubuntu-latest - env: - SCCACHE_GHA_ENABLED: "true" - RUSTC_WRAPPER: "sccache" - steps: - - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: "1.77" - override: true - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 - - name: Install circom - run: | - sudo wget -O ~/.cargo/bin/circom https://github.com/iden3/circom/releases/download/v2.1.9/circom-linux-amd64 - sudo chmod +x ~/.cargo/bin/circom - - name: Prepare CI for Core and FFI - run: ./scripts/prepare_ci.sh - - name: Build - run: cargo build - - name: Cache build - uses: actions/cache/save@v4 - with: - key: ${{ github.sha }}-setup-ubuntu - path: | - ~/.cargo - ./mopro-core/examples - diff --git a/.gitignore b/.gitignore index 73e36f1..1d553ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .vscode .DS_Store target/ -mopro-example-app -!templates/mopro-example-app +vectors/ graph.bin diff --git a/Cargo.lock b/Cargo.lock index 50e6401..1d01185 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -42,92 +42,23 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "alloy-rlp" -version = "0.3.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" dependencies = [ "arrayvec", "bytes", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - [[package]] name = "ark-bn254" version = "0.4.0" @@ -164,7 +95,7 @@ dependencies = [ "num-bigint", "num-traits", "thiserror", - "wasmer", + "wasmer 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -198,7 +129,7 @@ dependencies = [ "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", - "itertools", + "itertools 0.10.5", "num-traits", "rayon", "zeroize", @@ -234,7 +165,7 @@ dependencies = [ "ark-std 0.4.0", "derivative", "digest 0.10.7", - "itertools", + "itertools 0.10.5", "num-bigint", "num-traits", "paste", @@ -396,76 +327,12 @@ dependencies = [ "rayon", ] -[[package]] -name = "ark-zkey" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-circom", - "ark-ec", - "ark-ff 0.4.1", - "ark-groth16", - "ark-relations", - "ark-serialize 0.4.1", - "color-eyre", - "flame", - "flamer", - "memmap2 0.9.4", -] - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - [[package]] name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "askama" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" -dependencies = [ - "askama_derive", - "askama_escape", -] - -[[package]] -name = "askama_derive" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" -dependencies = [ - "askama_parser", - "basic-toml", - "mime", - "mime_guess", - "proc-macro2", - "quote", - "serde", - "syn 2.0.50", -] - -[[package]] -name = "askama_escape" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" - -[[package]] -name = "askama_parser" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" -dependencies = [ - "nom", -] - [[package]] name = "atty" version = "0.2.14" @@ -479,26 +346,26 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -517,27 +384,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64ct" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" - -[[package]] -name = "basic-toml" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" -dependencies = [ - "serde", -] - -[[package]] -name = "bincode" -version = "1.3.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bit-set" @@ -562,9 +411,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -587,33 +436,12 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -623,17 +451,11 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -663,12 +485,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" - [[package]] name = "byteorder" version = "1.4.3" @@ -677,43 +493,11 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" -dependencies = [ - "serde", -] - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.22", "serde", - "serde_json", - "thiserror", ] [[package]] @@ -724,9 +508,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.87" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" [[package]] name = "cfg-if" @@ -736,16 +520,11 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets", ] [[package]] @@ -759,46 +538,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "clap" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.0", -] - -[[package]] -name = "clap_derive" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.50", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - [[package]] name = "cobs" version = "0.2.3" @@ -842,36 +581,12 @@ dependencies = [ "tracing-error", ] -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "const-cstr" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6" - [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - [[package]] name = "core-foundation" version = "0.9.4" @@ -888,19 +603,6 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "core-graphics-types" version = "0.1.3" @@ -912,18 +614,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-text" -version = "19.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" -dependencies = [ - "core-foundation", - "core-graphics", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "corosensei" version = "0.1.4" @@ -1007,9 +697,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1022,11 +712,11 @@ checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ "atty", "cast", - "clap 2.34.0", + "clap", "criterion-plot", "csv", - "itertools", - "lazy_static 1.4.0", + "itertools 0.10.5", + "lazy_static", "num-traits", "oorandom", "plotters", @@ -1047,7 +737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -1071,9 +761,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1126,9 +816,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.119" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635179be18797d7e10edb9cd06c859580237750c7351f39ed9b298bfc17544ad" +checksum = "273dcfd3acd4e1e276af13ed2a43eea7001318823e7a726a6b3ed39b4acc0b82" dependencies = [ "cc", "cxxbridge-flags", @@ -1138,9 +828,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.119" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9324397d262f63ef77eb795d900c0d682a34a43ac0932bec049ed73055d52f63" +checksum = "d8b2766fbd92be34e9ed143898fce6c572dc009de39506ed6903e5a05b68914e" dependencies = [ "cc", "codespan-reporting", @@ -1148,100 +838,65 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] name = "cxxbridge-flags" -version = "1.0.119" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a87ff7342ffaa54b7c61618e0ce2bbcf827eba6d55b923b83d82551acbbecfe5" +checksum = "839fcd5e43464614ffaa989eaf1c139ef1f0c51672a1ed08023307fa1b909ccd" [[package]] name = "cxxbridge-macro" -version = "1.0.119" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b5b86cf65fa0626d85720619d80b288013477a91a0389fa8bc716bf4903ad1" +checksum = "4b2c1c1776b986979be68bb2285da855f8d8a35851a769fca8740df7c3d07877" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", -] - -[[package]] -name = "darling" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" -dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", + "syn 2.0.68", ] [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] - -[[package]] -name = "darling_core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn 2.0.50", -] - -[[package]] -name = "darling_macro" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" -dependencies = [ - "darling_core 0.10.2", - "quote", - "syn 1.0.109", + "syn 2.0.68", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ - "darling_core 0.20.8", + "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -1259,104 +914,37 @@ dependencies = [ ] [[package]] -name = "derive_builder" -version = "0.9.0" +name = "derive_more" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ - "darling 0.10.2", - "derive_builder_core", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.68", ] [[package]] -name = "derive_builder_core" +name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "darling 0.10.2", - "proc-macro2", - "quote", - "syn 1.0.109", + "generic-array", ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "dwrote" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" -dependencies = [ - "lazy_static 1.4.0", - "libc", - "winapi", - "wio", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -1373,9 +961,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -1437,10 +1025,10 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ - "darling 0.20.8", + "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] @@ -1451,9 +1039,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1471,7 +1059,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha3 0.10.8", + "sha3", "thiserror", "uint", ] @@ -1552,9 +1140,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fastrlp" @@ -1567,22 +1155,12 @@ dependencies = [ "bytes", ] -[[package]] -name = "fdeflate" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" -dependencies = [ - "simd-adler32", -] - [[package]] name = "ff" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -1599,86 +1177,12 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flame" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc2706461e1ee94f55cab2ed2e3d34ae9536cfa830358ef80acff1a3dacab30" -dependencies = [ - "lazy_static 0.2.11", - "serde", - "serde_derive", - "serde_json", - "thread-id", -] - -[[package]] -name = "flamer" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7693d9dd1ec1c54f52195dfe255b627f7cec7da33b679cd56de949e662b3db10" -dependencies = [ - "flame", - "quote", - "syn 2.0.50", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-ord" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "font-kit" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fe28504d371085fae9ac7a3450f0b289ab71e07c8e57baa3fb68b9e57d6ce5" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "core-foundation", - "core-graphics", - "core-text", - "dirs-next", - "dwrote", - "float-ord", - "freetype", - "lazy_static 1.4.0", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "walkdir", - "winapi", - "yeslogic-fontconfig-sys", -] - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -1686,7 +1190,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -1697,57 +1201,15 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "freetype" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a440748e063798e4893ceb877151e84acef9bea9a8c6800645cf3f1b3a7806e" -dependencies = [ - "freetype-sys", - "libc", -] - -[[package]] -name = "freetype-sys" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "funty" version = "2.0.0" @@ -1767,25 +1229,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", "wasi", ] -[[package]] -name = "gif" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gimli" version = "0.26.2" @@ -1803,23 +1255,6 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "goblin" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" -dependencies = [ - "log", - "plain", - "scroll", -] - [[package]] name = "group" version = "0.13.0" @@ -1833,55 +1268,9 @@ dependencies = [ [[package]] name = "half" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "halo2-circuit" -version = "0.1.0" -dependencies = [ - "halo2_proofs", - "plotters", - "rand", - "tabbycat", -] - -[[package]] -name = "halo2_proofs" -version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2?tag=v2023_04_20#be955686f86eb618f55d2320c0e042485b313d22" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2curves", - "plotters", - "rand_chacha", - "rand_core", - "rayon", - "sha3 0.9.1", - "tabbycat", - "tracing", -] - -[[package]] -name = "halo2curves" -version = "0.3.2" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves?tag=0.3.2#9f5c50810bbefe779ee5cf1d852b2fe85dc35d5e" -dependencies = [ - "ff", - "group", - "lazy_static 1.4.0", - "num-bigint", - "num-traits", - "pasta_curves", - "paste", - "rand", - "rand_core", - "static_assertions", - "subtle", -] +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hashbrown" @@ -1907,14 +1296,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -1955,49 +1344,12 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "jpeg-decoder", - "num-traits", - "png", -] - [[package]] name = "impl-codec" version = "0.6.0" @@ -2055,19 +1407,19 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2082,22 +1434,25 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.10" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] [[package]] -name = "jpeg-decoder" -version = "0.3.1" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2126,18 +1481,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" - -[[package]] -name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128" @@ -2147,9 +1493,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" @@ -2167,16 +1513,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.4.2", - "libc", -] - [[package]] name = "link-cplusplus" version = "1.0.9" @@ -2188,15 +1524,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "loupe" @@ -2228,6 +1564,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2239,9 +1584,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2252,15 +1597,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memmap2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" -dependencies = [ - "libc", -] - [[package]] name = "memoffset" version = "0.6.5" @@ -2276,57 +1612,26 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5637e166ea14be6063a3f8ba5ccb9a4159df7d8f6d61c02fc3d480b1f90dcfcb" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "block", "core-graphics-types", - "foreign-types 0.5.0", + "foreign-types", "log", "objc", "paste", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", - "simd-adler32", -] - -[[package]] -name = "mopro-cli" -version = "0.1.0" -dependencies = [ - "clap 4.5.1", - "fs_extra", ] [[package]] -name = "mopro-core" +name = "mopro-msm" version = "0.1.0" dependencies = [ "ark-bn254", @@ -2338,13 +1643,11 @@ dependencies = [ "ark-relations", "ark-serialize 0.4.1", "ark-std 0.4.0", - "ark-zkey", "color-eyre", "criterion", "enumset", - "halo2-circuit", - "halo2_proofs", "instant", + "itertools 0.13.0", "metal", "num-bigint", "objc", @@ -2356,44 +1659,17 @@ dependencies = [ "serde_derive", "serde_json", "thiserror", - "toml 0.8.10", - "wasmer", + "toml", + "wasmer 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "witness", ] -[[package]] -name = "mopro-ffi" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-serialize 0.4.1", - "bincode", - "color-eyre", - "criterion", - "halo2curves", - "mopro-core", - "num-bigint", - "serde", - "thiserror", - "uniffi", -] - [[package]] name = "more-asserts" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num" version = "0.4.0" @@ -2440,9 +1716,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2489,7 +1765,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] @@ -2528,24 +1804,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "oneshot-uniffi" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c548d5c78976f6955d72d0ced18c48ca07030f7a1d4024529fedd7c1c01b29c" - [[package]] name = "oorandom" version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "open-fastrlp" version = "0.1.4" @@ -2579,9 +1843,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec", @@ -2593,61 +1857,27 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "lazy_static 1.4.0", - "rand", - "static_assertions", - "subtle", -] - [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf45976c56919841273f2a0fc684c28437e2f304e264557d9c72be5d5a718be" -dependencies = [ - "rustc_version 0.4.0", -] +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pest" -version = "2.7.8" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -2656,9 +1886,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pkcs8" @@ -2670,77 +1900,34 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" dependencies = [ - "chrono", - "font-kit", - "image", - "lazy_static 1.4.0", "num-traits", - "pathfinder_geometry", "plotters-backend", - "plotters-bitmap", "plotters-svg", - "ttf-parser", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" - -[[package]] -name = "plotters-bitmap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cebbe1f70205299abc69e8b295035bb52a6a70ee35474ad10011f0a4efb8543" -dependencies = [ - "gif", - "image", - "plotters-backend", -] +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" dependencies = [ "plotters-backend", ] -[[package]] -name = "png" -version = "0.17.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - [[package]] name = "postcard" version = "1.0.8" @@ -2784,11 +1971,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.20.7", + "toml_edit 0.21.1", ] [[package]] @@ -2817,23 +2004,23 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.2", - "lazy_static 1.4.0", + "bitflags 2.6.0", + "lazy_static", "num-traits", "rand", "rand_chacha", @@ -2872,9 +2059,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -2926,9 +2113,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2944,23 +2131,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - [[package]] name = "regalloc" version = "0.0.34" @@ -2974,9 +2144,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -2986,9 +2156,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -2997,20 +2167,20 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "region" -version = "3.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" dependencies = [ "bitflags 1.3.2", "libc", - "mach", - "winapi", + "mach2", + "windows-sys 0.52.0", ] [[package]] @@ -3108,15 +2278,15 @@ dependencies = [ [[package]] name = "ruint-macro" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3145,16 +2315,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3163,9 +2333,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -3181,9 +2351,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3196,9 +2366,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" dependencies = [ "cfg-if", "derive_more", @@ -3208,11 +2378,11 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 1.0.109", @@ -3230,26 +2400,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" -[[package]] -name = "scroll" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" -dependencies = [ - "scroll_derive", -] - -[[package]] -name = "scroll_derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.50", -] - [[package]] name = "seahash" version = "4.1.0" @@ -3281,12 +2431,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" -dependencies = [ - "serde", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -3308,9 +2455,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] @@ -3333,14 +2480,14 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3349,9 +2496,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -3367,18 +2514,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - [[package]] name = "sha3" version = "0.10.8" @@ -3395,7 +2530,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "lazy_static 1.4.0", + "lazy_static", ] [[package]] @@ -3408,35 +2543,17 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - [[package]] name = "simdutf8" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "smallvec" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" - -[[package]] -name = "spin" -version = "0.5.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spki" @@ -3460,18 +2577,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - -[[package]] -name = "strsim" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" - [[package]] name = "strum" version = "0.24.1" @@ -3496,9 +2601,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3513,26 +2618,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "tabbycat" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c45590f0f859197b4545be1b17b2bc3cc7bb075f7d1cc0ea1dc6521c0bf256a3" -dependencies = [ - "anyhow", - "derive_builder", - "regex", -] - [[package]] name = "tap" version = "1.0.1" @@ -3547,9 +2641,9 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -3595,17 +2689,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "thread-id" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" -dependencies = [ - "libc", - "redox_syscall", - "winapi", -] - [[package]] name = "thread_local" version = "1.1.8" @@ -3637,9 +2720,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -3652,30 +2735,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.6", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -3686,33 +2760,33 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.2", + "winnow 0.6.13", ] [[package]] @@ -3735,7 +2809,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] @@ -3778,12 +2852,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "ttf-parser" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" - [[package]] name = "typenum" version = "1.17.0" @@ -3814,15 +2882,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-ident" version = "1.0.12" @@ -3831,9 +2890,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -3841,149 +2900,11 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" -[[package]] -name = "uniffi" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21345172d31092fd48c47fd56c53d4ae9e41c4b1f559fb8c38c1ab1685fd919f" -dependencies = [ - "anyhow", - "camino", - "clap 4.5.1", - "uniffi_bindgen", - "uniffi_build", - "uniffi_core", - "uniffi_macros", -] - -[[package]] -name = "uniffi_bindgen" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd992f2929a053829d5875af1eff2ee3d7a7001cb3b9a46cc7895f2caede6940" -dependencies = [ - "anyhow", - "askama", - "camino", - "cargo_metadata", - "clap 4.5.1", - "fs-err", - "glob", - "goblin", - "heck", - "once_cell", - "paste", - "serde", - "toml 0.5.11", - "uniffi_meta", - "uniffi_testing", - "uniffi_udl", -] - -[[package]] -name = "uniffi_build" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001964dd3682d600084b3aaf75acf9c3426699bc27b65e96bb32d175a31c74e9" -dependencies = [ - "anyhow", - "camino", - "uniffi_bindgen", -] - -[[package]] -name = "uniffi_checksum_derive" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55137c122f712d9330fd985d66fa61bdc381752e89c35708c13ce63049a3002c" -dependencies = [ - "quote", - "syn 2.0.50", -] - -[[package]] -name = "uniffi_core" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6121a127a3af1665cd90d12dd2b3683c2643c5103281d0fed5838324ca1fad5b" -dependencies = [ - "anyhow", - "bytes", - "camino", - "log", - "once_cell", - "oneshot-uniffi", - "paste", - "static_assertions", -] - -[[package]] -name = "uniffi_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cf7a58f101fcedafa5b77ea037999b88748607f0ef3a33eaa0efc5392e92e4" -dependencies = [ - "bincode", - "camino", - "fs-err", - "once_cell", - "proc-macro2", - "quote", - "serde", - "syn 2.0.50", - "toml 0.5.11", - "uniffi_build", - "uniffi_meta", -] - -[[package]] -name = "uniffi_meta" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dc8573a7b1ac4b71643d6da34888273ebfc03440c525121f1b3634ad3417a2" -dependencies = [ - "anyhow", - "bytes", - "siphasher", - "uniffi_checksum_derive", -] - -[[package]] -name = "uniffi_testing" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118448debffcb676ddbe8c5305fb933ab7e0123753e659a71dc4a693f8d9f23c" -dependencies = [ - "anyhow", - "camino", - "cargo_metadata", - "fs-err", - "once_cell", -] - -[[package]] -name = "uniffi_udl" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "889edb7109c6078abe0e53e9b4070cf74a6b3468d141bdf5ef1bd4d1dc24a1c3" -dependencies = [ - "anyhow", - "uniffi_meta", - "uniffi_testing", - "weedle2", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - [[package]] name = "uuid" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" [[package]] name = "valuable" @@ -4008,9 +2929,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -4024,9 +2945,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4034,24 +2955,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4059,32 +2980,59 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-encoder" -version = "0.200.0" +version = "0.212.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e3fb0c8fbddd78aa6095b850dfeedbc7506cf5f81e633f69cf8f2333ab84b9" +checksum = "501940df4418b8929eb6d52f1aade1fdd15a5b86c92453cb696e3c906bd3fc33" dependencies = [ "leb128", ] +[[package]] +name = "wasmer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +dependencies = [ + "cfg-if", + "indexmap 1.9.3", + "js-sys", + "loupe", + "more-asserts", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasmer-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-compiler-cranelift 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-derive 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine-dylib 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine-universal 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-vm 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wat", + "winapi", +] + [[package]] name = "wasmer" version = "2.3.0" @@ -4098,19 +3046,32 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-compiler-cranelift", - "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", - "wasmer-types", - "wasmer-vm", + "wasmer-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-compiler-cranelift 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-derive 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine-dylib 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine-universal 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-vm 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "wat", "winapi", ] +[[package]] +name = "wasmer-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" +dependencies = [ + "enumset", + "loupe", + "thiserror", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmer-artifact" version = "2.3.0" @@ -4119,8 +3080,26 @@ dependencies = [ "enumset", "loupe", "thiserror", - "wasmer-compiler", - "wasmer-types", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", +] + +[[package]] +name = "wasmer-compiler" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +dependencies = [ + "enumset", + "loupe", + "rkyv", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon", + "thiserror", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser", ] [[package]] @@ -4136,10 +3115,30 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror", - "wasmer-types", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "wasmparser", ] +[[package]] +name = "wasmer-compiler-cranelift" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.2", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmer-compiler-cranelift" version = "2.3.0" @@ -4155,8 +3154,20 @@ dependencies = [ "smallvec", "target-lexicon", "tracing", - "wasmer-compiler", - "wasmer-types", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", +] + +[[package]] +name = "wasmer-derive" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -4170,6 +3181,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "wasmer-engine" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" +dependencies = [ + "backtrace", + "enumset", + "lazy_static", + "loupe", + "memmap2", + "more-asserts", + "rustc-demangle", + "serde", + "serde_bytes", + "target-lexicon", + "thiserror", + "wasmer-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-vm 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmer-engine" version = "2.3.0" @@ -4177,19 +3211,45 @@ source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3a dependencies = [ "backtrace", "enumset", - "lazy_static 1.4.0", + "lazy_static", "loupe", - "memmap2 0.5.10", + "memmap2", "more-asserts", "rustc-demangle", "serde", "serde_bytes", "target-lexicon", "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", + "wasmer-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-vm 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", +] + +[[package]] +name = "wasmer-engine-dylib" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" +dependencies = [ + "cfg-if", + "enum-iterator", + "enumset", + "leb128", + "libloading", + "loupe", + "object 0.28.4", + "rkyv", + "serde", + "tempfile", + "tracing", + "wasmer-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-object 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-vm 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "which", ] [[package]] @@ -4208,15 +3268,35 @@ dependencies = [ "serde", "tempfile", "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", + "wasmer-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-object 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-vm 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "which", ] +[[package]] +name = "wasmer-engine-universal" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" +dependencies = [ + "cfg-if", + "enumset", + "leb128", + "loupe", + "region", + "rkyv", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-engine-universal-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-vm 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi", +] + [[package]] name = "wasmer-engine-universal" version = "2.3.0" @@ -4228,14 +3308,30 @@ dependencies = [ "loupe", "region", "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-engine-universal-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-vm 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "winapi", ] +[[package]] +name = "wasmer-engine-universal-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" +dependencies = [ + "enum-iterator", + "enumset", + "loupe", + "rkyv", + "thiserror", + "wasmer-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmer-engine-universal-artifact" version = "2.3.0" @@ -4246,9 +3342,21 @@ dependencies = [ "loupe", "rkyv", "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", + "wasmer-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", +] + +[[package]] +name = "wasmer-object" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" +dependencies = [ + "object 0.28.4", + "thiserror", + "wasmer-compiler 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4258,8 +3366,24 @@ source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3a dependencies = [ "object 0.28.4", "thiserror", - "wasmer-compiler", - "wasmer-types", + "wasmer-compiler 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", +] + +[[package]] +name = "wasmer-types" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +dependencies = [ + "backtrace", + "enum-iterator", + "indexmap 1.9.3", + "loupe", + "more-asserts", + "rkyv", + "serde", + "thiserror", ] [[package]] @@ -4277,6 +3401,34 @@ dependencies = [ "thiserror", ] +[[package]] +name = "wasmer-vm" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "enum-iterator", + "indexmap 1.9.3", + "lazy_static", + "libc", + "loupe", + "mach", + "memoffset", + "more-asserts", + "region", + "rkyv", + "scopeguard", + "serde", + "thiserror", + "wasmer-artifact 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmer-types 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi", +] + [[package]] name = "wasmer-vm" version = "2.3.0" @@ -4288,7 +3440,7 @@ dependencies = [ "corosensei", "enum-iterator", "indexmap 1.9.3", - "lazy_static 1.4.0", + "lazy_static", "libc", "loupe", "mach", @@ -4299,8 +3451,8 @@ dependencies = [ "scopeguard", "serde", "thiserror", - "wasmer-artifact", - "wasmer-types", + "wasmer-artifact 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", + "wasmer-types 2.3.0 (git+https://github.com/oskarth/wasmer.git?rev=09c7070)", "winapi", ] @@ -4312,9 +3464,9 @@ checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wast" -version = "200.0.0" +version = "212.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1810d14e6b03ebb8fb05eef4009ad5749c989b65197d83bce7de7172ed91366" +checksum = "4606a05fb0aae5d11dd7d8280a640d88a63ee019360ba9be552da3d294b8d1f5" dependencies = [ "bumpalo", "leb128", @@ -4325,38 +3477,23 @@ dependencies = [ [[package]] name = "wat" -version = "1.200.0" +version = "1.212.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776cbd10e217f83869beaa3f40e312bb9e91d5eee29bbf6f560db1261b6a4c3d" +checksum = "c74ca7f93f11a5d6eed8499f2a8daaad6e225cab0151bc25a091fff3b987532f" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "weedle2" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e79c5206e1f43a2306fd64bdb95025ee4228960f2e6c5a8b173f3caaf807741" -dependencies = [ - "nom", -] - -[[package]] -name = "weezl" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" - [[package]] name = "which" version = "4.4.2" @@ -4387,11 +3524,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4400,15 +3537,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.33.0" @@ -4433,24 +3561,25 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.52.3", - "windows_i686_gnu 0.52.3", - "windows_i686_msvc 0.52.3", - "windows_x86_64_gnu 0.52.3", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.52.3", + "windows_x86_64_msvc 0.52.5", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -4460,9 +3589,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -4472,9 +3601,15 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -4484,9 +3619,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -4496,15 +3631,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -4514,9 +3649,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -4529,22 +3664,13 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.2" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - [[package]] name = "witness" version = "0.2.0" @@ -4574,43 +3700,31 @@ dependencies = [ "tap", ] -[[package]] -name = "yeslogic-fontconfig-sys" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bbd69036d397ebbff671b1b8e4d918610c181c5a16073b96f984a38d08c386" -dependencies = [ - "const-cstr", - "dlib", - "once_cell", - "pkg-config", -] - [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -4623,5 +3737,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.68", ] diff --git a/Cargo.toml b/Cargo.toml index 8442e18..f83cdb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,4 @@ [workspace] -members = ["mopro-core", "mopro-ffi", "mopro-cli", "ark-zkey"] +members = ["mopro-msm"] resolver = "2" -exclude = ["mopro-example-app"] - -[patch.crates-io] -# NOTE: Forked wasmer to work around memory limits -# See https://github.com/wasmerio/wasmer/commit/09c7070 -wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } +exclude = ["mopro-example-app"] \ No newline at end of file diff --git a/LICENSE-APACHE b/LICENSE-APACHE deleted file mode 100644 index 261eeb9..0000000 --- a/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT deleted file mode 100644 index 832c1c0..0000000 --- a/LICENSE-MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 oskarth - -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/README.md b/README.md index fcb64da..7e1a753 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# mopro +# mopro msm gpu-acceleration -Mopro is a toolkit for ZK app development on mobile. Mopro makes client-side proving on mobile simple. +We are researching the methods and implement the methods that can accelerate multi-scalar multiplication (MSM) on IOS mobile device. -For an overview of Mopro, please see [overview](https://zkmopro.org/docs/intro). +## mopro-msm -To get started, please see [getting started](https://zkmopro.org/docs/getting-started). +This is the crate that possess various of implementation of MSM functions, which are integrated in `mopro-core`. -(The website is a WIP; if above links don't work, please see [docs folder](https://github.com/zkmopro/mopro/tree/main/mopro-web/docs)). \ No newline at end of file +## gpu-exploration-app + +This is a benchmark app to compare the performance of different algorithm on IOS device. diff --git a/ark-zkey/.gitignore b/ark-zkey/.gitignore deleted file mode 100644 index 6985cf1..0000000 --- a/ark-zkey/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb diff --git a/ark-zkey/Cargo.toml b/ark-zkey/Cargo.toml deleted file mode 100644 index f9f0829..0000000 --- a/ark-zkey/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "ark-zkey" -version = "0.1.0" -edition = "2021" -description = "Library to read zkey faster by serializing to arkworks friendly format." -license = "MIT OR Apache-2.0" -repository = "https://github.com/zkmopro/mopro" -documentation = "https://zkmopro.org/" -homepage = "https://zkmopro.org/" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "arkzkey-util" -path = "src/bin/arkzkey_util.rs" - -[dependencies] -color-eyre = "0.6" -memmap2 = "0.9" -flame = "0.2" -flamer = "0.5" - -ark-serialize = { version = "=0.4.1", features = ["derive"] } -ark-bn254 = { version = "=0.4.0" } -ark-groth16 = { version = "=0.4.0" } -ark-circom = { git = "https://github.com/vimwitch/circom-compat.git", version = "0.1.0" } -ark-relations = { version = "=0.4.0" } -ark-ff = { version = "=0.4.1" } -ark-ec = { version = "=0.4.1" } diff --git a/ark-zkey/LICENSE-APACHE b/ark-zkey/LICENSE-APACHE deleted file mode 100644 index 261eeb9..0000000 --- a/ark-zkey/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/ark-zkey/LICENSE-MIT b/ark-zkey/LICENSE-MIT deleted file mode 100644 index 832c1c0..0000000 --- a/ark-zkey/LICENSE-MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 oskarth - -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/ark-zkey/README.md b/ark-zkey/README.md deleted file mode 100644 index 0dc8767..0000000 --- a/ark-zkey/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# ark-zkey - -Library to read `zkey` faster by serializing to `arkworks` friendly format. - -See https://github.com/zkmopro/mopro/issues/25 for context. - -## How to use - -Run the following to convert a `zkey` to an `arkzkey`. This should be done as a pre-processing step. - -`cargo run --bin arkzkey-util --release -- ../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.zkey` - -This will generate and place an `arkzkey` file in the same directory as the original zkey. - -You can also install it locally: - -`cargo install --bin arkzkey-util --path . --release` - -## Tests - -``` -cargo test multiplier2 --release -- --nocapture -cargo test keccak256 --release -- --nocapture -cargo test rsa --release -- --nocapture -``` - -## Benchmark (Keccak) - -`cargo test keccak256 --release -- --nocapture` - -``` -[build] Processing zkey data... -test tests::test_keccak256_serialization_deserialization has been running for over 60 seconds -[build]Time to process zkey data: 158.753181958s -[build] Serializing proving key and constraint matrices -[build] Time to serialize proving key and constraint matrices: 42ns -[build] Writing arkzkey to: ../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.arkzkey -[build] Time to write arkzkey: 16.204274125s -Reading arkzkey from: ../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.arkzkey -Time to open arkzkey file: 51.75µs -Time to mmap arkzkey: 17.25µs -Time to deserialize proving key: 18.323550083s -Time to deserialize matrices: 46.935792ms -Time to read arkzkey: 18.3730695s -test tests::test_keccak256_serialization_deserialization ... ok -``` - -Vs naive: - -`[build] Time to process zkey data: 158.753181958s` - -**Result: 18s vs 158s** \ No newline at end of file diff --git a/ark-zkey/src/bin/arkzkey_util.rs b/ark-zkey/src/bin/arkzkey_util.rs deleted file mode 100644 index 130a93a..0000000 --- a/ark-zkey/src/bin/arkzkey_util.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::env; -use std::path::{Path, PathBuf}; - -extern crate ark_zkey; -use ark_zkey::{convert_zkey, read_proving_key_and_matrices_from_zkey}; - -fn main() -> color_eyre::eyre::Result<()> { - color_eyre::install()?; - - let args: Vec = env::args().collect(); - if args.len() != 2 { - eprintln!("Usage: zkey_to_arkzkey "); - std::process::exit(1); - } - - let zkey_path = &args[1]; - let (proving_key, constraint_matrices) = read_proving_key_and_matrices_from_zkey(zkey_path)?; - - let arkzkey_path = get_arkzkey_path(zkey_path); - let arkzkey_path_str = arkzkey_path - .to_str() - .ok_or_else(|| color_eyre::eyre::eyre!("Failed to convert arkzkey path to string"))?; - - convert_zkey(proving_key, constraint_matrices, &arkzkey_path_str)?; - - println!("Converted zkey file saved to: {}", arkzkey_path.display()); - - Ok(()) -} - -fn get_arkzkey_path(zkey_path: &str) -> PathBuf { - let path = Path::new(zkey_path); - let mut arkzkey_path = path.to_path_buf(); - arkzkey_path.set_extension("arkzkey"); - arkzkey_path -} diff --git a/ark-zkey/src/lib.rs b/ark-zkey/src/lib.rs deleted file mode 100644 index b849f7a..0000000 --- a/ark-zkey/src/lib.rs +++ /dev/null @@ -1,270 +0,0 @@ -use ark_bn254::{Bn254, Fr}; -use ark_circom::read_zkey; -//use ark_ec::pairing::Pairing; -use ark_ff::Field; -use ark_groth16::ProvingKey; -//use ark_groth16::VerifyingKey; -use ark_relations::r1cs::ConstraintMatrices; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; -use color_eyre::eyre::{Result, WrapErr}; -use memmap2::Mmap; -use std::fs::File; -//use std::io::Cursor; -//use std::io::{Read,self}; -use std::io::BufReader; -use std::path::PathBuf; -use std::time::Instant; - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug, PartialEq)] -pub struct SerializableProvingKey(pub ProvingKey); - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug, PartialEq)] -pub struct SerializableMatrix { - pub data: Vec>, -} - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug, PartialEq)] -pub struct SerializableConstraintMatrices { - pub num_instance_variables: usize, - pub num_witness_variables: usize, - pub num_constraints: usize, - pub a_num_non_zero: usize, - pub b_num_non_zero: usize, - pub c_num_non_zero: usize, - pub a: SerializableMatrix, - pub b: SerializableMatrix, - pub c: SerializableMatrix, -} - -impl From>> for SerializableMatrix { - fn from(matrix: Vec>) -> Self { - SerializableMatrix { data: matrix } - } -} - -impl From> for Vec> { - fn from(serializable_matrix: SerializableMatrix) -> Self { - serializable_matrix.data - } -} - -pub fn serialize_proving_key(pk: &SerializableProvingKey) -> Vec { - let mut serialized_data = Vec::new(); - pk.serialize_compressed(&mut serialized_data) - .expect("Serialization failed"); - serialized_data -} - -pub fn deserialize_proving_key(data: Vec) -> SerializableProvingKey { - SerializableProvingKey::deserialize_compressed_unchecked(&mut &data[..]) - .expect("Deserialization failed") -} - -pub fn read_arkzkey(arkzkey_path: &str) -> Result<(ProvingKey, ConstraintMatrices)> { - let now = std::time::Instant::now(); - let arkzkey_file_path = PathBuf::from(arkzkey_path); - let arkzkey_file = File::open(arkzkey_file_path).wrap_err("Failed to open arkzkey file")?; - println!("Time to open arkzkey file: {:?}", now.elapsed()); - - //let mut buf_reader = BufReader::new(arkzkey_file); - - // Using mmap - let now = std::time::Instant::now(); - let mmap = unsafe { Mmap::map(&arkzkey_file)? }; - let mut cursor = std::io::Cursor::new(mmap); - println!("Time to mmap arkzkey: {:?}", now.elapsed()); - - // Was &mut buf_reader - let now = std::time::Instant::now(); - let serialized_proving_key = - SerializableProvingKey::deserialize_compressed_unchecked(&mut cursor) - .wrap_err("Failed to deserialize proving key")?; - println!("Time to deserialize proving key: {:?}", now.elapsed()); - - let now = std::time::Instant::now(); - let serialized_constraint_matrices = - SerializableConstraintMatrices::deserialize_compressed_unchecked(&mut cursor) - .wrap_err("Failed to deserialize constraint matrices")?; - println!("Time to deserialize matrices: {:?}", now.elapsed()); - - let proving_key: ProvingKey = serialized_proving_key.0; - let constraint_matrices: ConstraintMatrices = ConstraintMatrices { - num_instance_variables: serialized_constraint_matrices.num_instance_variables, - num_witness_variables: serialized_constraint_matrices.num_witness_variables, - num_constraints: serialized_constraint_matrices.num_constraints, - a_num_non_zero: serialized_constraint_matrices.a_num_non_zero, - b_num_non_zero: serialized_constraint_matrices.b_num_non_zero, - c_num_non_zero: serialized_constraint_matrices.c_num_non_zero, - a: serialized_constraint_matrices.a.data, - b: serialized_constraint_matrices.b.data, - c: serialized_constraint_matrices.c.data, - }; - - Ok((proving_key, constraint_matrices)) -} - -pub fn read_arkzkey_from_bytes( - arkzkey_bytes: &[u8], -) -> Result<(ProvingKey, ConstraintMatrices)> { - let mut cursor = std::io::Cursor::new(arkzkey_bytes); - - let now = std::time::Instant::now(); - let serialized_proving_key = - SerializableProvingKey::deserialize_compressed_unchecked(&mut cursor) - .wrap_err("Failed to deserialize proving key")?; - println!("Time to deserialize proving key: {:?}", now.elapsed()); - - let now = std::time::Instant::now(); - let serialized_constraint_matrices = - SerializableConstraintMatrices::deserialize_compressed_unchecked(&mut cursor) - .wrap_err("Failed to deserialize constraint matrices")?; - println!("Time to deserialize matrices: {:?}", now.elapsed()); - - // Get on right form for API - let proving_key: ProvingKey = serialized_proving_key.0; - let constraint_matrices: ConstraintMatrices = ConstraintMatrices { - num_instance_variables: serialized_constraint_matrices.num_instance_variables, - num_witness_variables: serialized_constraint_matrices.num_witness_variables, - num_constraints: serialized_constraint_matrices.num_constraints, - a_num_non_zero: serialized_constraint_matrices.a_num_non_zero, - b_num_non_zero: serialized_constraint_matrices.b_num_non_zero, - c_num_non_zero: serialized_constraint_matrices.c_num_non_zero, - a: serialized_constraint_matrices.a.data, - b: serialized_constraint_matrices.b.data, - c: serialized_constraint_matrices.c.data, - }; - - Ok((proving_key, constraint_matrices)) -} - -pub fn read_proving_key_and_matrices_from_zkey( - zkey_path: &str, -) -> Result<(SerializableProvingKey, SerializableConstraintMatrices)> { - println!("Reading zkey from: {}", zkey_path); - let now = Instant::now(); - let zkey_file_path = PathBuf::from(zkey_path); - let zkey_file = File::open(zkey_file_path).wrap_err("Failed to open zkey file")?; - - let mut buf_reader = BufReader::new(zkey_file); - - let (proving_key, matrices) = - read_zkey(&mut buf_reader).wrap_err("Failed to read zkey file")?; - println!("Time to read zkey: {:?}", now.elapsed()); - - println!("Serializing proving key and constraint matrices"); - let now = Instant::now(); - let serializable_proving_key = SerializableProvingKey(proving_key); - let serializable_constrain_matrices = SerializableConstraintMatrices { - num_instance_variables: matrices.num_instance_variables, - num_witness_variables: matrices.num_witness_variables, - num_constraints: matrices.num_constraints, - a_num_non_zero: matrices.a_num_non_zero, - b_num_non_zero: matrices.b_num_non_zero, - c_num_non_zero: matrices.c_num_non_zero, - a: SerializableMatrix { data: matrices.a }, - b: SerializableMatrix { data: matrices.b }, - c: SerializableMatrix { data: matrices.c }, - }; - println!( - "Time to serialize proving key and constraint matrices: {:?}", - now.elapsed() - ); - - Ok((serializable_proving_key, serializable_constrain_matrices)) -} - -pub fn convert_zkey( - proving_key: SerializableProvingKey, - constraint_matrices: SerializableConstraintMatrices, - arkzkey_path: &str, -) -> Result<()> { - let arkzkey_file_path = PathBuf::from(arkzkey_path); - - let serialized_path = PathBuf::from(arkzkey_file_path); - - let mut file = - File::create(&serialized_path).wrap_err("Failed to create serialized proving key file")?; - - proving_key - .serialize_compressed(&mut file) - .wrap_err("Failed to serialize proving key")?; - - constraint_matrices - .serialize_compressed(&mut file) - .wrap_err("Failed to serialize constraint matrices")?; - - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - use std::time::Instant; - - fn test_circuit_serialization_deserialization(zkey_path: &str) -> Result<()> { - let arkzkey_path = zkey_path.replace(".zkey", ".arkzkey"); - - let (original_proving_key, original_constraint_matrices) = - read_proving_key_and_matrices_from_zkey(zkey_path)?; - - println!("[build] Writing arkzkey to: {}", arkzkey_path); - let now = Instant::now(); - convert_zkey( - original_proving_key.clone(), - original_constraint_matrices.clone(), - &arkzkey_path, - )?; - println!("[build] Time to write arkzkey: {:?}", now.elapsed()); - - println!("Reading arkzkey from: {}", arkzkey_path); - let now = Instant::now(); - let (deserialized_proving_key, deserialized_constraint_matrices) = - read_arkzkey(&arkzkey_path)?; - println!("Time to read arkzkey: {:?}", now.elapsed()); - - assert_eq!( - original_proving_key.0, deserialized_proving_key, - "Original and deserialized proving keys do not match" - ); - - let original_deserialized_constraint_matrices: ConstraintMatrices = - ConstraintMatrices { - num_instance_variables: original_constraint_matrices.num_instance_variables, - num_witness_variables: original_constraint_matrices.num_witness_variables, - num_constraints: original_constraint_matrices.num_constraints, - a_num_non_zero: original_constraint_matrices.a_num_non_zero, - b_num_non_zero: original_constraint_matrices.b_num_non_zero, - c_num_non_zero: original_constraint_matrices.c_num_non_zero, - a: original_constraint_matrices.a.data, - b: original_constraint_matrices.b.data, - c: original_constraint_matrices.c.data, - }; - assert_eq!( - original_deserialized_constraint_matrices, deserialized_constraint_matrices, - "Original and deserialized constraint matrices do not match" - ); - - Ok(()) - } - - #[test] - fn test_multiplier2_serialization_deserialization() -> Result<()> { - test_circuit_serialization_deserialization( - "../mopro-core/examples/circom/multiplier2/target/multiplier2_final.zkey", - ) - } - - #[test] - fn test_keccak256_serialization_deserialization() -> Result<()> { - test_circuit_serialization_deserialization( - "../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.zkey", - ) - } - - #[test] - fn test_rsa_serialization_deserialization() -> Result<()> { - test_circuit_serialization_deserialization( - "../mopro-core/examples/circom/rsa/target/main_final.zkey", - ) - } -} diff --git a/config-example.toml b/config-example.toml deleted file mode 100644 index 63fd570..0000000 --- a/config-example.toml +++ /dev/null @@ -1,28 +0,0 @@ -# config-example.toml - -[build] -# For iOS device_type can be x86_64, simulator, device -ios_device_type = "simulator" # Options: x86_64, simulator, device -# For Android device_type can be x86_64, x86, arm, arm64 -android_device_type = "arm64" # Options: x86_64, x86, arm, arm64 - -# debug is for Rust library to be in debug mode and release for release mode -# We recommend release mode by default for performance -build_mode = "release" # Options: debug, release - -[circuit] -adapter = "circom" # Proving system options: circom (default), halo2 -dir = "mopro-core/examples/circom/keccak256" # Directory of the circuit -name = "keccak256_256_test" # Name of the circuit - -[dylib] -# NOTE: Dylib support is experimental and requires some fiddling in iOS -# See https://github.com/zkmopro/mopro/pull/37 and https://github.com/zkmopro/mopro/pull/38 -use_dylib = false # Options: true, false -name = "keccak256.dylib" # Name of the dylib file, only used if use_dylib is true - -[witness] -# Note: circom-witness-rs is experimental -# See https://github.com/zkmopro/mopro/issues/32 for updates -# Only works for keccak256_256_test circuit now -use_native_witness_generation = false # Options: true, false \ No newline at end of file diff --git a/research/gpu-exploration-app/.gitignore b/gpu-exploration-app/.gitignore similarity index 100% rename from research/gpu-exploration-app/.gitignore rename to gpu-exploration-app/.gitignore diff --git a/research/gpu-exploration-app/LICENSE b/gpu-exploration-app/LICENSE similarity index 100% rename from research/gpu-exploration-app/LICENSE rename to gpu-exploration-app/LICENSE diff --git a/research/gpu-exploration-app/README.md b/gpu-exploration-app/README.md similarity index 100% rename from research/gpu-exploration-app/README.md rename to gpu-exploration-app/README.md diff --git a/research/gpu-exploration-app/core/Cargo.lock b/gpu-exploration-app/core/Cargo.lock similarity index 100% rename from research/gpu-exploration-app/core/Cargo.lock rename to gpu-exploration-app/core/Cargo.lock diff --git a/research/gpu-exploration-app/core/Cargo.toml b/gpu-exploration-app/core/Cargo.toml similarity index 100% rename from research/gpu-exploration-app/core/Cargo.toml rename to gpu-exploration-app/core/Cargo.toml diff --git a/mopro-core/examples/circom/keccak256/.gitignore b/gpu-exploration-app/core/circuits/.gitignore similarity index 100% rename from mopro-core/examples/circom/keccak256/.gitignore rename to gpu-exploration-app/core/circuits/.gitignore diff --git a/mopro-core/examples/circom/multiplier2/multiplier2.circom b/gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom similarity index 100% rename from mopro-core/examples/circom/multiplier2/multiplier2.circom rename to gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom diff --git a/gpu-exploration-app/core/src/lib.rs b/gpu-exploration-app/core/src/lib.rs new file mode 100644 index 0000000..c0bc5c4 --- /dev/null +++ b/gpu-exploration-app/core/src/lib.rs @@ -0,0 +1,87 @@ +// // This file contains tests calling MSM functions from `mopro-core` +// #[cfg(test)] +// mod tests { +// use ark_serialize::Write; +// use mopro_core::middleware::gpu_explorations::{ +// arkworks_pippenger, trapdoortech_zprize_msm, utils::benchmark::BenchmarkResult, utils::preprocess::HarnessError, +// }; +// use std::fs::{create_dir_all, File}; +// use std::path::Path; + +// const BENCHMARKS_DIR: &str = "benchmarks"; +// const UTILS_PATH: &str = "benchmarks/vectors"; +// const BENCHMARKS_PATH: &str = "benchmarks/results"; + +// fn ensure_dir_exists(dir_path: &str) { +// if !Path::new(dir_path).exists() { +// create_dir_all(dir_path).expect("Failed to create directory"); +// } +// } + +// fn setup_dirs() { +// ensure_dir_exists(BENCHMARKS_DIR); +// ensure_dir_exists(UTILS_PATH); +// ensure_dir_exists(BENCHMARKS_PATH); +// } + +// fn run_benchmarks(algorithm: &str, instance_size: &[usize], num_instance: &[usize], benchmark_fn: F) +// where +// F: Fn(usize, usize, &str) -> Result + Sync, +// { +// setup_dirs(); // to check the directories + +// let output_path = format!("{}/{}_benchmark.txt", BENCHMARKS_PATH, algorithm); +// let mut output_file = File::create(output_path).expect("output file creation failed"); +// writeln!(output_file, "msm_size,num_msm,avg_processing_time(ms)").unwrap(); + +// let results: Vec> = instance_size +// .iter() +// .map(|size| { +// num_instance +// .iter() +// .map(|num| { +// let utils_path = format!("{}/{}x{}", UTILS_PATH, *size, *num); +// let result = benchmark_fn(*size, *num, &utils_path).unwrap(); +// println!("{}x{} result: {:#?}", *size, *num, result); +// (result.instance_size, result.num_instance, result.avg_processing_time) +// }) +// .collect() +// }) +// .collect(); + +// for outer_result in results { +// for (instance_size, num_instance, avg_processing_time) in outer_result { +// writeln!( +// output_file, +// "{},{},{}", +// instance_size, num_instance, avg_processing_time +// ) +// .unwrap(); +// } +// } +// } + +// #[test] +// fn test_arkworks_msm() { +// let instance_size = &[8, 12, 16]; +// let num_instance = &[5, 10]; +// run_benchmarks( +// "arkworks_pippenger", +// instance_size, +// num_instance, +// |size: usize, num: usize, path: &str| arkworks_pippenger::run_benchmark(size as u32, num as u32, path), +// ); +// } + +// #[test] +// fn test_trapdoortech_msm() { +// let instance_size = &[8, 12, 16]; +// let num_instance = &[5, 10]; +// run_benchmarks( +// "trapdoortech_zprize_msm", +// instance_size, +// num_instance, +// |size: usize, num: usize, path: &str| trapdoortech_zprize_msm::run_benchmark(size as u32, num as u32, path), +// ); +// } +// } diff --git a/research/gpu-exploration-app/image/simulator_benchmark_result.png b/gpu-exploration-app/image/simulator_benchmark_result.png similarity index 100% rename from research/gpu-exploration-app/image/simulator_benchmark_result.png rename to gpu-exploration-app/image/simulator_benchmark_result.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/.gitignore b/gpu-exploration-app/ios/ExampleApp/.gitignore similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/.gitignore rename to gpu-exploration-app/ios/ExampleApp/.gitignore diff --git a/research/gpu-exploration-app/ios/ExampleApp/Bindings/mopro.swift b/gpu-exploration-app/ios/ExampleApp/Bindings/mopro.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Bindings/mopro.swift rename to gpu-exploration-app/ios/ExampleApp/Bindings/mopro.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.pbxproj diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/contents.xcworkspacedata diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to gpu-exploration-app/ios/ExampleApp/ExampleApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_1024x1024.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_120x120.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_180x180.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_40x40.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_58x58.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_60x60.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_80x80.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/AppIcon.appiconset/icon_87x87.png diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Assets.xcassets/Contents.json diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/ExampleApp.swift b/gpu-exploration-app/ios/ExampleApp/ExampleApp/ExampleApp.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/ExampleApp.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/ExampleApp.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/MSMBenchmarkView.swift b/gpu-exploration-app/ios/ExampleApp/ExampleApp/MSMBenchmarkView.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/MSMBenchmarkView.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/MSMBenchmarkView.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Utils.swift b/gpu-exploration-app/ios/ExampleApp/ExampleApp/Utils.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleApp/Utils.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleApp/Utils.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift b/gpu-exploration-app/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleAppTests/ExampleAppTests.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift b/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITests.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift b/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift rename to gpu-exploration-app/ios/ExampleApp/ExampleAppUITests/ExampleAppUITestsLaunchTests.swift diff --git a/research/gpu-exploration-app/ios/ExampleApp/Frameworks/CircuitBindings.podspec b/gpu-exploration-app/ios/ExampleApp/Frameworks/CircuitBindings.podspec similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Frameworks/CircuitBindings.podspec rename to gpu-exploration-app/ios/ExampleApp/Frameworks/CircuitBindings.podspec diff --git a/research/gpu-exploration-app/ios/ExampleApp/Frameworks/LICENSE b/gpu-exploration-app/ios/ExampleApp/Frameworks/LICENSE similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Frameworks/LICENSE rename to gpu-exploration-app/ios/ExampleApp/Frameworks/LICENSE diff --git a/research/gpu-exploration-app/ios/ExampleApp/Frameworks/MoproBindings.podspec b/gpu-exploration-app/ios/ExampleApp/Frameworks/MoproBindings.podspec similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Frameworks/MoproBindings.podspec rename to gpu-exploration-app/ios/ExampleApp/Frameworks/MoproBindings.podspec diff --git a/research/gpu-exploration-app/ios/ExampleApp/Info.plist b/gpu-exploration-app/ios/ExampleApp/Info.plist similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Info.plist rename to gpu-exploration-app/ios/ExampleApp/Info.plist diff --git a/research/gpu-exploration-app/ios/ExampleApp/Podfile b/gpu-exploration-app/ios/ExampleApp/Podfile similarity index 100% rename from research/gpu-exploration-app/ios/ExampleApp/Podfile rename to gpu-exploration-app/ios/ExampleApp/Podfile diff --git a/research/gpu-exploration-app/mopro-config.toml b/gpu-exploration-app/mopro-config.toml similarity index 94% rename from research/gpu-exploration-app/mopro-config.toml rename to gpu-exploration-app/mopro-config.toml index 4d83227..c2de9e9 100644 --- a/research/gpu-exploration-app/mopro-config.toml +++ b/gpu-exploration-app/mopro-config.toml @@ -2,7 +2,7 @@ [build] # For iOS device_type can be x86_64, simulator, device -ios_device_type = "simulator" # Options: x86_64, simulator, device +ios_device_type = "device" # Options: x86_64, simulator, device # For Android device_type can be x86_64, x86, arm, arm64 android_device_type = "arm64" # Options: x86_64, x86, arm, arm64 diff --git a/images/mopro_architecture2.png b/images/mopro_architecture2.png deleted file mode 100644 index ef6c39e896f7dadcdd731d37d4493ae236c73783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243002 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 aHjise9mgoKS78(QId|6NOo8sD+y4WKP)-E^ diff --git a/images/mopro_architecture2_full.png b/images/mopro_architecture2_full.png deleted file mode 100644 index 67a6e46e1df305edfdd4be6aefa9fbc93aa678d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419786 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%0AgXG4e#w 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

4OiDQ(bf4fHS~#;-d{59IO|rr0#f&yA1kwamit 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

u3xuq0`%M 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%0A!RlHrYyLe+qnbM@g= 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�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 [default: circom] - --platforms ... [default: core] - --project-name [default: mopro-example-app] - ``` - -- `mopro deps`: Install required dependencies. -- `mopro prepare`: Prepare and build circuit and its artifacts. - - options: - ```sh - --config [default: mopro-config.toml] - ``` -- `mopro build`: Build the project for specified platforms. - - - options: - ```sh - --config [default: mopro-config.toml] - --adapter [default: circom] - --platforms ... [default: core] - ``` - -- `mopro test`: Run tests for specific platform and test cases. - - options: - ```sh - --config [default: mopro-config.toml] - --adapter [default: circom] - --platforms ... [default: core] - --test-case - ``` -- `mopro export-bindings`: Export platform bindings to some other directory. - - - options: - ```sh - --platforms ... [default: ios] - -d, --destination - ``` - -(May be added soon: `mopro update`: Update bindings with new API for specified platforms.) - -## Prerequisites - -To use `mopro-cli`, make sure you have installed the [prerequisites](https://github.com/zkmopro/mopro/?tab=readme-ov-file#Prerequisites). - -## Examples - -### Basic example - -Initialize, build and test a circuit with Rust bindings: - -- Set `MOPRO_ROOT` - - ```sh - export MOPRO_ROOT=/Users/user/repos/github.com/zkmopro/mopro - ``` - -- Install dependencies - - ```sh - mopro deps - ``` - -- Default to circom adapter and core Rust bindings - - ```sh - mopro init - ``` - -- Go to the newly created directory - - ```sh - cd mopro-example-app - ``` - -- Prepare circuit artifacts - - ```sh - mopro prepare - ``` - -- Build the project - - ```sh - mopro build - ``` - -- Run end-to-end-test - - ```sh - mopro test - ``` - -### iOS - -Initialize and build an app with iOS support. - -```sh -mopro init --platforms ios -cd mopro-example-app -mopro prepare -mopro build --platforms ios - -# Open project in XCode -open ios/ExampleApp/ExampleApp.xcworkspace - -# Currently testing only available for Rust bindings, -# Can run iOS tests from newly created Xcode project -mopro test -``` - -### Android - -Initialize and build an app with Android support. - -```sh -mopro init --platforms android -cd mopro-example-app -mopro prepare -mopro build --platforms android - -# Open android project in Android Studio -open android -a Android\ Studio -``` - -### Web - -Initialize and build a web app. - -```sh -mopro init --platforms web -cd mopro-example-app -mopro prepare -mopro build --platforms web -``` - -Open web project directory and run frontend locally. - -```sh -cd web -npm install -npm run dev -``` - -### Exporting bindings - -To export bindings to a different directory: - -`mopro export-bindings --destination --platforms ` - -This will the following files, assuming they've been built, to the destination directory: - -``` -├── android -│ ├── jniLibs -│ │ └── arm64-v8a -│ │ └── libuniffi_mopro.so -│ └── uniffi -│ └── mopro -│ └── mopro.kt -└── ios - ├── Bindings - │ ├── module.modulemap - │ ├── mopro.swift - │ └── moproFFI.h - └── aarch64-apple-ios-sim - └── release - └── libmopro_ffi.a -``` - -#### Use the bindings in iOS - -- Create a XCFramework with `xcodebuild` - ```sh - xcodebuild -create-xcframework \ - -library /ios/aarch64-apple-ios-sim/release/libmopro_ffi.a \ - -headers /ios/Bindings \ - -output "/ios/Mopro.xcframework" - ``` -- Import both the XCFramework `Mopro.xcframework` and the Swift file bindings `Bindings/mopro.swift` files into your project (drag and drop should work). -- Use moproFFI in swift like - - ```swift - import moproFFI - - ... - try initializeMopro() - ... - ``` - -> Reference: https://forgen.tech/en/blog/post/building-an-ios-app-with-rust-using-uniffi - -#### Use the bindings in Android - -- Add dependency in `/app/build.gradle.kts` - ```kts - dependencies { - ... - implementation("net.java.dev.jna:jna:5.13.0@aar") - ... - } - ``` -- Sync gradle -- Move the `/android/jniLibs/` folder to `app/src/main/` -- Move the `/android/uniffi/` folder to `app/src/main/java/` -- Use moproFFI in kotlin like - - ```kotlin - import uniffi.mopro.initializeMopro - - ... - initializeMopro() - ... - ``` -> Reference: https://sal.dev/android/intro-rust-android-uniffi/ - -## Contributing - -Contributions to `mopro` are welcome. Please feel free to submit issues and pull requests. diff --git a/mopro-cli/src/build.rs b/mopro-cli/src/build.rs deleted file mode 100644 index f71cbd7..0000000 --- a/mopro-cli/src/build.rs +++ /dev/null @@ -1,39 +0,0 @@ -use crate::utils::get_mopro_root; -use std::process::{exit, Command}; - -pub fn build_project(config: &str, adapter: &str, platforms: &Vec) { - for platform in platforms.iter() { - println!( - "Building project for platform {}: {} with config {}", - platform, adapter, config - ); - - let mopro_root = get_mopro_root(); - - // Determine the script based on the platform - let script_name = if platform == "ios" { - "build_ios.sh" - } else if platform == "android" { - "build_android.sh" - } else if platform == "web" { - "build_web.sh" - } else { - "build_core.sh" - }; - - let script_path = format!("{}/scripts/cli/{}", mopro_root, script_name); - - let status = Command::new("sh") - .arg(script_path) - .arg(config) - .status() - .expect("Failed to execute build script"); - - if !status.success() { - eprintln!("Cargo build failed."); - exit(1); - } - - println!("Build completed successfully for platform {}.", platform); - } -} diff --git a/mopro-cli/src/deps.rs b/mopro-cli/src/deps.rs deleted file mode 100644 index 0b63f71..0000000 --- a/mopro-cli/src/deps.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::utils::get_mopro_root; -use std::process::{exit, Command}; - -pub fn install_deps() { - println!("Installing required dependencies"); - - let mopro_root = get_mopro_root(); - let script_name = "install_deps.sh"; - let script_path = format!("{}/scripts/cli/{}", mopro_root, script_name); - - let status = Command::new("sh") - .arg(script_path) - .status() - .expect("Failed to execute build script"); - - if !status.success() { - eprintln!("Unable install dependencies."); - exit(1); - } - - println!("Finished installing dependencies.") -} diff --git a/mopro-cli/src/export.rs b/mopro-cli/src/export.rs deleted file mode 100644 index 3c56907..0000000 --- a/mopro-cli/src/export.rs +++ /dev/null @@ -1,98 +0,0 @@ -use std::path::PathBuf; -use std::{env, fs}; - -fn export_ios_bindings(destination: &PathBuf) { - let current_dir = env::current_dir().expect("Failed to get current directory"); - let target_dir = current_dir.join("target"); - let ios_output_dir = &destination.join("ios"); - - // Create ios output directory if it does not exist - fs::create_dir_all(ios_output_dir).expect("Failed to create ios output directory"); - - // Define the paths to the source files and directories - let swift_bindings_dir = target_dir.join("SwiftBindings"); - for library in [ - "x86_64-apple-ios", - "aarch64-apple-ios-sim", - "aarch64-apple-ios", - ] { - for build_mode in ["release", "debug"] { - let library_dir = target_dir.join(library); - let library_file = library_dir.join(build_mode).join("libmopro_ffi.a"); - if library_file.exists() { - fs_extra::dir::copy( - library_dir, - ios_output_dir, - &fs_extra::dir::CopyOptions::new(), - ) - .expect("Failed to copy SwiftBindings directory"); - } - } - } - - // Copy SwiftBindings directory - fs_extra::dir::copy( - swift_bindings_dir, - ios_output_dir, - &fs_extra::dir::CopyOptions::new(), - ) - .expect("Failed to copy SwiftBindings directory"); - - fs::rename( - ios_output_dir.join("SwiftBindings"), - ios_output_dir.join("Bindings"), - ) - .expect("Failed to rename SwiftBindings directory"); - - println!("Exported Swift bindings to {:?}", destination); -} - -fn export_android_bindings(destination: &PathBuf) { - let current_dir = env::current_dir().expect("Failed to get current directory"); - let target_dir = current_dir.join("target"); - let android_output_dir = &destination.join("android"); - - // Create android output directory if it does not exist - fs::create_dir_all(android_output_dir).expect("Failed to create android output directory"); - - // Define the paths to the source files and directories - let jni_bindings_dir = target_dir.join("jniLibs"); - let kotlin_bindings_file = target_dir - .join("KotlinBindings/uniffi/mopro") - .join("mopro.kt"); - - // Define the destination paths - let _destination_jni_bindings_dir = android_output_dir.join("jniLibs"); - let destination_kotlin_bindings_file = android_output_dir - .join("uniffi") - .join("mopro") - .join("mopro.kt"); - - // Create KotlinBindings directory if it does not exist - fs::create_dir_all(android_output_dir.join("uniffi").join("mopro")) - .expect("Failed to create KotlinBindings directory"); - - // Copy jniLibs directory - fs_extra::dir::copy( - jni_bindings_dir, - android_output_dir, - &fs_extra::dir::CopyOptions::new(), - ) - .expect("Failed to copy jniLibs directory"); - - // Copy Kotlin bindings file - fs::copy(kotlin_bindings_file, destination_kotlin_bindings_file) - .expect("Failed to copy Kotlin bindings file"); - - println!("Exported Kotlin bindings to {:?}", destination); -} - -pub fn export_bindings(platforms: &Vec, destination: &PathBuf) { - fs::create_dir_all(destination).expect("Failed to create destination directory"); - if platforms.contains(&"ios".to_string()) { - export_ios_bindings(destination); - } - if platforms.contains(&"android".to_string()) { - export_android_bindings(destination); - } -} diff --git a/mopro-cli/src/init.rs b/mopro-cli/src/init.rs deleted file mode 100644 index 8562093..0000000 --- a/mopro-cli/src/init.rs +++ /dev/null @@ -1,69 +0,0 @@ -use crate::utils::get_mopro_root; -use fs_extra::dir::{self, CopyOptions}; -use std::env; -use std::fs; -use std::path::PathBuf; -use std::process; - -pub fn init_project(adapter: &str, platforms: &Vec, project_name: &str) { - println!( - "Initializing project for platforms {:?}: {} with name {}", - platforms, adapter, project_name - ); - - let mopro_root = get_mopro_root(); - - let source_path = PathBuf::from(mopro_root) - .join("templates") - .join("mopro-example-app"); - let current_dir = env::current_dir().expect("Failed to get current directory"); - let destination_path = current_dir.join(project_name); - - // Create the project directory - if destination_path.exists() { - eprintln!( - "A directory with the name '{}' already exists.", - project_name - ); - process::exit(1); - } else { - fs::create_dir(&destination_path).expect("Failed to create project directory"); - } - - let mut options = CopyOptions::new(); - options.overwrite = true; - options.copy_inside = true; - - // Determine which directories to copy based on the enabled platforms - let mut entries_to_copy = Vec::new(); - - // Always copy core platform - entries_to_copy.push(source_path.join("core")); - entries_to_copy.push(source_path.join("mopro-config.toml")); - entries_to_copy.push(source_path.join("Cargo.toml")); - entries_to_copy.push(source_path.join(".gitignore")); - entries_to_copy.push(source_path.join("README.md")); - if platforms.contains(&"ios".to_string()) { - entries_to_copy.push(source_path.join("ios")); - } - if platforms.contains(&"android".to_string()) { - entries_to_copy.push(source_path.join("android")); - } - if platforms.contains(&"web".to_string()) { - entries_to_copy.push(source_path.join("web")); - } - - // Perform the copy operation for each entry - for entry in entries_to_copy { - if entry.is_dir() { - // Copy directory - dir::copy(&entry, &destination_path, &options).expect("Failed to copy directory"); - } else { - // Copy file - let file_name = entry.file_name().unwrap(); - fs::copy(&entry, destination_path.join(file_name)).expect("Failed to copy file"); - } - } - - println!("Project '{}' initialized successfully.", project_name); -} diff --git a/mopro-cli/src/main.rs b/mopro-cli/src/main.rs deleted file mode 100644 index 1fff513..0000000 --- a/mopro-cli/src/main.rs +++ /dev/null @@ -1,110 +0,0 @@ -use clap::{Parser, Subcommand}; -use std::path::PathBuf; - -mod build; -mod deps; -mod export; -mod init; -mod prepare; -mod test; -mod update; -mod utils; - -/// CLI for multi-platform project management -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Cli { - #[command(subcommand)] - command: Commands, -} - -#[derive(Subcommand, Debug)] -enum Commands { - /// Install required dependencies - Deps {}, - /// Initializes a new project - Init { - #[arg(long, default_value = "circom")] - adapter: String, - #[arg(long, num_args = 1.., default_value = "core")] - platforms: Vec, - #[arg(long, default_value = "mopro-example-app")] - project_name: String, - }, - /// Prepare and build circuit artifacts - Prepare { - #[arg(long, default_value = "mopro-config.toml")] - config: String, - }, - /// Builds the project for specified platforms - Build { - #[arg(long, default_value = "mopro-config.toml")] - config: String, - #[arg(long, default_value = "circom")] - adapter: String, - #[arg(long, num_args = 1.., default_value = "core")] - platforms: Vec, - }, - // TODO: Update this when it does something useful over just `build` - // Updates bindings for the specified platforms - // Update { - // #[arg(long, default_value = "mopro-config.toml")] - // config: String, - // #[arg(long, default_value = "circom")] - // adapter: String, - // #[arg(long, num_args = 1.., default_value = "core")] - // platforms: Vec, - // }, - /// Runs tests for the specified platform and test cases - Test { - #[arg(long, default_value = "mopro-config.toml")] - config: String, - #[arg(long, default_value = "circom")] - adapter: String, - #[arg(long, num_args = 1.., default_value = "core")] - platforms: Vec, - #[arg(long)] - test_case: Option, - }, - /// Exports platform bindings to some other directory - ExportBindings { - #[arg(long, num_args = 1.., default_value = "ios")] - platforms: Vec, - #[arg(short, long)] - destination: PathBuf, - }, -} - -fn main() { - let cli = Cli::parse(); - - match &cli.command { - Commands::Deps {} => deps::install_deps(), - Commands::Init { - adapter, - platforms, - project_name, - } => init::init_project(adapter, platforms, project_name), - Commands::Prepare { config } => prepare::prepare_circuit(config), - Commands::Build { - config, - adapter, - platforms, - } => build::build_project(config, adapter, platforms), - // Commands::Update { - // config, - // adapter, - // platforms, - // } => update::update_project(config, adapter, platforms), - Commands::Test { - config, - adapter, - platforms, - test_case, - } => test::test_project(config, adapter, platforms, test_case), - Commands::ExportBindings { - platforms, - destination, - } => export::export_bindings(platforms, destination), - } -} diff --git a/mopro-cli/src/prepare.rs b/mopro-cli/src/prepare.rs deleted file mode 100644 index 24b2b46..0000000 --- a/mopro-cli/src/prepare.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::utils::get_mopro_root; -use std::process::{exit, Command}; - -pub fn prepare_circuit(config: &str) { - println!("Preparing circuit with config {}", config); - - let mopro_root = get_mopro_root(); - let script_name = "prepare.sh"; - let script_path = format!("{}/scripts/cli/{}", mopro_root, script_name); - - let status = Command::new("sh") - .arg(script_path) - .arg(config) - .status() - .expect("Failed to execute build script"); - - if !status.success() { - eprintln!("Unable to prepare circuit."); - exit(1); - } - - println!("Preparation of circuit completed successfully."); -} diff --git a/mopro-cli/src/test.rs b/mopro-cli/src/test.rs deleted file mode 100644 index fe607eb..0000000 --- a/mopro-cli/src/test.rs +++ /dev/null @@ -1,42 +0,0 @@ -use std::env; -use std::process::{exit, Command}; - -pub fn test_project( - config: &str, - adapter: &str, - platforms: &Vec, - test_case: &Option, -) { - println!( - "Testing project on platform {:?} with adapter {} and config {}", - platforms, adapter, config - ); - - println!("NOTE: Testing on iOS is not yet available."); - - let current_dir = env::current_dir().expect("Failed to get current directory"); - let core_dir_path = current_dir.join("core"); - let config_file_path = current_dir.join(config); - let config_file_path_str = config_file_path - .to_str() - .expect("Failed to convert config path to string"); - - // Set the BUILD_CONFIG_PATH environment variable for the cargo test command - let mut command = Command::new("cargo"); - command.arg("test"); - command.env("BUILD_CONFIG_PATH", config_file_path_str); - command.current_dir(core_dir_path); - - if let Some(case) = test_case { - command.arg(case); - } - - let status = command.status().expect("Failed to execute cargo test"); - - if !status.success() { - eprintln!("Tests failed."); - exit(1); - } - - println!("Tests completed successfully."); -} diff --git a/mopro-cli/src/update.rs b/mopro-cli/src/update.rs deleted file mode 100644 index 1c051dd..0000000 --- a/mopro-cli/src/update.rs +++ /dev/null @@ -1,34 +0,0 @@ -use crate::utils::get_mopro_root; -use std::process::{exit, Command}; - -// TODO: Update this script, not currently super useful -pub fn _update_project(config: &str, adapter: &str, platforms: &Vec) { - for platform in platforms.iter() { - // Skip the update process for the 'core' platform - if platform == "core" { - println!("Skipping update for platform 'core'."); - continue; - } - - println!("Updating project for platform {}: {}", platform, adapter); - - let mopro_root = get_mopro_root(); - - // Determine the script based on the platform - let script_name = "update.sh"; - let script_path = format!("{}/scripts/cli/{}", mopro_root, script_name); - - let status = Command::new("sh") - .arg(script_path) - .arg(&config) - .status() - .expect("Failed to execute update script"); - - if !status.success() { - eprintln!("Update failed for platform {}.", platform); - exit(1); - } - - println!("Update completed successfully for platform {}.", platform); - } -} diff --git a/mopro-cli/src/utils.rs b/mopro-cli/src/utils.rs deleted file mode 100644 index ef9e5b1..0000000 --- a/mopro-cli/src/utils.rs +++ /dev/null @@ -1,15 +0,0 @@ -use std::env; -use std::process::exit; - -pub fn get_mopro_root() -> String { - match env::var("MOPRO_ROOT") { - Ok(root) => root, - Err(_) => { - eprintln!("Error: MOPRO_ROOT environment variable is not set."); - eprintln!("Please set MOPRO_ROOT to point to the local checkout of mopro."); - eprintln!("For example: export MOPRO_ROOT=/Users/user/repos/github.com/zkmopro/mopro"); - eprintln!("Git repository: https://github.com/zkmopro/mopro"); - exit(1); - } - } -} diff --git a/mopro-core/Cargo.toml b/mopro-core/Cargo.toml deleted file mode 100644 index d943987..0000000 --- a/mopro-core/Cargo.toml +++ /dev/null @@ -1,103 +0,0 @@ -[package] -name = "mopro-core" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[features] -default = ["circom-default"] - -## Halo2 features - -# Halo2 dependencies -halo2 = ["halo2_proofs", "halo2-circuit"] - -## Circom features - -# Default features for circom -circom-default = ["wasmer/dylib", "circom"] -# Circom dependencies -circom = ["ark-circom", "ark-serialize", "num-bigint", "wasmer", "ruint", "ark-ec", "ark-crypto-primitives", "ark-std", "ark-bn254", "ark-groth16", "ark-relations", "ark-zkey"] - -# Each additional feature must also reference the circom feature to make sure the dependencies are included -dylib = ["circom"] # NOTE: can probably remove this if we use env config instead -gpu-benchmarks = ["ark-ff", "metal", "objc", "proptest", "parallel", "circom"] -calc-native-witness = ["witness", "circom"] # experimental feature to calculate witness with witness graph -build-native-witness = ["witness/build-witness", "circom"] # only enable build-native-witness feature when building the witness graph -parallel = ["rayon", "ark-std/parallel", "circom"] - -[dependencies] - -## Shared dependencies -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" - -once_cell = "1.8" -instant = "0.1" - -# Error handling -thiserror = "=1.0.39" -color-eyre = "=0.6.2" -criterion = "=0.3.6" - - - -## Halo2 dependencies -halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2", tag = "v2023_04_20", features = [ - "dev-graph", -], optional = true } - -# Temporary dependency on an example Halo2 circuit is overwritten by user provided circuit at build time -halo2-circuit = { path = "examples/halo2/fibonacci", optional = true } - - -## Circom dependencies -ark-circom = { git = "https://github.com/vimwitch/circom-compat.git", optional = true } -ark-serialize = { version = "=0.4.1", features = ["derive"], optional = true } -num-bigint = { version = "=0.4.3", default-features = false, features = [ - "rand", -], optional = true } -wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070", optional = true } - -ruint = { version = "1.10.0", features = ["rand", "serde", "ark-ff-04"], optional = true } - -# ZKP generation -ark-ec = { version = "=0.4.1", default-features = false, features = [ - "parallel", -], optional = true } -ark-crypto-primitives = { version = "=0.4.0", optional = true } -ark-std = { version = "=0.4.0", default-features = false, features = [ - "parallel", -], optional = true } -ark-bn254 = { version = "=0.4.0", optional = true } -ark-groth16 = { version = "=0.4.0", default-features = false, features = [ - "parallel", -], optional = true } -ark-relations = { version = "0.4", default-features = false, optional = true } -ark-zkey = { path = "../ark-zkey", optional = true } -witness = { git = "https://github.com/philsippl/circom-witness-rs.git", optional = true } - - -# GPU explorations -ark-ff = { version = "=0.4.1", default-features = false, optional = true, features = [ - "parallel", -] } -metal = { version = "=0.28.0", optional = true } -objc = { version = "=0.2.4", optional = true } -proptest = { version = "1.4.0", optional = true } - -[build-dependencies] -color-eyre = "0.6" -enumset = "1.0.8" -toml = "0.8" -serde = { version = "1.0", features = ["derive"] } -serde_derive = "1.0" - -## Circom dependencies -wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070", optional = true } -witness = { git = "https://github.com/philsippl/circom-witness-rs.git", optional = true } - -[dependencies.rayon] -version = "1" -optional = true \ No newline at end of file diff --git a/mopro-core/README.md b/mopro-core/README.md deleted file mode 100644 index 2eb0032..0000000 --- a/mopro-core/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# mopro-core - -Core mobile Rust library. For FFI, see `mopro-ffi` which is a thin wrapper for exposing UniFFI bindings around this library. - -## Overview - -TBD. - -## Examples - -Run `cargo run --example circom`. Also see `examples/circom/README.md` for more information. - -## Build dylib - -Experimental support. - -Turns `.wasm` file into a dynamic library (`.dylib`). - -Run: - -`cargo build --features dylib` - -After that you'll see location of the dylib file: - -``` -warning: Building dylib for aarch64-apple-darwin -warning: Dylib location: /Users/user/repos/github.com/zkmopro/mopro/mopro-core/target/debug/aarch64-apple-darwin/keccak256.dylib -``` - -Right now this is hardcoded for `rsa`. - -Note that: -- It has to be built for the right architecture -- Have to run `install_name_tool` to adjust install name -- Run `codesign` to sign dylib for use on iOS - -### Script - -- Add third argument `dylib` -- Add forth argument with name of dylib, e.g. `rsa` if you want `rsa.dylib` - -`./scripts/update_bindings.sh device release dylib rsa` - -Note that `APPLE_SIGNING_IDENTITY` must be set. - -## To use ark-zkey - -Experimental support for significantly faster zkey loading. See `../ark-zkey` README for how to build arkzkey. - -## To run msm benchmark report on laptop - -`cargo run --release --features gpu-benchmarks --package mopro-core --bin generate_benchmark_report` - -The report will be in `mopro-core/benchmarks/gpu_explorations/msm_bench_rust_laptop.csv`. - -## To use [circom-witness-rs](https://github.com/philsippl/circom-witness-rs) (Experimental) -- Set - ```toml - [witness] - use_native_witness_generation = true - ``` - in `config.toml` file -- Or build witness with - ```sh - WITNESS_CPP= cargo build --features build-native-witness --release - ``` - Test with - ```sh - cargo test --features calc-native-witness - ``` \ No newline at end of file diff --git a/mopro-core/build.rs b/mopro-core/build.rs deleted file mode 100644 index e974c23..0000000 --- a/mopro-core/build.rs +++ /dev/null @@ -1,347 +0,0 @@ -use color_eyre::eyre::eyre; -use color_eyre::eyre::Result; - -use serde::Deserialize; -use std::path::{Path, PathBuf}; -use std::{env, fs}; -use toml; - -#[derive(Deserialize)] -struct Config { - circuit: CircuitConfig, - #[cfg(feature = "circom")] - pub(crate) dylib: Option, - #[serde(skip)] - expanded_circuit_dir: Option, -} - -#[derive(Deserialize)] -struct CircuitConfig { - dir: String, - name: String, -} - -/// Resolve a potentially relative path against a base directory. -fn resolve_path(base_dir: &Path, relative_path: &str) -> String { - let path = Path::new(relative_path); - if path.is_absolute() { - relative_path.to_owned() - } else { - base_dir.join(path).to_string_lossy().into_owned() - } -} - -fn read_config() -> Result { - let config_str = match env::var("BUILD_CONFIG_PATH") { - Ok(config_path) => { - println!("cargo:rerun-if-changed={}", config_path); - println!("cargo:warning=BUILD_CONFIG_PATH={}", config_path); - let config_path = PathBuf::from(config_path); - - // Ensure the config path is absolute or resolve it based on current dir - let config_path = if config_path.is_absolute() { - config_path - } else { - env::current_dir()?.join(config_path) - }; - - // Read the configuration file - fs::read_to_string(config_path)? - } - Err(_) => { - println!("cargo:warning=BUILD_CONFIG_PATH not set. Using default configuration."); - #[cfg(not(feature = "halo2"))] - let default_config = r#" - [circuit] - adapter = "circom" - dir = "examples/circom/keccak256" - name = "keccak256_256_test" - - [dylib] - use_dylib = false - name = "keccak256.dylib" - "#; - - #[cfg(feature = "halo2")] // TODO - change sample to fibonacci - let default_config = r#" - [circuit] - adapter = "halo2" - dir = "examples/halo2/fibonacci" - name = "fibonacci" - - [dylib] - use_dylib = false - name = "keccak256.dylib" - "#; - default_config.to_string() - } - }; - - let mut config: Config = toml::from_str(&config_str)?; - - // Resolve paths relative to the config file or default path - let config_dir = PathBuf::from(env::var("BUILD_CONFIG_PATH").unwrap_or_else(|_| ".".into())); - let config_dir = config_dir.parent().unwrap_or_else(|| Path::new(".")); - - let resolved_circuit_dir = resolve_path(config_dir, &config.circuit.dir); - - config.expanded_circuit_dir = Some(resolved_circuit_dir.clone()); - - Ok(config) -} - -#[cfg(feature = "circom")] -mod circom { - use super::*; - use std::str::FromStr; - use { - enumset::enum_set, - enumset::EnumSet, - wasmer::{Cranelift, Dylib, Module, Store, Target, Triple}, - }; - - #[derive(Deserialize)] - pub(crate) struct DylibConfig { - use_dylib: bool, - name: String, - } - - impl Config { - fn resolve_circuit_dir(&self) -> PathBuf { - let base_dir = env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| ".".to_string()); - let circuit_dir = self - .expanded_circuit_dir - .as_ref() - .unwrap_or(&self.circuit.dir); - Path::new(&base_dir).join(circuit_dir) - } - } - - pub(crate) fn build_dylib(config: &Config) -> Result<()> { - if let Some(dylib_config) = &config.dylib { - if dylib_config.use_dylib { - let project_dir = env::var("CARGO_MANIFEST_DIR")?; - let out_dir = env::var("OUT_DIR")?; - let build_mode = env::var("PROFILE")?; - let target_arch = env::var("TARGET")?; - let dylib_name = &dylib_config.name; - let wasm_path = config.resolve_circuit_dir().join(format!( - "target/{}_js/{}.wasm", - config.circuit.name, config.circuit.name - )); - - let out_dir_path = PathBuf::from(out_dir); - let wasm_file_path = PathBuf::from(wasm_path); - let dylib_file_path = out_dir_path.join(dylib_name); - let final_dir_path = PathBuf::from(&project_dir) - .join("target") - .join(&target_arch) - .join(build_mode); - - // Create a WASM engine for the target that can compile - let triple = Triple::from_str(&target_arch).map_err(|e| eyre!(e))?; - let cpu_features = enum_set!(); - let target = Target::new(triple, cpu_features); - let engine = Dylib::new(Cranelift::default()).target(target).engine(); - - // Compile the WASM module - let store = Store::new(&engine); - let module = Module::from_file(&store, &wasm_file_path)?; - - // Serialize the compiled module to a dylib file - module.serialize_to_file(&dylib_file_path)?; - - // Ensure the dylib file exists - assert!(dylib_file_path.exists()); - - // Copy dylib to a more predictable path - fs::create_dir_all(&final_dir_path)?; - let final_dylib_path = final_dir_path.join(format!("{}", dylib_name)); - fs::copy(&dylib_file_path, &final_dylib_path)?; - - println!( - "cargo:rustc-env=BUILD_RS_DYLIB_FILE={}", - final_dylib_path.display() - ); - - println!( - "cargo:warning=BUILD_RS_DYLIB_FILE={}", - final_dylib_path.display() - ); - } else { - println!("cargo:warning=Dylib usage is disabled in the config."); - } - } - Ok(()) - } - - #[cfg(feature = "build-native-witness")] - fn build_witness_graph() -> Result<()> { - let _ = witness::generate::build_witness(); - let witness_cpp = env::var("WITNESS_CPP").expect("WITNESS_CPP is not set"); - let circuit_file = Path::new(&witness_cpp); - let circuit_name = circuit_file.file_stem().unwrap().to_str().unwrap(); - let circuit_directory = circuit_file.parent().unwrap(); - println!("cargo:warning=WITNESS_CPP: {}", witness_cpp); - let graph_path = circuit_directory - .join("target") - .join(format!("{}.bin", circuit_name)); - fs::copy("graph.bin", &graph_path).expect("Failed to copy graph.bin"); - Ok(()) - } - - /// Builds the circuit based on the provided configuration. - /// - /// This function assumes that the necessary steps to build the circuit - /// involve checking for the existence of certain files and setting environment variables. - pub(crate) fn build_circuit(circuit_dir_path: &PathBuf, circuit_name: &str) -> Result<()> { - // Check for the existence of required files - let zkey_path = circuit_dir_path.join(format!("target/{}_final.zkey", circuit_name)); - let wasm_path = - circuit_dir_path.join(format!("target/{}_js/{}.wasm", circuit_name, circuit_name)); - // let arkzkey_path = circuit_dir_path.join(format!("target/{}_final.arkzkey", circuit_name)); - #[cfg(feature = "calc-native-witness")] - { - let graph_path = circuit_dir_path.join(format!("target/{}.bin", circuit_name)); - - println!( - "cargo:warning=BUILD_RS_GRAPH_FILE: {}", - graph_path.display() - ); - println!( - "cargo:rustc-env=BUILD_RS_GRAPH_FILE={}", - graph_path.display() - ); - } - - // Ensure the required files exist - if !zkey_path.exists() || !wasm_path.exists() { - return Err(eyre!( - "Required files for building the circuit are missing. Did you run `mopro prepare`?" - )); - } - - // Set BUILD_RS_* environment variables - println!("cargo:rustc-env=BUILD_RS_ZKEY_FILE={}", zkey_path.display()); - println!("cargo:rustc-env=BUILD_RS_WASM_FILE={}", wasm_path.display()); - // println!( - // "cargo:rustc-env=BUILD_RS_ARKZKEY_FILE={}", - // arkzkey_path.display() - // ); - - println!("cargo:warning=BUILD_RS_ZKEY_FILE={}", zkey_path.display()); - println!("cargo:warning=BUILD_RS_WASM_FILE={}", wasm_path.display()); - // println!( - // "cargo:warning=BUILD_RS_ARKZKEY_FILE={}", - // arkzkey_path.display() - // ); - - Ok(()) - } -} - -fn get_circuit_dir_path(config: &Config) -> PathBuf { - // Check if the current package is mopro-core - let pkg_name = env::var("CARGO_PKG_NAME").unwrap_or_default(); - let base_dir = if pkg_name == "mopro-core" { - // If mopro-core, use CARGO_MANIFEST_DIR as base directory - env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set") - } else { - // Default to current directory - ".".to_string() - }; - - // Use the expanded circuit directory if available, otherwise fallback to the original directory - let circuit_dir = config - .expanded_circuit_dir - .as_ref() - .unwrap_or(&config.circuit.dir); - - // Resolve the circuit dictory to an absolute path based on the conditionally set base_dir - PathBuf::from(base_dir).join(circuit_dir) -} - -#[cfg(feature = "halo2")] -mod halo2 { - use super::*; - use std::fs::File; - use std::io::Write; - use toml::Value; - - pub(crate) fn build_circuit(circuit_dir_path: &PathBuf, circuit_name: &String) -> Result<()> { - // Resolve the circuit directory to an absolute path based on the conditionally set base_dir - let circuit_key_path = circuit_dir_path.join("out"); - - let srs_path = circuit_key_path.join(format!("{}_srs", circuit_name)); - let pk_path = circuit_key_path.join(format!("{}_pk", circuit_name)); - let vk_path = circuit_key_path.join(format!("{}_vk", circuit_name)); - - if !srs_path.exists() || !pk_path.exists() || !vk_path.exists() { - let missing_files = [&srs_path, &pk_path, &vk_path] - .iter() - .filter(|path| !path.exists()) - .map(|path| format!(" - {}", path.display())) - .collect::>() - .join("\n"); - - return Err(eyre!(format!( - "Required files for building the Halo2 circuit are missing. Ensure you've run `mopro prepare` or generated the files yourself. \ - \nMissing files:\n{}", - missing_files - ))); - } - - println!("cargo:rustc-env=BUILD_SRS_FILE={}", srs_path.display()); - println!("cargo:rustc-env=BUILD_PK_FILE={}", pk_path.display()); - println!("cargo:rustc-env=BUILD_VK_FILE={}", vk_path.display()); - - println!("cargo:warning=BUILD_SRS_FILE={}", srs_path.display()); - println!("cargo:warning=BUILD_PK_FILE={}", pk_path.display()); - println!("cargo:warning=BUILD_VK_FILE={}", vk_path.display()); - - Ok(()) - } -} - -fn main() -> color_eyre::eyre::Result<()> { - println!("cargo:rerun-if-env-changed=BUILD_CONFIG_PATH"); - println!("cargo:warning=Preparing circuits..."); - - let config = read_config()?; - - // Resolve the circuit dictory to an absolute path based on the conditionally set base_dir - let circuit_dir_path = get_circuit_dir_path(&config); - let circuit_name = &config.circuit.name; - - if cfg!(all(feature = "halo2", feature = "circom")) { - println!("cargo:error=Both Halo2 and Circom features are enabled. Please enable only one of them."); - return Err(eyre!( - "Both Halo2 and Circom features were enabled. Please enable only one of them.\n \ - By default, `circom` is enabled. You need to turn off the default features to run Halo2." - )); - } - - #[cfg(feature = "halo2")] - { - // If Halo2 feature is enabled, build Halo2 Circuit - println!("cargo:warning=Building Halo2 circuit..."); - - halo2::build_circuit(&circuit_dir_path, circuit_name)?; - } - - #[cfg(feature = "circom")] - { - // If Circom feature is enabled, build Circom Circuit - println!("cargo:warning=Building Circom circuit..."); - - circom::build_circuit(&circuit_dir_path, circuit_name)?; - - #[cfg(feature = "build-native-witness")] - build_witness_graph()?; - - circom::build_dylib(&config)?; - } - - println!("cargo:warning=Successfully prepared circuits."); - Ok(()) -} diff --git a/mopro-core/examples/circom.rs b/mopro-core/examples/circom.rs deleted file mode 100644 index 33416b4..0000000 --- a/mopro-core/examples/circom.rs +++ /dev/null @@ -1,46 +0,0 @@ -#[cfg(not(feature = "halo2"))] -use {mopro_core::middleware::circom::CircomState, num_bigint::BigInt, std::collections::HashMap}; - -#[cfg(not(feature = "halo2"))] -fn main() { - let wasm_path = "./examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm"; - let zkey_path = "./examples/circom/multiplier2/target/multiplier2_final.zkey"; - - // Instantiate CircomState - let mut circom_state = CircomState::new(); - - // Setup - let setup_res = circom_state.initialize(zkey_path, wasm_path); - assert!(setup_res.is_ok()); - - let _serialized_pk = setup_res.unwrap(); - - // Deserialize the proving key and inputs if necessary - - // Prepare inputs - let mut inputs = HashMap::new(); - inputs.insert("a".to_string(), vec![BigInt::from(3)]); - inputs.insert("b".to_string(), vec![BigInt::from(5)]); - - // Proof generation - let generate_proof_res = circom_state.generate_proof(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Proof verification - let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified -} - -#[cfg(feature = "halo2")] -fn main() { - println!("This example is only for Circom proving system. Currently, Halo2 proving system is enabled. Please disable the Halo2 feature in the Cargo.toml file."); -} diff --git a/mopro-core/examples/circom/.gitignore b/mopro-core/examples/circom/.gitignore deleted file mode 100644 index a8d8f21..0000000 --- a/mopro-core/examples/circom/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -!target -*.ptau -node_modules -target diff --git a/mopro-core/examples/circom/README.md b/mopro-core/examples/circom/README.md deleted file mode 100644 index facfeed..0000000 --- a/mopro-core/examples/circom/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Circom examples - - Example circuits written in Circom used for testing. One basic, multiplier2, and another one slightly more involved, keccak256. The former is a good minimal circuit to test things end to end. The latter is useful for benchmarking. - - To compile circuits, run `./scripts/compile.sh `. For example, `./scripts/compile.sh multiplier2 multiplier2.circom`. - - To run a trusted setup, run `./scripts/trusted_setup.sh `. For example, `./scripts/trusted_setup.sh multiplier2 08 multiplier2`. - -Both of these actions are done as part of the `./scripts/prepare.sh` script in the root directory `multiplier2` and `keccak256`. \ No newline at end of file diff --git a/mopro-core/examples/circom/anonAadhaar/.gitignore b/mopro-core/examples/circom/anonAadhaar/.gitignore deleted file mode 100644 index aec67d3..0000000 --- a/mopro-core/examples/circom/anonAadhaar/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -node_modules diff --git a/mopro-core/examples/circom/anonAadhaar/LICENSE b/mopro-core/examples/circom/anonAadhaar/LICENSE deleted file mode 100644 index a1c6d7a..0000000 --- a/mopro-core/examples/circom/anonAadhaar/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 zk-email - -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/mopro-core/examples/circom/anonAadhaar/README.md b/mopro-core/examples/circom/anonAadhaar/README.md deleted file mode 100644 index 1b6e778..0000000 --- a/mopro-core/examples/circom/anonAadhaar/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Notes - -This is the latest version of the AA circuits with in total 1,767,153 contraints. - -### Setup - -``` -./scripts/prepare.sh -``` - -### Build iOS Bindgins - -To build bindings for iOS, adjust settings in your config file (we recommend starting with `simulator` and `release`) and run: - -```sh -./scripts/build_ios.sh anon-aadhaar-config.toml -``` - -#### Update Bindings - -To update bindings, run - -```sh -./scripts/update_bindings.sh anon-aadhaar-config.toml -``` diff --git a/mopro-core/examples/circom/anonAadhaar/aadhaar-verifier.circom b/mopro-core/examples/circom/anonAadhaar/aadhaar-verifier.circom deleted file mode 100644 index ea904f4..0000000 --- a/mopro-core/examples/circom/anonAadhaar/aadhaar-verifier.circom +++ /dev/null @@ -1,83 +0,0 @@ -pragma circom 2.1.6; - -include "./node_modules/circomlib/circuits/poseidon.circom"; -include "./helpers/signature.circom"; -include "./helpers/nullifier.circom"; -include "./helpers/extractor.circom"; - - -/// @title AadhaarVerifier -/// @notice This circuit verifies the Aadhaar QR data using RSA signature -/// @param n - RSA pubic key size per chunk -/// @param k - Number of chunks the RSA public key is split into -/// @param maxDataLength - Maximum length of the data -/// @input qrDataPadded - QR data without the signature; each number represent ascii byte; remaining space is padded with 0 -/// @input qrDataPaddedLength - Length of padded QR data -/// @input nonPaddedDataLength - Length of actual data without padding -/// @input delimiterIndices - Indices of delimiters (255) in the QR text data. 18 delimiters including photo -/// @input signature - RSA signature -/// @input pubKey - RSA public key (of the government) -/// @input nullifierSeed - A random value that is part of the nullifier; for example: applicationId, actionId -/// @input public signalHash - An external signal to make it part of the proof -/// @output nullifier - A unique value derived from nullifierSeed and Aadhaar data to nullify the proof/user -/// @output timestamp - Timestamp of when the data was signed - extracted and converted to Unix timestamp -/// @output pubkeyHash - Poseidon hash of the RSA public key -template AadhaarVerifier(n, k, maxDataLength) { - signal input qrDataPadded[maxDataLength]; - signal input qrDataPaddedLength; - signal input nonPaddedDataLength; - signal input delimiterIndices[18]; - signal input signature[k]; - signal input pubKey[k]; - - // Public inputs - signal input nullifierSeed; - signal input signalHash; - signal input revealAgeAbove18; - signal input revealGender; - signal input revealState; - signal input revealPinCode; - - signal output pubkeyHash; - signal output nullifier; - signal output timestamp; - signal output ageAbove18; - signal output gender; - signal output state; - signal output pinCode; - - - // Verify the RSA signature - component signatureVerifier = SignatureVerifier(n, k, maxDataLength); - signatureVerifier.qrDataPadded <== qrDataPadded; - signatureVerifier.qrDataPaddedLength <== qrDataPaddedLength; - signatureVerifier.pubKey <== pubKey; - signatureVerifier.signature <== signature; - pubkeyHash <== signatureVerifier.pubkeyHash; - - - // Extract data from QR and compute nullifiers - component qrDataExtractor = QRDataExtractor(maxDataLength); - qrDataExtractor.data <== qrDataPadded; - qrDataExtractor.nonPaddedDataLength <== nonPaddedDataLength; - qrDataExtractor.delimiterIndices <== delimiterIndices; - - // Reveal extracted data - timestamp <== qrDataExtractor.timestamp; - ageAbove18 <== revealAgeAbove18 * qrDataExtractor.ageAbove18; - gender <== revealGender * qrDataExtractor.gender; - state <== revealState * qrDataExtractor.state; - pinCode <== revealPinCode * qrDataExtractor.pinCode; - - - // Calculate nullifier - signal photo[photoPackSize()] <== qrDataExtractor.photo; - nullifier <== Nullifier()(nullifierSeed, photo); - - - // Dummy square to prevent singal tampering (in case when using different prover) - signal signalHashSquare <== signalHash * signalHash; -} - - -component main { public [nullifierSeed, signalHash] } = AadhaarVerifier(121, 17, 512 * 3); diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/constants.circom b/mopro-core/examples/circom/anonAadhaar/helpers/constants.circom deleted file mode 100644 index 55ad2b0..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/constants.circom +++ /dev/null @@ -1,76 +0,0 @@ -pragma circom 2.1.6; - -/** -Aadhar QR code data schema (V2) - -- Delimiter is 255. -- Before first delimiter, there are two bytes representing the version. This should be [86, 50] (V2) -- From then on, each field is separated by the delimiter. There are total of 16 fields. - 1 (data after first 255). Email_mobile_present_bit_indicator_value (can be 0 or 1 or 2 or 3): - 0: indicates no mobile/email present in secure qr code. - 1: indicates only email present in secure qr code. - 2: indicates only mobile present in secure qr code - 3: indicates both mobile and email present in secure qr code. - 2. Reference ID - 3. Name - 4. Date of Birth - 5. Gender - 6. Address > Care of - 7. Address > District - 8. Address > Landmark - 9. Address > House - 10. Address > Location - 11. Address > Pin code - 12. Address > Post office - 13. Address > State - 14. Address > Street - 15. Address > Sub district - 16. VTC - 17. Last 4 digits of mobile number - 18. The data after 18th 255 till end (-256 ofthe signature) it the photo. - -- Last 256 bytes is the signature. - -- TODO: Find out if there is any different for people who has not verified mobile number. -**/ - - -function referenceIdPosition() { - return 2; -} - -// Position/order (not index) of name field in the data -// i.e, name bytes will appear after 3rd 255 -function namePosition() { - return 3; -} - -function dobPosition() { - return 4; -} - -function genderPosition() { - return 5; -} - -function pinCodePosition() { - return 11; -} - -function statePosition() { - return 13; -} - -function photoPosition() { - return 18; -} - -function maxFieldByteSize() { - return 31; -} - -// Number of int chunks to pack the photo to -// Photo can only be of max 32 * 31 bytes (packSize * fieldByteSize) -function photoPackSize() { - return 32; -} diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/extractor.circom b/mopro-core/examples/circom/anonAadhaar/helpers/extractor.circom deleted file mode 100644 index c070b29..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/extractor.circom +++ /dev/null @@ -1,347 +0,0 @@ -pragma circom 2.1.6; - -include "../node_modules/circomlib/circuits/comparators.circom"; -include "../node_modules/circomlib/circuits/bitify.circom"; -include "../helpers/constants.circom"; -include "../utils/array.circom"; -include "../utils/pack.circom"; - - - -/// @title ExtractAndPackAsInt -/// @notice Helper function to exract data at a position to a single int (assumes data is less than 31 bytes) -/// @dev This is only used for state now; but can work for district, name, etc if needed -/// @param maxDataLength - Maximum length of the data -/// @param extractPosition - Position of the data to extract (after which delimiter does the data start) -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @input delimiterIndices - indices of the delimiters in the QR data -/// @output out - single field (int) element representing the data in little endian order (reverse string when decoded) -template ExtractAndPackAsInt(maxDataLength, extractPosition) { - signal input nDelimitedData[maxDataLength]; - signal input delimiterIndices[18]; - - signal output out; - - signal startDelimiterIndex <== delimiterIndices[extractPosition - 1]; - signal endDelimiterIndex <== delimiterIndices[extractPosition]; - - var extractMaxLength = maxFieldByteSize(); // Packing data only as a single int - var byteLength = extractMaxLength + 1; - - // Shift the data to the right till the the delimiter start - component shifter = SubarraySelector(maxDataLength, byteLength); - shifter.in <== nDelimitedData; - shifter.startIndex <== startDelimiterIndex; // We want delimiter to be the first byte - shifter.length <== endDelimiterIndex - startDelimiterIndex; - signal shiftedBytes[byteLength] <== shifter.out; - - // Assert that the first byte is the delimiter (255 * position of the field) - shiftedBytes[0] === extractPosition * 255; - - // Assert that last byte is the delimiter (255 * (position of the field + 1)) - component endDelimiterSelector = ArraySelector(maxDataLength, 16); - endDelimiterSelector.in <== nDelimitedData; - endDelimiterSelector.index <== endDelimiterIndex; - endDelimiterSelector.out === (extractPosition + 1) * 255; - - // Pack byte[] to int[] where int is field element which take up to 31 bytes - component outInt = BytesToIntChunks(extractMaxLength); - for (var i = 0; i < extractMaxLength; i ++) { - outInt.bytes[i] <== shiftedBytes[i + 1]; // +1 to skip the delimiter - - // Assert that each value is less than 255 - ensures no delimiter in between - assert(shiftedBytes[i + 1] < 255); - } - - out <== outInt.ints[0]; -} - - -/// @title TimetampExtractor -/// @notice Extracts the timetamp when the QR was signed rounded to nearest hour -/// @dev We ignore minutes and seconds to avoid identifying the user based on the precise timestamp -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @output timestamp - Unix timestamp on signature -/// @output year - Year of the signature -/// @output month - Month of the signature -/// @output day - Day of the signature -template TimetampExtractor(maxDataLength) { - signal input nDelimitedData[maxDataLength]; - - signal output timestamp; - signal output year <== DigitBytesToNumber(4)([nDelimitedData[9], nDelimitedData[10], nDelimitedData[11], nDelimitedData[12]]); - signal output month <== DigitBytesToNumber(2)([nDelimitedData[13], nDelimitedData[14]]); - signal output day <== DigitBytesToNumber(2)([nDelimitedData[15], nDelimitedData[16]]); - signal hour <== DigitBytesToNumber(2)([nDelimitedData[17], nDelimitedData[18]]); - - component dateToUnixTime = DigitBytesToTimestamp(2032); - dateToUnixTime.year <== year; - dateToUnixTime.month <== month; - dateToUnixTime.day <== day; - dateToUnixTime.hour <== hour; - dateToUnixTime.minute <== 0; - dateToUnixTime.second <== 0; - - timestamp <== dateToUnixTime.out - 19800; // 19800 is the offset for IST -} - - -/// @title AgeExtractor -/// @notice Extract date of birth from the Aadhaar QR data and returns as Unix timestamp -/// @notice The timestamp will correspond to 00:00 of the date in IST timezone -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @input startDelimiterIndex - index of the delimiter after which the date of birth start -/// @input endDelimiterIndex - index of the delimiter up to which the date of birth is present -/// @output out - Unix timestamp representing the date of birth -template AgeExtractor(maxDataLength) { - signal input nDelimitedData[maxDataLength]; - signal input startDelimiterIndex; - signal input currentYear; - signal input currentMonth; - signal input currentDay; - - signal output out; - - var dobDelimiterIndex = dobPosition(); - var byteLength = 10 + 2; // DD-MM-YYYY + 2 delimiter - - component shifter = SubarraySelector(maxDataLength, byteLength); - shifter.in <== nDelimitedData; - shifter.startIndex <== startDelimiterIndex; // We want delimiter to be the first byte - shifter.length <== startDelimiterIndex + 10; - - signal shiftedBytes[byteLength] <== shifter.out; - - // Assert delimiters around the data is correct - shiftedBytes[0] === dobPosition() * 255; - shiftedBytes[11] === (dobPosition() + 1) * 255; - - // Convert DOB bytes to unix timestamp. - // Get year, month, name as ints (DD-MM-YYYY format and starts from shiftedBytes[0]) - signal year <== DigitBytesToNumber(4)([shiftedBytes[7], shiftedBytes[8], shiftedBytes[9], shiftedBytes[10]]); - signal month <== DigitBytesToNumber(2)([shiftedBytes[4], shiftedBytes[5]]); - signal day <== DigitBytesToNumber(2)([shiftedBytes[1], shiftedBytes[2]]); - - assert(currentYear + currentMonth + currentDay >= year + month + day); - - // Completed age based on year value - signal ageByYear <== currentYear - year - 1; - - // +1 if month and day is greater than or equal to the current month and day - component monthGt = GreaterThan(4); - monthGt.in[0] <== currentMonth + 1; - monthGt.in[1] <== month; - - component dayGt = GreaterThan(4); - dayGt.in[0] <== currentDay + 1; - dayGt.in[1] <== day; - - out <== ageByYear + monthGt.out + dayGt.out; -} - - -/// @title GenderExtractor -/// @notice Extracts the Gender from the Aadhaar QR data and returns as Unix timestamp -/// @dev Not reusing ExtractAndPackAsInt as the output is a single byte and its cheaper this way -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @input startDelimiterIndex - index of the delimiter after -/// @output out Single byte number representing gender -template GenderExtractor(maxDataLength) { - signal input nDelimitedData[maxDataLength]; - signal input startDelimiterIndex; - - signal output out; - - // Assert start delimiter value - component startDelimiterSelector = ArraySelector(maxDataLength, 16); - startDelimiterSelector.in <== nDelimitedData; - startDelimiterSelector.index <== startDelimiterIndex; - startDelimiterSelector.out === genderPosition() * 255; - - // Assert end delimiter value - component endDelimiterSelector = ArraySelector(maxDataLength, 16); - endDelimiterSelector.in <== nDelimitedData; - endDelimiterSelector.index <== startDelimiterIndex + 2; - endDelimiterSelector.out === (genderPosition() + 1) * 255; - - // Get gender byte - component genderSelector = ArraySelector(maxDataLength, 16); - genderSelector.in <== nDelimitedData; - genderSelector.index <== startDelimiterIndex + 1; - out <== genderSelector.out; - - assert(out < 255); -} - -/// @title PinCodeExtractor -/// @notice Extracts the pin code from the Aadhaar QR data -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @input startDelimiterIndex - index of the delimiter after which the pin code start -/// @input endDelimiterIndex - index of the delimiter up to which the pin code is present -/// @output out - pincode as integer -template PinCodeExtractor(maxDataLength) { - signal input nDelimitedData[maxDataLength]; - signal input startDelimiterIndex; - signal input endDelimiterIndex; - - signal output out; - - var pinCodeMaxLength = 6; - var byteLength = pinCodeMaxLength + 2; // 2 delimiters - - component shifter = SubarraySelector(maxDataLength, byteLength); - shifter.in <== nDelimitedData; - shifter.startIndex <== startDelimiterIndex; - shifter.length <== endDelimiterIndex - startDelimiterIndex + 1; - - signal shiftedBytes[byteLength] <== shifter.out; - - // Assert delimiters around the data is correct - shiftedBytes[0] === pinCodePosition() * 255; - shiftedBytes[7] === (pinCodePosition() + 1) * 255; - - out <== DigitBytesToNumber(6)([shiftedBytes[1], shiftedBytes[2], shiftedBytes[3], shiftedBytes[4], shiftedBytes[5], shiftedBytes[6]]); -} - - -/// @title PhotoExtractor -/// @notice Extracts the photo from the Aadhaar QR data -/// @dev Not reusing ExtractAndPackAsInt as there is no endDelimiter (photo is last item) -/// @input nDelimitedData[maxDataLength] - QR data where each delimiter is 255 * n where n is order of the data -/// @input startDelimiterIndex - index of the delimiter after which the photo start -/// @input endIndex - index of the last byte of the photo -/// @output out - int[33] representing the photo in little endian order -template PhotoExtractor(maxDataLength) { - signal input nDelimitedData[maxDataLength]; - signal input startDelimiterIndex; - signal input endIndex; - - signal output out[photoPackSize()]; - - var photoMaxLength = photoPackSize() * maxFieldByteSize(); - var bytesLength = photoMaxLength + 1; - - // Shift the data to the right to until the photo index - component shifter = SubarraySelector(maxDataLength, bytesLength); - shifter.in <== nDelimitedData; - shifter.startIndex <== startDelimiterIndex; // We want delimiter to be the first byte - shifter.length <== endIndex - startDelimiterIndex + 1; - - signal shiftedBytes[bytesLength] <== shifter.out; - - // Assert that the first byte is the delimiter (255 * position of name field) - shiftedBytes[0] === photoPosition() * 255; - - // Pack byte[] to int[] where int is field element which take up to 31 bytes - // When packing like this the trailing 0s in each chunk would be removed as they are LSB - // This is ok for being used in nullifiers as the behaviour would be consistent - component outInt = BytesToIntChunks(photoMaxLength); - for (var i = 0; i < photoMaxLength; i ++) { - outInt.bytes[i] <== shiftedBytes[i + 1]; // +1 to skip the delimiter - } - - out <== outInt.ints; -} - - -/// @title QRDataExtractor -/// @notice Extracts the name, date, gender, photo from the Aadhaar QR data -/// @input data[maxDataLength] - QR data without the signature padded -/// @input dataLength - Length of the padded QR data -/// @input nonPaddedDataLength - Length of the non-padded QR data -/// @input delimiterIndices[17] - Indices of the delimiters in the QR data -/// @output name - single field (int) element representing the name in little endian order -/// @output age - Unix timestamp representing the date of birth -/// @output gender - Single byte number representing gender -/// @output photo - Photo of the user -template QRDataExtractor(maxDataLength) { - signal input data[maxDataLength]; - signal input nonPaddedDataLength; - signal input delimiterIndices[18]; - - // signal output name; - signal output timestamp; - signal output ageAbove18; - signal output gender; - signal output state; - signal output pinCode; - signal output photo[photoPackSize()]; - - // Create `nDelimitedData` - same as `data` but each delimiter is replaced with n * 255 - // where n means the nth occurance of 255 - // This is to verify `delimiterIndices` is correctly set for each extraction - component is255[maxDataLength]; - component indexBeforePhoto[maxDataLength]; - signal is255AndIndexBeforePhoto[maxDataLength]; - signal nDelimitedData[maxDataLength]; - signal n255Filter[maxDataLength + 1]; - n255Filter[0] <== 0; - for (var i = 0; i < maxDataLength; i++) { - is255[i] = IsEqual(); - is255[i].in[0] <== 255; - is255[i].in[1] <== data[i]; - - indexBeforePhoto[i] = LessThan(12); - indexBeforePhoto[i].in[0] <== i; - indexBeforePhoto[i].in[1] <== delimiterIndices[photoPosition() - 1] + 1; - - is255AndIndexBeforePhoto[i] <== is255[i].out * indexBeforePhoto[i].out; - - // Each value is n * 255 where n the count of 255s before it - n255Filter[i + 1] <== is255AndIndexBeforePhoto[i] * 255 + n255Filter[i]; - - nDelimitedData[i] <== is255AndIndexBeforePhoto[i] * n255Filter[i] + data[i]; - } - - // Extract timestamp - component timestampExtractor = TimetampExtractor(maxDataLength); - timestampExtractor.nDelimitedData <== nDelimitedData; - timestamp <== timestampExtractor.timestamp; - - // Extract age - and calculate if above 18 - // We use the year, month, day from the timestamp to calculate the age - // This wont be precise but avoid the need for additional `currentTime` input - // User can generate fresh QR for accuracy if needed (on their 18th birthday) - component ageExtractor = AgeExtractor(maxDataLength); - ageExtractor.nDelimitedData <== nDelimitedData; - ageExtractor.startDelimiterIndex <== delimiterIndices[dobPosition() - 1]; - ageExtractor.currentYear <== timestampExtractor.year; - ageExtractor.currentMonth <== timestampExtractor.month; - ageExtractor.currentDay <== timestampExtractor.day; - - component ageAbove18Checker = GreaterThan(8); - ageAbove18Checker.in[0] <== ageExtractor.out; - ageAbove18Checker.in[1] <== 18; - ageAbove18 <== ageAbove18Checker.out; - - // Extract gender - component genderExtractor = GenderExtractor(maxDataLength); - genderExtractor.nDelimitedData <== nDelimitedData; - genderExtractor.startDelimiterIndex <== delimiterIndices[genderPosition() - 1]; - gender <== genderExtractor.out; - - // Extract state - component stateExtractor = ExtractAndPackAsInt(maxDataLength, statePosition()); - stateExtractor.nDelimitedData <== nDelimitedData; - stateExtractor.delimiterIndices <== delimiterIndices; - state <== stateExtractor.out; - - // Extract PIN code - component pinCodeExtractor = PinCodeExtractor(maxDataLength); - pinCodeExtractor.nDelimitedData <== nDelimitedData; - pinCodeExtractor.startDelimiterIndex <== delimiterIndices[pinCodePosition() - 1]; - pinCodeExtractor.endDelimiterIndex <== delimiterIndices[pinCodePosition()]; - pinCode <== pinCodeExtractor.out; - - // Extract photo - component photoExtractor = PhotoExtractor(maxDataLength); - photoExtractor.nDelimitedData <== nDelimitedData; - photoExtractor.startDelimiterIndex <== delimiterIndices[photoPosition() - 1]; - photoExtractor.endIndex <== nonPaddedDataLength - 1; - photo <== photoExtractor.out; - - // TODO: We might be able to optimize the extraction by left shifting data to delimiter - // before DOB (rotating data and not seting remamining to 0 like in VarShiftLeft), - // and then extracting DOB, gender simply by using indices - // Pincode also only needs shift (without setting remaining to 0) as size is fixed -} diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/nullifier.circom b/mopro-core/examples/circom/anonAadhaar/helpers/nullifier.circom deleted file mode 100644 index 22eb376..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/nullifier.circom +++ /dev/null @@ -1,29 +0,0 @@ -pragma circom 2.1.6; - -include "../node_modules/circomlib/circuits/poseidon.circom"; -include "../helpers/constants.circom"; - - -/// @title Nullifier -/// @notice Computes the nullifier for an Aadhaar identity -/// @input photo The photo of the user -/// @output nullifier = hash(nullifierSeed, hash(photo[0:15]), hash(photo[16:31])) -template Nullifier() { - signal input nullifierSeed; - signal input photo[photoPackSize()]; // 32 elements - - signal output out; - - // Poseidon template only support 16 inputs - so we do in two chunks (photo is 32 chunks) - component first16Hasher = Poseidon(16); - for (var i = 0; i < 16; i++) { - first16Hasher.inputs[i] <== photo[i]; - } - - component last16Hasher = Poseidon(16); - for (var i = 0; i < 16; i++) { - last16Hasher.inputs[i] <== photo[i + 16]; - } - - out <== Poseidon(3)([nullifierSeed, first16Hasher.out, last16Hasher.out]); -} diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/LICENSE b/mopro-core/examples/circom/anonAadhaar/helpers/rsa/LICENSE deleted file mode 100644 index a1c6d7a..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 zk-email - -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/mopro-core/examples/circom/anonAadhaar/helpers/rsa/bigint.circom b/mopro-core/examples/circom/anonAadhaar/helpers/rsa/bigint.circom deleted file mode 100644 index b8d7601..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/bigint.circom +++ /dev/null @@ -1,565 +0,0 @@ -pragma circom 2.1.6; - -include "../../node_modules/circomlib/circuits/comparators.circom"; -include "../../node_modules/circomlib/circuits/bitify.circom"; -include "../../node_modules/circomlib/circuits/gates.circom"; -include "bigint_func.circom"; - -// addition mod 2**n with carry bit -template ModSum(n) { - assert(n <= 252); - signal input a; - signal input b; - signal output sum; - signal output carry; - - component n2b = Num2Bits(n + 1); - n2b.in <== a + b; - carry <== n2b.out[n]; - sum <== a + b - carry * (1 << n); -} - -// a - b -template ModSub(n) { - assert(n <= 252); - signal input a; - signal input b; - signal output out; - signal output borrow; - component lt = LessThan(n); - lt.in[0] <== a; - lt.in[1] <== b; - borrow <== lt.out; - out <== borrow * (1 << n) + a - b; -} - -// a - b - c -// assume a - b - c + 2**n >= 0 -template ModSubThree(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - assert(a - b - c + (1 << n) >= 0); - signal output out; - signal output borrow; - signal b_plus_c; - b_plus_c <== b + c; - component lt = LessThan(n + 1); - lt.in[0] <== a; - lt.in[1] <== b_plus_c; - borrow <== lt.out; - out <== borrow * (1 << n) + a - b_plus_c; -} - -template ModSumThree(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - signal output sum; - signal output carry; - - component n2b = Num2Bits(n + 2); - n2b.in <== a + b + c; - carry <== n2b.out[n] + 2 * n2b.out[n + 1]; - sum <== a + b + c - carry * (1 << n); -} - -template ModSumFour(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - signal input d; - signal output sum; - signal output carry; - - component n2b = Num2Bits(n + 2); - n2b.in <== a + b + c + d; - carry <== n2b.out[n] + 2 * n2b.out[n + 1]; - sum <== a + b + c + d - carry * (1 << n); -} - -// product mod 2**n with carry -template ModProd(n) { - assert(n <= 126); - signal input a; - signal input b; - signal output prod; - signal output carry; - - component n2b = Num2Bits(2 * n); - n2b.in <== a * b; - - component b2n1 = Bits2Num(n); - component b2n2 = Bits2Num(n); - var i; - for (i = 0; i < n; i++) { - b2n1.in[i] <== n2b.out[i]; - b2n2.in[i] <== n2b.out[i + n]; - } - prod <== b2n1.out; - carry <== b2n2.out; -} - -// split a n + m bit input into two outputs -template Split(n, m) { - assert(n <= 126); - signal input in; - signal output small; - signal output big; - - small <-- in % (1 << n); - big <-- in \ (1 << n); - - component n2b_small = Num2Bits(n); - n2b_small.in <== small; - component n2b_big = Num2Bits(m); - n2b_big.in <== big; - - in === small + big * (1 << n); -} - -// split a n + m + k bit input into three outputs -template SplitThree(n, m, k) { - assert(n <= 126); - signal input in; - signal output small; - signal output medium; - signal output big; - - small <-- in % (1 << n); - medium <-- (in \ (1 << n)) % (1 << m); - big <-- in \ (1 << n + m); - - component n2b_small = Num2Bits(n); - n2b_small.in <== small; - component n2b_medium = Num2Bits(m); - n2b_medium.in <== medium; - component n2b_big = Num2Bits(k); - n2b_big.in <== big; - - in === small + medium * (1 << n) + big * (1 << n + m); -} - -// a[i], b[i] in 0... 2**n-1 -// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) -template BigAdd(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal output out[k + 1]; - - component unit0 = ModSum(n); - unit0.a <== a[0]; - unit0.b <== b[0]; - out[0] <== unit0.sum; - - component unit[k - 1]; - for (var i = 1; i < k; i++) { - unit[i - 1] = ModSumThree(n); - unit[i - 1].a <== a[i]; - unit[i - 1].b <== b[i]; - if (i == 1) { - unit[i - 1].c <== unit0.carry; - } else { - unit[i - 1].c <== unit[i - 2].carry; - } - out[i] <== unit[i - 1].sum; - } - out[k] <== unit[k - 2].carry; -} - -// a and b have n-bit registers -// a has ka registers, each with NONNEGATIVE ma-bit values (ma can be > n) -// b has kb registers, each with NONNEGATIVE mb-bit values (mb can be > n) -// out has ka + kb - 1 registers, each with (ma + mb + ceil(log(max(ka, kb))))-bit values -template BigMultNoCarry(n, ma, mb, ka, kb) { - assert(ma + mb <= 253); - signal input a[ka]; - signal input b[kb]; - signal output out[ka + kb - 1]; - - var prod_val[ka + kb - 1]; - for (var i = 0; i < ka + kb - 1; i++) { - prod_val[i] = 0; - } - for (var i = 0; i < ka; i++) { - for (var j = 0; j < kb; j++) { - prod_val[i + j] += a[i] * b[j]; - } - } - for (var i = 0; i < ka + kb - 1; i++) { - out[i] <-- prod_val[i]; - } - - var a_poly[ka + kb - 1]; - var b_poly[ka + kb - 1]; - var out_poly[ka + kb - 1]; - for (var i = 0; i < ka + kb - 1; i++) { - out_poly[i] = 0; - a_poly[i] = 0; - b_poly[i] = 0; - for (var j = 0; j < ka + kb - 1; j++) { - out_poly[i] = out_poly[i] + out[j] * (i ** j); - } - for (var j = 0; j < ka; j++) { - a_poly[i] = a_poly[i] + a[j] * (i ** j); - } - for (var j = 0; j < kb; j++) { - b_poly[i] = b_poly[i] + b[j] * (i ** j); - } - } - for (var i = 0; i < ka + kb - 1; i++) { - out_poly[i] === a_poly[i] * b_poly[i]; - } -} - - -// in[i] contains longs -// out[i] contains shorts -template LongToShortNoEndCarry(n, k) { - assert(n <= 126); - signal input in[k]; - signal output out[k+1]; - - var split[k][3]; - for (var i = 0; i < k; i++) { - split[i] = SplitThreeFn(in[i], n, n, n); - } - - var carry[k]; - carry[0] = 0; - out[0] <-- split[0][0]; - if (k == 1) { - out[1] <-- split[0][1]; - } - if (k > 1) { - var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); - out[1] <-- sumAndCarry[0]; - carry[1] = sumAndCarry[1]; - } - if (k == 2) { - out[2] <-- split[1][1] + split[0][2] + carry[1]; - } - if (k > 2) { - for (var i = 2; i < k; i++) { - var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); - out[i] <-- sumAndCarry[0]; - carry[i] = sumAndCarry[1]; - } - out[k] <-- split[k-1][1] + split[k-2][2] + carry[k-1]; - } - - component outRangeChecks[k+1]; - for (var i = 0; i < k+1; i++) { - outRangeChecks[i] = Num2Bits(n); - outRangeChecks[i].in <== out[i]; - } - - signal runningCarry[k]; - component runningCarryRangeChecks[k]; - runningCarry[0] <-- (in[0] - out[0]) / (1 << n); - runningCarryRangeChecks[0] = Num2Bits(n + log_ceil(k)); - runningCarryRangeChecks[0].in <== runningCarry[0]; - runningCarry[0] * (1 << n) === in[0] - out[0]; - for (var i = 1; i < k; i++) { - runningCarry[i] <-- (in[i] - out[i] + runningCarry[i-1]) / (1 << n); - runningCarryRangeChecks[i] = Num2Bits(n + log_ceil(k)); - runningCarryRangeChecks[i].in <== runningCarry[i]; - runningCarry[i] * (1 << n) === in[i] - out[i] + runningCarry[i-1]; - } - runningCarry[k-1] === out[k]; -} - -template BigMult(n, k) { - signal input a[k]; - signal input b[k]; - signal output out[2 * k]; - - component mult = BigMultNoCarry(n, n, n, k, k); - for (var i = 0; i < k; i++) { - mult.a[i] <== a[i]; - mult.b[i] <== b[i]; - } - - // no carry is possible in the highest order register - component longshort = LongToShortNoEndCarry(n, 2 * k - 1); - for (var i = 0; i < 2 * k - 1; i++) { - longshort.in[i] <== mult.out[i]; - } - for (var i = 0; i < 2 * k; i++) { - out[i] <== longshort.out[i]; - } -} - -template BigLessThan(n, k){ - signal input a[k]; - signal input b[k]; - signal output out; - - component lt[k]; - component eq[k]; - for (var i = 0; i < k; i++) { - lt[i] = LessThan(n); - lt[i].in[0] <== a[i]; - lt[i].in[1] <== b[i]; - eq[i] = IsEqual(); - eq[i].in[0] <== a[i]; - eq[i].in[1] <== b[i]; - } - - // ors[i] holds (lt[k - 1] || (eq[k - 1] && lt[k - 2]) .. || (eq[k - 1] && .. && lt[i])) - // ands[i] holds (eq[k - 1] && .. && lt[i]) - // eq_ands[i] holds (eq[k - 1] && .. && eq[i]) - component ors[k - 1]; - component ands[k - 1]; - component eq_ands[k - 1]; - for (var i = k - 2; i >= 0; i--) { - ands[i] = AND(); - eq_ands[i] = AND(); - ors[i] = OR(); - - if (i == k - 2) { - ands[i].a <== eq[k - 1].out; - ands[i].b <== lt[k - 2].out; - eq_ands[i].a <== eq[k - 1].out; - eq_ands[i].b <== eq[k - 2].out; - ors[i].a <== lt[k - 1].out; - ors[i].b <== ands[i].out; - } else { - ands[i].a <== eq_ands[i + 1].out; - ands[i].b <== lt[i].out; - eq_ands[i].a <== eq_ands[i + 1].out; - eq_ands[i].b <== eq[i].out; - ors[i].a <== ors[i + 1].out; - ors[i].b <== ands[i].out; - } - } - out <== ors[0].out; -} - -template BigIsEqual(k){ - signal input in[2][k]; - signal output out; - component isEqual[k+1]; - var sum = 0; - for(var i = 0; i < k; i++){ - isEqual[i] = IsEqual(); - isEqual[i].in[0] <== in[0][i]; - isEqual[i].in[1] <== in[1][i]; - sum = sum + isEqual[i].out; - } - - isEqual[k] = IsEqual(); - isEqual[k].in[0] <== sum; - isEqual[k].in[1] <== k; - out <== isEqual[k].out; -} - -// leading register of b should be non-zero -template BigMod(n, k) { - assert(n <= 126); - signal input a[2 * k]; - signal input b[k]; - - signal output div[k + 1]; - signal output mod[k]; - - var longdiv[2][100] = long_div(n, k, k, a, b); - for (var i = 0; i < k; i++) { - div[i] <-- longdiv[0][i]; - mod[i] <-- longdiv[1][i]; - } - div[k] <-- longdiv[0][k]; - component div_range_checks[k + 1]; - for (var i = 0; i <= k; i++) { - div_range_checks[i] = Num2Bits(n); - div_range_checks[i].in <== div[i]; - } - component mod_range_checks[k]; - for (var i = 0; i < k; i++) { - mod_range_checks[i] = Num2Bits(n); - mod_range_checks[i].in <== mod[i]; - } - - component mul = BigMult(n, k + 1); - for (var i = 0; i < k; i++) { - mul.a[i] <== div[i]; - mul.b[i] <== b[i]; - } - mul.a[k] <== div[k]; - mul.b[k] <== 0; - - component add = BigAdd(n, 2 * k + 2); - for (var i = 0; i < 2 * k; i++) { - add.a[i] <== mul.out[i]; - if (i < k) { - add.b[i] <== mod[i]; - } else { - add.b[i] <== 0; - } - } - add.a[2 * k] <== mul.out[2 * k]; - add.a[2 * k + 1] <== mul.out[2 * k + 1]; - add.b[2 * k] <== 0; - add.b[2 * k + 1] <== 0; - - for (var i = 0; i < 2 * k; i++) { - add.out[i] === a[i]; - } - add.out[2 * k] === 0; - add.out[2 * k + 1] === 0; - - component lt = BigLessThan(n, k); - for (var i = 0; i < k; i++) { - lt.a[i] <== mod[i]; - lt.b[i] <== b[i]; - } - lt.out === 1; -} - -// a[i], b[i] in 0... 2**n-1 -// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) -// assume a >= b -template BigSub(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal output out[k]; - signal output underflow; - - component unit0 = ModSub(n); - unit0.a <== a[0]; - unit0.b <== b[0]; - out[0] <== unit0.out; - - component unit[k - 1]; - for (var i = 1; i < k; i++) { - unit[i - 1] = ModSubThree(n); - unit[i - 1].a <== a[i]; - unit[i - 1].b <== b[i]; - if (i == 1) { - unit[i - 1].c <== unit0.borrow; - } else { - unit[i - 1].c <== unit[i - 2].borrow; - } - out[i] <== unit[i - 1].out; - } - underflow <== unit[k - 2].borrow; -} - -// calculates (a - b) % p, where a, b < p -// note: does not assume a >= b -template BigSubModP(n, k){ - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - signal output out[k]; - component sub = BigSub(n, k); - for (var i = 0; i < k; i++){ - sub.a[i] <== a[i]; - sub.b[i] <== b[i]; - } - signal flag; - flag <== sub.underflow; - component add = BigAdd(n, k); - for (var i = 0; i < k; i++){ - add.a[i] <== sub.out[i]; - add.b[i] <== flag * p[i]; - } - for (var i = 0; i < k; i++){ - out[i] <== add.out[i]; - } -} - -template BigMultModP(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - signal output out[k]; - - component big_mult = BigMult(n, k); - for (var i = 0; i < k; i++) { - big_mult.a[i] <== a[i]; - big_mult.b[i] <== b[i]; - } - component big_mod = BigMod(n, k); - for (var i = 0; i < 2 * k; i++) { - big_mod.a[i] <== big_mult.out[i]; - } - for (var i = 0; i < k; i++) { - big_mod.b[i] <== p[i]; - } - for (var i = 0; i < k; i++) { - out[i] <== big_mod.mod[i]; - } -} - -template BigModInv(n, k) { - assert(n <= 252); - signal input in[k]; - signal input p[k]; - signal output out[k]; - - // length k - var inv[100] = mod_inv(n, k, in, p); - for (var i = 0; i < k; i++) { - out[i] <-- inv[i]; - } - component range_checks[k]; - for (var i = 0; i < k; i++) { - range_checks[i] = Num2Bits(n); - range_checks[i].in <== out[i]; - } - - component mult = BigMult(n, k); - for (var i = 0; i < k; i++) { - mult.a[i] <== in[i]; - mult.b[i] <== out[i]; - } - component mod = BigMod(n, k); - for (var i = 0; i < 2 * k; i++) { - mod.a[i] <== mult.out[i]; - } - for (var i = 0; i < k; i++) { - mod.b[i] <== p[i]; - } - mod.mod[0] === 1; - for (var i = 1; i < k; i++) { - mod.mod[i] === 0; - } -} - -// in[i] contains values in the range -2^(m-1) to 2^(m-1) -// constrain that in[] as a big integer is zero -// each limbs is n bits -template CheckCarryToZero(n, m, k) { - assert(k >= 2); - - var EPSILON = 3; - - assert(m + EPSILON <= 253); - - signal input in[k]; - - signal carry[k]; - component carryRangeChecks[k]; - for (var i = 0; i < k-1; i++){ - carryRangeChecks[i] = Num2Bits(m + EPSILON - n); - if( i == 0 ){ - carry[i] <-- in[i] / (1< 10944121435919637611123202872628637544274182200208017171849102093287904247808 ? 1 : 0; -} - -function div_ceil(m, n) { - var ret = 0; - if (m % n == 0) { - ret = m \ n; - } else { - ret = m \ n + 1; - } - return ret; -} - -function log_ceil(n) { - var n_temp = n; - for (var i = 0; i < 254; i++) { - if (n_temp == 0) { - return i; - } - n_temp = n_temp \ 2; - } - return 254; -} - -function SplitFn(in, n, m) { - return [in % (1 << n), (in \ (1 << n)) % (1 << m)]; -} - -function SplitThreeFn(in, n, m, k) { - return [in % (1 << n), (in \ (1 << n)) % (1 << m), (in \ (1 << n + m)) % (1 << k)]; -} - -// m bits per overflowed register (values are potentially negative) -// n bits per properly-sized register -// in has k registers -// out has k + ceil(m/n) - 1 + 1 registers. highest-order potentially negative, -// all others are positive -// - 1 since the last register is included in the last ceil(m/n) array -// + 1 since the carries from previous registers could push you over -function getProperRepresentation(m, n, k, in) { - var ceilMN = div_ceil(m, n); - - var out[100]; // should be out[k + ceilMN] - assert(k + ceilMN < 100); - for (var i = 0; i < k; i++) { - out[i] = in[i]; - } - for (var i = k; i < 100; i++) { - out[i] = 0; - } - assert(n <= m); - for (var i = 0; i+1 < k + ceilMN; i++) { - assert((1 << m) >= out[i] && out[i] >= -(1 << m)); - var shifted_val = out[i] + (1 << m); - assert(0 <= shifted_val && shifted_val <= (1 << (m+1))); - out[i] = shifted_val & ((1 << n) - 1); - out[i+1] += (shifted_val >> n) - (1 << (m - n)); - } - - return out; -} - -// Evaluate polynomial a at point x -function poly_eval(len, a, x) { - var v = 0; - for (var i = 0; i < len; i++) { - v += a[i] * (x ** i); - } - return v; -} - -// Interpolate a degree len-1 polynomial given its evaluations at 0..len-1 -function poly_interp(len, v) { - assert(len <= 200); - var out[200]; - for (var i = 0; i < len; i++) { - out[i] = 0; - } - - // Product_{i=0..len-1} (x-i) - var full_poly[201]; - full_poly[0] = 1; - for (var i = 0; i < len; i++) { - full_poly[i+1] = 0; - for (var j = i; j >= 0; j--) { - full_poly[j+1] += full_poly[j]; - full_poly[j] *= -i; - } - } - - for (var i = 0; i < len; i++) { - var cur_v = 1; - for (var j = 0; j < len; j++) { - if (i == j) { - // do nothing - } else { - cur_v *= i-j; - } - } - cur_v = v[i] / cur_v; - - var cur_rem = full_poly[len]; - for (var j = len-1; j >= 0; j--) { - out[j] += cur_v * cur_rem; - cur_rem = full_poly[j] + i * cur_rem; - } - assert(cur_rem == 0); - } - - return out; -} - -// 1 if true, 0 if false -function long_gt(n, k, a, b) { - for (var i = k - 1; i >= 0; i--) { - if (a[i] > b[i]) { - return 1; - } - if (a[i] < b[i]) { - return 0; - } - } - return 0; -} - -// n bits per register -// a has k registers -// b has k registers -// a >= b -function long_sub(n, k, a, b) { - var diff[100]; - var borrow[100]; - for (var i = 0; i < k; i++) { - if (i == 0) { - if (a[i] >= b[i]) { - diff[i] = a[i] - b[i]; - borrow[i] = 0; - } else { - diff[i] = a[i] - b[i] + (1 << n); - borrow[i] = 1; - } - } else { - if (a[i] >= b[i] + borrow[i - 1]) { - diff[i] = a[i] - b[i] - borrow[i - 1]; - borrow[i] = 0; - } else { - diff[i] = (1 << n) + a[i] - b[i] - borrow[i - 1]; - borrow[i] = 1; - } - } - } - return diff; -} - -// a is a n-bit scalar -// b has k registers -function long_scalar_mult(n, k, a, b) { - var out[100]; - for (var i = 0; i < 100; i++) { - out[i] = 0; - } - for (var i = 0; i < k; i++) { - var temp = out[i] + (a * b[i]); - out[i] = temp % (1 << n); - out[i + 1] = out[i + 1] + temp \ (1 << n); - } - return out; -} - - -// n bits per register -// a has k + m registers -// b has k registers -// out[0] has length m + 1 -- quotient -// out[1] has length k -- remainder -// implements algorithm of https://people.eecs.berkeley.edu/~fateman/282/F%20Wright%20notes/week4.pdf -function long_div(n, k, m, a, b){ - var out[2][100]; - m += k; - while (b[k-1] == 0) { - out[1][k] = 0; - k--; - assert(k > 0); - } - m -= k; - - var remainder[200]; - for (var i = 0; i < m + k; i++) { - remainder[i] = a[i]; - } - - var mult[200]; - var dividend[200]; - for (var i = m; i >= 0; i--) { - if (i == m) { - dividend[k] = 0; - for (var j = k - 1; j >= 0; j--) { - dividend[j] = remainder[j + m]; - } - } else { - for (var j = k; j >= 0; j--) { - dividend[j] = remainder[j + i]; - } - } - - out[0][i] = short_div(n, k, dividend, b); - - var mult_shift[100] = long_scalar_mult(n, k, out[0][i], b); - var subtrahend[200]; - for (var j = 0; j < m + k; j++) { - subtrahend[j] = 0; - } - for (var j = 0; j <= k; j++) { - if (i + j < m + k) { - subtrahend[i + j] = mult_shift[j]; - } - } - remainder = long_sub(n, m + k, remainder, subtrahend); - } - for (var i = 0; i < k; i++) { - out[1][i] = remainder[i]; - } - out[1][k] = 0; - - return out; -} - -// n bits per register -// a has k + 1 registers -// b has k registers -// assumes leading digit of b is at least 2 ** (n - 1) -// 0 <= a < (2**n) * b -function short_div_norm(n, k, a, b) { - var qhat = (a[k] * (1 << n) + a[k - 1]) \ b[k - 1]; - if (qhat > (1 << n) - 1) { - qhat = (1 << n) - 1; - } - - var mult[100] = long_scalar_mult(n, k, qhat, b); - if (long_gt(n, k + 1, mult, a) == 1) { - mult = long_sub(n, k + 1, mult, b); - if (long_gt(n, k + 1, mult, a) == 1) { - return qhat - 2; - } else { - return qhat - 1; - } - } else { - return qhat; - } -} - -// n bits per register -// a has k + 1 registers -// b has k registers -// assumes leading digit of b is non-zero -// 0 <= a < (2**n) * b -function short_div(n, k, a, b) { - var scale = (1 << n) \ (1 + b[k - 1]); - - // k + 2 registers now - var norm_a[200] = long_scalar_mult(n, k + 1, scale, a); - // k + 1 registers now - var norm_b[200] = long_scalar_mult(n, k, scale, b); - - var ret; - if (norm_b[k] != 0) { - ret = short_div_norm(n, k + 1, norm_a, norm_b); - } else { - ret = short_div_norm(n, k, norm_a, norm_b); - } - return ret; -} - -// n bits per register -// a and b both have k registers -// out[0] has length 2 * k -// adapted from BigMulShortLong and LongToShortNoEndCarry2 witness computation -function prod(n, k, a, b) { - // first compute the intermediate values. taken from BigMulShortLong - var prod_val[100]; // length is 2 * k - 1 - for (var i = 0; i < 2 * k - 1; i++) { - prod_val[i] = 0; - if (i < k) { - for (var a_idx = 0; a_idx <= i; a_idx++) { - prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; - } - } else { - for (var a_idx = i - k + 1; a_idx < k; a_idx++) { - prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; - } - } - } - - // now do a bunch of carrying to make sure registers not overflowed. taken from LongToShortNoEndCarry2 - var out[100]; // length is 2 * k - - var split[100][3]; // first dimension has length 2 * k - 1 - for (var i = 0; i < 2 * k - 1; i++) { - split[i] = SplitThreeFn(prod_val[i], n, n, n); - } - - var carry[100]; // length is 2 * k - 1 - carry[0] = 0; - out[0] = split[0][0]; - if (2 * k - 1 > 1) { - var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); - out[1] = sumAndCarry[0]; - carry[1] = sumAndCarry[1]; - } - if (2 * k - 1 > 2) { - for (var i = 2; i < 2 * k - 1; i++) { - var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); - out[i] = sumAndCarry[0]; - carry[i] = sumAndCarry[1]; - } - out[2 * k - 1] = split[2*k-2][1] + split[2*k-3][2] + carry[2*k-2]; - } - return out; -} - -// n bits per register -// a has k registers -// p has k registers -// e has k registers -// k * n <= 500 -// p is a prime -// computes a^e mod p -function mod_exp(n, k, a, p, e) { - var eBits[500]; // length is k * n - for (var i = 0; i < k; i++) { - for (var j = 0; j < n; j++) { - eBits[j + n * i] = (e[i] >> j) & 1; - } - } - - var out[100]; // length is k - for (var i = 0; i < 100; i++) { - out[i] = 0; - } - out[0] = 1; - - // repeated squaring - for (var i = k * n - 1; i >= 0; i--) { - // multiply by a if bit is 0 - if (eBits[i] == 1) { - var temp[200]; // length 2 * k - temp = prod(n, k, out, a); - var temp2[2][100]; - temp2 = long_div(n, k, k, temp, p); - out = temp2[1]; - } - - // square, unless we're at the end - if (i > 0) { - var temp[200]; // length 2 * k - temp = prod(n, k, out, out); - var temp2[2][100]; - temp2 = long_div(n, k, k, temp, p); - out = temp2[1]; - } - - } - return out; -} - -// n bits per register -// a has k registers -// p has k registers -// k * n <= 500 -// p is a prime -// if a == 0 mod p, returns 0 -// else computes inv = a^(p-2) mod p -function mod_inv(n, k, a, p) { - var isZero = 1; - for (var i = 0; i < k; i++) { - if (a[i] != 0) { - isZero = 0; - } - } - if (isZero == 1) { - var ret[100]; - for (var i = 0; i < k; i++) { - ret[i] = 0; - } - return ret; - } - - var pCopy[100]; - for (var i = 0; i < 100; i++) { - if (i < k) { - pCopy[i] = p[i]; - } else { - pCopy[i] = 0; - } - } - - var two[100]; - for (var i = 0; i < 100; i++) { - two[i] = 0; - } - two[0] = 2; - - var pMinusTwo[100]; - pMinusTwo = long_sub(n, k, pCopy, two); // length k - var out[100]; - out = mod_exp(n, k, a, pCopy, pMinusTwo); - return out; -} - -// a, b and out are all n bits k registers -function long_sub_mod_p(n, k, a, b, p){ - var gt = long_gt(n, k, a, b); - var tmp[100]; - if(gt){ - tmp = long_sub(n, k, a, b); - } - else{ - tmp = long_sub(n, k, b, a); - } - var out[2][100]; - for(var i = k;i < 2 * k; i++){ - tmp[i] = 0; - } - out = long_div(n, k, k, tmp, p); - if(gt==0){ - tmp = long_sub(n, k, p, out[1]); - } - return tmp; -} - -// a, b, p and out are all n bits k registers -function prod_mod_p(n, k, a, b, p){ - var tmp[100]; - var result[2][100]; - tmp = prod(n, k, a, b); - result = long_div(n, k, k, tmp, p); - return result[1]; -} \ No newline at end of file diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/fp.circom b/mopro-core/examples/circom/anonAadhaar/helpers/rsa/fp.circom deleted file mode 100644 index 23391be..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/fp.circom +++ /dev/null @@ -1,144 +0,0 @@ -pragma circom 2.1.6; - -include "../../node_modules/circomlib/circuits/bitify.circom"; -include "../../node_modules/circomlib/circuits/comparators.circom"; -include "../../node_modules/circomlib/circuits/sign.circom"; -include "./bigint.circom"; -include "./bigint_func.circom"; - -// These functions operate over values in Z/Zp for some integer p (typically, -// but not necessarily prime). Values are stored as standard bignums with k -// chunks of n bits, but intermediate values often have "overflow" bits inside -// various chunks. -// -// These Fp functions will always correctly generate witnesses mod p, but they -// do not *check* that values are normalized to < p; they only check that -// values are correct mod p. This is to save the comparison circuit. -// They *will* always check for intended results mod p (soundness), but it may -// not have a unique intermediate signal. -// -// Conversely, some templates may not be satisfiable if the input witnesses are -// not < p. This does not break completeness, as honest provers will always -// generate witnesses which are canonical (between 0 and p). - -// a * b = r mod p -// a * b - p * q - r for some q -template FpMul(n, k) { - assert(n + n + log_ceil(k) + 2 <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - - signal output out[k]; - - signal v_ab[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - var v_a = poly_eval(k, a, x); - var v_b = poly_eval(k, b, x); - v_ab[x] <== v_a * v_b; - } - - var ab[200] = poly_interp(2*k-1, v_ab); - // ab_proper has length 2*k - var ab_proper[200] = getProperRepresentation(n + n + log_ceil(k), n, 2*k-1, ab); - - var long_div_out[2][100] = long_div(n, k, k, ab_proper, p); - - // Since we're only computing a*b, we know that q < p will suffice, so we - // know it fits into k chunks and can do size n range checks. - signal q[k]; - component q_range_check[k]; - signal r[k]; - component r_range_check[k]; - for (var i = 0; i < k; i++) { - q[i] <-- long_div_out[0][i]; - q_range_check[i] = Num2Bits(n); - q_range_check[i].in <== q[i]; - - r[i] <-- long_div_out[1][i]; - r_range_check[i] = Num2Bits(n); - r_range_check[i].in <== r[i]; - } - - signal v_pq_r[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - var v_p = poly_eval(k, p, x); - var v_q = poly_eval(k, q, x); - var v_r = poly_eval(k, r, x); - v_pq_r[x] <== v_p * v_q + v_r; - } - - signal v_t[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - v_t[x] <== v_ab[x] - v_pq_r[x]; - } - - var t[200] = poly_interp(2*k-1, v_t); - component tCheck = CheckCarryToZero(n, n + n + log_ceil(k) + 2, 2*k-1); - for (var i = 0; i < 2*k-1; i++) { - tCheck.in[i] <== t[i]; - } - - for (var i = 0; i < k; i++) { - out[i] <== r[i]; - } -} - -// Lifted from https://sourcegraph.com/github.com/darkforest-eth/circuits/-/blob/range_proof/circuit.circom -// NB: RangeProof is inclusive. -// input: field element, whose abs is claimed to be less than max_abs_value -// output: none -// we also want something like 4 * (abs(in) + max_abs_value) < 2 ** bits -// and bits << 256 -// NB: RangeProof is inclusive. -// input: field element, whose abs is claimed to be <= than max_abs_value -// output: none -// also checks that both max and abs(in) are expressible in `bits` bits -template RangeProof(bits) { - signal input in; - signal input max_abs_value; - - /* check that both max and abs(in) are expressible in `bits` bits */ - component n2b1 = Num2Bits(bits+1); - n2b1.in <== in + (1 << bits); - component n2b2 = Num2Bits(bits); - n2b2.in <== max_abs_value; - - /* check that in + max is between 0 and 2*max */ - component lowerBound = LessThan(bits+1); - component upperBound = LessThan(bits+1); - - lowerBound.in[0] <== max_abs_value + in; - lowerBound.in[1] <== 0; - lowerBound.out === 0; - - upperBound.in[0] <== 2 * max_abs_value; - upperBound.in[1] <== max_abs_value + in; - upperBound.out === 0; -} - -// input: n field elements, whose abs are claimed to be less than max_abs_value -// output: none -template MultiRangeProof(n, bits) { - signal input in[n]; - signal input max_abs_value; - component rangeProofs[n]; - - for (var i = 0; i < n; i++) { - rangeProofs[i] = RangeProof(bits); - rangeProofs[i].in <== in[i]; - rangeProofs[i].max_abs_value <== max_abs_value; - } -} - -template IsNegative(){ - signal input in; - signal output out; - component n2b = Num2Bits(254); - component sign = Sign(); - in ==> n2b.in; - for (var i = 0; i<254; i++) { - n2b.out[i] ==> sign.in[i]; - } - sign.sign ==> out; -} \ No newline at end of file diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/rsa.circom b/mopro-core/examples/circom/anonAadhaar/helpers/rsa/rsa.circom deleted file mode 100644 index 3dc9180..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/rsa.circom +++ /dev/null @@ -1,156 +0,0 @@ -pragma circom 2.1.6; - -include "./fp.circom"; - -// Computes base^65537 mod modulus -// Does not necessarily reduce fully mod modulus (the answer could be -// too big by a multiple of modulus) -template FpPow65537Mod(n, k) { - signal input base[k]; - // Exponent is hardcoded at 65537 - signal input modulus[k]; - signal output out[k]; - - component doublers[16]; - component adder = FpMul(n, k); - for (var i = 0; i < 16; i++) { - doublers[i] = FpMul(n, k); - } - - for (var j = 0; j < k; j++) { - adder.p[j] <== modulus[j]; - for (var i = 0; i < 16; i++) { - doublers[i].p[j] <== modulus[j]; - } - } - for (var j = 0; j < k; j++) { - doublers[0].a[j] <== base[j]; - doublers[0].b[j] <== base[j]; - } - for (var i = 0; i + 1 < 16; i++) { - for (var j = 0; j < k; j++) { - doublers[i + 1].a[j] <== doublers[i].out[j]; - doublers[i + 1].b[j] <== doublers[i].out[j]; - } - } - for (var j = 0; j < k; j++) { - adder.a[j] <== base[j]; - adder.b[j] <== doublers[15].out[j]; - } - for (var j = 0; j < k; j++) { - out[j] <== adder.out[j]; - } -} - -template RSAPad(n, k) { - signal input modulus[k]; - signal input base_message[k]; - signal output padded_message[k]; - - var base_len = 408; - var msg_len = 256; - - signal padded_message_bits[n*k]; - - component modulus_n2b[k]; - component base_message_n2b[k]; - signal modulus_bits[n*k]; - signal base_message_bits[n*k]; - for (var i = 0; i < k; i++) { - base_message_n2b[i] = Num2Bits(n); - base_message_n2b[i].in <== base_message[i]; - for (var j = 0; j < n; j++) { - base_message_bits[i*n+j] <== base_message_n2b[i].out[j]; - } - modulus_n2b[i] = Num2Bits(n); - modulus_n2b[i].in <== modulus[i]; - for (var j = 0; j < n; j++) { - modulus_bits[i*n+j] <== modulus_n2b[i].out[j]; - } - } - - for (var i = msg_len; i < n*k; i++) { - base_message_bits[i] === 0; - } - - for (var i = 0; i < msg_len; i++) { - padded_message_bits[i] <== base_message_bits[i]; - } - - for (var i = base_len; i < base_len + 8; i++) { - padded_message_bits[i] <== 0; - } - - for (var i = msg_len; i < base_len; i++) { - padded_message_bits[i] <== (0x3031300d060960864801650304020105000420 >> (i - msg_len)) & 1; - } - - component modulus_zero[(n*k + 7 - (base_len + 8))\8]; - { - var modulus_prefix = 0; - for (var i = n*k - 1; i >= base_len + 8; i--) { - if (i+8 < n*k) { - modulus_prefix += modulus_bits[i+8]; - if (i % 8 == 0) { - var idx = (i - (base_len + 8)) \ 8; - modulus_zero[idx] = IsZero(); - modulus_zero[idx].in <== modulus_prefix; - padded_message_bits[i] <== 1-modulus_zero[idx].out; - } else { - padded_message_bits[i] <== padded_message_bits[i+1]; - } - } else { - padded_message_bits[i] <== 0; - } - } - } - - // The RFC guarantees at least 8 octets of 0xff padding. - assert(base_len + 8 + 65 <= n*k); - for (var i = base_len + 8; i < base_len + 8 + 65; i++) { - padded_message_bits[i] === 1; - } - - component padded_message_b2n[k]; - for (var i = 0; i < k; i++) { - padded_message_b2n[i] = Bits2Num(n); - for (var j = 0; j < n; j++) { - padded_message_b2n[i].in[j] <== padded_message_bits[i*n+j]; - } - padded_message[i] <== padded_message_b2n[i].out; - } -} - -template RSAVerify65537(n, k) { - signal input signature[k]; - signal input modulus[k]; - signal input base_message[k]; - - component padder = RSAPad(n, k); - for (var i = 0; i < k; i++) { - padder.modulus[i] <== modulus[i]; - padder.base_message[i] <== base_message[i]; - } - - // Check that the signature is in proper form and reduced mod modulus. - component signatureRangeCheck[k]; - component bigLessThan = BigLessThan(n, k); - for (var i = 0; i < k; i++) { - signatureRangeCheck[i] = Num2Bits(n); - signatureRangeCheck[i].in <== signature[i]; - bigLessThan.a[i] <== signature[i]; - bigLessThan.b[i] <== modulus[i]; - } - bigLessThan.out === 1; - - component bigPow = FpPow65537Mod(n, k); - for (var i = 0; i < k; i++) { - bigPow.base[i] <== signature[i]; - bigPow.modulus[i] <== modulus[i]; - } - // By construction of the padding, the padded message is necessarily - // smaller than the modulus. Thus, we don't have to check that bigPow is fully reduced. - for (var i = 0; i < k; i++) { - bigPow.out[i] === padder.padded_message[i]; - } -} \ No newline at end of file diff --git a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/sha.circom b/mopro-core/examples/circom/anonAadhaar/helpers/rsa/sha.circom deleted file mode 100644 index 36184ab..0000000 --- a/mopro-core/examples/circom/anonAadhaar/helpers/rsa/sha.circom +++ /dev/null @@ -1,157 +0,0 @@ -pragma circom 2.1.6; - -include "../../node_modules/circomlib/circuits/bitify.circom"; -include "../../node_modules/circomlib/circuits/sha256/constants.circom"; -include "../../node_modules/circomlib/circuits/sha256/sha256compression.circom"; -include "../../node_modules/circomlib/circuits/comparators.circom"; -include "../../utils/array.circom"; - -function log2_ceil(a) { - var n = a+1; - var r = 0; - while (n>0) { - r++; - n \= 2; - } - return r; -} - -template Sha256Bytes(max_num_bytes) { - signal input in_padded[max_num_bytes]; - signal input in_len_padded_bytes; - signal output out[256]; - - var num_bits = max_num_bytes * 8; - component sha = Sha256General(num_bits); - - component bytes[max_num_bytes]; - for (var i = 0; i < max_num_bytes; i++) { - bytes[i] = Num2Bits(8); - bytes[i].in <== in_padded[i]; - for (var j = 0; j < 8; j++) { - sha.paddedIn[i*8+j] <== bytes[i].out[7-j]; - } - } - sha.in_len_padded_bits <== in_len_padded_bytes * 8; - - for (var i = 0; i < 256; i++) { - out[i] <== sha.out[i]; - } -} - -// A modified version of the SHA256 circuit that allows specified length messages up to a max to all work via array indexing on the SHA256 compression circuit. -template Sha256General(maxBitsPadded) { - // maxBitsPadded must be a multiple of 512, and the bit circuits in this file are limited to 15 so must be raised if the message is longer. - assert(maxBitsPadded % 512 == 0); - var maxBitsPaddedBits = log2_ceil(maxBitsPadded); - assert(2 ** maxBitsPaddedBits > maxBitsPadded); - - // Note that maxBitsPadded = maxBits + 64 - signal input paddedIn[maxBitsPadded]; - signal output out[256]; - signal input in_len_padded_bits; // This is the padded length of the message pre-hash. - signal inBlockIndex; - - var i; - var k; - var j; - var maxBlocks; - var bitsLastBlock; - maxBlocks = (maxBitsPadded\512); - var maxBlocksBits = log2_ceil(maxBlocks); - assert(2 ** maxBlocksBits > maxBlocks); - - inBlockIndex <-- (in_len_padded_bits >> 9); - in_len_padded_bits === inBlockIndex * 512; - - // These verify the unconstrained floor calculation is the uniquely correct integer that represents the floor - // component floorVerifierUnder = LessEqThan(maxBitsPaddedBits); // todo verify the length passed in is less than nbits. note that maxBitsPaddedBits can likely be lowered or made it a fn of maxbits - // floorVerifierUnder.in[0] <== (inBlockIndex)*512; - // floorVerifierUnder.in[1] <== in_len_padded_bits; - // floorVerifierUnder.out === 1; - - // component floorVerifierOver = GreaterThan(maxBitsPaddedBits); - // floorVerifierOver.in[0] <== (inBlockIndex+1)*512; - // floorVerifierOver.in[1] <== in_len_padded_bits; - // floorVerifierOver.out === 1; - - // These verify we pass in a valid number of bits to the SHA256 compression circuit. - component bitLengthVerifier = LessEqThan(maxBitsPaddedBits); // todo verify the length passed in is less than nbits. note that maxBitsPaddedBits can likely be lowered or made it a fn of maxbits - bitLengthVerifier.in[0] <== in_len_padded_bits; - bitLengthVerifier.in[1] <== maxBitsPadded; - bitLengthVerifier.out === 1; - - // Note that we can no longer do padded verification efficiently inside the SHA because it requires non deterministic array indexing. - // We can do it if we add a constraint, but since guessing a valid SHA2 preimage is hard anyways, we'll just do it outside the circuit. - - // signal paddedIn[maxBlocks*512]; - // for (k=0; k> k)&1; - // } - - component ha0 = H(0); - component hb0 = H(1); - component hc0 = H(2); - component hd0 = H(3); - component he0 = H(4); - component hf0 = H(5); - component hg0 = H(6); - component hh0 = H(7); - - component sha256compression[maxBlocks]; - - for (i=0; i 16 and <= 32 (i.e we merge two consecutive item in array to bring down the size) - var poseidonInputSize = k \ 2; - if (k % 2 == 1) { - poseidonInputSize++; - } - assert(poseidonInputSize <= 16); - signal pubkeyHasherInput[poseidonInputSize]; - for (var i = 0; i < poseidonInputSize; i++) { - if (i == poseidonInputSize - 1 && poseidonInputSize % 2 == 1) { - pubkeyHasherInput[i] <== pubKey[i * 2]; - } else { - pubkeyHasherInput[i] <== pubKey[i * 2] + (1 << n) * pubKey[i * 2 + 1]; - } - } - component pubkeyHasher = Poseidon(poseidonInputSize); - pubkeyHasher.inputs <== pubkeyHasherInput; - pubkeyHash <== pubkeyHasher.out; -} diff --git a/mopro-core/examples/circom/anonAadhaar/input.json b/mopro-core/examples/circom/anonAadhaar/input.json deleted file mode 100644 index 48c38e8..0000000 --- a/mopro-core/examples/circom/anonAadhaar/input.json +++ /dev/null @@ -1,1606 +0,0 @@ -{ - "qr_data_padded": [ - "86", - "50", - "255", - "51", - "255", - "50", - "54", - "57", - "55", - "50", - "48", - "50", - "52", - "48", - "50", - "48", - "51", - "49", - "57", - "49", - "53", - "50", - "53", - "54", - "52", - "52", - "255", - "83", - "117", - "109", - "105", - "116", - "32", - "75", - "117", - "109", - "97", - "114", - "255", - "48", - "49", - "45", - "48", - "49", - "45", - "49", - "57", - "56", - "52", - "255", - "77", - "255", - "67", - "47", - "79", - "32", - "73", - "115", - "104", - "119", - "97", - "114", - "32", - "67", - "104", - "97", - "110", - "100", - "255", - "69", - "97", - "115", - "116", - "32", - "68", - "101", - "108", - "104", - "105", - "255", - "255", - "66", - "45", - "51", - "49", - "44", - "32", - "51", - "114", - "100", - "32", - "70", - "108", - "111", - "111", - "114", - "255", - "255", - "49", - "49", - "48", - "48", - "53", - "49", - "255", - "75", - "114", - "105", - "115", - "104", - "110", - "97", - "32", - "78", - "97", - "103", - "97", - "114", - "255", - "68", - "101", - "108", - "104", - "105", - "255", - "82", - "97", - "100", - "104", - "101", - "121", - "32", - "83", - "104", - "121", - "97", - "109", - "32", - "80", - "97", - "114", - "107", - "32", - "69", - "120", - "116", - "101", - "110", - "115", - "105", - "111", - "110", - "255", - "71", - "97", - "110", - "100", - "104", - "105", - "32", - "78", - "97", - "103", - "97", - "114", - "255", - "75", - "114", - "105", - "115", - "104", - "110", - "97", - "32", - "78", - "97", - "103", - "97", - "114", - "255", - "49", - "50", - "51", - "52", - "255", - "255", - "79", - "255", - "81", - "0", - "47", - "0", - "0", - "0", - "0", - "0", - "60", - "0", - "0", - "0", - "60", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "60", - "0", - "0", - "0", - "60", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "3", - "7", - "1", - "1", - "7", - "1", - "1", - "7", - "1", - "1", - "255", - "82", - "0", - "12", - "2", - "0", - "0", - "1", - "1", - "5", - "4", - "4", - "0", - "0", - "255", - "92", - "0", - "35", - "66", - "111", - "24", - "110", - "234", - "110", - "234", - "110", - "188", - "103", - "0", - "103", - "0", - "102", - "226", - "95", - "76", - "95", - "76", - "95", - "100", - "72", - "3", - "72", - "3", - "72", - "69", - "79", - "210", - "79", - "210", - "79", - "97", - "255", - "100", - "0", - "34", - "0", - "1", - "67", - "114", - "101", - "97", - "116", - "101", - "100", - "32", - "98", - "121", - "58", - "32", - "74", - "74", - "50", - "48", - "48", - "48", - "32", - "118", - "101", - "114", - "115", - "105", - "111", - "110", - "32", - "52", - "46", - "49", - "255", - "144", - "0", - "10", - "0", - "0", - "0", - "0", - "2", - "236", - "0", - "1", - "255", - "82", - "0", - "12", - "2", - "0", - "0", - "1", - "1", - "5", - "4", - "4", - "0", - "0", - "255", - "147", - "255", - "145", - "0", - "4", - "0", - "0", - "195", - "235", - "5", - "4", - "11", - "128", - "38", - "166", - "255", - "145", - "0", - "4", - "0", - "1", - "192", - "249", - "65", - "128", - "16", - "124", - "55", - "255", - "145", - "0", - "4", - "0", - "2", - "192", - "249", - "65", - "0", - "14", - "175", - "255", - "145", - "0", - "4", - "0", - "3", - "195", - "238", - "4", - "131", - "237", - "4", - "131", - "232", - "8", - "15", - "61", - "227", - "128", - "14", - "78", - "244", - "198", - "10", - "190", - "128", - "74", - "255", - "145", - "0", - "4", - "0", - "4", - "192", - "30", - "10", - "3", - "229", - "7", - "0", - "240", - "64", - "15", - "157", - "12", - "56", - "206", - "16", - "124", - "255", - "145", - "0", - "4", - "0", - "5", - "192", - "120", - "40", - "7", - "196", - "14", - "1", - "224", - "128", - "16", - "128", - "16", - "144", - "102", - "15", - "55", - "255", - "145", - "0", - "4", - "0", - "6", - "195", - "235", - "15", - "131", - "232", - "29", - "7", - "202", - "36", - "35", - "123", - "119", - "32", - "21", - "133", - "220", - "173", - "123", - "29", - "124", - "190", - "51", - "158", - "143", - "0", - "4", - "234", - "216", - "145", - "15", - "189", - "91", - "82", - "210", - "45", - "90", - "170", - "52", - "34", - "209", - "158", - "13", - "108", - "213", - "78", - "158", - "137", - "255", - "145", - "0", - "4", - "0", - "7", - "192", - "56", - "56", - "15", - "132", - "112", - "35", - "164", - "155", - "1", - "61", - "240", - "240", - "232", - "42", - "148", - "255", - "145", - "0", - "4", - "0", - "8", - "192", - "49", - "32", - "29", - "20", - "7", - "59", - "113", - "163", - "24", - "138", - "108", - "156", - "26", - "255", - "145", - "0", - "4", - "0", - "9", - "193", - "241", - "27", - "135", - "206", - "122", - "15", - "144", - "184", - "25", - "25", - "211", - "9", - "237", - "209", - "173", - "196", - "150", - "111", - "25", - "246", - "238", - "110", - "167", - "245", - "97", - "24", - "144", - "213", - "187", - "170", - "6", - "133", - "23", - "21", - "199", - "31", - "204", - "1", - "35", - "171", - "39", - "5", - "127", - "48", - "209", - "141", - "130", - "143", - "72", - "200", - "150", - "233", - "85", - "241", - "55", - "128", - "173", - "216", - "49", - "52", - "216", - "139", - "110", - "91", - "225", - "30", - "109", - "204", - "188", - "146", - "157", - "214", - "18", - "87", - "32", - "89", - "157", - "101", - "246", - "187", - "223", - "117", - "50", - "62", - "81", - "65", - "205", - "126", - "255", - "145", - "0", - "4", - "0", - "10", - "160", - "28", - "48", - "34", - "126", - "189", - "171", - "105", - "217", - "255", - "145", - "0", - "4", - "0", - "11", - "160", - "58", - "48", - "35", - "137", - "175", - "61", - "198", - "184", - "255", - "145", - "0", - "4", - "0", - "12", - "199", - "200", - "222", - "62", - "71", - "240", - "248", - "106", - "128", - "111", - "222", - "255", - "137", - "22", - "12", - "202", - "78", - "23", - "233", - "116", - "114", - "125", - "113", - "100", - "226", - "16", - "241", - "69", - "36", - "122", - "23", - "17", - "120", - "240", - "5", - "127", - "168", - "109", - "250", - "155", - "59", - "7", - "206", - "127", - "108", - "18", - "105", - "216", - "235", - "32", - "159", - "93", - "175", - "208", - "238", - "70", - "166", - "172", - "160", - "62", - "58", - "51", - "254", - "8", - "55", - "97", - "246", - "138", - "129", - "137", - "16", - "33", - "165", - "205", - "22", - "186", - "92", - "163", - "108", - "70", - "25", - "168", - "130", - "96", - "162", - "13", - "106", - "78", - "71", - "254", - "89", - "108", - "233", - "225", - "39", - "97", - "63", - "17", - "13", - "42", - "95", - "0", - "30", - "0", - "130", - "28", - "154", - "5", - "162", - "1", - "51", - "178", - "125", - "65", - "235", - "47", - "162", - "24", - "112", - "152", - "119", - "13", - "83", - "212", - "102", - "84", - "248", - "36", - "193", - "63", - "193", - "101", - "254", - "213", - "80", - "59", - "106", - "79", - "74", - "170", - "227", - "110", - "2", - "204", - "201", - "182", - "60", - "114", - "60", - "65", - "195", - "148", - "232", - "145", - "30", - "46", - "232", - "19", - "28", - "159", - "29", - "153", - "101", - "206", - "162", - "28", - "108", - "80", - "229", - "255", - "145", - "0", - "4", - "0", - "13", - "128", - "255", - "145", - "0", - "4", - "0", - "14", - "128", - "255", - "145", - "0", - "4", - "0", - "15", - "195", - "224", - "188", - "135", - "193", - "127", - "15", - "134", - "196", - "158", - "62", - "204", - "245", - "173", - "53", - "224", - "68", - "102", - "215", - "173", - "58", - "244", - "81", - "11", - "131", - "110", - "245", - "166", - "156", - "166", - "215", - "76", - "158", - "156", - "10", - "170", - "148", - "182", - "60", - "115", - "173", - "176", - "16", - "1", - "15", - "169", - "187", - "111", - "38", - "226", - "185", - "241", - "97", - "88", - "34", - "140", - "218", - "123", - "203", - "88", - "112", - "88", - "143", - "74", - "108", - "17", - "106", - "37", - "69", - "149", - "69", - "151", - "215", - "37", - "209", - "201", - "125", - "81", - "117", - "124", - "102", - "108", - "252", - "251", - "26", - "14", - "104", - "229", - "35", - "22", - "219", - "199", - "180", - "110", - "24", - "47", - "126", - "104", - "141", - "232", - "237", - "115", - "47", - "31", - "176", - "190", - "111", - "243", - "116", - "185", - "32", - "185", - "121", - "57", - "59", - "197", - "65", - "61", - "233", - "98", - "18", - "172", - "235", - "82", - "146", - "150", - "241", - "30", - "186", - "172", - "161", - "155", - "148", - "171", - "212", - "237", - "170", - "123", - "85", - "177", - "76", - "132", - "230", - "38", - "114", - "51", - "254", - "36", - "37", - "236", - "202", - "21", - "44", - "48", - "203", - "191", - "154", - "22", - "219", - "13", - "67", - "28", - "214", - "71", - "72", - "63", - "173", - "24", - "137", - "62", - "141", - "14", - "123", - "11", - "237", - "106", - "219", - "68", - "40", - "62", - "29", - "255", - "145", - "0", - "4", - "0", - "16", - "128", - "255", - "145", - "0", - "4", - "0", - "17", - "128", - "255", - "217", - "235", - "89", - "152", - "53", - "59", - "33", - "186", - "193", - "56", - "29", - "117", - "14", - "31", - "162", - "102", - "65", - "224", - "150", - "175", - "57", - "29", - "17", - "95", - "173", - "173", - "212", - "123", - "244", - "250", - "47", - "255", - "139", - "96", - "54", - "34", - "219", - "243", - "92", - "100", - "240", - "182", - "255", - "21", - "167", - "91", - "244", - "127", - "53", - "165", - "180", - "223", - "131", - "221", - "184", - "74", - "53", - "233", - "255", - "238", - "30", - "166", - "5", - "157", - "243", - "128", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "35", - "136", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "qrDataPaddedLength": 1152, - "nonPaddedDataLength": 1137, - "delimiter_indices": [ - "2", - "4", - "26", - "38", - "49", - "51", - "68", - "79", - "80", - "96", - "97", - "104", - "118", - "124", - "152", - "165", - "179", - "184" - ], - "signature": [ - "2597334526677113555961629994892926638", - "1874022799470608265149907052534928237", - "532931701307795701700379205484947707", - "1241467253205962957307657264429579016", - "1358341066331429308131265698973739827", - "249382464705315120442792485067655575", - "1043907442603104252177860572450404035", - "2522748665002176143215406095338397798", - "183432772087985066751997294584364365", - "2513572649811237604338685344487706886", - "86995082383127269299995009413012355", - "777004986025489159616301122863881087", - "1013321238055256729123141343340971725", - "1047392920377553221009028046621837452", - "1189052003243520715853202284110998690", - "120711539922143415898040852456384405", - "290259688129375981778657984298594" - ], - "pub_key": [ - "1640818228760052179859042244355947249", - "2556500785716576226415796061849734159", - "1773663274924506786300654122545997574", - "156007087115998107687088234502964965", - "1007983086444915868913459627234715796", - "1207907671574654908578158113785868692", - "661583974440108157749604450701607929", - "2294674184689511060148392370957342314", - "2125217202257742866740569471305663059", - "757604698857004563734075326539558731", - "200007885942223577865900248803094107", - "634836160982611096393054589936335825", - "1449711680328986902465274550271974011", - "203106953707476066515237197004426128", - "531393944197892908304277361531706813", - "2243235350875430237629201981240106035", - "3040469700157016219231660416032053" - ], - "nullifierSeed": 12345678, - "signalHash": "312829776796408387545637016147278514583116203736587368460269838669765409292", - "revealGender": "0", - "revealAgeAbove18": "0", - "revealState": "0", - "revealPinCode": "0" -} diff --git a/mopro-core/examples/circom/anonAadhaar/package-lock.json b/mopro-core/examples/circom/anonAadhaar/package-lock.json deleted file mode 100644 index 123c855..0000000 --- a/mopro-core/examples/circom/anonAadhaar/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "circom", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } - }, - "node_modules/circomlib": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz", - "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==" - } - } -} diff --git a/mopro-core/examples/circom/anonAadhaar/package.json b/mopro-core/examples/circom/anonAadhaar/package.json deleted file mode 100644 index 7117d38..0000000 --- a/mopro-core/examples/circom/anonAadhaar/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } -} diff --git a/mopro-core/examples/circom/anonAadhaar/utils/array.circom b/mopro-core/examples/circom/anonAadhaar/utils/array.circom deleted file mode 100644 index 0b12bfd..0000000 --- a/mopro-core/examples/circom/anonAadhaar/utils/array.circom +++ /dev/null @@ -1,120 +0,0 @@ -pragma circom 2.1.6; - -include "../node_modules/circomlib/circuits/comparators.circom"; -include "../node_modules/circomlib/circuits/bitify.circom"; - -function log2(a) { - if (a == 0) { - return 0; - } - var n = 1; - var r = 1; - while (n0) { - numChunks += 1; - } - return numChunks; -} - - -/// @title BytesToIntChunks -/// @notice Converts a byte array to an array of integers where each byte represent a ASCII character -/// @dev This is based on Bytes2Ints component from zkemail/email-wallet -/// @dev Trailing 0 (LSB) in each int chunk will be removed. Each int should be padded to 32 bytes during reconversion -/// @param byteSize The size of the input byte array -/// @input bytes The input byte array -/// @output ints The output integer array -template BytesToIntChunks(byteSize) { - var numChunks = computeIntSize(byteSize); - signal input bytes[byteSize]; - signal output ints[numChunks]; - - var packBytes = maxBytesInField(); - signal intsSums[numChunks][packBytes]; - for(var i=0; i=byteSize) { - intsSums[i][j] <== intsSums[i][j-1]; - } else if (j==0){ - intsSums[i][j] <== bytes[idx]; - } else { - intsSums[i][j] <== intsSums[i][j-1] + (1<<(8*j)) * bytes[idx]; - } - } - } - for(var i=0; i= 48); // Ensure input is a digit - assert(in[i - 1] <= 57); - - sum[i] <== sum[i - 1] * 10 + (in[i - 1] - 48); - } - - out <== sum[length]; -} - - -/// @title DigitBytesToTimestamp -/// @notice Converts a date string of format YYYYMMDDHHMMSS to a unix time -/// @notice Each byte is expected to be a ASCII character representing a digit -/// @notice Assumes the input time is in UTC -/// @param maxYears The maximum year that can be represented -/// @param includeHours 1 to include hours, 0 to round down to day -/// @param includeMinutes 1 to include minutes, 0 to round down to hour -/// @param includeSeconds 1 to include seconds, 0 to round down to minute -/// @input in The input byte array -/// @output out The output integer representing the unix time -template DigitBytesToTimestamp(maxYears) { - signal input year; - signal input month; - signal input day; - signal input hour; - signal input minute; - signal input second; - - signal output out; - - assert(year >= 1970); - assert(year <= maxYears); - - signal daysTillPreviousMonth[12] <== [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; - - var maxLeapYears = (maxYears - 1972) \ 4; // 1972 is first leap year since epoch - var arrLength = 14 + maxLeapYears + maxLeapYears; - - signal daysPassed[arrLength]; - daysPassed[0] <== (year - 1970) * 365; - daysPassed[1] <== day - 1; - - component isCurrentMonth[12]; - for (var i = 0; i < 12; i++) { - isCurrentMonth[i] = IsEqual(); - isCurrentMonth[i].in[0] <== month - 1; - isCurrentMonth[i].in[1] <== i; - - daysPassed[i + 2] <== isCurrentMonth[i].out * daysTillPreviousMonth[i]; // Add days till previous month - } - - component isLeapYearCurrentYear[maxLeapYears]; // ith leap year is current year - component isLeapYearLessThanCurrentYear[maxLeapYears]; // ith leap after 1970 is below current year - component isCurrentMonthAfterFeb[maxLeapYears]; - - for (var i = 0; i < maxLeapYears; i++) { - isLeapYearLessThanCurrentYear[i] = GreaterThan(8); - isLeapYearLessThanCurrentYear[i].in[0] <== year - 1972; - isLeapYearLessThanCurrentYear[i].in[1] <== i * 4; - - isLeapYearCurrentYear[i] = IsEqual(); - isLeapYearCurrentYear[i].in[0] <== year - 1972; - isLeapYearCurrentYear[i].in[1] <== i * 4; - - daysPassed[14 + i] <== isLeapYearLessThanCurrentYear[i].out; // Add 1 day for each leap year - - isCurrentMonthAfterFeb[i] = GreaterThan(4); - isCurrentMonthAfterFeb[i].in[0] <== month; - isCurrentMonthAfterFeb[i].in[1] <== 2; - daysPassed[14 + maxLeapYears + i] <== isLeapYearCurrentYear[i].out * isCurrentMonthAfterFeb[i].out; // Add 1 days if current year is leap and date is after Feb - } - - signal totalDaysPassed[arrLength]; - totalDaysPassed[0] <== daysPassed[0]; - for (var i = 1; i < arrLength; i++) { - totalDaysPassed[i] <== totalDaysPassed[i - 1] + daysPassed[i]; - } - - out <== totalDaysPassed[arrLength -1] * 86400 + hour * 3600 + minute * 60 + second; -} diff --git a/mopro-core/examples/circom/complex-circuit/README.md b/mopro-core/examples/circom/complex-circuit/README.md deleted file mode 100644 index 3697502..0000000 --- a/mopro-core/examples/circom/complex-circuit/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Complex Circuits - -Used for benchmarking. - -Inspired by https://github.com/arkworks-rs/circom-compat/tree/master/test-vectors/complex-circuit \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-1000k-1000k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-1000k-1000k.circom deleted file mode 100644 index 02cc27f..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-1000k-1000k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(1000000, 1000000); diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-100k-100k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-100k-100k.circom deleted file mode 100644 index 9ea00cf..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-100k-100k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(100000, 100000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-1200k-1200k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-1200k-1200k.circom deleted file mode 100644 index 815aa27..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-1200k-1200k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(1200000, 1200000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-1600k-1600k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-1600k-1600k.circom deleted file mode 100644 index ce28090..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-1600k-1600k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(1600000, 1600000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-200k-200k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-200k-200k.circom deleted file mode 100644 index 67e6ed3..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-200k-200k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(200000, 200000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-3200k-3200k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-3200k-3200k.circom deleted file mode 100644 index 438643b..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-3200k-3200k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(3200000, 3200000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-400k-400k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-400k-400k.circom deleted file mode 100644 index 9bb6059..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-400k-400k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(400000, 400000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit-800k-800k.circom b/mopro-core/examples/circom/complex-circuit/complex-circuit-800k-800k.circom deleted file mode 100644 index 0b27b50..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit-800k-800k.circom +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(800000, 800000); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/complex-circuit.circom.template b/mopro-core/examples/circom/complex-circuit/complex-circuit.circom.template deleted file mode 100644 index 58bde39..0000000 --- a/mopro-core/examples/circom/complex-circuit/complex-circuit.circom.template +++ /dev/null @@ -1,23 +0,0 @@ -pragma circom 2.1.6; - -template ComplexCircuit(NUM_VARIABLES, NUM_CONSTRAINTS) { - signal input a; - signal output c; - - assert(NUM_VARIABLES <= NUM_CONSTRAINTS); - - signal b[NUM_VARIABLES]; - - b[0] <== a*a; - var i; - for (i = 1; i < NUM_VARIABLES; i++) { - b[i] <== b[i-1]*b[i-1]; - } - i = i-1; - for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { - b[i] === b[i-1]*b[i-1]; - } - c <== b[i]; -} - -component main = ComplexCircuit(NUM_VARIABLES_TEMPLATE, NUM_CONSTRAINTS_TEMPLATE); \ No newline at end of file diff --git a/mopro-core/examples/circom/complex-circuit/package-lock.json b/mopro-core/examples/circom/complex-circuit/package-lock.json deleted file mode 100644 index 123c855..0000000 --- a/mopro-core/examples/circom/complex-circuit/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "circom", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } - }, - "node_modules/circomlib": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz", - "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==" - } - } -} diff --git a/mopro-core/examples/circom/complex-circuit/package.json b/mopro-core/examples/circom/complex-circuit/package.json deleted file mode 100644 index 7117d38..0000000 --- a/mopro-core/examples/circom/complex-circuit/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } -} diff --git a/mopro-core/examples/circom/keccak256/README.md b/mopro-core/examples/circom/keccak256/README.md deleted file mode 100644 index 6537653..0000000 --- a/mopro-core/examples/circom/keccak256/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# README - -Basic test of Keccak256 in Circom, around 150k constraints. - -Used as a non-trivial circuit for initial benchmarking. - -Taken from https://github.com/vocdoni/keccak256-circom diff --git a/mopro-core/examples/circom/keccak256/keccak.circom b/mopro-core/examples/circom/keccak256/keccak.circom deleted file mode 100644 index f4a1b2f..0000000 --- a/mopro-core/examples/circom/keccak256/keccak.circom +++ /dev/null @@ -1,186 +0,0 @@ -// Keccak256 hash function (ethereum version). -// For LICENSE check https://github.com/vocdoni/keccak256-circom/blob/master/LICENSE - -pragma circom 2.0.0; - -include "./utils.circom"; -include "./permutations.circom"; - -template Pad(nBits) { - signal input in[nBits]; - - var blockSize=136*8; - signal output out[blockSize]; - signal out2[blockSize]; - - var i; - - for (i=0; i> i) & 1; - } - for (i=nBits+8; i> i) & 1; - } - for (i=0; i<8; i++) { - out[blockSize-8+i] <== aux.out[i]; - } - for (i=0; i>shr) - signal input a[n]; - signal input b[n]; - signal output out[n]; - var i; - - component aux0 = ShR(64, shr); - for (i=0; i<64; i++) { - aux0.in[i] <== a[i]; - } - component aux1 = ShL(64, shl); - for (i=0; i<64; i++) { - aux1.in[i] <== a[i]; - } - component aux2 = OrArray(64); - for (i=0; i<64; i++) { - aux2.a[i] <== aux0.out[i]; - aux2.b[i] <== aux1.out[i]; - } - component aux3 = XorArray(64); - for (i=0; i<64; i++) { - aux3.a[i] <== b[i]; - aux3.b[i] <== aux2.out[i]; - } - for (i=0; i<64; i++) { - out[i] <== aux3.out[i]; - } -} - -template Theta() { - signal input in[25*64]; - signal output out[25*64]; - - var i; - - component c0 = Xor5(64); - for (i=0; i<64; i++) { - c0.a[i] <== in[i]; - c0.b[i] <== in[5*64+i]; - c0.c[i] <== in[10*64+i]; - c0.d[i] <== in[15*64+i]; - c0.e[i] <== in[20*64+i]; - } - - component c1 = Xor5(64); - for (i=0; i<64; i++) { - c1.a[i] <== in[1*64+i]; - c1.b[i] <== in[6*64+i]; - c1.c[i] <== in[11*64+i]; - c1.d[i] <== in[16*64+i]; - c1.e[i] <== in[21*64+i]; - } - - component c2 = Xor5(64); - for (i=0; i<64; i++) { - c2.a[i] <== in[2*64+i]; - c2.b[i] <== in[7*64+i]; - c2.c[i] <== in[12*64+i]; - c2.d[i] <== in[17*64+i]; - c2.e[i] <== in[22*64+i]; - } - - component c3 = Xor5(64); - for (i=0; i<64; i++) { - c3.a[i] <== in[3*64+i]; - c3.b[i] <== in[8*64+i]; - c3.c[i] <== in[13*64+i]; - c3.d[i] <== in[18*64+i]; - c3.e[i] <== in[23*64+i]; - } - - component c4 = Xor5(64); - for (i=0; i<64; i++) { - c4.a[i] <== in[4*64+i]; - c4.b[i] <== in[9*64+i]; - c4.c[i] <== in[14*64+i]; - c4.d[i] <== in[19*64+i]; - c4.e[i] <== in[24*64+i]; - } - - // d = c4 ^ (c1<<1 | c1>>(64-1)) - component d0 = D(64, 1, 64-1); - for (i=0; i<64; i++) { - d0.a[i] <== c1.out[i]; - d0.b[i] <== c4.out[i]; - } - // r[0] = a[0] ^ d - component r0 = XorArray(64); - for (i=0; i<64; i++) { - r0.a[i] <== in[i]; - r0.b[i] <== d0.out[i]; - } - for (i=0; i<64; i++) { - out[i] <== r0.out[i]; - } - // r[5] = a[5] ^ d - component r5 = XorArray(64); - for (i=0; i<64; i++) { - r5.a[i] <== in[5*64+i]; - r5.b[i] <== d0.out[i]; - } - for (i=0; i<64; i++) { - out[5*64+i] <== r5.out[i]; - } - // r[10] = a[10] ^ d - component r10 = XorArray(64); - for (i=0; i<64; i++) { - r10.a[i] <== in[10*64+i]; - r10.b[i] <== d0.out[i]; - } - for (i=0; i<64; i++) { - out[10*64+i] <== r10.out[i]; - } - // r[15] = a[15] ^ d - component r15 = XorArray(64); - for (i=0; i<64; i++) { - r15.a[i] <== in[15*64+i]; - r15.b[i] <== d0.out[i]; - } - for (i=0; i<64; i++) { - out[15*64+i] <== r15.out[i]; - } - // r[20] = a[20] ^ d - component r20 = XorArray(64); - for (i=0; i<64; i++) { - r20.a[i] <== in[20*64+i]; - r20.b[i] <== d0.out[i]; - } - for (i=0; i<64; i++) { - out[20*64+i] <== r20.out[i]; - } - - // d = c0 ^ (c2<<1 | c2>>(64-1)) - component d1 = D(64, 1, 64-1); - for (i=0; i<64; i++) { - d1.a[i] <== c2.out[i]; - d1.b[i] <== c0.out[i]; - } - // r[1] = a[1] ^ d - component r1 = XorArray(64); - for (i=0; i<64; i++) { - r1.a[i] <== in[1*64+i]; - r1.b[i] <== d1.out[i]; - } - for (i=0; i<64; i++) { - out[1*64+i] <== r1.out[i]; - } - // r[6] = a[6] ^ d - component r6 = XorArray(64); - for (i=0; i<64; i++) { - r6.a[i] <== in[6*64+i]; - r6.b[i] <== d1.out[i]; - } - for (i=0; i<64; i++) { - out[6*64+i] <== r6.out[i]; - } - // r[11] = a[11] ^ d - component r11 = XorArray(64); - for (i=0; i<64; i++) { - r11.a[i] <== in[11*64+i]; - r11.b[i] <== d1.out[i]; - } - for (i=0; i<64; i++) { - out[11*64+i] <== r11.out[i]; - } - // r[16] = a[16] ^ d - component r16 = XorArray(64); - for (i=0; i<64; i++) { - r16.a[i] <== in[16*64+i]; - r16.b[i] <== d1.out[i]; - } - for (i=0; i<64; i++) { - out[16*64+i] <== r16.out[i]; - } - // r[21] = a[21] ^ d - component r21 = XorArray(64); - for (i=0; i<64; i++) { - r21.a[i] <== in[21*64+i]; - r21.b[i] <== d1.out[i]; - } - for (i=0; i<64; i++) { - out[21*64+i] <== r21.out[i]; - } - - // d = c1 ^ (c3<<1 | c3>>(64-1)) - component d2 = D(64, 1, 64-1); - for (i=0; i<64; i++) { - d2.a[i] <== c3.out[i]; - d2.b[i] <== c1.out[i]; - } - // r[2] = a[2] ^ d - component r2 = XorArray(64); - for (i=0; i<64; i++) { - r2.a[i] <== in[2*64+i]; - r2.b[i] <== d2.out[i]; - } - for (i=0; i<64; i++) { - out[2*64+i] <== r2.out[i]; - } - // r[7] = a[7] ^ d - component r7 = XorArray(64); - for (i=0; i<64; i++) { - r7.a[i] <== in[7*64+i]; - r7.b[i] <== d2.out[i]; - } - for (i=0; i<64; i++) { - out[7*64+i] <== r7.out[i]; - } - // r[12] = a[12] ^ d - component r12 = XorArray(64); - for (i=0; i<64; i++) { - r12.a[i] <== in[12*64+i]; - r12.b[i] <== d2.out[i]; - } - for (i=0; i<64; i++) { - out[12*64+i] <== r12.out[i]; - } - // r[17] = a[17] ^ d - component r17 = XorArray(64); - for (i=0; i<64; i++) { - r17.a[i] <== in[17*64+i]; - r17.b[i] <== d2.out[i]; - } - for (i=0; i<64; i++) { - out[17*64+i] <== r17.out[i]; - } - // r[22] = a[22] ^ d - component r22 = XorArray(64); - for (i=0; i<64; i++) { - r22.a[i] <== in[22*64+i]; - r22.b[i] <== d2.out[i]; - } - for (i=0; i<64; i++) { - out[22*64+i] <== r22.out[i]; - } - - // d = c2 ^ (c4<<1 | c4>>(64-1)) - component d3 = D(64, 1, 64-1); - for (i=0; i<64; i++) { - d3.a[i] <== c4.out[i]; - d3.b[i] <== c2.out[i]; - } - // r[3] = a[3] ^ d - component r3 = XorArray(64); - for (i=0; i<64; i++) { - r3.a[i] <== in[3*64+i]; - r3.b[i] <== d3.out[i]; - } - for (i=0; i<64; i++) { - out[3*64+i] <== r3.out[i]; - } - // r[8] = a[8] ^ d - component r8 = XorArray(64); - for (i=0; i<64; i++) { - r8.a[i] <== in[8*64+i]; - r8.b[i] <== d3.out[i]; - } - for (i=0; i<64; i++) { - out[8*64+i] <== r8.out[i]; - } - // r[13] = a[13] ^ d - component r13 = XorArray(64); - for (i=0; i<64; i++) { - r13.a[i] <== in[13*64+i]; - r13.b[i] <== d3.out[i]; - } - for (i=0; i<64; i++) { - out[13*64+i] <== r13.out[i]; - } - // r[18] = a[18] ^ d - component r18 = XorArray(64); - for (i=0; i<64; i++) { - r18.a[i] <== in[18*64+i]; - r18.b[i] <== d3.out[i]; - } - for (i=0; i<64; i++) { - out[18*64+i] <== r18.out[i]; - } - // r[23] = a[23] ^ d - component r23 = XorArray(64); - for (i=0; i<64; i++) { - r23.a[i] <== in[23*64+i]; - r23.b[i] <== d3.out[i]; - } - for (i=0; i<64; i++) { - out[23*64+i] <== r23.out[i]; - } - - // d = c3 ^ (c0<<1 | c0>>(64-1)) - component d4 = D(64, 1, 64-1); - for (i=0; i<64; i++) { - d4.a[i] <== c0.out[i]; - d4.b[i] <== c3.out[i]; - } - // r[4] = a[4] ^ d - component r4 = XorArray(64); - for (i=0; i<64; i++) { - r4.a[i] <== in[4*64+i]; - r4.b[i] <== d4.out[i]; - } - for (i=0; i<64; i++) { - out[4*64+i] <== r4.out[i]; - } - // r[9] = a[9] ^ d - component r9 = XorArray(64); - for (i=0; i<64; i++) { - r9.a[i] <== in[9*64+i]; - r9.b[i] <== d4.out[i]; - } - for (i=0; i<64; i++) { - out[9*64+i] <== r9.out[i]; - } - // r[14] = a[14] ^ d - component r14 = XorArray(64); - for (i=0; i<64; i++) { - r14.a[i] <== in[14*64+i]; - r14.b[i] <== d4.out[i]; - } - for (i=0; i<64; i++) { - out[14*64+i] <== r14.out[i]; - } - // r[19] = a[19] ^ d - component r19 = XorArray(64); - for (i=0; i<64; i++) { - r19.a[i] <== in[19*64+i]; - r19.b[i] <== d4.out[i]; - } - for (i=0; i<64; i++) { - out[19*64+i] <== r19.out[i]; - } - // r[24] = a[24] ^ d - component r24 = XorArray(64); - for (i=0; i<64; i++) { - r24.a[i] <== in[24*64+i]; - r24.b[i] <== d4.out[i]; - } - for (i=0; i<64; i++) { - out[24*64+i] <== r24.out[i]; - } -} - -// RhoPi - -template stepRhoPi(shl, shr) { - // out = a<>shr - signal input a[64]; - signal output out[64]; - var i; - - component aux0 = ShR(64, shr); - for (i=0; i<64; i++) { - aux0.in[i] <== a[i]; - } - component aux1 = ShL(64, shl); - for (i=0; i<64; i++) { - aux1.in[i] <== a[i]; - } - component aux2 = OrArray(64); - for (i=0; i<64; i++) { - aux2.a[i] <== aux0.out[i]; - aux2.b[i] <== aux1.out[i]; - } - for (i=0; i<64; i++) { - out[i] <== aux2.out[i]; - } -} -template RhoPi() { - signal input in[25*64]; - signal output out[25*64]; - - var i; - - // r[10] = a[1]<<1|a[1]>>(64-1) - component s10 = stepRhoPi(1, 64-1); - for (i=0; i<64; i++) { - s10.a[i] <== in[1*64+i]; - } - // r[7] = a[10]<<3|a[10]>>(64-3) - component s7 = stepRhoPi(3, 64-3); - for (i=0; i<64; i++) { - s7.a[i] <== in[10*64+i]; - } - // r[11] = a[7]<<6|a[7]>>(64-6) - component s11 = stepRhoPi(6, 64-6); - for (i=0; i<64; i++) { - s11.a[i] <== in[7*64+i]; - } - // r[17] = a[11]<<10|a[11]>>(64-10) - component s17 = stepRhoPi(10, 64-10); - for (i=0; i<64; i++) { - s17.a[i] <== in[11*64+i]; - } - // r[18] = a[17]<<15|a[17]>>(64-15) - component s18 = stepRhoPi(15, 64-15); - for (i=0; i<64; i++) { - s18.a[i] <== in[17*64+i]; - } - // r[3] = a[18]<<21|a[18]>>(64-21) - component s3 = stepRhoPi(21, 64-21); - for (i=0; i<64; i++) { - s3.a[i] <== in[18*64+i]; - } - // r[5] = a[3]<<28|a[3]>>(64-28) - component s5 = stepRhoPi(28, 64-28); - for (i=0; i<64; i++) { - s5.a[i] <== in[3*64+i]; - } - // r[16] = a[5]<<36|a[5]>>(64-36) - component s16 = stepRhoPi(36, 64-36); - for (i=0; i<64; i++) { - s16.a[i] <== in[5*64+i]; - } - // r[8] = a[16]<<45|a[16]>>(64-45) - component s8 = stepRhoPi(45, 64-45); - for (i=0; i<64; i++) { - s8.a[i] <== in[16*64+i]; - } - // r[21] = a[8]<<55|a[8]>>(64-55) - component s21 = stepRhoPi(55, 64-55); - for (i=0; i<64; i++) { - s21.a[i] <== in[8*64+i]; - } - // r[24] = a[21]<<2|a[21]>>(64-2) - component s24 = stepRhoPi(2, 64-2); - for (i=0; i<64; i++) { - s24.a[i] <== in[21*64+i]; - } - // r[4] = a[24]<<14|a[24]>>(64-14) - component s4 = stepRhoPi(14, 64-14); - for (i=0; i<64; i++) { - s4.a[i] <== in[24*64+i]; - } - // r[15] = a[4]<<27|a[4]>>(64-27) - component s15 = stepRhoPi(27, 64-27); - for (i=0; i<64; i++) { - s15.a[i] <== in[4*64+i]; - } - // r[23] = a[15]<<41|a[15]>>(64-41) - component s23 = stepRhoPi(41, 64-41); - for (i=0; i<64; i++) { - s23.a[i] <== in[15*64+i]; - } - // r[19] = a[23]<<56|a[23]>>(64-56) - component s19 = stepRhoPi(56, 64-56); - for (i=0; i<64; i++) { - s19.a[i] <== in[23*64+i]; - } - // r[13] = a[19]<<8|a[19]>>(64-8) - component s13 = stepRhoPi(8, 64-8); - for (i=0; i<64; i++) { - s13.a[i] <== in[19*64+i]; - } - // r[12] = a[13]<<25|a[13]>>(64-25) - component s12 = stepRhoPi(25, 64-25); - for (i=0; i<64; i++) { - s12.a[i] <== in[13*64+i]; - } - // r[2] = a[12]<<43|a[12]>>(64-43) - component s2 = stepRhoPi(43, 64-43); - for (i=0; i<64; i++) { - s2.a[i] <== in[12*64+i]; - } - // r[20] = a[2]<<62|a[2]>>(64-62) - component s20 = stepRhoPi(62, 64-62); - for (i=0; i<64; i++) { - s20.a[i] <== in[2*64+i]; - } - // r[14] = a[20]<<18|a[20]>>(64-18) - component s14 = stepRhoPi(18, 64-18); - for (i=0; i<64; i++) { - s14.a[i] <== in[20*64+i]; - } - // r[22] = a[14]<<39|a[14]>>(64-39) - component s22 = stepRhoPi(39, 64-39); - for (i=0; i<64; i++) { - s22.a[i] <== in[14*64+i]; - } - // r[9] = a[22]<<61|a[22]>>(64-61) - component s9 = stepRhoPi(61, 64-61); - for (i=0; i<64; i++) { - s9.a[i] <== in[22*64+i]; - } - // r[6] = a[9]<<20|a[9]>>(64-20) - component s6 = stepRhoPi(20, 64-20); - for (i=0; i<64; i++) { - s6.a[i] <== in[9*64+i]; - } - // r[1] = a[6]<<44|a[6]>>(64-44) - component s1 = stepRhoPi(44, 64-44); - for (i=0; i<64; i++) { - s1.a[i] <== in[6*64+i]; - } - - for (i=0; i<64; i++) { - out[i] <== in[i]; - out[10*64+i] <== s10.out[i]; - out[7*64+i] <== s7.out[i]; - out[11*64+i] <== s11.out[i]; - out[17*64+i] <== s17.out[i]; - out[18*64+i] <== s18.out[i]; - out[3*64+i] <== s3.out[i]; - out[5*64+i] <== s5.out[i]; - out[16*64+i] <== s16.out[i]; - out[8*64+i] <== s8.out[i]; - out[21*64+i] <== s21.out[i]; - out[24*64+i] <== s24.out[i]; - out[4*64+i] <== s4.out[i]; - out[15*64+i] <== s15.out[i]; - out[23*64+i] <== s23.out[i]; - out[19*64+i] <== s19.out[i]; - out[13*64+i] <== s13.out[i]; - out[12*64+i] <== s12.out[i]; - out[2*64+i] <== s2.out[i]; - out[20*64+i] <== s20.out[i]; - out[14*64+i] <== s14.out[i]; - out[22*64+i] <== s22.out[i]; - out[9*64+i] <== s9.out[i]; - out[6*64+i] <== s6.out[i]; - out[1*64+i] <== s1.out[i]; - } -} - - -// Chi - -template stepChi() { - // out = a ^ (^b) & c - signal input a[64]; - signal input b[64]; - signal input c[64]; - signal output out[64]; - var i; - - // ^b - component bXor = XorArraySingle(64); - for (i=0; i<64; i++) { - bXor.a[i] <== b[i]; - } - // (^b)&c - component bc = AndArray(64); - for (i=0; i<64; i++) { - bc.a[i] <== bXor.out[i]; - bc.b[i] <== c[i]; - } - // a^(^b)&c - component abc = XorArray(64); - for (i=0; i<64; i++) { - abc.a[i] <== a[i]; - abc.b[i] <== bc.out[i]; - } - for (i=0; i<64; i++) { - out[i] <== abc.out[i]; - } -} - -template Chi() { - signal input in[25*64]; - signal output out[25*64]; - - var i; - - component r0 = stepChi(); - for (i=0; i<64; i++) { - r0.a[i] <== in[i]; - r0.b[i] <== in[1*64+i]; - r0.c[i] <== in[2*64+i]; - } - component r1 = stepChi(); - for (i=0; i<64; i++) { - r1.a[i] <== in[1*64+i]; - r1.b[i] <== in[2*64+i]; - r1.c[i] <== in[3*64+i]; - } - component r2 = stepChi(); - for (i=0; i<64; i++) { - r2.a[i] <== in[2*64+i]; - r2.b[i] <== in[3*64+i]; - r2.c[i] <== in[4*64+i]; - } - component r3 = stepChi(); - for (i=0; i<64; i++) { - r3.a[i] <== in[3*64+i]; - r3.b[i] <== in[4*64+i]; - r3.c[i] <== in[0*64+i]; - } - component r4 = stepChi(); - for (i=0; i<64; i++) { - r4.a[i] <== in[4*64+i]; - r4.b[i] <== in[i]; - r4.c[i] <== in[1*64+i]; - } - - component r5 = stepChi(); - for (i=0; i<64; i++) { - r5.a[i] <== in[5*64+i]; - r5.b[i] <== in[6*64+i]; - r5.c[i] <== in[7*64+i]; - } - component r6 = stepChi(); - for (i=0; i<64; i++) { - r6.a[i] <== in[6*64+i]; - r6.b[i] <== in[7*64+i]; - r6.c[i] <== in[8*64+i]; - } - component r7 = stepChi(); - for (i=0; i<64; i++) { - r7.a[i] <== in[7*64+i]; - r7.b[i] <== in[8*64+i]; - r7.c[i] <== in[9*64+i]; - } - component r8 = stepChi(); - for (i=0; i<64; i++) { - r8.a[i] <== in[8*64+i]; - r8.b[i] <== in[9*64+i]; - r8.c[i] <== in[5*64+i]; - } - component r9 = stepChi(); - for (i=0; i<64; i++) { - r9.a[i] <== in[9*64+i]; - r9.b[i] <== in[5*64+i]; - r9.c[i] <== in[6*64+i]; - } - - component r10 = stepChi(); - for (i=0; i<64; i++) { - r10.a[i] <== in[10*64+i]; - r10.b[i] <== in[11*64+i]; - r10.c[i] <== in[12*64+i]; - } - component r11 = stepChi(); - for (i=0; i<64; i++) { - r11.a[i] <== in[11*64+i]; - r11.b[i] <== in[12*64+i]; - r11.c[i] <== in[13*64+i]; - } - component r12 = stepChi(); - for (i=0; i<64; i++) { - r12.a[i] <== in[12*64+i]; - r12.b[i] <== in[13*64+i]; - r12.c[i] <== in[14*64+i]; - } - component r13 = stepChi(); - for (i=0; i<64; i++) { - r13.a[i] <== in[13*64+i]; - r13.b[i] <== in[14*64+i]; - r13.c[i] <== in[10*64+i]; - } - component r14 = stepChi(); - for (i=0; i<64; i++) { - r14.a[i] <== in[14*64+i]; - r14.b[i] <== in[10*64+i]; - r14.c[i] <== in[11*64+i]; - } - - component r15 = stepChi(); - for (i=0; i<64; i++) { - r15.a[i] <== in[15*64+i]; - r15.b[i] <== in[16*64+i]; - r15.c[i] <== in[17*64+i]; - } - component r16 = stepChi(); - for (i=0; i<64; i++) { - r16.a[i] <== in[16*64+i]; - r16.b[i] <== in[17*64+i]; - r16.c[i] <== in[18*64+i]; - } - component r17 = stepChi(); - for (i=0; i<64; i++) { - r17.a[i] <== in[17*64+i]; - r17.b[i] <== in[18*64+i]; - r17.c[i] <== in[19*64+i]; - } - component r18 = stepChi(); - for (i=0; i<64; i++) { - r18.a[i] <== in[18*64+i]; - r18.b[i] <== in[19*64+i]; - r18.c[i] <== in[15*64+i]; - } - component r19 = stepChi(); - for (i=0; i<64; i++) { - r19.a[i] <== in[19*64+i]; - r19.b[i] <== in[15*64+i]; - r19.c[i] <== in[16*64+i]; - } - - component r20 = stepChi(); - for (i=0; i<64; i++) { - r20.a[i] <== in[20*64+i]; - r20.b[i] <== in[21*64+i]; - r20.c[i] <== in[22*64+i]; - } - component r21 = stepChi(); - for (i=0; i<64; i++) { - r21.a[i] <== in[21*64+i]; - r21.b[i] <== in[22*64+i]; - r21.c[i] <== in[23*64+i]; - } - component r22 = stepChi(); - for (i=0; i<64; i++) { - r22.a[i] <== in[22*64+i]; - r22.b[i] <== in[23*64+i]; - r22.c[i] <== in[24*64+i]; - } - component r23 = stepChi(); - for (i=0; i<64; i++) { - r23.a[i] <== in[23*64+i]; - r23.b[i] <== in[24*64+i]; - r23.c[i] <== in[20*64+i]; - } - component r24 = stepChi(); - for (i=0; i<64; i++) { - r24.a[i] <== in[24*64+i]; - r24.b[i] <== in[20*64+i]; - r24.c[i] <== in[21*64+i]; - } - - for (i=0; i<64; i++) { - out[i] <== r0.out[i]; - out[1*64+i] <== r1.out[i]; - out[2*64+i] <== r2.out[i]; - out[3*64+i] <== r3.out[i]; - out[4*64+i] <== r4.out[i]; - - out[5*64+i] <== r5.out[i]; - out[6*64+i] <== r6.out[i]; - out[7*64+i] <== r7.out[i]; - out[8*64+i] <== r8.out[i]; - out[9*64+i] <== r9.out[i]; - - out[10*64+i] <== r10.out[i]; - out[11*64+i] <== r11.out[i]; - out[12*64+i] <== r12.out[i]; - out[13*64+i] <== r13.out[i]; - out[14*64+i] <== r14.out[i]; - - out[15*64+i] <== r15.out[i]; - out[16*64+i] <== r16.out[i]; - out[17*64+i] <== r17.out[i]; - out[18*64+i] <== r18.out[i]; - out[19*64+i] <== r19.out[i]; - - out[20*64+i] <== r20.out[i]; - out[21*64+i] <== r21.out[i]; - out[22*64+i] <== r22.out[i]; - out[23*64+i] <== r23.out[i]; - out[24*64+i] <== r24.out[i]; - } -} - -// Iota - -template RC(r) { - signal output out[64]; - var rc[24] = [ - 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, - 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, - 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, - 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, - 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, - 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, - 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, - 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 - ]; - for (var i=0; i<64; i++) { - out[i] <== (rc[r] >> i) & 1; - } -} - -template Iota(r) { - signal input in[25*64]; - signal output out[25*64]; - var i; - - component rc = RC(r); - - component iota = XorArray(64); - for (var i=0; i<64; i++) { - iota.a[i] <== in[i]; - iota.b[i] <== rc.out[i]; - } - for (i=0; i<64; i++) { - out[i] <== iota.out[i]; - } - for (i=64; i<25*64; i++) { - out[i] <== in[i]; - } -} - diff --git a/mopro-core/examples/circom/keccak256/utils.circom b/mopro-core/examples/circom/keccak256/utils.circom deleted file mode 100644 index 6a66fb2..0000000 --- a/mopro-core/examples/circom/keccak256/utils.circom +++ /dev/null @@ -1,118 +0,0 @@ -// Keccak256 hash function (ethereum version). -// For LICENSE check https://github.com/vocdoni/keccak256-circom/blob/master/LICENSE - -pragma circom 2.0.0; - -include "node_modules/circomlib/circuits/gates.circom"; -include "node_modules/circomlib/circuits/sha256/xor3.circom"; -include "node_modules/circomlib/circuits/sha256/shift.circom"; // contains ShiftRight - -template Xor5(n) { - signal input a[n]; - signal input b[n]; - signal input c[n]; - signal input d[n]; - signal input e[n]; - signal output out[n]; - var i; - - component xor3 = Xor3(n); - for (i=0; idAb9}V Co-JYk diff --git a/mopro-core/examples/circom/multiplier2/target/multiplier2.sym b/mopro-core/examples/circom/multiplier2/target/multiplier2.sym deleted file mode 100644 index 9432aa8..0000000 --- a/mopro-core/examples/circom/multiplier2/target/multiplier2.sym +++ /dev/null @@ -1,3 +0,0 @@ -1,1,0,main.c -2,2,0,main.a -3,3,0,main.b diff --git a/mopro-core/examples/circom/multiplier2/target/multiplier2_js/generate_witness.js b/mopro-core/examples/circom/multiplier2/target/multiplier2_js/generate_witness.js deleted file mode 100644 index eabb86e..0000000 --- a/mopro-core/examples/circom/multiplier2/target/multiplier2_js/generate_witness.js +++ /dev/null @@ -1,20 +0,0 @@ -const wc = require("./witness_calculator.js"); -const { readFileSync, writeFile } = require("fs"); - -if (process.argv.length != 5) { - console.log("Usage: node generate_witness.js "); -} else { - const input = JSON.parse(readFileSync(process.argv[3], "utf8")); - - const buffer = readFileSync(process.argv[2]); - wc(buffer).then(async witnessCalculator => { - // const w= await witnessCalculator.calculateWitness(input,0); - // for (let i=0; i< w.length; i++){ - // console.log(w[i]); - // } - const buff= await witnessCalculator.calculateWTNSBin(input,0); - writeFile(process.argv[4], buff, function(err) { - if (err) throw err; - }); - }); -} diff --git a/mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm b/mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm deleted file mode 100644 index c8cecba52317dc317b96b279cb6e3325c263910e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34291 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 diff --git a/mopro-core/examples/circom/multiplier2/target/multiplier2_js/witness_calculator.js b/mopro-core/examples/circom/multiplier2/target/multiplier2_js/witness_calculator.js deleted file mode 100644 index 20e6e20..0000000 --- a/mopro-core/examples/circom/multiplier2/target/multiplier2_js/witness_calculator.js +++ /dev/null @@ -1,337 +0,0 @@ -module.exports = async function builder(code, options) { - - options = options || {}; - - let wasmModule; - try { - wasmModule = await WebAssembly.compile(code); - } catch (err) { - console.log(err); - console.log("\nTry to run circom --c in order to generate c++ code instead\n"); - throw new Error(err); - } - - let wc; - - let errStr = ""; - let msgStr = ""; - - const instance = await WebAssembly.instantiate(wasmModule, { - runtime: { - exceptionHandler : function(code) { - let err; - if (code == 1) { - err = "Signal not found.\n"; - } else if (code == 2) { - err = "Too many signals set.\n"; - } else if (code == 3) { - err = "Signal already set.\n"; - } else if (code == 4) { - err = "Assert Failed.\n"; - } else if (code == 5) { - err = "Not enough memory.\n"; - } else if (code == 6) { - err = "Input signal array access exceeds the size.\n"; - } else { - err = "Unknown error.\n"; - } - throw new Error(err + errStr); - }, - printErrorMessage : function() { - errStr += getMessage() + "\n"; - // console.error(getMessage()); - }, - writeBufferMessage : function() { - const msg = getMessage(); - // Any calls to `log()` will always end with a `\n`, so that's when we print and reset - if (msg === "\n") { - console.log(msgStr); - msgStr = ""; - } else { - // If we've buffered other content, put a space in between the items - if (msgStr !== "") { - msgStr += " " - } - // Then append the message to the message we are creating - msgStr += msg; - } - }, - showSharedRWMemory : function() { - printSharedRWMemory (); - } - - } - }); - - const sanityCheck = - options -// options && -// ( -// options.sanityCheck || -// options.logGetSignal || -// options.logSetSignal || -// options.logStartComponent || -// options.logFinishComponent -// ); - - - wc = new WitnessCalculator(instance, sanityCheck); - return wc; - - function getMessage() { - var message = ""; - var c = instance.exports.getMessageChar(); - while ( c != 0 ) { - message += String.fromCharCode(c); - c = instance.exports.getMessageChar(); - } - return message; - } - - function printSharedRWMemory () { - const shared_rw_memory_size = instance.exports.getFieldNumLen32(); - const arr = new Uint32Array(shared_rw_memory_size); - for (let j=0; j { - const h = fnvHash(k); - const hMSB = parseInt(h.slice(0,8), 16); - const hLSB = parseInt(h.slice(8,16), 16); - const fArr = flatArray(input[k]); - let signalSize = this.instance.exports.getInputSignalSize(hMSB, hLSB); - if (signalSize < 0){ - throw new Error(`Signal ${k} not found\n`); - } - if (fArr.length < signalSize) { - throw new Error(`Not enough values for input signal ${k}\n`); - } - if (fArr.length > signalSize) { - throw new Error(`Too many values for input signal ${k}\n`); - } - for (let i=0; i0) { - res.unshift(0); - i--; - } - } - return res; -} - -function fromArray32(arr) { //returns a BigInt - var res = BigInt(0); - const radix = BigInt(0x100000000); - for (let i = 0; i= 0 -template ModSubThree(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - assert(a - b - c + (1 << n) >= 0); - signal output out; - signal output borrow; - signal b_plus_c; - b_plus_c <== b + c; - component lt = LessThan(n + 1); - lt.in[0] <== a; - lt.in[1] <== b_plus_c; - borrow <== lt.out; - out <== borrow * (1 << n) + a - b_plus_c; -} - -template ModSumThree(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - signal output sum; - signal output carry; - - component n2b = Num2Bits(n + 2); - n2b.in <== a + b + c; - carry <== n2b.out[n] + 2 * n2b.out[n + 1]; - sum <== a + b + c - carry * (1 << n); -} - -template ModSumFour(n) { - assert(n + 2 <= 253); - signal input a; - signal input b; - signal input c; - signal input d; - signal output sum; - signal output carry; - - component n2b = Num2Bits(n + 2); - n2b.in <== a + b + c + d; - carry <== n2b.out[n] + 2 * n2b.out[n + 1]; - sum <== a + b + c + d - carry * (1 << n); -} - -// product mod 2**n with carry -template ModProd(n) { - assert(n <= 126); - signal input a; - signal input b; - signal output prod; - signal output carry; - - component n2b = Num2Bits(2 * n); - n2b.in <== a * b; - - component b2n1 = Bits2Num(n); - component b2n2 = Bits2Num(n); - var i; - for (i = 0; i < n; i++) { - b2n1.in[i] <== n2b.out[i]; - b2n2.in[i] <== n2b.out[i + n]; - } - prod <== b2n1.out; - carry <== b2n2.out; -} - -// split a n + m bit input into two outputs -template Split(n, m) { - assert(n <= 126); - signal input in; - signal output small; - signal output big; - - small <-- in % (1 << n); - big <-- in \ (1 << n); - - component n2b_small = Num2Bits(n); - n2b_small.in <== small; - component n2b_big = Num2Bits(m); - n2b_big.in <== big; - - in === small + big * (1 << n); -} - -// split a n + m + k bit input into three outputs -template SplitThree(n, m, k) { - assert(n <= 126); - signal input in; - signal output small; - signal output medium; - signal output big; - - small <-- in % (1 << n); - medium <-- (in \ (1 << n)) % (1 << m); - big <-- in \ (1 << n + m); - - component n2b_small = Num2Bits(n); - n2b_small.in <== small; - component n2b_medium = Num2Bits(m); - n2b_medium.in <== medium; - component n2b_big = Num2Bits(k); - n2b_big.in <== big; - - in === small + medium * (1 << n) + big * (1 << n + m); -} - -// a[i], b[i] in 0... 2**n-1 -// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) -template BigAdd(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal output out[k + 1]; - - component unit0 = ModSum(n); - unit0.a <== a[0]; - unit0.b <== b[0]; - out[0] <== unit0.sum; - - component unit[k - 1]; - for (var i = 1; i < k; i++) { - unit[i - 1] = ModSumThree(n); - unit[i - 1].a <== a[i]; - unit[i - 1].b <== b[i]; - if (i == 1) { - unit[i - 1].c <== unit0.carry; - } else { - unit[i - 1].c <== unit[i - 2].carry; - } - out[i] <== unit[i - 1].sum; - } - out[k] <== unit[k - 2].carry; -} - -// a and b have n-bit registers -// a has ka registers, each with NONNEGATIVE ma-bit values (ma can be > n) -// b has kb registers, each with NONNEGATIVE mb-bit values (mb can be > n) -// out has ka + kb - 1 registers, each with (ma + mb + ceil(log(max(ka, kb))))-bit values -template BigMultNoCarry(n, ma, mb, ka, kb) { - assert(ma + mb <= 253); - signal input a[ka]; - signal input b[kb]; - signal output out[ka + kb - 1]; - - var prod_val[ka + kb - 1]; - for (var i = 0; i < ka + kb - 1; i++) { - prod_val[i] = 0; - } - for (var i = 0; i < ka; i++) { - for (var j = 0; j < kb; j++) { - prod_val[i + j] += a[i] * b[j]; - } - } - for (var i = 0; i < ka + kb - 1; i++) { - out[i] <-- prod_val[i]; - } - - var a_poly[ka + kb - 1]; - var b_poly[ka + kb - 1]; - var out_poly[ka + kb - 1]; - for (var i = 0; i < ka + kb - 1; i++) { - out_poly[i] = 0; - a_poly[i] = 0; - b_poly[i] = 0; - for (var j = 0; j < ka + kb - 1; j++) { - out_poly[i] = out_poly[i] + out[j] * (i ** j); - } - for (var j = 0; j < ka; j++) { - a_poly[i] = a_poly[i] + a[j] * (i ** j); - } - for (var j = 0; j < kb; j++) { - b_poly[i] = b_poly[i] + b[j] * (i ** j); - } - } - for (var i = 0; i < ka + kb - 1; i++) { - out_poly[i] === a_poly[i] * b_poly[i]; - } -} - - -// in[i] contains longs -// out[i] contains shorts -template LongToShortNoEndCarry(n, k) { - assert(n <= 126); - signal input in[k]; - signal output out[k+1]; - - var split[k][3]; - for (var i = 0; i < k; i++) { - split[i] = SplitThreeFn(in[i], n, n, n); - } - - var carry[k]; - carry[0] = 0; - out[0] <-- split[0][0]; - if (k == 1) { - out[1] <-- split[0][1]; - } - if (k > 1) { - var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); - out[1] <-- sumAndCarry[0]; - carry[1] = sumAndCarry[1]; - } - if (k == 2) { - out[2] <-- split[1][1] + split[0][2] + carry[1]; - } - if (k > 2) { - for (var i = 2; i < k; i++) { - var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); - out[i] <-- sumAndCarry[0]; - carry[i] = sumAndCarry[1]; - } - out[k] <-- split[k-1][1] + split[k-2][2] + carry[k-1]; - } - - component outRangeChecks[k+1]; - for (var i = 0; i < k+1; i++) { - outRangeChecks[i] = Num2Bits(n); - outRangeChecks[i].in <== out[i]; - } - - signal runningCarry[k]; - component runningCarryRangeChecks[k]; - runningCarry[0] <-- (in[0] - out[0]) / (1 << n); - runningCarryRangeChecks[0] = Num2Bits(n + log_ceil(k)); - runningCarryRangeChecks[0].in <== runningCarry[0]; - runningCarry[0] * (1 << n) === in[0] - out[0]; - for (var i = 1; i < k; i++) { - runningCarry[i] <-- (in[i] - out[i] + runningCarry[i-1]) / (1 << n); - runningCarryRangeChecks[i] = Num2Bits(n + log_ceil(k)); - runningCarryRangeChecks[i].in <== runningCarry[i]; - runningCarry[i] * (1 << n) === in[i] - out[i] + runningCarry[i-1]; - } - runningCarry[k-1] === out[k]; -} - -template BigMult(n, k) { - signal input a[k]; - signal input b[k]; - signal output out[2 * k]; - - component mult = BigMultNoCarry(n, n, n, k, k); - for (var i = 0; i < k; i++) { - mult.a[i] <== a[i]; - mult.b[i] <== b[i]; - } - - // no carry is possible in the highest order register - component longshort = LongToShortNoEndCarry(n, 2 * k - 1); - for (var i = 0; i < 2 * k - 1; i++) { - longshort.in[i] <== mult.out[i]; - } - for (var i = 0; i < 2 * k; i++) { - out[i] <== longshort.out[i]; - } -} - -template BigLessThan(n, k){ - signal input a[k]; - signal input b[k]; - signal output out; - - component lt[k]; - component eq[k]; - for (var i = 0; i < k; i++) { - lt[i] = LessThan(n); - lt[i].in[0] <== a[i]; - lt[i].in[1] <== b[i]; - eq[i] = IsEqual(); - eq[i].in[0] <== a[i]; - eq[i].in[1] <== b[i]; - } - - // ors[i] holds (lt[k - 1] || (eq[k - 1] && lt[k - 2]) .. || (eq[k - 1] && .. && lt[i])) - // ands[i] holds (eq[k - 1] && .. && lt[i]) - // eq_ands[i] holds (eq[k - 1] && .. && eq[i]) - component ors[k - 1]; - component ands[k - 1]; - component eq_ands[k - 1]; - for (var i = k - 2; i >= 0; i--) { - ands[i] = AND(); - eq_ands[i] = AND(); - ors[i] = OR(); - - if (i == k - 2) { - ands[i].a <== eq[k - 1].out; - ands[i].b <== lt[k - 2].out; - eq_ands[i].a <== eq[k - 1].out; - eq_ands[i].b <== eq[k - 2].out; - ors[i].a <== lt[k - 1].out; - ors[i].b <== ands[i].out; - } else { - ands[i].a <== eq_ands[i + 1].out; - ands[i].b <== lt[i].out; - eq_ands[i].a <== eq_ands[i + 1].out; - eq_ands[i].b <== eq[i].out; - ors[i].a <== ors[i + 1].out; - ors[i].b <== ands[i].out; - } - } - out <== ors[0].out; -} - -template BigIsEqual(k){ - signal input in[2][k]; - signal output out; - component isEqual[k+1]; - var sum = 0; - for(var i = 0; i < k; i++){ - isEqual[i] = IsEqual(); - isEqual[i].in[0] <== in[0][i]; - isEqual[i].in[1] <== in[1][i]; - sum = sum + isEqual[i].out; - } - - isEqual[k] = IsEqual(); - isEqual[k].in[0] <== sum; - isEqual[k].in[1] <== k; - out <== isEqual[k].out; -} - -// leading register of b should be non-zero -template BigMod(n, k) { - assert(n <= 126); - signal input a[2 * k]; - signal input b[k]; - - signal output div[k + 1]; - signal output mod[k]; - - var longdiv[2][100] = long_div(n, k, k, a, b); - for (var i = 0; i < k; i++) { - div[i] <-- longdiv[0][i]; - mod[i] <-- longdiv[1][i]; - } - div[k] <-- longdiv[0][k]; - component range_checks[k + 1]; - for (var i = 0; i <= k; i++) { - range_checks[i] = Num2Bits(n); - range_checks[i].in <== div[i]; - } - - component mul = BigMult(n, k + 1); - for (var i = 0; i < k; i++) { - mul.a[i] <== div[i]; - mul.b[i] <== b[i]; - } - mul.a[k] <== div[k]; - mul.b[k] <== 0; - - component add = BigAdd(n, 2 * k + 2); - for (var i = 0; i < 2 * k; i++) { - add.a[i] <== mul.out[i]; - if (i < k) { - add.b[i] <== mod[i]; - } else { - add.b[i] <== 0; - } - } - add.a[2 * k] <== mul.out[2 * k]; - add.a[2 * k + 1] <== mul.out[2 * k + 1]; - add.b[2 * k] <== 0; - add.b[2 * k + 1] <== 0; - - for (var i = 0; i < 2 * k; i++) { - add.out[i] === a[i]; - } - add.out[2 * k] === 0; - add.out[2 * k + 1] === 0; - - component lt = BigLessThan(n, k); - for (var i = 0; i < k; i++) { - lt.a[i] <== mod[i]; - lt.b[i] <== b[i]; - } - lt.out === 1; -} - -// a[i], b[i] in 0... 2**n-1 -// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) -// assume a >= b -template BigSub(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal output out[k]; - signal output underflow; - - component unit0 = ModSub(n); - unit0.a <== a[0]; - unit0.b <== b[0]; - out[0] <== unit0.out; - - component unit[k - 1]; - for (var i = 1; i < k; i++) { - unit[i - 1] = ModSubThree(n); - unit[i - 1].a <== a[i]; - unit[i - 1].b <== b[i]; - if (i == 1) { - unit[i - 1].c <== unit0.borrow; - } else { - unit[i - 1].c <== unit[i - 2].borrow; - } - out[i] <== unit[i - 1].out; - } - underflow <== unit[k - 2].borrow; -} - -// calculates (a - b) % p, where a, b < p -// note: does not assume a >= b -template BigSubModP(n, k){ - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - signal output out[k]; - component sub = BigSub(n, k); - for (var i = 0; i < k; i++){ - sub.a[i] <== a[i]; - sub.b[i] <== b[i]; - } - signal flag; - flag <== sub.underflow; - component add = BigAdd(n, k); - for (var i = 0; i < k; i++){ - add.a[i] <== sub.out[i]; - add.b[i] <== flag * p[i]; - } - for (var i = 0; i < k; i++){ - out[i] <== add.out[i]; - } -} - -template BigMultModP(n, k) { - assert(n <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - signal output out[k]; - - component big_mult = BigMult(n, k); - for (var i = 0; i < k; i++) { - big_mult.a[i] <== a[i]; - big_mult.b[i] <== b[i]; - } - component big_mod = BigMod(n, k); - for (var i = 0; i < 2 * k; i++) { - big_mod.a[i] <== big_mult.out[i]; - } - for (var i = 0; i < k; i++) { - big_mod.b[i] <== p[i]; - } - for (var i = 0; i < k; i++) { - out[i] <== big_mod.mod[i]; - } -} - -template BigModInv(n, k) { - assert(n <= 252); - signal input in[k]; - signal input p[k]; - signal output out[k]; - - // length k - var inv[100] = mod_inv(n, k, in, p); - for (var i = 0; i < k; i++) { - out[i] <-- inv[i]; - } - component range_checks[k]; - for (var i = 0; i < k; i++) { - range_checks[i] = Num2Bits(n); - range_checks[i].in <== out[i]; - } - - component mult = BigMult(n, k); - for (var i = 0; i < k; i++) { - mult.a[i] <== in[i]; - mult.b[i] <== out[i]; - } - component mod = BigMod(n, k); - for (var i = 0; i < 2 * k; i++) { - mod.a[i] <== mult.out[i]; - } - for (var i = 0; i < k; i++) { - mod.b[i] <== p[i]; - } - mod.mod[0] === 1; - for (var i = 1; i < k; i++) { - mod.mod[i] === 0; - } -} - -// in[i] contains values in the range -2^(m-1) to 2^(m-1) -// constrain that in[] as a big integer is zero -// each limbs is n bits -template CheckCarryToZero(n, m, k) { - assert(k >= 2); - - var EPSILON = 3; - - assert(m + EPSILON <= 253); - - signal input in[k]; - - signal carry[k]; - component carryRangeChecks[k]; - for (var i = 0; i < k-1; i++){ - carryRangeChecks[i] = Num2Bits(m + EPSILON - n); - if( i == 0 ){ - carry[i] <-- in[i] / (1< 10944121435919637611123202872628637544274182200208017171849102093287904247808 ? 1 : 0; -} - -function div_ceil(m, n) { - var ret = 0; - if (m % n == 0) { - ret = m \ n; - } else { - ret = m \ n + 1; - } - return ret; -} - -function log_ceil(n) { - var n_temp = n; - for (var i = 0; i < 254; i++) { - if (n_temp == 0) { - return i; - } - n_temp = n_temp \ 2; - } - return 254; -} - -function SplitFn(in, n, m) { - return [in % (1 << n), (in \ (1 << n)) % (1 << m)]; -} - -function SplitThreeFn(in, n, m, k) { - return [in % (1 << n), (in \ (1 << n)) % (1 << m), (in \ (1 << n + m)) % (1 << k)]; -} - -// m bits per overflowed register (values are potentially negative) -// n bits per properly-sized register -// in has k registers -// out has k + ceil(m/n) - 1 + 1 registers. highest-order potentially negative, -// all others are positive -// - 1 since the last register is included in the last ceil(m/n) array -// + 1 since the carries from previous registers could push you over -function getProperRepresentation(m, n, k, in) { - var ceilMN = div_ceil(m, n); - - var out[100]; // should be out[k + ceilMN] - assert(k + ceilMN < 100); - for (var i = 0; i < k; i++) { - out[i] = in[i]; - } - for (var i = k; i < 100; i++) { - out[i] = 0; - } - assert(n <= m); - for (var i = 0; i+1 < k + ceilMN; i++) { - assert((1 << m) >= out[i] && out[i] >= -(1 << m)); - var shifted_val = out[i] + (1 << m); - assert(0 <= shifted_val && shifted_val <= (1 << (m+1))); - out[i] = shifted_val & ((1 << n) - 1); - out[i+1] += (shifted_val >> n) - (1 << (m - n)); - } - - return out; -} - -// Evaluate polynomial a at point x -function poly_eval(len, a, x) { - var v = 0; - for (var i = 0; i < len; i++) { - v += a[i] * (x ** i); - } - return v; -} - -// Interpolate a degree len-1 polynomial given its evaluations at 0..len-1 -function poly_interp(len, v) { - assert(len <= 200); - var out[200]; - for (var i = 0; i < len; i++) { - out[i] = 0; - } - - // Product_{i=0..len-1} (x-i) - var full_poly[201]; - full_poly[0] = 1; - for (var i = 0; i < len; i++) { - full_poly[i+1] = 0; - for (var j = i; j >= 0; j--) { - full_poly[j+1] += full_poly[j]; - full_poly[j] *= -i; - } - } - - for (var i = 0; i < len; i++) { - var cur_v = 1; - for (var j = 0; j < len; j++) { - if (i == j) { - // do nothing - } else { - cur_v *= i-j; - } - } - cur_v = v[i] / cur_v; - - var cur_rem = full_poly[len]; - for (var j = len-1; j >= 0; j--) { - out[j] += cur_v * cur_rem; - cur_rem = full_poly[j] + i * cur_rem; - } - assert(cur_rem == 0); - } - - return out; -} - -// 1 if true, 0 if false -function long_gt(n, k, a, b) { - for (var i = k - 1; i >= 0; i--) { - if (a[i] > b[i]) { - return 1; - } - if (a[i] < b[i]) { - return 0; - } - } - return 0; -} - -// n bits per register -// a has k registers -// b has k registers -// a >= b -function long_sub(n, k, a, b) { - var diff[100]; - var borrow[100]; - for (var i = 0; i < k; i++) { - if (i == 0) { - if (a[i] >= b[i]) { - diff[i] = a[i] - b[i]; - borrow[i] = 0; - } else { - diff[i] = a[i] - b[i] + (1 << n); - borrow[i] = 1; - } - } else { - if (a[i] >= b[i] + borrow[i - 1]) { - diff[i] = a[i] - b[i] - borrow[i - 1]; - borrow[i] = 0; - } else { - diff[i] = (1 << n) + a[i] - b[i] - borrow[i - 1]; - borrow[i] = 1; - } - } - } - return diff; -} - -// a is a n-bit scalar -// b has k registers -function long_scalar_mult(n, k, a, b) { - var out[100]; - for (var i = 0; i < 100; i++) { - out[i] = 0; - } - for (var i = 0; i < k; i++) { - var temp = out[i] + (a * b[i]); - out[i] = temp % (1 << n); - out[i + 1] = out[i + 1] + temp \ (1 << n); - } - return out; -} - - -// n bits per register -// a has k + m registers -// b has k registers -// out[0] has length m + 1 -- quotient -// out[1] has length k -- remainder -// implements algorithm of https://people.eecs.berkeley.edu/~fateman/282/F%20Wright%20notes/week4.pdf -function long_div(n, k, m, a, b){ - var out[2][100]; - m += k; - while (b[k-1] == 0) { - out[1][k] = 0; - k--; - assert(k > 0); - } - m -= k; - - var remainder[200]; - for (var i = 0; i < m + k; i++) { - remainder[i] = a[i]; - } - - var mult[200]; - var dividend[200]; - for (var i = m; i >= 0; i--) { - if (i == m) { - dividend[k] = 0; - for (var j = k - 1; j >= 0; j--) { - dividend[j] = remainder[j + m]; - } - } else { - for (var j = k; j >= 0; j--) { - dividend[j] = remainder[j + i]; - } - } - - out[0][i] = short_div(n, k, dividend, b); - - var mult_shift[100] = long_scalar_mult(n, k, out[0][i], b); - var subtrahend[200]; - for (var j = 0; j < m + k; j++) { - subtrahend[j] = 0; - } - for (var j = 0; j <= k; j++) { - if (i + j < m + k) { - subtrahend[i + j] = mult_shift[j]; - } - } - remainder = long_sub(n, m + k, remainder, subtrahend); - } - for (var i = 0; i < k; i++) { - out[1][i] = remainder[i]; - } - out[1][k] = 0; - - return out; -} - -// n bits per register -// a has k + 1 registers -// b has k registers -// assumes leading digit of b is at least 2 ** (n - 1) -// 0 <= a < (2**n) * b -function short_div_norm(n, k, a, b) { - var qhat = (a[k] * (1 << n) + a[k - 1]) \ b[k - 1]; - if (qhat > (1 << n) - 1) { - qhat = (1 << n) - 1; - } - - var mult[100] = long_scalar_mult(n, k, qhat, b); - if (long_gt(n, k + 1, mult, a) == 1) { - mult = long_sub(n, k + 1, mult, b); - if (long_gt(n, k + 1, mult, a) == 1) { - return qhat - 2; - } else { - return qhat - 1; - } - } else { - return qhat; - } -} - -// n bits per register -// a has k + 1 registers -// b has k registers -// assumes leading digit of b is non-zero -// 0 <= a < (2**n) * b -function short_div(n, k, a, b) { - var scale = (1 << n) \ (1 + b[k - 1]); - - // k + 2 registers now - var norm_a[200] = long_scalar_mult(n, k + 1, scale, a); - // k + 1 registers now - var norm_b[200] = long_scalar_mult(n, k, scale, b); - - var ret; - if (norm_b[k] != 0) { - ret = short_div_norm(n, k + 1, norm_a, norm_b); - } else { - ret = short_div_norm(n, k, norm_a, norm_b); - } - return ret; -} - -// n bits per register -// a and b both have k registers -// out[0] has length 2 * k -// adapted from BigMulShortLong and LongToShortNoEndCarry2 witness computation -function prod(n, k, a, b) { - // first compute the intermediate values. taken from BigMulShortLong - var prod_val[100]; // length is 2 * k - 1 - for (var i = 0; i < 2 * k - 1; i++) { - prod_val[i] = 0; - if (i < k) { - for (var a_idx = 0; a_idx <= i; a_idx++) { - prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; - } - } else { - for (var a_idx = i - k + 1; a_idx < k; a_idx++) { - prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; - } - } - } - - // now do a bunch of carrying to make sure registers not overflowed. taken from LongToShortNoEndCarry2 - var out[100]; // length is 2 * k - - var split[100][3]; // first dimension has length 2 * k - 1 - for (var i = 0; i < 2 * k - 1; i++) { - split[i] = SplitThreeFn(prod_val[i], n, n, n); - } - - var carry[100]; // length is 2 * k - 1 - carry[0] = 0; - out[0] = split[0][0]; - if (2 * k - 1 > 1) { - var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); - out[1] = sumAndCarry[0]; - carry[1] = sumAndCarry[1]; - } - if (2 * k - 1 > 2) { - for (var i = 2; i < 2 * k - 1; i++) { - var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); - out[i] = sumAndCarry[0]; - carry[i] = sumAndCarry[1]; - } - out[2 * k - 1] = split[2*k-2][1] + split[2*k-3][2] + carry[2*k-2]; - } - return out; -} - -// n bits per register -// a has k registers -// p has k registers -// e has k registers -// k * n <= 500 -// p is a prime -// computes a^e mod p -function mod_exp(n, k, a, p, e) { - var eBits[500]; // length is k * n - for (var i = 0; i < k; i++) { - for (var j = 0; j < n; j++) { - eBits[j + n * i] = (e[i] >> j) & 1; - } - } - - var out[100]; // length is k - for (var i = 0; i < 100; i++) { - out[i] = 0; - } - out[0] = 1; - - // repeated squaring - for (var i = k * n - 1; i >= 0; i--) { - // multiply by a if bit is 0 - if (eBits[i] == 1) { - var temp[200]; // length 2 * k - temp = prod(n, k, out, a); - var temp2[2][100]; - temp2 = long_div(n, k, k, temp, p); - out = temp2[1]; - } - - // square, unless we're at the end - if (i > 0) { - var temp[200]; // length 2 * k - temp = prod(n, k, out, out); - var temp2[2][100]; - temp2 = long_div(n, k, k, temp, p); - out = temp2[1]; - } - - } - return out; -} - -// n bits per register -// a has k registers -// p has k registers -// k * n <= 500 -// p is a prime -// if a == 0 mod p, returns 0 -// else computes inv = a^(p-2) mod p -function mod_inv(n, k, a, p) { - var isZero = 1; - for (var i = 0; i < k; i++) { - if (a[i] != 0) { - isZero = 0; - } - } - if (isZero == 1) { - var ret[100]; - for (var i = 0; i < k; i++) { - ret[i] = 0; - } - return ret; - } - - var pCopy[100]; - for (var i = 0; i < 100; i++) { - if (i < k) { - pCopy[i] = p[i]; - } else { - pCopy[i] = 0; - } - } - - var two[100]; - for (var i = 0; i < 100; i++) { - two[i] = 0; - } - two[0] = 2; - - var pMinusTwo[100]; - pMinusTwo = long_sub(n, k, pCopy, two); // length k - var out[100]; - out = mod_exp(n, k, a, pCopy, pMinusTwo); - return out; -} - -// a, b and out are all n bits k registers -function long_sub_mod_p(n, k, a, b, p){ - var gt = long_gt(n, k, a, b); - var tmp[100]; - if(gt){ - tmp = long_sub(n, k, a, b); - } - else{ - tmp = long_sub(n, k, b, a); - } - var out[2][100]; - for(var i = k;i < 2 * k; i++){ - tmp[i] = 0; - } - out = long_div(n, k, k, tmp, p); - if(gt==0){ - tmp = long_sub(n, k, p, out[1]); - } - return tmp; -} - -// a, b, p and out are all n bits k registers -function prod_mod_p(n, k, a, b, p){ - var tmp[100]; - var result[2][100]; - tmp = prod(n, k, a, b); - result = long_div(n, k, k, tmp, p); - return result[1]; -} diff --git a/mopro-core/examples/circom/rsa/fp.circom b/mopro-core/examples/circom/rsa/fp.circom deleted file mode 100644 index 2246251..0000000 --- a/mopro-core/examples/circom/rsa/fp.circom +++ /dev/null @@ -1,144 +0,0 @@ -pragma circom 2.1.5; - -include "./node_modules/circomlib/circuits/bitify.circom"; -include "./node_modules/circomlib/circuits/comparators.circom"; -include "./node_modules/circomlib/circuits/sign.circom"; -include "./bigint.circom"; -include "./bigint_func.circom"; - -// These functions operate over values in Z/Zp for some integer p (typically, -// but not necessarily prime). Values are stored as standard bignums with k -// chunks of n bits, but intermediate values often have "overflow" bits inside -// various chunks. -// -// These Fp functions will always correctly generate witnesses mod p, but they -// do not *check* that values are normalized to < p; they only check that -// values are correct mod p. This is to save the comparison circuit. -// They *will* always check for intended results mod p (soundness), but it may -// not have a unique intermediate signal. -// -// Conversely, some templates may not be satisfiable if the input witnesses are -// not < p. This does not break completeness, as honest provers will always -// generate witnesses which are canonical (between 0 and p). - -// a * b = r mod p -// a * b - p * q - r for some q -template FpMul(n, k) { - assert(n + n + log_ceil(k) + 2 <= 252); - signal input a[k]; - signal input b[k]; - signal input p[k]; - - signal output out[k]; - - signal v_ab[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - var v_a = poly_eval(k, a, x); - var v_b = poly_eval(k, b, x); - v_ab[x] <== v_a * v_b; - } - - var ab[200] = poly_interp(2*k-1, v_ab); - // ab_proper has length 2*k - var ab_proper[200] = getProperRepresentation(n + n + log_ceil(k), n, 2*k-1, ab); - - var long_div_out[2][100] = long_div(n, k, k, ab_proper, p); - - // Since we're only computing a*b, we know that q < p will suffice, so we - // know it fits into k chunks and can do size n range checks. - signal q[k]; - component q_range_check[k]; - signal r[k]; - component r_range_check[k]; - for (var i = 0; i < k; i++) { - q[i] <-- long_div_out[0][i]; - q_range_check[i] = Num2Bits(n); - q_range_check[i].in <== q[i]; - - r[i] <-- long_div_out[1][i]; - r_range_check[i] = Num2Bits(n); - r_range_check[i].in <== r[i]; - } - - signal v_pq_r[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - var v_p = poly_eval(k, p, x); - var v_q = poly_eval(k, q, x); - var v_r = poly_eval(k, r, x); - v_pq_r[x] <== v_p * v_q + v_r; - } - - signal v_t[2*k-1]; - for (var x = 0; x < 2*k-1; x++) { - v_t[x] <== v_ab[x] - v_pq_r[x]; - } - - var t[200] = poly_interp(2*k-1, v_t); - component tCheck = CheckCarryToZero(n, n + n + log_ceil(k) + 2, 2*k-1); - for (var i = 0; i < 2*k-1; i++) { - tCheck.in[i] <== t[i]; - } - - for (var i = 0; i < k; i++) { - out[i] <== r[i]; - } -} - -// Lifted from https://sourcegraph.com/github.com/darkforest-eth/circuits/-/blob/range_proof/circuit.circom -// NB: RangeProof is inclusive. -// input: field element, whose abs is claimed to be less than max_abs_value -// output: none -// we also want something like 4 * (abs(in) + max_abs_value) < 2 ** bits -// and bits << 256 -// NB: RangeProof is inclusive. -// input: field element, whose abs is claimed to be <= than max_abs_value -// output: none -// also checks that both max and abs(in) are expressible in `bits` bits -template RangeProof(bits) { - signal input in; - signal input max_abs_value; - - /* check that both max and abs(in) are expressible in `bits` bits */ - component n2b1 = Num2Bits(bits+1); - n2b1.in <== in + (1 << bits); - component n2b2 = Num2Bits(bits); - n2b2.in <== max_abs_value; - - /* check that in + max is between 0 and 2*max */ - component lowerBound = LessThan(bits+1); - component upperBound = LessThan(bits+1); - - lowerBound.in[0] <== max_abs_value + in; - lowerBound.in[1] <== 0; - lowerBound.out === 0; - - upperBound.in[0] <== 2 * max_abs_value; - upperBound.in[1] <== max_abs_value + in; - upperBound.out === 0; -} - -// input: n field elements, whose abs are claimed to be less than max_abs_value -// output: none -template MultiRangeProof(n, bits) { - signal input in[n]; - signal input max_abs_value; - component rangeProofs[n]; - - for (var i = 0; i < n; i++) { - rangeProofs[i] = RangeProof(bits); - rangeProofs[i].in <== in[i]; - rangeProofs[i].max_abs_value <== max_abs_value; - } -} - -template IsNegative(){ - signal input in; - signal output out; - component n2b = Num2Bits(254); - component sign = Sign(); - in ==> n2b.in; - for (var i = 0; i<254; i++) { - n2b.out[i] ==> sign.in[i]; - } - sign.sign ==> out; -} diff --git a/mopro-core/examples/circom/rsa/input.json b/mopro-core/examples/circom/rsa/input.json deleted file mode 100644 index 76b16ef..0000000 --- a/mopro-core/examples/circom/rsa/input.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "signature": [ - "3582320600048169363", - "7163546589759624213", - "18262551396327275695", - "4479772254206047016", - "1970274621151677644", - "6547632513799968987", - "921117808165172908", - "7155116889028933260", - "16769940396381196125", - "17141182191056257954", - "4376997046052607007", - "17471823348423771450", - "16282311012391954891", - "70286524413490741", - "1588836847166444745", - "15693430141227594668", - "13832254169115286697", - "15936550641925323613", - "323842208142565220", - "6558662646882345749", - "15268061661646212265", - "14962976685717212593", - "15773505053543368901", - "9586594741348111792", - "1455720481014374292", - "13945813312010515080", - "6352059456732816887", - "17556873002865047035", - "2412591065060484384", - "11512123092407778330", - "8499281165724578877", - "12768005853882726493" - ], - "modulus": [ - "13792647154200341559", - "12773492180790982043", - "13046321649363433702", - "10174370803876824128", - "7282572246071034406", - "1524365412687682781", - "4900829043004737418", - "6195884386932410966", - "13554217876979843574", - "17902692039595931737", - "12433028734895890975", - "15971442058448435996", - "4591894758077129763", - "11258250015882429548", - "16399550288873254981", - "8246389845141771315", - "14040203746442788850", - "7283856864330834987", - "12297563098718697441", - "13560928146585163504", - "7380926829734048483", - "14591299561622291080", - "8439722381984777599", - "17375431987296514829", - "16727607878674407272", - "3233954801381564296", - "17255435698225160983", - "15093748890170255670", - "15810389980847260072", - "11120056430439037392", - "5866130971823719482", - "13327552690270163501" - ], - "base_message": [ - "18114495772705111902", - "2254271930739856077", - "2068851770", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ] -} diff --git a/mopro-core/examples/circom/rsa/main.circom b/mopro-core/examples/circom/rsa/main.circom deleted file mode 100644 index c612ef8..0000000 --- a/mopro-core/examples/circom/rsa/main.circom +++ /dev/null @@ -1,5 +0,0 @@ -pragma circom 2.1.5; - -include "./rsa.circom"; - -component main{public [modulus]} = RSAVerify65537(64, 32); diff --git a/mopro-core/examples/circom/rsa/package-lock.json b/mopro-core/examples/circom/rsa/package-lock.json deleted file mode 100644 index 123c855..0000000 --- a/mopro-core/examples/circom/rsa/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "circom", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } - }, - "node_modules/circomlib": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz", - "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==" - } - } -} diff --git a/mopro-core/examples/circom/rsa/package.json b/mopro-core/examples/circom/rsa/package.json deleted file mode 100644 index 7117d38..0000000 --- a/mopro-core/examples/circom/rsa/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "circom", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "dependencies": { - "circomlib": "^2.0.5" - } -} diff --git a/mopro-core/examples/circom/rsa/rsa.circom b/mopro-core/examples/circom/rsa/rsa.circom deleted file mode 100644 index 64fda67..0000000 --- a/mopro-core/examples/circom/rsa/rsa.circom +++ /dev/null @@ -1,156 +0,0 @@ -pragma circom 2.1.5; - -include "./fp.circom"; - -// Computes base^65537 mod modulus -// Does not necessarily reduce fully mod modulus (the answer could be -// too big by a multiple of modulus) -template FpPow65537Mod(n, k) { - signal input base[k]; - // Exponent is hardcoded at 65537 - signal input modulus[k]; - signal output out[k]; - - component doublers[16]; - component adder = FpMul(n, k); - for (var i = 0; i < 16; i++) { - doublers[i] = FpMul(n, k); - } - - for (var j = 0; j < k; j++) { - adder.p[j] <== modulus[j]; - for (var i = 0; i < 16; i++) { - doublers[i].p[j] <== modulus[j]; - } - } - for (var j = 0; j < k; j++) { - doublers[0].a[j] <== base[j]; - doublers[0].b[j] <== base[j]; - } - for (var i = 0; i + 1 < 16; i++) { - for (var j = 0; j < k; j++) { - doublers[i + 1].a[j] <== doublers[i].out[j]; - doublers[i + 1].b[j] <== doublers[i].out[j]; - } - } - for (var j = 0; j < k; j++) { - adder.a[j] <== base[j]; - adder.b[j] <== doublers[15].out[j]; - } - for (var j = 0; j < k; j++) { - out[j] <== adder.out[j]; - } -} - -template RSAPad(n, k) { - signal input modulus[k]; - signal input base_message[k]; - signal output padded_message[k]; - - var base_len = 280; - var msg_len = 160; - - signal padded_message_bits[n*k]; - - component modulus_n2b[k]; - component base_message_n2b[k]; - signal modulus_bits[n*k]; - signal base_message_bits[n*k]; - for (var i = 0; i < k; i++) { - base_message_n2b[i] = Num2Bits(n); - base_message_n2b[i].in <== base_message[i]; - for (var j = 0; j < n; j++) { - base_message_bits[i*n+j] <== base_message_n2b[i].out[j]; - } - modulus_n2b[i] = Num2Bits(n); - modulus_n2b[i].in <== modulus[i]; - for (var j = 0; j < n; j++) { - modulus_bits[i*n+j] <== modulus_n2b[i].out[j]; - } - } - - for (var i = msg_len; i < n*k; i++) { - base_message_bits[i] === 0; - } - - for (var i = 0; i < msg_len; i++) { - padded_message_bits[i] <== base_message_bits[i]; - } - - for (var i = base_len; i < base_len + 8; i++) { - padded_message_bits[i] <== 0; - } - - for (var i = msg_len; i < base_len; i++) { - padded_message_bits[i] <== (0x3021300906052b0e03021a05000414 >> (i - msg_len)) & 1; - } - - component modulus_zero[(n*k + 7 - (base_len + 8))\8]; - { - var modulus_prefix = 0; - for (var i = n*k - 1; i >= base_len + 8; i--) { - if (i+8 < n*k) { - modulus_prefix += modulus_bits[i+8]; - if (i % 8 == 0) { - var idx = (i - (base_len + 8)) / 8; - modulus_zero[idx] = IsZero(); - modulus_zero[idx].in <== modulus_prefix; - padded_message_bits[i] <== 1-modulus_zero[idx].out; - } else { - padded_message_bits[i] <== padded_message_bits[i+1]; - } - } else { - padded_message_bits[i] <== 0; - } - } - } - - // The RFC guarantees at least 8 octets of 0xff padding. - assert(base_len + 8 + 65 <= n*k); - for (var i = base_len + 8; i < base_len + 8 + 65; i++) { - padded_message_bits[i] === 1; - } - - component padded_message_b2n[k]; - for (var i = 0; i < k; i++) { - padded_message_b2n[i] = Bits2Num(n); - for (var j = 0; j < n; j++) { - padded_message_b2n[i].in[j] <== padded_message_bits[i*n+j]; - } - padded_message[i] <== padded_message_b2n[i].out; - } -} - -template RSAVerify65537(n, k) { - signal input signature[k]; - signal input modulus[k]; - signal input base_message[k]; - - component padder = RSAPad(n, k); - for (var i = 0; i < k; i++) { - padder.modulus[i] <== modulus[i]; - padder.base_message[i] <== base_message[i]; - } - - // Check that the signature is in proper form and reduced mod modulus. - component signatureRangeCheck[k]; - component bigLessThan = BigLessThan(n, k); - for (var i = 0; i < k; i++) { - signatureRangeCheck[i] = Num2Bits(n); - signatureRangeCheck[i].in <== signature[i]; - bigLessThan.a[i] <== signature[i]; - bigLessThan.b[i] <== modulus[i]; - } - bigLessThan.out === 1; - - component bigPow = FpPow65537Mod(n, k); - for (var i = 0; i < k; i++) { - bigPow.base[i] <== signature[i]; - bigPow.modulus[i] <== modulus[i]; - } - // By construction of the padding, the padded message is necessarily - // smaller than the modulus. Thus, we don't have to check that bigPow is fully reduced. - for (var i = 0; i < k; i++) { - bigPow.out[i] === padder.padded_message[i]; - } -} diff --git a/mopro-core/examples/circom/scripts/build_complex_circuits.sh b/mopro-core/examples/circom/scripts/build_complex_circuits.sh deleted file mode 100755 index 6120c1f..0000000 --- a/mopro-core/examples/circom/scripts/build_complex_circuits.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -# Script for building complex circuits, used for benchmarking - -# Deal with errors -set -euo pipefail - -# Color definitions -DEFAULT='\033[0m' -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -BLUE='\033[0;34m' -GREY='\033[0;90m' - -# Coloring the -x output (commands) -# DEBUG_COLOR="${DEFAULT}" -# trap 'echo -e ${DEBUG_COLOR}${BASH_COMMAND}${DEFAULT}' DEBUG - -# Function to handle exit -handle_exit() { - # $? is a special variable that holds the exit code of the last command executed - if [ $? -ne 0 ]; then - echo -e "\n${RED}Script did not finish successfully!${DEFAULT}" - fi -} - -# Set the trap -trap handle_exit EXIT - -print_action() { - printf "\n${GREEN}$1${DEFAULT}\n" -} - -print_warning() { - printf "\n${YELLOW}$1${DEFAULT}\n" -} - -# Assert we're in the project root -if [[ ! -d "mopro-ffi" || ! -d "mopro-core" ]]; then - echo -e "${RED}Error: This script must be run from the project root directory that contains mopro-ffi and mopro-core folders.${DEFAULT}" - exit 1 -fi - -PROJECT_DIR=$(pwd) -CIRCOM_DIR="${PROJECT_DIR}/mopro-core/examples/circom" -ARKZKEY_DIR="${PROJECT_DIR}/ark-zkey" - -compile_circuit() { - local circuit_dir=$1 - local circuit_file=$2 - local target_file="$circuit_dir/target/$(basename $circuit_file .circom).r1cs" - - print_action "[core/circom] Compiling $circuit_file example circuit..." - if [ ! -f "$target_file" ]; then - ./scripts/compile.sh $circuit_dir $circuit_file - else - echo "File $target_file already exists, skipping compilation." - fi -} - -# Build Circom circuits in mopro-core and run trusted setup -print_action "[core/circom] Compiling complex-circuit..." -cd "${CIRCOM_DIR}" - -# Compile complex-circuits -compile_circuit complex-circuit complex-circuit-100k-100k.circom -compile_circuit complex-circuit complex-circuit-200k-200k.circom -compile_circuit complex-circuit complex-circuit-400k-400k.circom -compile_circuit complex-circuit complex-circuit-800k-800k.circom -compile_circuit complex-circuit complex-circuit-1600k-1600k.circom - -# Run trusted setup for complex-circuits -print_action "[core/circom] Running trusted setup for complex-circuit..." -./scripts/trusted_setup.sh complex-circuit 17 complex-circuit-100k-100k -./scripts/trusted_setup.sh complex-circuit 18 complex-circuit-200k-200k -./scripts/trusted_setup.sh complex-circuit 19 complex-circuit-400k-400k -./scripts/trusted_setup.sh complex-circuit 20 complex-circuit-800k-800k -./scripts/trusted_setup.sh complex-circuit 21 complex-circuit-1600k-1600k - -# Generate arkzkey for complex-circuits -print_action "[core/circom] Generating arkzkey for complex-circuit..." -./scripts/generate_arkzkey.sh complex-circuit complex-circuit-100k-100k -./scripts/generate_arkzkey.sh complex-circuit complex-circuit-200k-200k -./scripts/generate_arkzkey.sh complex-circuit complex-circuit-400k-400k -./scripts/generate_arkzkey.sh complex-circuit complex-circuit-800k-800k -./scripts/generate_arkzkey.sh complex-circuit complex-circuit-1600k-1600k - -print_action "Done! All complex-circuit circuits built and prepared." \ No newline at end of file diff --git a/mopro-core/examples/circom/scripts/compile.sh b/mopro-core/examples/circom/scripts/compile.sh deleted file mode 100755 index 8d8dd82..0000000 --- a/mopro-core/examples/circom/scripts/compile.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Example usage: -# ./scripts/compile.sh multiplier2 multiplier2.circom - -# Deal with errors -set -euo pipefail - -# Check if arguments are provided -if [ "$#" -ne 2 ]; then - echo "Usage: $0 " - exit 1 -fi - -DIR="$1" -CIRCUIT="$2" - -mkdir -p ${DIR}/target -circom ./${DIR}/${CIRCUIT} --r1cs --wasm --sym --output ./${DIR}/target \ No newline at end of file diff --git a/mopro-core/examples/circom/scripts/generate_arkzkey.sh b/mopro-core/examples/circom/scripts/generate_arkzkey.sh deleted file mode 100755 index d80db52..0000000 --- a/mopro-core/examples/circom/scripts/generate_arkzkey.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# Example usage: -# ./scripts/generate_arkzkey.sh multiplier2 multiplier2 - -# Assumes inside target directory - -# Deal with errors -set -euo pipefail - -# Check if arguments are provided -if [ "$#" -ne 2 ]; then - echo "Usage: $0 " - exit 1 -fi - -DIR="$1" -CIRCUIT="$2" -ZKEY_PATH="${DIR}/target/${CIRCUIT}_final.zkey" -ARKZKEY_PATH="${DIR}/target/${CIRCUIT}_final.arkzkey" - -# Check if ZKEY_PATH exists -if [ ! -f "$ZKEY_PATH" ]; then - echo "Error: ZKEY_PATH does not exist at ${ZKEY_PATH}" - exit 1 -fi - -# Check if arkzkey-util command exists -if ! command -v arkzkey-util &> /dev/null; then - echo "Error: arkzkey-util command is not available." - exit 1 -fi - -echo "Generate arkzkey file for ${CIRCUIT}..." -if [ ! -f "${ARKZKEY_PATH}" ]; then - arkzkey-util ${ZKEY_PATH} -else - echo "File ${ARKZKEY_PATH} already exists, skipping." -fi - -echo "arkzkey file generation done, arkzkey file is in ${ARKZKEY_PATH}" \ No newline at end of file diff --git a/mopro-core/examples/circom/scripts/trusted_setup.sh b/mopro-core/examples/circom/scripts/trusted_setup.sh deleted file mode 100755 index 312e436..0000000 --- a/mopro-core/examples/circom/scripts/trusted_setup.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# Example usage: -# ./scripts/trusted_setup.sh multiplier2 08 multiplier2 - -# Deal with errors -set -euo pipefail - -# Change this is if you keep your Powers of Tau files elsewhere -PTAU_DIR="ptau" - -# Check if arguments are provided -if [ "$#" -ne 3 ]; then - echo "Usage: $0 " - exit 1 -fi - -DIR="$1" -PTAU="$2" -CIRCUIT="$3" -PTAU_PATH="${PTAU_DIR}/powersOfTau28_hez_final_${PTAU}.ptau" - -# Phase 1 - Perpetual Powers of Tau -# From https://github.com/iden3/snarkjs - -if [ ! -f "$PTAU_PATH" ]; then - echo "Downloading Powers of Tau file..." - wget -P $PTAU_DIR https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_${PTAU}.ptau -else - echo "File $PTAU_PATH already exists, skipping download." -fi - -# Phase 2 - Circuit specific setup -# Toy example, not for production use -# For a real deployment with Groth16 use a tool like p0tion for phase 2 trusted setup -# See https://github.com/privacy-scaling-explorations/p0tion - -echo "Generate zkey file for ${CIRCUIT}..." -if [ ! -f "${DIR}/target/${CIRCUIT}_final.zkey" ]; then - snarkjs groth16 setup ${DIR}/target/${CIRCUIT}.r1cs ${PTAU_PATH} ${DIR}/target/${CIRCUIT}_0000.zkey - snarkjs zkey contribute ${DIR}/target/${CIRCUIT}_0000.zkey ${DIR}/target/${CIRCUIT}_final.zkey \ - --name="Demo contribution" -e="0xdeadbeef" -else - echo "File ${DIR}/target/${CIRCUIT}_final.zkey already exists, skipping." -fi - -echo "Trusted setup done, zkey file is in ${DIR}/target/${CIRCUIT}_final.zkey" \ No newline at end of file diff --git a/mopro-core/examples/halo2/fibonacci/.gitignore b/mopro-core/examples/halo2/fibonacci/.gitignore deleted file mode 100644 index c2b9385..0000000 --- a/mopro-core/examples/halo2/fibonacci/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -/out \ No newline at end of file diff --git a/mopro-core/examples/halo2/fibonacci/Cargo.toml b/mopro-core/examples/halo2/fibonacci/Cargo.toml deleted file mode 100644 index 69e3e9e..0000000 --- a/mopro-core/examples/halo2/fibonacci/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "halo2-circuit" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "halo2_circuit" -path = "src/lib.rs" - -[features] -dev-graph = ["halo2_proofs/dev-graph", "plotters"] - -[dependencies] -halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2", tag = "v2023_04_20", features = [ - "dev-graph", -] } -plotters = { version = "0.3.0", optional = true } -tabbycat = { version = "0.1", features = ["attributes"], optional = true } -rand = "0.8.5" \ No newline at end of file diff --git a/mopro-core/examples/halo2/fibonacci/README.md b/mopro-core/examples/halo2/fibonacci/README.md deleted file mode 100644 index 52ac0ae..0000000 --- a/mopro-core/examples/halo2/fibonacci/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Halo2 Examples - -This rust crate contains examples of Halo2 circuit that does Fibonacci calculation and checks if the provided number is -a Fibonacci number. - -## Instruction - -1. Compile the repo - -``` -cargo build -``` - -2. Run Fibonacci example - -``` -cargo test -- --nocapture fibonacci_example -``` - -3. Plot the circuit layout - -``` -cargo test --all-features -- --nocapture plot_fibonacci -``` - -4. Write the proving and verifying keys, as well as the SRS - -``` -cargo run --bin fibonacci -``` diff --git a/mopro-core/examples/halo2/fibonacci/src/bin/fibonacci.rs b/mopro-core/examples/halo2/fibonacci/src/bin/fibonacci.rs deleted file mode 100644 index 28b894b..0000000 --- a/mopro-core/examples/halo2/fibonacci/src/bin/fibonacci.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::env; -use std::path::Path; - -use halo2_proofs::halo2curves::bn256::{Bn256, Fr}; -use halo2_proofs::plonk::{keygen_pk, keygen_vk}; -use halo2_proofs::poly::commitment::ParamsProver; -use halo2_proofs::poly::kzg::commitment::ParamsKZG; - -use halo2_circuit::{write_keys, write_srs, FinbonaciCircuit}; - -/// This binary is picked up by the `mopro prepare` command as a backup option to generate the -/// srs, as well as proving and verification keys for the circuit when the keys are not found in the -/// `/out` directory. -/// -/// When integrating your own Halo2 circuit with the mopro-core library, you should: -/// 1. Provide your own implementation of the `` binary that prepares the keys. -/// 2. Generate the keys yourself and store them in the `out` directory of your circuit directory. -pub fn main() { - // Get the project's root directory from the `CARGO_MANIFEST_DIR` environment variable - let project_root = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR is not set"); - - // Create the path to the `out` directory under the project's root directory - let out_dir = Path::new(&project_root).join("out"); - - // Check if the `out` directory exists, if not, create it - if !out_dir.exists() { - std::fs::create_dir(&out_dir).expect("Unable to create out directory"); - } - - // Circuit name - let circuit_name = "fibonacci"; - - // Set up the circuit - let k = 4; - let circuit = FinbonaciCircuit::::default(); - - // Generate SRS - let srs = ParamsKZG::::new(k); - - let srs_path = out_dir.join(format!("{}_srs", circuit_name)); - write_srs(&srs, srs_path.as_path()); - - // Generate the proving key - should be loaded from disk in production - let vk = keygen_vk(&srs, &circuit).expect("keygen_vk should not fail"); - let vk_path = out_dir.join(format!("{}_vk", circuit_name)); - - let pk = keygen_pk(&srs, vk, &circuit).expect("keygen_pk should not fail"); - let pk_path = out_dir.join(format!("{}_pk", circuit_name)); - - write_keys(&pk, pk_path.as_path(), vk_path.as_path()); - - println!("Circuit file preparation finished successfully."); - println!("SRS stored in {}", srs_path.display()); - println!("Proving key stored in {}", pk_path.display()); - println!("Verification key stored in {}", vk_path.display()); -} diff --git a/mopro-core/examples/halo2/fibonacci/src/circuit.rs b/mopro-core/examples/halo2/fibonacci/src/circuit.rs deleted file mode 100644 index 6349fef..0000000 --- a/mopro-core/examples/halo2/fibonacci/src/circuit.rs +++ /dev/null @@ -1,245 +0,0 @@ -use std::marker::PhantomData; - -use halo2_proofs::arithmetic::Field; -use halo2_proofs::{circuit::*, plonk::*, poly::Rotation}; - -#[derive(Debug, Clone)] - -// Defines the configuration of all the columns, and all of the column definitions -// Will be incrementally populated and passed around -pub struct FibonacciConfig { - pub col_a: Column, - pub col_b: Column, - pub col_c: Column, - pub selector: Selector, - pub instance: Column, -} - -#[derive(Debug, Clone)] -struct FibonacciChip { - config: FibonacciConfig, - _marker: PhantomData, - // In rust, when you have a struct that is generic over a type parameter (here F), - // but the type parameter is not referenced in a field of the struct, - // you have to use PhantomData to virtually reference the type parameter, - // so that the compiler can track it. Otherwise it would give an error. - Jason -} - -impl FibonacciChip { - // Default constructor - pub fn construct(config: FibonacciConfig) -> Self { - Self { - config, - _marker: PhantomData, - } - } - - // Configure will set what type of columns things are, enable equality, create gates, and return a config with all the gates - pub fn configure(meta: &mut ConstraintSystem) -> FibonacciConfig { - let col_a = meta.advice_column(); - let col_b = meta.advice_column(); - let col_c = meta.advice_column(); - let selector = meta.selector(); - let instance = meta.instance_column(); - - // enable_equality has some cost, so we only want to define it on rows where we need copy constraints - meta.enable_equality(col_a); - meta.enable_equality(col_b); - meta.enable_equality(col_c); - meta.enable_equality(instance); - - // Defining a create_gate here applies it over every single column in the circuit. - // We will use the selector column to decide when to turn this gate on and off, since we probably don't want it on every row - meta.create_gate("add", |meta| { - // - // col_a | col_b | col_c | selector - // a b c s - // - let s = meta.query_selector(selector); - let a = meta.query_advice(col_a, Rotation::cur()); - let b = meta.query_advice(col_b, Rotation::cur()); - let c = meta.query_advice(col_c, Rotation::cur()); - vec![s * (a + b - c)] - }); - - FibonacciConfig { - col_a, - col_b, - col_c, - selector, - instance, - } - } - - // These assign functions are to be called by the synthesizer, and will be used to assign values to the columns (the witness) - // The layouter will collect all the region definitions and compress it horizontally (i.e. squeeze up/down) - // but not vertically (i.e. will not squeeze left/right, at least right now) - #[allow(clippy::type_complexity)] - pub fn assign_first_row( - &self, - mut layouter: impl Layouter, - ) -> Result<(AssignedCell, AssignedCell, AssignedCell), Error> { - layouter.assign_region( - || "first row", - |mut region| { - self.config.selector.enable(&mut region, 0)?; - - let a_cell = region.assign_advice_from_instance( - || "f(0)", - self.config.instance, - 0, - self.config.col_a, - 0, - )?; - - let b_cell = region.assign_advice_from_instance( - || "f(1)", - self.config.instance, - 1, - self.config.col_b, - 0, - )?; - - let c_cell = region.assign_advice( - || "a + b", - self.config.col_c, - 0, - || a_cell.value().copied() + b_cell.value(), - )?; - - Ok((a_cell, b_cell, c_cell)) - }, - ) - } - - // This will be repeatedly called. Note that each time it makes a new region, comprised of a, b, c, s that happen to all be in the same row - pub fn assign_row( - &self, - mut layouter: impl Layouter, - prev_b: &AssignedCell, - prev_c: &AssignedCell, - ) -> Result, Error> { - layouter.assign_region( - || "next row", - |mut region| { - self.config.selector.enable(&mut region, 0)?; - - // Copy the value from b & c in previous row to a & b in current row - prev_b.copy_advice(|| "a", &mut region, self.config.col_a, 0)?; - prev_c.copy_advice(|| "b", &mut region, self.config.col_b, 0)?; - - let c_cell = region.assign_advice( - || "c", - self.config.col_c, - 0, - || prev_b.value().copied() + prev_c.value(), - )?; - - Ok(c_cell) - }, - ) - } - - pub fn expose_public( - &self, - mut layouter: impl Layouter, - cell: &AssignedCell, - row: usize, - ) -> Result<(), Error> { - layouter.constrain_instance(cell.cell(), self.config.instance, row) - } -} - -/// The circuit takes in the two starting elements and the 9th element of their Fibonacci sequence -/// and checks that the 9th element is indeed the sum of the two starting elements -#[derive(Default)] -pub struct FinbonaciCircuit(PhantomData); - -// Our circuit will instantiate an instance based on the interface defined on the chip and floorplanner (layouter) -// There isn't a clear reason this and the chip aren't the same thing, except for better abstractions for complex circuits -impl Circuit for FinbonaciCircuit { - type Config = FibonacciConfig; - type FloorPlanner = SimpleFloorPlanner; - // Circuit without witnesses, called only during key generation - fn without_witnesses(&self) -> Self { - Self::default() - } - - // Has the arrangement of columns. Called only during keygen, and will just call chip config most of the time - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - FibonacciChip::configure(meta) - } - - // Take the output of configure and floorplanner type to make the actual circuit - // Called both at key generation time, and proving time with a specific witness - // Will call all of the copy constraints - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), Error> { - let chip = FibonacciChip::construct(config); - - let (_, mut prev_b, mut prev_c) = - chip.assign_first_row(layouter.namespace(|| "first row"))?; - - for _i in 3..10 { - let c_cell = chip.assign_row(layouter.namespace(|| "next row"), &prev_b, &prev_c)?; - prev_b = prev_c; - prev_c = c_cell; - } - - chip.expose_public(layouter.namespace(|| "out"), &prev_c, 2)?; - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use std::marker::PhantomData; - - use halo2_proofs::dev::MockProver; - use halo2_proofs::halo2curves::pasta::Fp; - - use super::FinbonaciCircuit; - - #[test] - fn fibonacci_example() { - let k = 4; - - let a = Fp::from(1); // F[0] - let b = Fp::from(1); // F[1] - let out = Fp::from(55); // F[9] - - let circuit = FinbonaciCircuit(PhantomData); - - let mut public_input = vec![a, b, out]; - - // This prover is faster and 'fake', but is mostly a devtool for debugging - let prover = MockProver::run(k, &circuit, vec![public_input.clone()]).unwrap(); - // This function will pretty-print on errors - prover.assert_satisfied(); - - public_input[2] += Fp::one(); - let _prover = MockProver::run(k, &circuit, vec![public_input]).unwrap(); - // check that the verification fails - let result = _prover.verify(); - assert!(!result.is_ok()); - } - - #[cfg(feature = "dev-graph")] - #[test] - fn plot_fibonacci() { - use plotters::prelude::*; - - let root = BitMapBackend::new("fib-1-layout.png", (1024, 3096)).into_drawing_area(); - root.fill(&WHITE).unwrap(); - let root = root.titled("Fib 1 Layout", ("sans-serif", 60)).unwrap(); - - let circuit = FinbonaciCircuit::(PhantomData); - halo2_proofs::dev::CircuitLayout::default() - .render(4, &circuit, &root) - .unwrap(); - } -} diff --git a/mopro-core/examples/halo2/fibonacci/src/io.rs b/mopro-core/examples/halo2/fibonacci/src/io.rs deleted file mode 100644 index 5fcdca4..0000000 --- a/mopro-core/examples/halo2/fibonacci/src/io.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::fmt; -use std::fs::File; -use std::io::{BufWriter, Write}; -use std::path::Path; - -use halo2_proofs::halo2curves::bn256::{Bn256, G1Affine}; -use halo2_proofs::plonk::ProvingKey; -use halo2_proofs::poly::commitment::Params; -use halo2_proofs::poly::kzg::commitment::ParamsKZG; -use halo2_proofs::SerdeFormat::RawBytes; - -fn with_writer(path: &Path, f: impl FnOnce(&mut BufWriter) -> Result<(), E>) -where - E: fmt::Debug, -{ - let file = File::create(path).expect("Unable to create file"); - let mut writer = BufWriter::new(file); - f(&mut writer).expect("Unable to write to file"); - writer.flush().expect("Unable to flush file"); -} - -/// Write SRS to file. -pub fn write_srs(srs: &ParamsKZG, path: &Path) { - with_writer(path, |writer| srs.write(writer)); -} - -/// Write proving key and verification key to file. -pub fn write_keys(pk: &ProvingKey, pk_path: &Path, vk_path: &Path) { - with_writer(pk_path, |writer| pk.write(writer, RawBytes)); - with_writer(vk_path, |writer| pk.get_vk().write(writer, RawBytes)); -} diff --git a/mopro-core/examples/halo2/fibonacci/src/lib.rs b/mopro-core/examples/halo2/fibonacci/src/lib.rs deleted file mode 100644 index 937716b..0000000 --- a/mopro-core/examples/halo2/fibonacci/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! This is a sample Fibonacci implementation in Halo2 to be used with Mopro - -/// This crate contains the functions picked up by the `mopro-core`. -/// **Make sure to re-implement these functions with your own circuit logic.** -mod mopro; -pub use mopro::{prove, read_pk, read_vk, verify}; - -pub(crate) mod circuit; -pub(crate) mod io; - -pub use circuit::FinbonaciCircuit; -pub use io::{write_keys, write_srs}; diff --git a/mopro-core/examples/halo2/fibonacci/src/mopro.rs b/mopro-core/examples/halo2/fibonacci/src/mopro.rs deleted file mode 100644 index 797c169..0000000 --- a/mopro-core/examples/halo2/fibonacci/src/mopro.rs +++ /dev/null @@ -1,92 +0,0 @@ -use std::collections::HashMap; -use std::io; - -use crate::FinbonaciCircuit; -use halo2_proofs::halo2curves::bn256::{Bn256, Fr, G1Affine}; -use halo2_proofs::plonk::{create_proof, verify_proof, ProvingKey, VerifyingKey}; -use halo2_proofs::poly::commitment::ParamsProver; -use halo2_proofs::poly::kzg::commitment::{KZGCommitmentScheme, ParamsKZG}; -use halo2_proofs::poly::kzg::multiopen::{ProverGWC, VerifierGWC}; -use halo2_proofs::poly::kzg::strategy::SingleStrategy; -use halo2_proofs::transcript::{ - Blake2bRead, Blake2bWrite, TranscriptReadBuffer, TranscriptWriterBuffer, -}; -use halo2_proofs::SerdeFormat::RawBytes; -use rand::thread_rng; - -/// This function is picked up by the `mopro-core` when generating the proof. -/// It should be implemented the proving logic for the circuit. -pub fn prove( - inputs: HashMap>, - srs: &ParamsKZG, - pk: &ProvingKey, -) -> Result<(Vec, Vec), String> { - let circuit = FinbonaciCircuit::::default(); - - // Fix the starting values for the Fibonacci sequence - let a = Fr::from(1); // F[0] - let b = Fr::from(1); // F[1] - // Check that the `out` value is indeed the 9th Fibonacci number - let out: Fr = inputs - .get("out") - .ok_or("`out` value not found in proof input".to_string())? - .get(0) - .ok_or("`out` value list is empty".to_string()) - .unwrap() - .clone(); - - let mut transcript = TranscriptWriterBuffer::<_, G1Affine, _>::init(Vec::new()); - - let public_input = vec![a, b, out]; - - create_proof::, ProverGWC<_>, _, _, Blake2bWrite<_, _, _>, _>( - &srs, - &pk, - &[circuit], - &[&[&public_input[..]]], - thread_rng(), - &mut transcript, - ) - .unwrap(); - - let proof = transcript.finalize(); - Ok((public_input, proof)) -} - -/// This function is picked up by the `mopro-core` when generating the proof. -/// It should be implemented the proving logic for the circuit. -pub fn verify( - proof: Vec, - inputs: &Vec, - srs: &ParamsKZG, - vk: &VerifyingKey, -) -> Result { - let mut transcript = TranscriptReadBuffer::<_, G1Affine, _>::init(proof.as_slice()); - let proof_verified = verify_proof::<_, VerifierGWC<_>, _, Blake2bRead<_, _, _>, _>( - srs.verifier_params(), - &vk, - SingleStrategy::new(&srs), - &[&[inputs.as_ref()]], - &mut transcript, - ) - .is_ok(); - Ok(proof_verified) -} - -/// Read a proving key from the file. -/// This function is picked up by the `mopro-core` when reading the proving key. -/// It has not been implemented in the `mopro-core` because some implementations might -/// have `halo2_proofs` `params` feature enabled, which changes the way the proving key is read, -/// To avoid compilation errors because of feature unification we have delegated the implementation. -pub fn read_pk(reader: &mut R) -> io::Result> { - ProvingKey::read::<_, FinbonaciCircuit<_>>(reader, RawBytes) -} - -/// Read a verification key from the file. -/// This function is picked up by the `mopro-core` when reading the proving key. -/// It has not been implemented in the `mopro-core` because some implementations might -/// have `halo2_proofs` `params` feature enabled, which changes the way the proving key is read, -/// To avoid compilation errors because of feature unification we have delegated the implementation. -pub fn read_vk(reader: &mut R) -> io::Result> { - VerifyingKey::read::<_, FinbonaciCircuit<_>>(reader, RawBytes) -} diff --git a/mopro-core/gpu_explorations/README.md b/mopro-core/gpu_explorations/README.md deleted file mode 100644 index d9ba3b8..0000000 --- a/mopro-core/gpu_explorations/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# GPU exploration - -## Report links - -- [Benchmarking TrapdoorTechZprize MSM & arkworks(0.4) MSM](https://hackmd.io/ZCxFpQ8AROyYGTl5GLqAGQ) - -## Steps to run the benchmarks - -There are currently 2 algorithms for benchmarking: - -- `arkworks_pippenger` -- `trapdoortech_zprize_msm` - -### mopro-core tests - -To run the benchmarks of the instance size of $2^{16}$ on BLS12_377 curve in `mopro-core`, replace `` with the algorithm name listed above. - -```bash -cargo test --release --features gpu-benchmarks --package mopro-core --lib -- middleware::gpu_explorations::::tests::test_run_benchmark --exact --nocapture -``` - -Run the benchmarks for multiple instance size. You can customize your own benchmark parameters on modular files in `mopro-core\src\middleware\gpu_explorations` -```bash -cargo test --release --features gpu-benchmarks --package mopro-core --lib -- middleware::gpu_explorations::::tests::test_run_multi_benchmarks --exact --nocapture -``` - -More context about the benchmark: -- It would generate instances size on BLS12_377 curve with scalar size of 32 bytes (i.e. can represent 0 to $2^{256}-1$ unsigned integer.) in `mopro-core/src/middlware/gpu-explorations/utils/vectors/` -- The instance size mean the amount of points and scalars. -- The msm time is linear to the size of instance. - -The results are as below: - -```bash -Vectors already generated -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 195.635083ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 206.639791ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 205.1675ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 197.742167ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 207.147166ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 199.729459ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 203.080416ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 198.15875ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 201.636916ms -Average time to execute MSM with 65536 points and scalars in 1 iterations is: 210.273792ms -Done running benchmark. Check the result at: "../mopro-core/benchmarks/gpu_explorations" -16x10 result: BenchmarkResult { - instance_size: 16, - num_instance: 10, - avg_processing_time: 202.52110399999998, -} -... -``` - -### ios benchmarking - -1. install `mopro-cli` (See [Getting Started](https://zkmopro.org/docs/getting-started)). -2. cd to the `research/gpu-exploration-app` directory. -3. run `mopro build --platforms ios` (remember to change your ios_device_type `simulator`/`device`) to build and update the bindings. -4. open `ios/ExampleApp/ExampleApp.xcworkspace` in Xcode. -5. choose your simulator/mobile device and build the project (can also use `cmd + R` as hot key). -6. choose `MSMBenchmark` and choose the algorithms and click the button below you want to start benchmark. - -### `ExampleGpuExploration` in templates - -> The example project would be created soon. diff --git a/mopro-core/gpu_explorations/benchmarks/arkworks_pippenger_benchmark.txt b/mopro-core/gpu_explorations/benchmarks/arkworks_pippenger_benchmark.txt deleted file mode 100644 index ca449d3..0000000 --- a/mopro-core/gpu_explorations/benchmarks/arkworks_pippenger_benchmark.txt +++ /dev/null @@ -1,7 +0,0 @@ -msm_size,num_msm,avg_processing_time(ms) -8,10,1.3042915 -12,10,8.4526458 -16,10,82.19201659999999 -18,10,307.24009179999996 -20,10,1140.8793625 -22,10,4160.4375503 diff --git a/mopro-core/gpu_explorations/benchmarks/halo2curve_multicore_msm_benchmark.txt b/mopro-core/gpu_explorations/benchmarks/halo2curve_multicore_msm_benchmark.txt deleted file mode 100644 index e51e596..0000000 --- a/mopro-core/gpu_explorations/benchmarks/halo2curve_multicore_msm_benchmark.txt +++ /dev/null @@ -1,7 +0,0 @@ -msm_size,num_msm,avg_processing_time(ms) -8,10,2.72165 -12,10,12.6313959 -16,10,116.79077500000001 -18,10,410.9840459 -20,10,1544.3454166 -22,10,5254.7052669 diff --git a/mopro-core/gpu_explorations/benchmarks/halo2curve_singlecore_msm_benchmark.txt b/mopro-core/gpu_explorations/benchmarks/halo2curve_singlecore_msm_benchmark.txt deleted file mode 100644 index 4d9ade4..0000000 --- a/mopro-core/gpu_explorations/benchmarks/halo2curve_singlecore_msm_benchmark.txt +++ /dev/null @@ -1,7 +0,0 @@ -msm_size,num_msm,avg_processing_time(ms) -8,10,5.959329 -12,10,39.155546 -16,10,464.353125 -18,10,1649.2290374 -20,10,6154.858971 -22,10,20962.7212291 diff --git a/mopro-core/gpu_explorations/benchmarks/metal_msm_benchmark.txt b/mopro-core/gpu_explorations/benchmarks/metal_msm_benchmark.txt deleted file mode 100644 index a8e0052..0000000 --- a/mopro-core/gpu_explorations/benchmarks/metal_msm_benchmark.txt +++ /dev/null @@ -1,6 +0,0 @@ -msm_size,num_msm,avg_processing_time(ms) -10,5,43.1081248 -16,5,1730.2658421999997 -18,5,10277.7072166 -20,5,41019.2250086 -22,5,555877.919833 diff --git a/mopro-core/gpu_explorations/benchmarks/trapdoor_benchmark.txt b/mopro-core/gpu_explorations/benchmarks/trapdoor_benchmark.txt deleted file mode 100644 index e4e3428..0000000 --- a/mopro-core/gpu_explorations/benchmarks/trapdoor_benchmark.txt +++ /dev/null @@ -1,7 +0,0 @@ -msm_size,num_msm,avg_processing_time(ms) -8,5,5.758712888888889 -8,10,5.595629300000001 -12,5,48.66521755555556 -12,10,48.5190125 -16,5,539.597666625 -16,10,527.8981749000001 diff --git a/mopro-core/src/middleware/circom/mod.rs b/mopro-core/src/middleware/circom/mod.rs deleted file mode 100644 index e40fbe3..0000000 --- a/mopro-core/src/middleware/circom/mod.rs +++ /dev/null @@ -1,796 +0,0 @@ -use self::{ - serialization::{SerializableInputs, SerializableProof}, - utils::bytes_to_bits, -}; -use crate::MoproError; - -use std::io::Cursor; -use std::sync::Mutex; -use std::time::Instant; -use std::{collections::HashMap, fs::File, io::BufReader}; - -use ark_bn254::{Bn254, Fr}; -use ark_circom::{ - read_zkey, - CircomReduction, - WitnessCalculator, //read_zkey, -}; -use ark_crypto_primitives::snark::SNARK; -use ark_groth16::{prepare_verifying_key, Groth16, ProvingKey}; -use ark_std::UniformRand; - -use ark_relations::r1cs::ConstraintMatrices; -use ark_std::rand::thread_rng; -use color_eyre::Result; -use core::include_bytes; -use num_bigint::BigInt; -use once_cell::sync::{Lazy, OnceCell}; - -use wasmer::{Module, Store}; - -use ark_zkey::{read_arkzkey, read_arkzkey_from_bytes}; //SerializableConstraintMatrices - -#[cfg(feature = "dylib")] -use { - std::{env, path::Path}, - wasmer::Dylib, -}; - -#[cfg(feature = "calc-native-witness")] -use { - ark_std::str::FromStr, - ruint::aliases::U256, - witness::{init_graph, Graph}, -}; - -pub mod serialization; -pub mod utils; - -type GrothBn = Groth16; - -type CircuitInputs = HashMap>; - -// TODO: Split up this namespace a bit, right now quite a lot of things going on - -pub struct CircomState { - zkey: Option<(ProvingKey, ConstraintMatrices)>, - wtns: Option, -} - -impl Default for CircomState { - fn default() -> Self { - Self::new() - } -} - -// NOTE: A lot of the contents of this file is inspired by github.com/worldcoin/semaphore-rs - -// TODO: Replace printlns with logging - -const ZKEY_BYTES: &[u8] = include_bytes!(env!("BUILD_RS_ZKEY_FILE")); - -// const ARKZKEY_BYTES: &[u8] = include_bytes!(env!("BUILD_RS_ARKZKEY_FILE")); - -static ZKEY: Lazy<(ProvingKey, ConstraintMatrices)> = Lazy::new(|| { - let mut reader = Cursor::new(ZKEY_BYTES); - read_zkey(&mut reader).expect("Failed to read zkey") -}); - -// static ARKZKEY: Lazy<(ProvingKey, ConstraintMatrices)> = Lazy::new(|| { -// //let mut reader = Cursor::new(ARKZKEY_BYTES); -// // TODO: Use reader? More flexible; unclear if perf diff -// read_arkzkey_from_bytes(ARKZKEY_BYTES).expect("Failed to read arkzkey") -// }); - -#[cfg(not(feature = "dylib"))] -const WASM: &[u8] = include_bytes!(env!("BUILD_RS_WASM_FILE")); - -/// `WITNESS_CALCULATOR` is a lazily initialized, thread-safe singleton of type `WitnessCalculator`. -/// `OnceCell` ensures that the initialization occurs exactly once, and `Mutex` allows safe shared -/// access from multiple threads. -static WITNESS_CALCULATOR: OnceCell> = OnceCell::new(); - -#[cfg(feature = "calc-native-witness")] -const GRAPH_BYTES: &[u8] = include_bytes!(env!("BUILD_RS_GRAPH_FILE")); -#[cfg(feature = "calc-native-witness")] -static WITNESS_GRAPH: Lazy = - Lazy::new(|| init_graph(&GRAPH_BYTES).expect("Failed to initialize Graph")); -#[cfg(feature = "calc-native-witness")] -fn calculate_witness_with_graph(inputs: CircuitInputs) -> Vec { - let inputs_u256: HashMap> = inputs - .into_iter() - .map(|(k, v)| { - ( - k, - v.into_iter() - .map(|x| U256::from_str(&x.to_string()).unwrap()) - .collect(), - ) - }) - .collect(); - - let witness = witness::calculate_witness(inputs_u256, &WITNESS_GRAPH).unwrap(); - let full_assignment = witness - .into_iter() - .map(|x| Fr::from_str(&x.to_string()).unwrap()) - .collect::>(); - full_assignment -} - -/// Initializes the `WITNESS_CALCULATOR` singleton with a `WitnessCalculator` instance created from -/// a specified dylib file (WASM circuit). Also initialize `ZKEY`. -#[cfg(feature = "dylib")] -pub fn initialize(dylib_path: &Path) { - println!("Initializing dylib: {:?}", dylib_path); - - WITNESS_CALCULATOR - .set(from_dylib(dylib_path)) - .expect("Failed to set WITNESS_CALCULATOR"); - - // Initialize ZKEY - let now = std::time::Instant::now(); - Lazy::force(&ZKEY); - // Lazy::force(&ARKZKEY); - println!("Initializing zkey took: {:.2?}", now.elapsed()); -} - -#[cfg(not(feature = "dylib"))] -pub fn initialize() { - println!("Initializing library with zkey"); - - // Initialize ZKEY - let now = std::time::Instant::now(); - Lazy::force(&ZKEY); - // Lazy::force(&ARKZKEY); - println!("Initializing zkey took: {:.2?}", now.elapsed()); -} - -/// Creates a `WitnessCalculator` instance from a dylib file. -#[cfg(feature = "dylib")] -fn from_dylib(path: &Path) -> Mutex { - let store = Store::new(&Dylib::headless().engine()); - let module = unsafe { - Module::deserialize_from_file(&store, path).expect("Failed to load dylib module") - }; - let result = - WitnessCalculator::from_module(module).expect("Failed to create WitnessCalculator"); - - Mutex::new(result) -} - -#[must_use] -pub fn zkey() -> &'static (ProvingKey, ConstraintMatrices) { - &ZKEY -} - -// Experimental -// #[must_use] -// pub fn arkzkey() -> &'static (ProvingKey, ConstraintMatrices) { -// &ARKZKEY -// } - -/// Provides access to the `WITNESS_CALCULATOR` singleton, initializing it if necessary. -/// It expects the path to the dylib file to be set in the `CIRCUIT_WASM_DYLIB` environment variable. -#[cfg(feature = "dylib")] -#[must_use] -pub fn witness_calculator() -> &'static Mutex { - let var_name = "CIRCUIT_WASM_DYLIB"; - - WITNESS_CALCULATOR.get_or_init(|| { - let path = env::var(var_name).unwrap_or_else(|_| { - panic!( - "Mopro circuit WASM Dylib not initialized. \ - Please set {} environment variable to the path of the dylib file", - var_name - ) - }); - from_dylib(Path::new(&path)) - }) -} - -#[cfg(not(feature = "dylib"))] -#[must_use] -pub fn witness_calculator() -> &'static Mutex { - WITNESS_CALCULATOR.get_or_init(|| { - let store = Store::default(); - let module = Module::from_binary(&store, WASM).expect("WASM should be valid"); - let result = - WitnessCalculator::from_module(module).expect("Failed to create WitnessCalculator"); - Mutex::new(result) - }) -} - -pub fn generate_proof_static( - inputs: CircuitInputs, -) -> Result<(SerializableProof, SerializableInputs), MoproError> { - let mut rng = thread_rng(); - let rng = &mut rng; - - let r = ark_bn254::Fr::rand(rng); - let s = ark_bn254::Fr::rand(rng); - - println!("Generating proof Static"); - - let now = std::time::Instant::now(); - #[cfg(not(feature = "calc-native-witness"))] - let full_assignment = witness_calculator() - .lock() - .expect("Failed to lock witness calculator") - .calculate_witness_element::(inputs, false) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - #[cfg(feature = "calc-native-witness")] - let full_assignment = calculate_witness_with_graph(inputs); - - println!("Witness generation took: {:.2?}", now.elapsed()); - - let now = std::time::Instant::now(); - let zkey = zkey(); - // let zkey = arkzkey(); - println!("Loading zkey took: {:.2?}", now.elapsed()); - - let public_inputs = full_assignment.as_slice()[1..zkey.1.num_instance_variables].to_vec(); - - let now = std::time::Instant::now(); - let ark_proof = Groth16::<_, CircomReduction>::create_proof_with_reduction_and_matrices( - &zkey.0, - r, - s, - &zkey.1, - zkey.1.num_instance_variables, - zkey.1.num_constraints, - full_assignment.as_slice(), - ); - - let proof = ark_proof.map_err(|e| MoproError::CircomError(e.to_string()))?; - - println!("proof generation took: {:.2?}", now.elapsed()); - - // TODO: Add SerializableInputs(inputs))) - Ok((SerializableProof(proof), SerializableInputs(public_inputs))) -} - -pub fn verify_proof_static( - serialized_proof: SerializableProof, - serialized_inputs: SerializableInputs, -) -> Result { - let start = Instant::now(); - let zkey = zkey(); - // let zkey = arkzkey(); - let pvk = prepare_verifying_key(&zkey.0.vk); - - let proof_verified = - GrothBn::verify_with_processed_vk(&pvk, &serialized_inputs.0, &serialized_proof.0) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - - let verification_duration = start.elapsed(); - println!("Verification time static: {:?}", verification_duration); - Ok(proof_verified) -} - -impl CircomState { - pub fn new() -> Self { - Self { - zkey: None, - // arkzkey: None, - wtns: None, - } - } - - pub fn initialize(&mut self, zkey_path: &str, wasm_path: &str) -> Result<(), MoproError> { - let mut file = File::open(zkey_path).map_err(|e| MoproError::CircomError(e.to_string()))?; - let zkey = read_zkey(&mut file).map_err(|e| MoproError::CircomError(e.to_string()))?; - - // read_arkzkey(arkzkey_path).map_err(|e| MoproError::CircomError(e.to_string()))?; - self.zkey = Some(zkey); - - let wtns = WitnessCalculator::new(wasm_path) - .map_err(|e| MoproError::CircomError(e.to_string())) - .unwrap(); - self.wtns = Some(wtns); - - Ok(()) - } - - pub fn generate_proof( - &mut self, - inputs: CircuitInputs, - ) -> Result<(SerializableProof, SerializableInputs), MoproError> { - let mut rng = thread_rng(); - let rng = &mut rng; - - let r = ark_bn254::Fr::rand(rng); - let s = ark_bn254::Fr::rand(rng); - - println!("Generating proof"); - - let now = std::time::Instant::now(); - let full_assignment = self - .wtns - .clone() - .unwrap() - .calculate_witness_element::(inputs, false) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - - println!("Witness generation took: {:.2?}", now.elapsed()); - - let now = std::time::Instant::now(); - let zkey = self.zkey.as_ref().ok_or(MoproError::CircomError( - "Zkey has not been set up".to_string(), - ))?; - println!("Loading zkey took: {:.2?}", now.elapsed()); - - let public_inputs = full_assignment.as_slice()[1..zkey.1.num_instance_variables].to_vec(); - - let now = std::time::Instant::now(); - let ark_proof = Groth16::<_, CircomReduction>::create_proof_with_reduction_and_matrices( - &zkey.0, - r, - s, - &zkey.1, - zkey.1.num_instance_variables, - zkey.1.num_constraints, - full_assignment.as_slice(), - ); - - let proof = ark_proof.map_err(|e| MoproError::CircomError(e.to_string()))?; - - println!("proof generation took: {:.2?}", now.elapsed()); - Ok((SerializableProof(proof), SerializableInputs(public_inputs))) - } - - pub fn verify_proof( - &self, - serialized_proof: SerializableProof, - serialized_inputs: SerializableInputs, - ) -> Result { - let start = Instant::now(); - let zkey = self.zkey.as_ref().ok_or(MoproError::CircomError( - "Zkey has not been set up".to_string(), - ))?; - let pvk = prepare_verifying_key(&zkey.0.vk); - - let proof_verified = - GrothBn::verify_with_processed_vk(&pvk, &serialized_inputs.0, &serialized_proof.0) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - - let verification_duration = start.elapsed(); - println!("Verification time: {:?}", verification_duration); - Ok(proof_verified) - } -} - -// Helper function for Keccak256 example -pub fn bytes_to_circuit_inputs(bytes: &[u8]) -> CircuitInputs { - let bits = bytes_to_bits(bytes); - let big_int_bits = bits - .into_iter() - .map(|bit| BigInt::from(bit as u8)) - .collect(); - let mut inputs = HashMap::new(); - inputs.insert("in".to_string(), big_int_bits); - inputs -} - -pub fn strings_to_circuit_inputs(strings: Vec) -> Vec { - strings - .into_iter() - .map(|value| BigInt::parse_bytes(value.as_bytes(), 10).unwrap()) - .collect() -} - -pub fn bytes_to_circuit_outputs(bytes: &[u8]) -> SerializableInputs { - let bits = bytes_to_bits(bytes); - let field_bits = bits.into_iter().map(|bit| Fr::from(bit as u8)).collect(); - SerializableInputs(field_bits) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_setup_prove_verify_simple() { - let wasm_path = "./examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm"; - let zkey_path = "./examples/circom/multiplier2/target/multiplier2_final.zkey"; - // Instantiate CircomState - let mut circom_state = CircomState::new(); - - // Setup - let setup_res = circom_state.initialize(zkey_path, wasm_path); - assert!(setup_res.is_ok()); - - let _serialized_pk = setup_res.unwrap(); - - // Prepare inputs - let mut inputs = HashMap::new(); - let a = 3; - let b = 5; - let c = a * b; - inputs.insert("a".to_string(), vec![BigInt::from(a)]); - inputs.insert("b".to_string(), vec![BigInt::from(b)]); - // output = [public output c, public input a] - let expected_output = vec![Fr::from(c), Fr::from(a)]; - let serialized_outputs = SerializableInputs(expected_output); - - // Proof generation - let generate_proof_res = circom_state.generate_proof(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Check output - assert_eq!(serialized_inputs, serialized_outputs); - - // Proof verification - let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[test] - fn test_setup_prove_verify_keccak() { - let wasm_path = - "./examples/circom/keccak256/target/keccak256_256_test_js/keccak256_256_test.wasm"; - let zkey_path = "./examples/circom/keccak256/target/keccak256_256_test_final.zkey"; - // Instantiate CircomState - let mut circom_state = CircomState::new(); - - // Setup - let setup_res = circom_state.initialize(zkey_path, wasm_path); - assert!(setup_res.is_ok()); - - let _serialized_pk = setup_res.unwrap(); - - // Prepare inputs - let input_vec = vec![ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ]; - - // Expected output - let expected_output_vec = vec![ - 37, 17, 98, 135, 161, 178, 88, 97, 125, 150, 143, 65, 228, 211, 170, 133, 153, 9, 88, - 212, 4, 212, 175, 238, 249, 210, 214, 116, 170, 85, 45, 21, - ]; - - let inputs = bytes_to_circuit_inputs(&input_vec); - let serialized_outputs = bytes_to_circuit_outputs(&expected_output_vec); - - // Proof generation - let generate_proof_res = circom_state.generate_proof(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Check output - assert_eq!(serialized_inputs, serialized_outputs); - - // Proof verification - let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[test] - fn test_setup_error() { - // Arrange: Create a new CircomState instance - let mut circom_state = CircomState::new(); - - let wasm_path = "badpath/multiplier2.wasm"; - let zkey_path = "badpath/multiplier2.zkey"; - - // Act: Call the setup method - let result = circom_state.initialize(zkey_path, wasm_path); - - // Assert: Check that the method returns an error - assert!(result.is_err()); - } - - #[cfg(feature = "dylib")] - #[test] - fn test_dylib_init_and_generate_witness() { - // Assumes that the dylib file has been built and is in the following location - let dylib_path = "target/debug/aarch64-apple-darwin/keccak256.dylib"; - - // Initialize libray - initialize(Path::new(&dylib_path)); - - let input_vec = vec![ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ]; - - let inputs = bytes_to_circuit_inputs(&input_vec); - let now = std::time::Instant::now(); - let full_assignment = witness_calculator() - .lock() - .expect("Failed to lock witness calculator") - .calculate_witness_element::(inputs, false) - .map_err(|e| MoproError::CircomError(e.to_string())); - - println!("Witness generation took: {:.2?}", now.elapsed()); - - assert!(full_assignment.is_ok()); - } - - #[test] - fn test_generate_proof_static() { - // XXX: This can be done better - #[cfg(feature = "dylib")] - { - // Assumes that the dylib file has been built and is in the following location - let dylib_path = "target/debug/aarch64-apple-darwin/keccak256.dylib"; - - // Initialize libray - initialize(Path::new(&dylib_path)); - } - - let input_vec = vec![ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ]; - let expected_output_vec = vec![ - 37, 17, 98, 135, 161, 178, 88, 97, 125, 150, 143, 65, 228, 211, 170, 133, 153, 9, 88, - 212, 4, 212, 175, 238, 249, 210, 214, 116, 170, 85, 45, 21, - ]; - let inputs = bytes_to_circuit_inputs(&input_vec); - let serialized_outputs = bytes_to_circuit_outputs(&expected_output_vec); - - let generate_proof_res = generate_proof_static(inputs); - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - assert_eq!(serialized_inputs, serialized_outputs); - - // Proof verification - let verify_res = verify_proof_static(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[ignore = "ignore for ci"] - #[test] - fn test_setup_prove_rsa() { - let wasm_path = "./examples/circom/rsa/target/main_js/main.wasm"; - let zkey_path = "./examples/circom/rsa/target/main_final.zkey"; - - // Instantiate CircomState - let mut circom_state = CircomState::new(); - - // Setup - let setup_res = circom_state.initialize(zkey_path, wasm_path); - assert!(setup_res.is_ok()); - - let _serialized_pk = setup_res.unwrap(); - - // Prepare inputs - #[derive(serde::Deserialize)] - struct InputData { - signature: Vec, - modulus: Vec, - base_message: Vec, - } - - let file_data = std::fs::read_to_string("./examples/circom/rsa/input.json") - .expect("Unable to read file"); - let data: InputData = - serde_json::from_str(&file_data).expect("JSON was not well-formatted"); - - let mut inputs: HashMap> = HashMap::new(); - inputs.insert( - "signature".to_string(), - strings_to_circuit_inputs(data.signature), - ); - inputs.insert( - "modulus".to_string(), - strings_to_circuit_inputs(data.modulus), - ); - inputs.insert( - "base_message".to_string(), - strings_to_circuit_inputs(data.base_message), - ); - - // Proof generation - let generate_proof_res = circom_state.generate_proof(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Proof verification - let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[ignore = "ignore for ci"] - #[test] - fn test_setup_prove_rsa2() { - // Prepare inputs - #[derive(serde::Deserialize)] - struct InputData { - signature: Vec, - modulus: Vec, - base_message: Vec, - } - - let file_data = std::fs::read_to_string("./examples/circom/rsa/input.json") - .expect("Unable to read file"); - let data: InputData = - serde_json::from_str(&file_data).expect("JSON was not well-formatted"); - - let mut inputs: HashMap> = HashMap::new(); - inputs.insert( - "signature".to_string(), - strings_to_circuit_inputs(data.signature), - ); - inputs.insert( - "modulus".to_string(), - strings_to_circuit_inputs(data.modulus), - ); - inputs.insert( - "base_message".to_string(), - strings_to_circuit_inputs(data.base_message), - ); - - // Proof generation - let generate_proof_res = generate_proof_static(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Proof verification - let verify_res = verify_proof_static(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[ignore = "ignore for ci"] - #[test] - fn test_setup_prove_anon_aadhaar() { - let wasm_path = - "./examples/circom/anonAadhaar/target/aadhaar-verifier_js/aadhaar-verifier.wasm"; - let zkey_path = "./examples/circom/anonAadhaar/target/aadhaar-verifier_final.zkey"; - - // Instantiate CircomState - let mut circom_state = CircomState::new(); - - // Setup - let setup_res = circom_state.initialize(zkey_path, wasm_path); - assert!(setup_res.is_ok()); - - let _serialized_pk = setup_res.unwrap(); - - // Prepare inputs - #[derive(serde::Deserialize)] - struct InputData { - qr_data_padded: Vec, - delimiter_indices: Vec, - signature: Vec, - pub_key: Vec, - } - - let file_data = std::fs::read_to_string("./examples/circom/anonAadhaar/input.json") - .expect("Unable to read file"); - let data: InputData = - serde_json::from_str(&file_data).expect("JSON was not well-formatted"); - - let mut inputs: CircuitInputs = HashMap::new(); - inputs.insert( - "qrDataPadded".to_string(), - strings_to_circuit_inputs(data.qr_data_padded), - ); - inputs.insert("qrDataPaddedLength".to_string(), vec![BigInt::from(1152)]); - inputs.insert("nonPaddedDataLength".to_string(), vec![BigInt::from(1137)]); - inputs.insert( - "delimiterIndices".to_string(), - strings_to_circuit_inputs(data.delimiter_indices), - ); - inputs.insert( - "signature".to_string(), - strings_to_circuit_inputs(data.signature), - ); - inputs.insert( - "pubKey".to_string(), - strings_to_circuit_inputs(data.pub_key), - ); - inputs.insert("nullifierSeed".to_string(), vec![BigInt::from(12345678)]); - inputs.insert("signalHash".to_string(), vec![BigInt::from(1)]); - inputs.insert("revealGender".to_string(), vec![BigInt::from(0)]); - inputs.insert("revealAgeAbove18".to_string(), vec![BigInt::from(0)]); - inputs.insert("revealState".to_string(), vec![BigInt::from(0)]); - inputs.insert("revealPinCode".to_string(), vec![BigInt::from(0)]); - // Proof generation - let generate_proof_res = circom_state.generate_proof(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Proof verification - let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } - - #[ignore = "ignore for ci"] - #[test] - fn test_setup_prove_anon_aadhaar2() { - // Prepare inputs - #[derive(serde::Deserialize)] - struct InputData { - aadhaar_data: Vec, - signature: Vec, - pub_key: Vec, - } - - let file_data = std::fs::read_to_string("./examples/circom/anonAadhaar/input.json") - .expect("Unable to read file"); - let data: InputData = - serde_json::from_str(&file_data).expect("JSON was not well-formatted"); - - let mut inputs: CircuitInputs = HashMap::new(); - inputs.insert( - "aadhaarData".to_string(), - strings_to_circuit_inputs(data.aadhaar_data), - ); - inputs.insert("aadhaarDataLength".to_string(), vec![BigInt::from(64)]); - inputs.insert( - "signature".to_string(), - strings_to_circuit_inputs(data.signature), - ); - inputs.insert( - "pubKey".to_string(), - strings_to_circuit_inputs(data.pub_key), - ); - inputs.insert("signalHash".to_string(), vec![BigInt::from(1)]); - - // Proof generation - let generate_proof_res = generate_proof_static(inputs); - - // Check and print the error if there is one - if let Err(e) = &generate_proof_res { - println!("Error: {:?}", e); - } - - assert!(generate_proof_res.is_ok()); - - let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); - - // Proof verification - let verify_res = verify_proof_static(serialized_proof, serialized_inputs); - assert!(verify_res.is_ok()); - - assert!(verify_res.unwrap()); // Verifying that the proof was indeed verified - } -} diff --git a/mopro-core/src/middleware/circom/serialization.rs b/mopro-core/src/middleware/circom/serialization.rs deleted file mode 100644 index 1378c4e..0000000 --- a/mopro-core/src/middleware/circom/serialization.rs +++ /dev/null @@ -1,116 +0,0 @@ -use ark_bn254::Bn254; -use ark_circom::ethereum; -use ark_ec::pairing::Pairing; -use ark_groth16::{Proof, ProvingKey}; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; -use color_eyre::Result; - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug)] -pub struct SerializableProvingKey(pub ProvingKey); - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug)] -pub struct SerializableProof(pub Proof); - -#[derive(CanonicalSerialize, CanonicalDeserialize, Clone, Debug, PartialEq)] -pub struct SerializableInputs(pub Vec<::ScalarField>); - -pub fn serialize_proof(proof: &SerializableProof) -> Vec { - let mut serialized_data = Vec::new(); - proof - .serialize_uncompressed(&mut serialized_data) - .expect("Serialization failed"); - serialized_data -} - -pub fn deserialize_proof(data: Vec) -> SerializableProof { - SerializableProof::deserialize_uncompressed(&mut &data[..]).expect("Deserialization failed") -} - -pub fn serialize_proving_key(pk: &SerializableProvingKey) -> Vec { - let mut serialized_data = Vec::new(); - pk.serialize_uncompressed(&mut serialized_data) - .expect("Serialization failed"); - serialized_data -} - -pub fn deserialize_proving_key(data: Vec) -> SerializableProvingKey { - SerializableProvingKey::deserialize_uncompressed(&mut &data[..]) - .expect("Deserialization failed") -} - -pub fn serialize_inputs(inputs: &SerializableInputs) -> Vec { - let mut serialized_data = Vec::new(); - inputs - .serialize_uncompressed(&mut serialized_data) - .expect("Serialization failed"); - serialized_data -} - -pub fn deserialize_inputs(data: Vec) -> SerializableInputs { - SerializableInputs::deserialize_uncompressed(&mut &data[..]).expect("Deserialization failed") -} - -// Convert proof to U256-tuples as expected by the Solidity Groth16 Verifier -pub fn to_ethereum_proof(proof: &SerializableProof) -> ethereum::Proof { - ethereum::Proof::from(proof.0.clone()) -} - -pub fn to_ethereum_inputs(inputs: &SerializableInputs) -> ethereum::Inputs { - ethereum::Inputs::from(&inputs.0[..]) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::middleware::circom::serialization::SerializableProvingKey; - use crate::middleware::circom::utils::assert_paths_exists; - use crate::MoproError; - use ark_bn254::Bn254; - use ark_circom::{CircomBuilder, CircomConfig}; - use ark_groth16::Groth16; - use ark_std::rand::thread_rng; - use color_eyre::Result; - - type GrothBn = Groth16; - - fn generate_serializable_proving_key( - wasm_path: &str, - r1cs_path: &str, - ) -> Result { - assert_paths_exists(wasm_path, r1cs_path)?; - - let cfg = CircomConfig::::new(wasm_path, r1cs_path) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - - let builder = CircomBuilder::new(cfg); - let circom = builder.setup(); - - let mut rng = thread_rng(); - let raw_params = GrothBn::generate_random_parameters_with_reduction(circom, &mut rng) - .map_err(|e| MoproError::CircomError(e.to_string()))?; - - Ok(SerializableProvingKey(raw_params)) - } - - #[test] - fn test_serialization_deserialization() { - let wasm_path = "./examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm"; - let r1cs_path = "./examples/circom/multiplier2/target/multiplier2.r1cs"; - - // Generate a serializable proving key for testing - let serializable_pk = generate_serializable_proving_key(wasm_path, r1cs_path) - .expect("Failed to generate serializable proving key"); - - // Serialize - let serialized_data = serialize_proving_key(&serializable_pk); - - // Deserialize - let deserialized_pk = deserialize_proving_key(serialized_data); - - // Assert that the original and deserialized ProvingKeys are the same - assert_eq!( - serializable_pk.0, deserialized_pk.0, - "Original and deserialized proving keys do not match" - ); - } -} diff --git a/mopro-core/src/middleware/circom/utils.rs b/mopro-core/src/middleware/circom/utils.rs deleted file mode 100644 index 31d6122..0000000 --- a/mopro-core/src/middleware/circom/utils.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::MoproError; - -use std::path::Path; - -pub fn assert_paths_exists(wasm_path: &str, r1cs_path: &str) -> Result<(), MoproError> { - // Check that the files exist - ark-circom should probably do this instead and not panic - if !Path::new(wasm_path).exists() { - return Err(MoproError::CircomError(format!( - "Path does not exist: {}", - wasm_path - ))); - } - - if !Path::new(r1cs_path).exists() { - return Err(MoproError::CircomError(format!( - "Path does not exist: {}", - r1cs_path - ))); - }; - - Ok(()) -} - -pub fn bytes_to_bits(bytes: &[u8]) -> Vec { - let mut bits = Vec::new(); - for &byte in bytes { - for j in 0..8 { - let bit = (byte >> j) & 1; - bits.push(bit == 1); - } - } - bits -} diff --git a/mopro-core/src/middleware/halo2/mod.rs b/mopro-core/src/middleware/halo2/mod.rs deleted file mode 100644 index e772012..0000000 --- a/mopro-core/src/middleware/halo2/mod.rs +++ /dev/null @@ -1,119 +0,0 @@ -use std::collections::HashMap; -use std::io::Cursor; -use std::time::Instant; - -pub(crate) use halo2_proofs::halo2curves::bn256::{Bn256, Fr as Fp, G1Affine}; -use halo2_proofs::plonk::{ProvingKey, VerifyingKey}; -use halo2_proofs::poly::commitment::Params; -use halo2_proofs::poly::kzg::commitment::ParamsKZG; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; - -use halo2_circuit::{prove, verify}; -pub use serialisation::deserialize_circuit_inputs; - -use crate::MoproError; - -mod serialisation; - -type CircuitInputs = HashMap>; - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct SerializableProof(pub Vec); - -#[derive(Clone, Debug)] -pub struct SerializablePublicInputs(pub Vec); - -/// Read SRS from file -const SRS_BYTES: &[u8] = include_bytes!(env!("BUILD_SRS_FILE")); - -static SRS: Lazy> = Lazy::new(|| { - let mut reader = Cursor::new(SRS_BYTES); - ParamsKZG::read(&mut reader).expect("Unable to read SRS from file") -}); - -/// Read Proving Key (PK) from file - -const PK_BYTES: &[u8] = include_bytes!(env!("BUILD_PK_FILE")); - -static PK: Lazy> = Lazy::new(|| { - let mut reader = Cursor::new(PK_BYTES); - halo2_circuit::read_pk(&mut reader).expect("Unable to read PK from file") -}); - -/// Read Verification Key (VK) from file - -const VK_BYTES: &[u8] = include_bytes!(env!("BUILD_VK_FILE")); - -static VK: Lazy> = Lazy::new(|| { - let mut reader = Cursor::new(VK_BYTES); - halo2_circuit::read_vk(&mut reader).expect("Unable to read VK from file") -}); - -pub fn generate_halo2_proof( - inputs: CircuitInputs, -) -> color_eyre::Result<(SerializableProof, SerializablePublicInputs), MoproError> { - let start = Instant::now(); - - let (public_input, proof) = - prove(inputs, &SRS, &PK).map_err(|e| MoproError::Halo2Error(e.to_string()))?; - - let proving_duration = start.elapsed(); - println!("Proving time 2: {:?}", proving_duration); - - Ok(( - SerializableProof(proof), - SerializablePublicInputs(public_input), - )) -} - -pub fn verify_halo2_proof( - serialized_proof: SerializableProof, - serialized_inputs: SerializablePublicInputs, -) -> color_eyre::Result { - let start = Instant::now(); - - let proof = serialized_proof.0; - let inputs = serialized_inputs.0; - - let proof_verified = verify(proof, &inputs, &SRS, &VK) - .map_err(|_| MoproError::Halo2Error("Failed to verify the proof".to_string()))?; - - let verification_duration = start.elapsed(); - println!("Verification time 2: {:?}", verification_duration); - Ok(proof_verified) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_generate_halo2_proof() { - let mut input = HashMap::new(); - input.insert("out".to_string(), vec![Fp::from(55)]); - - let (_, inputs) = generate_halo2_proof(input).unwrap(); - assert_eq!(inputs.0[2], Fp::from(55)); - } - - #[test] - fn test_verify_halo2_proof() { - let mut input = HashMap::new(); - input.insert("out".to_string(), vec![Fp::from(55)]); - - let (proof, inputs) = generate_halo2_proof(input).unwrap(); - let verified = verify_halo2_proof(proof, inputs).unwrap(); - assert!(verified); - } - - #[test] - fn test_bad_proof_not_verified() { - let mut input = HashMap::new(); - input.insert("out".to_string(), vec![Fp::from(56)]); - - let (proof, inputs) = generate_halo2_proof(input).unwrap(); - let verified = verify_halo2_proof(proof, inputs).unwrap(); - assert!(!verified); - } -} diff --git a/mopro-core/src/middleware/halo2/serialisation.rs b/mopro-core/src/middleware/halo2/serialisation.rs deleted file mode 100644 index 62a7f03..0000000 --- a/mopro-core/src/middleware/halo2/serialisation.rs +++ /dev/null @@ -1,106 +0,0 @@ -use std::collections::HashMap; -use std::fmt; -use std::str::FromStr; - -use halo2_proofs::halo2curves::ff::PrimeField; -use serde::de::{SeqAccess, Visitor}; -use serde::ser::SerializeSeq; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; - -use crate::middleware::halo2::{Fp, SerializablePublicInputs}; - -pub fn deserialize_circuit_inputs( - ser_inputs: HashMap>, -) -> HashMap> { - ser_inputs - .iter() - .map(|(k, v)| { - let fp_vec: Vec = v - .iter() - .map(|s| { - // TODO - support big integers full range, not just u128 - let int = u128::from_str(s).unwrap(); - Fp::from_u128(int) - }) - .collect(); - (k.clone(), fp_vec) - }) - .collect() -} - -impl Serialize for SerializablePublicInputs { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut seq = serializer.serialize_seq(Some(self.0.len()))?; - for fp in &self.0 { - seq.serialize_element(&fp.to_bytes())?; - } - seq.end() - } -} - -impl<'de> Deserialize<'de> for SerializablePublicInputs { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct SerializableInputsVisitor; - - impl<'de> Visitor<'de> for SerializableInputsVisitor { - type Value = SerializablePublicInputs; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence of byte arrays of length 32") - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - let mut vec = Vec::new(); - while let Some(bytes) = seq.next_element::<[u8; 32]>()? { - vec.push(Fp::from_bytes(&bytes).unwrap()); - } - Ok(SerializablePublicInputs(vec)) - } - } - - deserializer.deserialize_seq(SerializableInputsVisitor) - } -} - -// Tests for serialization and deserialization -#[cfg(test)] -mod tests { - use super::*; - use serde_json; - - #[test] - fn test_serialization() { - let fp1 = Fp::from(1); - let fp2 = Fp::from(2); - let inputs = SerializablePublicInputs(vec![fp1, fp2]); - - let serialized = serde_json::to_string(&inputs).unwrap(); - println!("Serialized: {}", serialized); - - let deserialized: SerializablePublicInputs = serde_json::from_str(&serialized).unwrap(); - assert_eq!(inputs.0.len(), deserialized.0.len()); - for (original, deserialized_fp) in inputs.0.iter().zip(deserialized.0.iter()) { - assert_eq!(original.to_bytes(), deserialized_fp.to_bytes()); - } - } - - #[test] - fn test_circuit_inputs_deserialization() { - let mut serialized = HashMap::new(); - serialized.insert("out".to_string(), vec!["1".to_string(), "2".to_string()]); - let deserialized = deserialize_circuit_inputs(serialized); - assert_eq!(deserialized.len(), 1); - assert_eq!(deserialized.get("out").unwrap().len(), 2); - assert_eq!(deserialized.get("out").unwrap()[0], Fp::from(1)); - assert_eq!(deserialized.get("out").unwrap()[1], Fp::from(2)); - } -} diff --git a/mopro-core/src/middleware/mod.rs b/mopro-core/src/middleware/mod.rs deleted file mode 100644 index a6000ca..0000000 --- a/mopro-core/src/middleware/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -#[cfg(feature = "circom")] -pub mod circom; - -#[cfg(feature = "gpu-benchmarks")] -pub mod gpu_explorations; - -#[cfg(feature = "halo2")] -pub mod halo2; diff --git a/mopro-ffi/.gitignore b/mopro-ffi/.gitignore deleted file mode 100644 index 8648243..0000000 --- a/mopro-ffi/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - -# kotlin generated file -jniLibs/ -src/uniffi/mopro/ \ No newline at end of file diff --git a/mopro-ffi/Cargo.toml b/mopro-ffi/Cargo.toml deleted file mode 100644 index f3f3eae..0000000 --- a/mopro-ffi/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -name = "mopro-ffi" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = ["lib", "cdylib", "staticlib"] -name = "mopro_ffi" - -[[bin]] -name = "uniffi-bindgen" -path = "uniffi-bindgen.rs" - -[features] -default = ["circom"] -# default = ["gpu-benchmarks"] -# default = ["calc-native-witness"] - -# If we enable them here, they should be enabled in mopro-core as well -halo2 = ["mopro-core/halo2"] -circom = ["mopro-core/default"] -dylib = ["mopro-core/dylib", "circom"] -gpu-benchmarks = ["mopro-core/gpu-benchmarks", "circom"] -calc-native-witness = ["mopro-core/calc-native-witness", "circom"] - -[dependencies] -mopro-core = { path = "../mopro-core", default-features = false } -uniffi = { version = "0.25", features = ["cli"] } -serde = { version = "1", features = ["derive"] } -bincode = "1" -ark-serialize = { version = "=0.4.1", features = ["derive"] } -num-bigint = { version = "=0.4.3", default-features = false, features = [ - "rand", -] } - -# Error handling -thiserror = "=1.0.39" -color-eyre = "=0.6.2" -criterion = "=0.3.6" - -[build-dependencies] -uniffi = { version = "0.25", features = ["build"] } - -[dev-dependencies] -uniffi = { version = "0.25", features = ["bindgen-tests"] } -# Circom test dependency -ark-bn254 = { version = "=0.4.0" } -# Halo2 test dependency -halo2curves = { git = "https://github.com/privacy-scaling-explorations/halo2curves", tag = "0.3.2" } diff --git a/mopro-ffi/Makefile b/mopro-ffi/Makefile deleted file mode 100644 index 072c25b..0000000 --- a/mopro-ffi/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -TARGETS = x86_64-apple-ios aarch64-apple-ios aarch64-apple-ios-sim -BUILD_TYPES = debug release - -all: $(BUILD_TYPES) - -debug: $(TARGETS) - for target in $(TARGETS); do \ - cargo build --target $$target; \ - done - -release: - for target in $(TARGETS); do \ - cargo build --release --target $$target; \ - done - -.PHONY: all $(BUILD_TYPES) $(TARGETS) \ No newline at end of file diff --git a/mopro-ffi/README.md b/mopro-ffi/README.md deleted file mode 100644 index f1c9e51..0000000 --- a/mopro-ffi/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# mopro-ffi - -Thin wrapper around `mopro-core`, exposes UniFFI bindings to be used by `rust-ios`, etc. - -## Overview - -TBD. - -## Development - -### Prerequisites - -1. Ensure you have Rust installed -2. Add platform targets `rustup target add x86_64-apple-ios aarch64-apple-ios aarch64-apple-ios-sim` -3. Install `uniffi-bindgen` locally with `cargo install --bin uniffi-bindgen --path .` -4. In order to locally run the bindings tests, you will need - * Kotlin: - * `kotlinc`, the [Kotlin command-line compiler](https://kotlinlang.org/docs/command-line.html). - * `ktlint`, the [Kotlin linter used to format the generated bindings](https://ktlint.github.io/). - * The [Java Native Access](https://github.com/java-native-access/jna#download) JAR downloaded and its path - added to your `$CLASSPATH` environment variable. - * Swift: - * `swift` and `swiftc`, the [Swift command-line tools](https://swift.org/download/). - * The Swift `Foundation` package. - -### Platforms supported - -Currently iOS is the main target, but Android will soon follow. PRs welcome. - -### Building - -Run `make` to build debug and release static libraries for supported platforms. - -### Generate UniFFI bindings - -The following command generates Swift bindings: - -`uniffi-bindgen generate src/mopro.udl --language swift --out-dir target/SwiftBindings` - -## Test bindings - -To test bindings: - -`cargo test --test test_generated_bindings` - -To test bindings in release mode without warning: - -`cargo test --test test_generated_bindings --release 2>/dev/null` - -## Generate MSM benchmark report in swift on laptop - -1. Comment `default=[]` and uncomment `default=["gpu-benchmarks"]` to enable `gpu-benchmarks` feature flag -2. run `RUSTFLAGS="-C opt-level=3" cargo test --test test_generated_bindings --release` -3. The benchmark result will be shown in the console log - -![msm benchmarks of time (rust vs. swift)](https://hackmd.io/_uploads/BkxRMMtca.png) - -The above report was conducted on an M1 Pro MacBook Pro. - -For more information, read this report we have completed, which compares the time performance of MSM running in rust and swift. - -## To use [circom-witness-rs](https://github.com/philsippl/circom-witness-rs) (Experimental) -1. Comment `default=[]` and uncomment `default = ["calc-native-witness"]` to enable `calc-native-witness` feature flag -2. Test with - ```sh - # Run all tests - cargo test --features calc-native-witness - # Run bindings tests - cargo test --test test_generated_bindings --features calc-native-witness - ``` \ No newline at end of file diff --git a/mopro-ffi/build.rs b/mopro-ffi/build.rs deleted file mode 100644 index ca4b249..0000000 --- a/mopro-ffi/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - uniffi::generate_scaffolding("src/mopro.udl").expect("Building the UDL file failed"); -} diff --git a/mopro-ffi/src/circom.rs b/mopro-ffi/src/circom.rs deleted file mode 100644 index 88c5058..0000000 --- a/mopro-ffi/src/circom.rs +++ /dev/null @@ -1,496 +0,0 @@ -#![allow(unused_variables)] - -use std::collections::HashMap; -#[cfg(feature = "dylib")] -use std::path::Path; - -#[cfg(feature = "circom")] -pub(crate) use common::*; -#[cfg(feature = "gpu-benchmarks")] -use mopro_core::middleware::gpu_explorations::{self, utils::benchmark::BenchmarkResult}; -use mopro_core::MoproError; -#[cfg(feature = "circom")] -use {mopro_core::middleware::circom, num_bigint::BigInt, std::str::FromStr, std::sync::RwLock}; - -use crate::GenerateProofResult; - -/// Module that contains all the shared adapter functionality implemented for the Circom adapter. -/// As the adapter is only used when the `circom` feature is enabled, -/// we make the compiler avoid the shared functions of module when the feature is not enabled. -#[cfg(feature = "circom")] -mod common { - use std::collections::HashMap; - use std::str::FromStr; - - use num_bigint::BigInt; - - use mopro_core::middleware::circom; - use mopro_core::MoproError; - - use crate::GenerateProofResult; - - #[cfg(not(feature = "dylib"))] - pub fn initialize_mopro() -> Result<(), MoproError> { - // TODO: Error handle / panic? - mopro_core::middleware::circom::initialize(); - Ok(()) - } - - #[cfg(feature = "dylib")] - pub fn initialize_mopro() -> Result<(), MoproError> { - println!("need to use dylib to init!"); - panic!("need to use dylib to init!"); - } - - #[cfg(feature = "dylib")] - pub fn initialize_mopro_dylib(dylib_path: String) -> Result<(), MoproError> { - // TODO: Error handle / panic? - let dylib_path = Path::new(dylib_path.as_str()); - circom::initialize(dylib_path); - Ok(()) - } - - #[cfg(not(feature = "dylib"))] - pub fn initialize_mopro_dylib(_dylib_path: String) -> Result<(), MoproError> { - println!("dylib feature not enabled!"); - panic!("dylib feature not enabled!"); - } - - pub fn generate_proof_static( - inputs: HashMap>, - ) -> Result { - // Convert inputs to BigInt - let bigint_inputs = inputs - .into_iter() - .map(|(k, v)| { - ( - k, - v.into_iter() - .map(|i| BigInt::from_str(&i).unwrap()) - .collect(), - ) - }) - .collect(); - - let (proof, inputs) = circom::generate_proof_static(bigint_inputs)?; - - let serialized_proof = circom::serialization::serialize_proof(&proof); - let serialized_inputs = circom::serialization::serialize_inputs(&inputs); - Ok(GenerateProofResult { - proof: serialized_proof, - inputs: serialized_inputs, - }) - } - - pub fn verify_proof_static(proof: Vec, public_input: Vec) -> Result { - let deserialized_proof = circom::serialization::deserialize_proof(proof); - let deserialized_public_input = circom::serialization::deserialize_inputs(public_input); - let is_valid = circom::verify_proof_static(deserialized_proof, deserialized_public_input)?; - Ok(is_valid) - } -} - -#[derive(Debug, Clone, Default)] -pub struct G1 { - pub x: String, - pub y: String, -} - -#[derive(Debug, Clone, Default)] -pub struct G2 { - pub x: Vec, - pub y: Vec, -} - -#[derive(Debug, Clone, Default)] -pub struct ProofCalldata { - pub a: G1, - pub b: G2, - pub c: G1, -} - -// NOTE: Need to hardcode the types here, otherwise UniFFI will complain if the gpu-benchmarks feature is not enabled -#[derive(Debug, Clone)] -#[cfg(not(feature = "gpu-benchmarks"))] -pub struct BenchmarkResult { - pub instance_size: u32, - pub num_instance: u32, - pub avg_processing_time: f64, -} - -pub struct MoproCircom { - #[cfg(feature = "circom")] - state: RwLock, -} -impl Default for MoproCircom { - fn default() -> Self { - Self::new() - } -} - -// TODO: Use FFIError::SerializationError instead -impl MoproCircom { - pub fn new() -> Self { - Self { - #[cfg(feature = "circom")] - state: RwLock::new(circom::CircomState::new()), - } - } - - #[cfg(feature = "circom")] - pub fn initialize(&self, zkey_path: String, wasm_path: String) -> Result<(), MoproError> { - let mut state_guard = self.state.write().unwrap(); - state_guard.initialize(zkey_path.as_str(), wasm_path.as_str())?; - Ok(()) - } - - #[cfg(not(feature = "circom"))] - pub fn initialize(&self, zkey_path: String, wasm_path: String) -> Result<(), MoproError> { - Err(MoproError::CircomError("Project is compiled for Halo2 proving system. This function is currently not supported in Halo2.".to_string())) - } - - // inputs: circom::serialization::serialize_inputs(&inputs), - - #[cfg(feature = "circom")] - pub fn generate_proof( - &self, - inputs: HashMap>, - ) -> Result { - let mut state_guard = self.state.write().unwrap(); - - // Convert inputs to BigInt - let bigint_inputs = inputs - .into_iter() - .map(|(k, v)| { - ( - k, - v.into_iter() - .map(|i| BigInt::from_str(&i).unwrap()) - .collect(), - ) - }) - .collect(); - - let (proof, inputs) = state_guard.generate_proof(bigint_inputs)?; - - Ok(GenerateProofResult { - proof: circom::serialization::serialize_proof(&proof), - inputs: circom::serialization::serialize_inputs(&inputs), - }) - } - - #[cfg(not(feature = "circom"))] - pub fn generate_proof( - &self, - inputs: HashMap>, - ) -> Result { - Err(MoproError::CircomError("Project is compiled for Halo2 proving system. This function is currently not supported in Halo2.".to_string())) - } - - #[cfg(feature = "circom")] - pub fn verify_proof(&self, proof: Vec, public_input: Vec) -> Result { - let state_guard = self.state.read().unwrap(); - let deserialized_proof = circom::serialization::deserialize_proof(proof); - let deserialized_public_input = circom::serialization::deserialize_inputs(public_input); - let is_valid = state_guard.verify_proof(deserialized_proof, deserialized_public_input)?; - Ok(is_valid) - } - - #[cfg(not(feature = "circom"))] - pub fn verify_proof(&self, proof: Vec, public_input: Vec) -> Result { - Err(MoproError::CircomError("Project is compiled for Halo2 proving system. This function is currently not supported in Halo2.".to_string())) - } -} - -// Convert proof to String-tuples as expected by the Solidity Groth16 Verifier -#[cfg(feature = "circom")] -pub fn to_ethereum_proof(proof: Vec) -> ProofCalldata { - let deserialized_proof = circom::serialization::deserialize_proof(proof); - let proof = circom::serialization::to_ethereum_proof(&deserialized_proof); - let a = G1 { - x: proof.a.x.to_string(), - y: proof.a.y.to_string(), - }; - let b = G2 { - x: proof.b.x.iter().map(|x| x.to_string()).collect(), - y: proof.b.y.iter().map(|x| x.to_string()).collect(), - }; - let c = G1 { - x: proof.c.x.to_string(), - y: proof.c.y.to_string(), - }; - ProofCalldata { a, b, c } -} - -#[cfg(not(feature = "circom"))] -pub fn to_ethereum_proof(proof: Vec) -> ProofCalldata { - panic!("Can not generate Ethereum Proof for non-circom circuits."); -} - -#[cfg(feature = "circom")] -pub fn to_ethereum_inputs(inputs: Vec) -> Vec { - let deserialized_inputs = circom::serialization::deserialize_inputs(inputs); - let inputs = deserialized_inputs - .0 - .iter() - .map(|x| x.to_string()) - .collect(); - inputs -} - -#[cfg(not(feature = "circom"))] -pub fn to_ethereum_inputs(inputs: Vec) -> Vec { - panic!("Can not generate Ethereum Inputs for non-circom circuits."); -} - -#[cfg(feature = "gpu-benchmarks")] -pub fn arkworks_pippenger( - instance_size: u32, - num_instance: u32, - utils_dir: &str, -) -> Result { - let benchmarks = gpu_explorations::arkworks_pippenger::run_benchmark( - instance_size, - num_instance, - &utils_dir, - ) - .unwrap(); - Ok(benchmarks) -} - -// #[cfg(feature = "gpu-benchmarks")] -// pub fn trapdoortech_zprize_msm( -// instance_size: u32, -// num_instance: u32, -// utils_dir: &str, -// ) -> Result { -// let benchmarks = gpu_explorations::trapdoortech_zprize_msm::run_benchmark( -// instance_size, -// num_instance, -// &utils_dir, -// ) -// .unwrap(); -// Ok(benchmarks) -// } - -#[cfg(feature = "gpu-benchmarks")] -pub fn metal_msm( - instance_size: u32, - num_instance: u32, - utils_dir: &str, -) -> Result { - let benchmarks = - gpu_explorations::metal::msm::run_benchmark(instance_size, num_instance, utils_dir) - .unwrap(); - Ok(benchmarks) -} - -#[cfg(not(feature = "gpu-benchmarks"))] -pub fn arkworks_pippenger( - instance_size: u32, - num_instance: u32, - utils_dir: &str, -) -> Result { - println!("gpu-benchmarks feature not enabled!"); - Ok(BenchmarkResult { - instance_size, - num_instance, - avg_processing_time: 0.0, - }) -} - -// #[cfg(not(feature = "gpu-benchmarks"))] -// pub fn trapdoortech_zprize_msm( -// instance_size: u32, -// num_instance: u32, -// utils_dir: &str, -// ) -> Result { -// println!("gpu-benchmarks feature not enabled!"); -// Ok(BenchmarkResult { -// instance_size, -// num_instance, -// avg_processing_time: 0.0, -// }) -// } - -pub fn metal_msm( - instance_size: u32, - num_instance: u32, - utils_dir: &str, -) -> Result { - println!("gpu-benchmarks feature not enabled!"); - Ok(BenchmarkResult { - instance_size, - num_instance, - avg_processing_time: 0.0, - }) -} - -#[cfg(test)] -#[cfg(feature = "circom")] -mod tests { - use std::collections::HashMap; - use std::str::FromStr; - - use ark_bn254::Fr; - use num_bigint::BigUint; - - use mopro_core::middleware::circom; - use mopro_core::MoproError; - - use crate::circom::{to_ethereum_inputs, to_ethereum_proof, MoproCircom}; - - fn bytes_to_circuit_inputs(input_vec: &Vec) -> HashMap> { - let bits = circom::utils::bytes_to_bits(&input_vec); - let converted_vec: Vec = bits - .into_iter() - .map(|bit| (bit as i32).to_string()) - .collect(); - let mut inputs = HashMap::new(); - inputs.insert("in".to_string(), converted_vec); - inputs - } - - fn bytes_to_circuit_outputs(bytes: &[u8]) -> Vec { - let bits = circom::utils::bytes_to_bits(bytes); - let field_bits = bits.into_iter().map(|bit| Fr::from(bit as u8)).collect(); - let circom_outputs = circom::serialization::SerializableInputs(field_bits); - circom::serialization::serialize_inputs(&circom_outputs) - } - - #[test] - fn test_end_to_end() -> Result<(), MoproError> { - // Paths to your wasm and zkey files - let wasm_path = - "./../mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm"; - let zkey_path = "./../mopro-core/examples/circom/multiplier2/target/multiplier2_final.zkey"; - - // Create a new MoproCircom instance - let mopro_circom = MoproCircom::new(); - - // Step 1: Initialize - let init_result = mopro_circom.initialize(zkey_path.to_string(), wasm_path.to_string()); - assert!(init_result.is_ok()); - - let mut inputs = HashMap::new(); - let a = BigUint::from_str( - "21888242871839275222246405745257275088548364400416034343698204186575808495616", - ) - .unwrap(); - let b = BigUint::from(1u8); - let c = a.clone() * b.clone(); - inputs.insert("a".to_string(), vec![a.to_string()]); - inputs.insert("b".to_string(), vec![b.to_string()]); - // output = [public output c, public input a] - let expected_output = vec![Fr::from(c), Fr::from(a)]; - let circom_outputs = circom::serialization::SerializableInputs(expected_output); - let serialized_outputs = circom::serialization::serialize_inputs(&circom_outputs); - - // Step 2: Generate Proof - let generate_proof_result = mopro_circom.generate_proof(inputs)?; - let serialized_proof = generate_proof_result.proof; - let serialized_inputs = generate_proof_result.inputs; - - assert!(serialized_proof.len() > 0); - assert_eq!(serialized_inputs, serialized_outputs); - - // Step 3: Verify Proof - let is_valid = - mopro_circom.verify_proof(serialized_proof.clone(), serialized_inputs.clone())?; - assert!(is_valid); - - // Step 4: Convert Proof to Ethereum compatible proof - let proof_calldata = to_ethereum_proof(serialized_proof); - let inputs_calldata = to_ethereum_inputs(serialized_inputs); - assert!(proof_calldata.a.x.len() > 0); - assert!(inputs_calldata.len() > 0); - - Ok(()) - } - - #[test] - fn test_end_to_end_keccak() -> Result<(), MoproError> { - // Paths to your wasm and r1cs files - let wasm_path = - "./../mopro-core/examples/circom/keccak256/target/keccak256_256_test_js/keccak256_256_test.wasm"; - let zkey_path = - "./../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.zkey"; - - // Create a new MoproCircom instance - let mopro_circom = MoproCircom::new(); - - // Step 1: Setup - let setup_result = mopro_circom.initialize(zkey_path.to_string(), wasm_path.to_string()); - assert!(setup_result.is_ok()); - - // Prepare inputs - let input_vec = vec![ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ]; - - // Expected output - let expected_output_vec = vec![ - 37, 17, 98, 135, 161, 178, 88, 97, 125, 150, 143, 65, 228, 211, 170, 133, 153, 9, 88, - 212, 4, 212, 175, 238, 249, 210, 214, 116, 170, 85, 45, 21, - ]; - - let inputs = bytes_to_circuit_inputs(&input_vec); - let serialized_outputs = bytes_to_circuit_outputs(&expected_output_vec); - - // Step 2: Generate Proof - let generate_proof_result = mopro_circom.generate_proof(inputs)?; - let serialized_proof = generate_proof_result.proof; - let serialized_inputs = generate_proof_result.inputs; - - assert!(serialized_proof.len() > 0); - assert_eq!(serialized_inputs, serialized_outputs); - - // Step 3: Verify Proof - - let is_valid = - mopro_circom.verify_proof(serialized_proof.clone(), serialized_inputs.clone())?; - assert!(is_valid); - - // Step 4: Convert Proof to Ethereum compatible proof - let proof_calldata = to_ethereum_proof(serialized_proof); - let inputs_calldata = to_ethereum_inputs(serialized_inputs); - assert!(proof_calldata.a.x.len() > 0); - assert!(inputs_calldata.len() > 0); - - Ok(()) - } - - #[test] - #[cfg(feature = "gpu-benchmarks")] - fn test_arkworks_pippenger() -> Result<(), MoproError> { - let instance_size = 16; - let num_instance = 10; - let utils_dir = "../mopro-core/src/middleware/gpu_explorations/utils/vectors/16x10"; - let result = arkworks_pippenger(instance_size, num_instance, &utils_dir).unwrap(); - println!("Benchmark result: {:#?}", result); - Ok(()) - } - - // #[test] - // #[cfg(feature = "gpu-benchmarks")] - // fn test_trapdoortech_zprize_msm() -> Result<(), MoproError> { - // let instance_size = 16; - // let num_instance = 10; - // let utils_dir = "../mopro-core/src/middleware/gpu_explorations/utils/vectors/16x10"; - // let result = trapdoortech_zprize_msm(instance_size, num_instance, utils_dir); - // println!("Benchmark result: {:#?}", result); - // Ok(()) - // } - - #[test] - #[cfg(feature = "gpu-benchmarks")] - fn test_metal_msm() -> Result<(), MoproError> { - let instance_size = 16; - let num_instance = 10; - let utils_dir = "../mopro-core/src/middleware/gpu_explorations/utils/vectors/16x10"; - let result = metal_msm(instance_size, num_instance, utils_dir); - println!("Benchmark result: {:#?}", result); - Ok(()) - } -} diff --git a/mopro-ffi/src/halo2.rs b/mopro-ffi/src/halo2.rs deleted file mode 100644 index e55c60d..0000000 --- a/mopro-ffi/src/halo2.rs +++ /dev/null @@ -1,93 +0,0 @@ -#![allow(unused_variables)] - -#[cfg(feature = "halo2")] -pub(crate) use common::*; - -/// Module that contains all the shared adapter functionality implemented for the Halo2 adapter. -/// As the adapter is only used when the `halo2` feature is enabled, -/// we make the compiler avoid the shared functions of module when the feature is not enabled. -#[cfg(feature = "halo2")] -mod common { - use std::collections::HashMap; - - use mopro_core::middleware::halo2; - use mopro_core::middleware::halo2::deserialize_circuit_inputs; - use mopro_core::MoproError; - - use crate::GenerateProofResult; - - pub fn generate_proof_static( - circuit_inputs: HashMap>, - ) -> Result { - let circuit_inputs = deserialize_circuit_inputs(circuit_inputs); - - let (proof, inputs) = halo2::generate_halo2_proof(circuit_inputs).unwrap(); - - let serialized_proof = - bincode::serialize(&proof).map_err(|e| MoproError::Halo2Error(e.to_string()))?; - let serialized_inputs = - bincode::serialize(&inputs).expect("Serialization of Inputs failed"); - - Ok(GenerateProofResult { - proof: serialized_proof, - inputs: serialized_inputs, - }) - } - - pub fn verify_proof_static(proof: Vec, public_inputs: Vec) -> Result { - let deserialized_proof: halo2::SerializableProof = - bincode::deserialize(&proof).map_err(|e| MoproError::Halo2Error(e.to_string()))?; - let deserialized_inputs: halo2::SerializablePublicInputs = - bincode::deserialize(&public_inputs) - .map_err(|e| MoproError::Halo2Error(e.to_string()))?; - let is_valid = halo2::verify_halo2_proof(deserialized_proof, deserialized_inputs).unwrap(); - Ok(is_valid) - } - - pub fn initialize_mopro() -> Result<(), MoproError> { - panic!("Mopro Halo2 does not implement initialization yet."); - } - - pub fn initialize_mopro_dylib(dylib_path: String) -> Result<(), MoproError> { - panic!("Mopro Halo2 does not implement dylib initialization yet."); - } - - #[cfg(test)] - mod test { - use crate::adapter::{generate_proof_static, verify_proof_static}; - use halo2curves::bn256::Fr; - use mopro_core::middleware::halo2::SerializablePublicInputs; - use mopro_core::MoproError; - use std::collections::HashMap; - - #[test] - fn test_end_to_end() -> Result<(), MoproError> { - // We by default compile the Fibonacci Halo2 Circuit - // TODO - For the future we should consider a stateful circuit to change the keys on the fly. - - let mut inputs = HashMap::new(); - let out = 55u64; - inputs.insert("out".to_string(), vec![out.to_string()]); - - let expected_output = vec![Fr::from(1), Fr::from(1), Fr::from(out)]; - let expected_output_bytes = - bincode::serialize(&SerializablePublicInputs(expected_output)) - .expect("Serialization of Output Expected bytes failed"); - - // Step 2: Generate Proof - let generate_proof_result = generate_proof_static(inputs)?; - let serialized_proof = generate_proof_result.proof; - let serialized_inputs = generate_proof_result.inputs; - - assert!(serialized_proof.len() > 0); - assert_eq!(serialized_inputs, expected_output_bytes); - - // Step 3: Verify Proof - let is_valid = - verify_proof_static(serialized_proof.clone(), serialized_inputs.clone())?; - assert!(is_valid); - - Ok(()) - } - } -} diff --git a/mopro-ffi/src/lib.rs b/mopro-ffi/src/lib.rs deleted file mode 100644 index 60b71f1..0000000 --- a/mopro-ffi/src/lib.rs +++ /dev/null @@ -1,97 +0,0 @@ -#[cfg(all(feature = "halo2", feature = "circom"))] -compile_error!( - "Cannot enable both `halo2` and `circom` features at the same time -Please enable only one of them" -); - -mod circom; -mod halo2; - -// We require that each adapter implements the same set of default functions -// As well as allow an adapter to export its own unique functions as long as -// There is as default (`dummy`) implementation for when the adapter is not enabled. -#[cfg(feature = "circom")] -use circom as adapter; -#[cfg(feature = "halo2")] -use halo2 as adapter; - -use std::collections::HashMap; - -use mopro_core::MoproError; - -// A set of shared functions that each adapter is required to implement. -// We wrap these functions in another layer of abstraction to enforce consistent types. -// Adapter does not need to implement the `dummy` version as another adapter will provide it. - -pub fn initialize_mopro() -> Result<(), MoproError> { - adapter::initialize_mopro() -} - -pub fn initialize_mopro_dylib(dylib_path: String) -> Result<(), MoproError> { - adapter::initialize_mopro_dylib(dylib_path) -} - -pub fn generate_proof_static( - inputs: HashMap>, -) -> Result { - adapter::generate_proof_static(inputs) -} - -pub fn verify_proof_static(proof: Vec, public_input: Vec) -> Result { - adapter::verify_proof_static(proof, public_input) -} - -// A set of unique functions that each adapter can implement, which we directly re-export. -// The adapter must provide a default (`dummy`) implementation for when the adapter is not enabled. - -pub use circom::{arkworks_pippenger, metal_msm}; -pub use circom::{to_ethereum_inputs, to_ethereum_proof}; -pub use circom::{BenchmarkResult, MoproCircom, ProofCalldata, G1, G2}; - -#[derive(Debug)] -pub enum FFIError { - MoproError(mopro_core::MoproError), - SerializationError(String), -} - -#[derive(Debug, Clone)] -pub struct GenerateProofResult { - pub proof: Vec, - pub inputs: Vec, -} - -impl From for FFIError { - fn from(error: MoproError) -> Self { - FFIError::MoproError(error) - } -} - -// Test functions (TODO - consider removing) - -fn add(a: u32, b: u32) -> u32 { - a + b -} - -fn hello() -> String { - "Hello World from Rust".to_string() -} - -// TODO: Remove me -// UniFFI expects String type -// See https://mozilla.github.io/uniffi-rs/udl/builtin_types.html -// fn run_example(wasm_path: String, r1cs_path: String) -> Result<(), MoproError> { -// circom::run_example(wasm_path.as_str(), r1cs_path.as_str()) -// } - -uniffi::include_scaffolding!("mopro"); - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn add_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} diff --git a/mopro-ffi/src/mopro.udl b/mopro-ffi/src/mopro.udl deleted file mode 100644 index 56487bb..0000000 --- a/mopro-ffi/src/mopro.udl +++ /dev/null @@ -1,75 +0,0 @@ -namespace mopro { - u32 add(u32 a, u32 b); - string hello(); - - [Throws=MoproError] - void initialize_mopro(); - - [Throws=MoproError] - void initialize_mopro_dylib(string dylib_path); - - [Throws=MoproError] - GenerateProofResult generate_proof_static(record> circuit_inputs); - - [Throws=MoproError] - boolean verify_proof_static(bytes proof, bytes public_input); - - [Throws=MoproError] - BenchmarkResult arkworks_pippenger(u32 instance_size, u32 num_instance, [ByRef] string utils_dir); - - // [Throws=MoproError] - // BenchmarkResult trapdoortech_zprize_msm(u32 instance_size, u32 num_instance, [ByRef] string utils_dir); - - [Throws=MoproError] - BenchmarkResult metal_msm(u32 instance_size, u32 num_instance, [ByRef] string utils_dir); - - ProofCalldata to_ethereum_proof(bytes proof); - sequence to_ethereum_inputs(bytes inputs); -}; - -dictionary GenerateProofResult { - bytes proof; - bytes inputs; -}; - -dictionary BenchmarkResult { - u32 instance_size; - u32 num_instance; - double avg_processing_time; -}; - -dictionary G1 { - string x; - string y; -}; - -dictionary G2 { - sequence x; - sequence y; -}; - -dictionary ProofCalldata { - G1 a; - G2 b; - G1 c; -}; - - -[Error] -enum MoproError { - "CircomError", - "Halo2Error", -}; - -interface MoproCircom { - constructor(); - - [Throws=MoproError] - void initialize(string zkey_path, string wasm_path); - - [Throws=MoproError] - GenerateProofResult generate_proof(record> circuit_inputs); - - [Throws=MoproError] - boolean verify_proof(bytes proof, bytes public_input); -}; diff --git a/mopro-ffi/tests/bindings/test_mopro.kts b/mopro-ffi/tests/bindings/test_mopro.kts deleted file mode 100644 index 2790ce6..0000000 --- a/mopro-ffi/tests/bindings/test_mopro.kts +++ /dev/null @@ -1,33 +0,0 @@ -import uniffi.mopro.* - -var wasmPath = "../mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm" -var zkeyPath = "../mopro-core/examples/circom/multiplier2/target/multiplier2_final.zkey" - -try { - // Setup - var moproCircom = MoproCircom() - moproCircom.initialize(zkeyPath, wasmPath) - - // Prepare inputs - val inputs = mutableMapOf>() - inputs["a"] = listOf("3") - inputs["b"] = listOf("5") - - // Generate proof - var generateProofResult = moproCircom.generateProof(inputs) - assert(generateProofResult.proof.size > 0) { "Proof is empty" } - - // Verify proof - var isValid = moproCircom.verifyProof(generateProofResult.proof, generateProofResult.inputs) - assert(isValid) { "Proof is invalid" } - - // Convert proof to Ethereum compatible proof - var convertProofResult = toEthereumProof(generateProofResult.proof) - var convertInputsResult = toEthereumInputs(generateProofResult.inputs) - assert(convertProofResult.a.x.isNotEmpty()) { "Proof is empty" } - assert(convertInputsResult.size > 0) { "Inputs are empty" } - - -} catch (e: Exception) { - println(e) -} diff --git a/mopro-ffi/tests/bindings/test_mopro.swift b/mopro-ffi/tests/bindings/test_mopro.swift deleted file mode 100644 index 390a920..0000000 --- a/mopro-ffi/tests/bindings/test_mopro.swift +++ /dev/null @@ -1,70 +0,0 @@ -import mopro -import Foundation - -let moproCircom = MoproCircom() - -let wasmPath = "./../../../../mopro-core/examples/circom/multiplier2/target/multiplier2_js/multiplier2.wasm" -let zkeyPath = "./../../../../mopro-core/examples/circom/multiplier2/target/multiplier2_final.zkey" - -func serializeOutputs(_ stringArray: [String]) -> [UInt8] { - var bytesArray: [UInt8] = [] - let length = stringArray.count - var littleEndianLength = length.littleEndian - let targetLength = 32 - withUnsafeBytes(of: &littleEndianLength) { - bytesArray.append(contentsOf: $0) - } - for value in stringArray { - // TODO: should handle 254-bit input - var littleEndian = Int32(value)!.littleEndian - var byteLength = 0 - withUnsafeBytes(of: &littleEndian) { - bytesArray.append(contentsOf: $0) - byteLength = byteLength + $0.count - } - if byteLength < targetLength { - let paddingCount = targetLength - byteLength - let paddingArray = [UInt8](repeating: 0, count: paddingCount) - bytesArray.append(contentsOf: paddingArray) - } - } - return bytesArray -} - -do { - // Setup - try moproCircom.initialize(zkeyPath: zkeyPath ,wasmPath: wasmPath) - - // Prepare inputs - var inputs = [String: [String]]() - let a = 3 - let b = 5 - let c = a*b - inputs["a"] = [String(a)] - inputs["b"] = [String(b)] - - // Expected outputs - let outputs: [String] = [String(c), String(a)] - let expectedOutput: [UInt8] = serializeOutputs(outputs) - - // Generate Proof - let generateProofResult = try moproCircom.generateProof(circuitInputs: inputs) - assert(!generateProofResult.proof.isEmpty, "Proof should not be empty") - - // Verify Proof - assert(Data(expectedOutput) == generateProofResult.inputs, "Circuit outputs mismatch the expected outputs") - - let isValid = try moproCircom.verifyProof(proof: generateProofResult.proof, publicInput: generateProofResult.inputs) - assert(isValid, "Proof verification should succeed") - - // Convert proof to Ethereum compatible proof - let convertProofResult = toEthereumProof(proof: generateProofResult.proof) - let convertInputsResult = toEthereumInputs(inputs: generateProofResult.inputs) - assert(convertProofResult.a.x.count > 0, "Proof should not be empty") - assert(convertInputsResult.count > 0, "Inputs should not be empty") - -} catch let error as MoproError { - print("MoproError: \(error)") -} catch { - print("Unexpected error: \(error)") -} diff --git a/mopro-ffi/tests/bindings/test_mopro_gpu_benchmarks.swift b/mopro-ffi/tests/bindings/test_mopro_gpu_benchmarks.swift deleted file mode 100644 index 0d69063..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_gpu_benchmarks.swift +++ /dev/null @@ -1,42 +0,0 @@ -import mopro -import Foundation - -let instanceSize: UInt32 = 16; -let numInstance: UInt32 = 10; -let utilsDir = "../../../mopro-core/src/middleware/gpu_explorations/utils/vectors/16x10"; - -// test with arkworks pippenger -do { - let result = try arkworksPippenger( - instanceSize: instanceSize, - numInstance: numInstance, - utilsDir: utilsDir - ); - print("Benchmark result: \(result)"); -} catch let error as MoproError{ - print("Error running benchmark: \(error)") -} - -// test with trapdoor zprize msm -// do { -// let result = try trapdoortechZprizeMsm( -// instanceSize: instanceSize, -// numInstance: numInstance, -// utilsDir: utilsDir -// ); -// print("Benchmark result: \(result)"); -// } catch let error as MoproError{ -// print("Error running benchmark: \(error)") -// } - -// test with metal_msm -do { - let result = try metalMsm( - instanceSize: 16, - numInstance: 10, - utilsDir: "../../../mopro-core/src/middleware/gpu_explorations/utils/vectors/16x10" - ); - print("Benchmark result: \(result)"); -} catch let error as MoproError{ - print("Error running benchmark: \(error)") -} \ No newline at end of file diff --git a/mopro-ffi/tests/bindings/test_mopro_keccak.kts b/mopro-ffi/tests/bindings/test_mopro_keccak.kts deleted file mode 100644 index 59bc589..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_keccak.kts +++ /dev/null @@ -1,278 +0,0 @@ -import uniffi.mopro.* - -var wasmPath = - "../mopro-core/examples/circom/keccak256/target/keccak256_256_test_js/keccak256_256_test.wasm" -var zkeyPath = "../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.zkey" - -try { - var moproCircom = MoproCircom() - moproCircom.initialize(zkeyPath, wasmPath) - - val inputs = mutableMapOf>() - inputs["in"] = - listOf( - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "1", - "0", - "1", - "0", - "0", - "1", - "1", - "0", - "1", - "1", - "0", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ) - - var generateProofResult = moproCircom.generateProof(inputs) - assert(generateProofResult.proof.size > 0) { "Proof is empty" } - var isValid = moproCircom.verifyProof(generateProofResult.proof, generateProofResult.inputs) - assert(isValid) { "Proof is invalid" } -} catch (e: Exception) { - println(e) -} diff --git a/mopro-ffi/tests/bindings/test_mopro_keccak.swift b/mopro-ffi/tests/bindings/test_mopro_keccak.swift deleted file mode 100644 index 45b47ca..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_keccak.swift +++ /dev/null @@ -1,81 +0,0 @@ -import mopro -import Foundation - -let moproCircom = MoproCircom() - -let wasmPath = "./../../../../mopro-core/examples/circom/keccak256/target/keccak256_256_test_js/keccak256_256_test.wasm" -let zkeyPath = "./../../../../mopro-core/examples/circom/keccak256/target/keccak256_256_test_final.zkey" - -// Helper function to convert bytes to bits -func bytesToBits(bytes: [UInt8]) -> [String] { - var bits = [String]() - for byte in bytes { - for j in 0..<8 { - let bit = (byte >> j) & 1 - bits.append(String(bit)) - } - } - return bits -} - -func serializeOutputs(_ stringArray: [String]) -> [UInt8] { - var bytesArray: [UInt8] = [] - let length = stringArray.count - var littleEndianLength = length.littleEndian - let targetLength = 32 - withUnsafeBytes(of: &littleEndianLength) { - bytesArray.append(contentsOf: $0) - } - for value in stringArray { - // TODO: should handle 254-bit input - var littleEndian = Int32(value)!.littleEndian - var byteLength = 0 - withUnsafeBytes(of: &littleEndian) { - bytesArray.append(contentsOf: $0) - byteLength = byteLength + $0.count - } - if byteLength < targetLength { - let paddingCount = targetLength - byteLength - let paddingArray = [UInt8](repeating: 0, count: paddingCount) - bytesArray.append(contentsOf: paddingArray) - } - } - return bytesArray -} - -do { - // Setup - try moproCircom.initialize(zkeyPath: zkeyPath, wasmPath: wasmPath) - - // Prepare inputs - let inputVec: [UInt8] = [ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ] - let bits = bytesToBits(bytes: inputVec) - var inputs = [String: [String]]() - inputs["in"] = bits - - // Expected outputs - let outputVec: [UInt8] = [ - 37, 17, 98, 135, 161, 178, 88, 97, 125, 150, 143, 65, 228, 211, 170, 133, 153, 9, 88, - 212, 4, 212, 175, 238, 249, 210, 214, 116, 170, 85, 45, 21, - ] - let outputBits: [String] = bytesToBits(bytes: outputVec) - let expectedOutput: [UInt8] = serializeOutputs(outputBits) - - // Generate Proof - let generateProofResult = try moproCircom.generateProof(circuitInputs: inputs) - assert(!generateProofResult.proof.isEmpty, "Proof should not be empty") - - // Verify Proof - assert(Data(expectedOutput) == generateProofResult.inputs, "Circuit outputs mismatch the expected outputs") - - let isValid = try moproCircom.verifyProof(proof: generateProofResult.proof, publicInput: generateProofResult.inputs) - assert(isValid, "Proof verification should succeed") - -} catch let error as MoproError { - print("MoproError: \(error)") -} catch { - print("Unexpected error: \(error)") -} diff --git a/mopro-ffi/tests/bindings/test_mopro_keccak_static.kts b/mopro-ffi/tests/bindings/test_mopro_keccak_static.kts deleted file mode 100644 index 0be0e68..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_keccak_static.kts +++ /dev/null @@ -1,273 +0,0 @@ -import uniffi.mopro.* - -try { - initializeMopro() - - val inputs = mutableMapOf>() - inputs["in"] = - listOf( - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "1", - "0", - "1", - "0", - "0", - "1", - "1", - "0", - "1", - "1", - "0", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ) - - var generateProofResult = generateProofStatic(inputs) - assert(generateProofResult.proof.size > 0) { "Proof is empty" } - var isValid = verifyProofStatic(generateProofResult.proof, generateProofResult.inputs) - assert(isValid) { "Proof is invalid" } -} catch (e: Exception) { - println(e) -} diff --git a/mopro-ffi/tests/bindings/test_mopro_keccak_static.swift b/mopro-ffi/tests/bindings/test_mopro_keccak_static.swift deleted file mode 100644 index 15b9d14..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_keccak_static.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation -import mopro - -//let moproCircom = MoproCircom() - -// Using zkey and generate_proof_static - -// let wasmPath = "./../../../../mopro-core/examples/circom/keccak256/target/keccak256_256_test_js/keccak256_256_test.wasm" -// let r1csPath = "./../../../../mopro-core/examples/circom/keccak256/target/keccak256_256_test.r1cs" - -// Helper function to convert bytes to bits -func bytesToBits(bytes: [UInt8]) -> [String] { - var bits = [String]() - for byte in bytes { - for j in 0..<8 { - let bit = (byte >> j) & 1 - bits.append(String(bit)) - } - } - return bits -} - -func serializeOutputs(_ stringArray: [String]) -> [UInt8] { - var bytesArray: [UInt8] = [] - let length = stringArray.count - var littleEndianLength = length.littleEndian - let targetLength = 32 - withUnsafeBytes(of: &littleEndianLength) { - bytesArray.append(contentsOf: $0) - } - for value in stringArray { - // TODO: should handle 254-bit input - var littleEndian = Int32(value)!.littleEndian - var byteLength = 0 - withUnsafeBytes(of: &littleEndian) { - bytesArray.append(contentsOf: $0) - byteLength = byteLength + $0.count - } - if byteLength < targetLength { - let paddingCount = targetLength - byteLength - let paddingArray = [UInt8](repeating: 0, count: paddingCount) - bytesArray.append(contentsOf: paddingArray) - } - } - return bytesArray -} - -do { - - // Prepare inputs - let inputVec: [UInt8] = [ - 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ] - let bits = bytesToBits(bytes: inputVec) - var inputs = [String: [String]]() - inputs["in"] = bits - - // Expected outputs - let outputVec: [UInt8] = [ - 37, 17, 98, 135, 161, 178, 88, 97, 125, 150, 143, 65, 228, 211, 170, 133, 153, 9, 88, - 212, 4, 212, 175, 238, 249, 210, 214, 116, 170, 85, 45, 21, - ] - let outputBits: [String] = bytesToBits(bytes: outputVec) - let expectedOutput: [UInt8] = serializeOutputs(outputBits) - - // // Generate Proof - let generateProofResult = try generateProofStatic(circuitInputs: inputs) - // let generateProofResult = try moproCircom.generateProof(circuitInputs: inputs) - assert(!generateProofResult.proof.isEmpty, "Proof should not be empty") - - // // Verify Proof - assert(Data(expectedOutput) == generateProofResult.inputs, "Circuit outputs mismatch the expected outputs") - - let isValid = try verifyProofStatic( - proof: generateProofResult.proof, publicInput: generateProofResult.inputs) - assert(isValid, "Proof verification should succeed") - -} catch let error as MoproError { - print("MoproError: \(error)") -} catch { - print("Unexpected error: \(error)") -} diff --git a/mopro-ffi/tests/bindings/test_mopro_rsa.kts b/mopro-ffi/tests/bindings/test_mopro_rsa.kts deleted file mode 100644 index 09a8df3..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_rsa.kts +++ /dev/null @@ -1,114 +0,0 @@ -import uniffi.mopro.*; - -var wasmPath = "../mopro-core/examples/circom/rsa/target/main_js/main.wasm" -var zkeyPath = "../mopro-core/examples/circom/rsa/target/main_final.zkey" - -try { - var moproCircom = MoproCircom() - moproCircom.initialize(zkeyPath, wasmPath) - - val inputs = mutableMapOf>() - inputs["signature"] = listOf("3582320600048169363", - "7163546589759624213", - "18262551396327275695", - "4479772254206047016", - "1970274621151677644", - "6547632513799968987", - "921117808165172908", - "7155116889028933260", - "16769940396381196125", - "17141182191056257954", - "4376997046052607007", - "17471823348423771450", - "16282311012391954891", - "70286524413490741", - "1588836847166444745", - "15693430141227594668", - "13832254169115286697", - "15936550641925323613", - "323842208142565220", - "6558662646882345749", - "15268061661646212265", - "14962976685717212593", - "15773505053543368901", - "9586594741348111792", - "1455720481014374292", - "13945813312010515080", - "6352059456732816887", - "17556873002865047035", - "2412591065060484384", - "11512123092407778330", - "8499281165724578877", - "12768005853882726493") - inputs["modulus"] = listOf("13792647154200341559", - "12773492180790982043", - "13046321649363433702", - "10174370803876824128", - "7282572246071034406", - "1524365412687682781", - "4900829043004737418", - "6195884386932410966", - "13554217876979843574", - "17902692039595931737", - "12433028734895890975", - "15971442058448435996", - "4591894758077129763", - "11258250015882429548", - "16399550288873254981", - "8246389845141771315", - "14040203746442788850", - "7283856864330834987", - "12297563098718697441", - "13560928146585163504", - "7380926829734048483", - "14591299561622291080", - "8439722381984777599", - "17375431987296514829", - "16727607878674407272", - "3233954801381564296", - "17255435698225160983", - "15093748890170255670", - "15810389980847260072", - "11120056430439037392", - "5866130971823719482", - "13327552690270163501",) - inputs["base_message"] = listOf("18114495772705111902", - "2254271930739856077", - "2068851770", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0",) - - var generateProofResult = moproCircom.generateProof(inputs) - assert(generateProofResult.proof.size > 0) { "Proof is empty"} - var isValid = moproCircom.verifyProof(generateProofResult.proof, generateProofResult.inputs) - assert(isValid) { "Proof is invalid"} -} catch (e: Exception) { - println(e); -} diff --git a/mopro-ffi/tests/bindings/test_mopro_rsa.swift b/mopro-ffi/tests/bindings/test_mopro_rsa.swift deleted file mode 100644 index f80c8e3..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_rsa.swift +++ /dev/null @@ -1,173 +0,0 @@ -import mopro -import Foundation - -let moproCircom = MoproCircom() - -let wasmPath = "./../../../../mopro-core/examples/circom/rsa/target/main_js/main.wasm" -let zkeyPath = "./../../../../mopro-core/examples/circom/rsa/target/main_final.zkey" - -// Helper function to convert bytes to bits -func bytesToBits(bytes: [UInt8]) -> [String] { - var bits = [String]() - for byte in bytes { - for j in 0..<8 { - let bit = (byte >> j) & 1 - bits.append(String(bit)) - } - } - return bits -} - -func serializeOutputs(_ stringArray: [String]) -> [UInt8] { - var bytesArray: [UInt8] = [] - let length = stringArray.count - var littleEndianLength = length.littleEndian - let targetLength = 32 - withUnsafeBytes(of: &littleEndianLength) { - bytesArray.append(contentsOf: $0) - } - for value in stringArray { - // TODO: should handle 254-bit input - var littleEndian = Int32(value)!.littleEndian - var byteLength = 0 - withUnsafeBytes(of: &littleEndian) { - bytesArray.append(contentsOf: $0) - byteLength = byteLength + $0.count - } - if byteLength < targetLength { - let paddingCount = targetLength - byteLength - let paddingArray = [UInt8](repeating: 0, count: paddingCount) - bytesArray.append(contentsOf: paddingArray) - } - } - return bytesArray -} - -do { - // Setup - try moproCircom.initialize(zkeyPath: zkeyPath ,wasmPath: wasmPath) - - // Prepare inputs - let signature: [String] = [ - "3582320600048169363", - "7163546589759624213", - "18262551396327275695", - "4479772254206047016", - "1970274621151677644", - "6547632513799968987", - "921117808165172908", - "7155116889028933260", - "16769940396381196125", - "17141182191056257954", - "4376997046052607007", - "17471823348423771450", - "16282311012391954891", - "70286524413490741", - "1588836847166444745", - "15693430141227594668", - "13832254169115286697", - "15936550641925323613", - "323842208142565220", - "6558662646882345749", - "15268061661646212265", - "14962976685717212593", - "15773505053543368901", - "9586594741348111792", - "1455720481014374292", - "13945813312010515080", - "6352059456732816887", - "17556873002865047035", - "2412591065060484384", - "11512123092407778330", - "8499281165724578877", - "12768005853882726493", - ] - - let modulus: [String] = [ - "13792647154200341559", - "12773492180790982043", - "13046321649363433702", - "10174370803876824128", - "7282572246071034406", - "1524365412687682781", - "4900829043004737418", - "6195884386932410966", - "13554217876979843574", - "17902692039595931737", - "12433028734895890975", - "15971442058448435996", - "4591894758077129763", - "11258250015882429548", - "16399550288873254981", - "8246389845141771315", - "14040203746442788850", - "7283856864330834987", - "12297563098718697441", - "13560928146585163504", - "7380926829734048483", - "14591299561622291080", - "8439722381984777599", - "17375431987296514829", - "16727607878674407272", - "3233954801381564296", - "17255435698225160983", - "15093748890170255670", - "15810389980847260072", - "11120056430439037392", - "5866130971823719482", - "13327552690270163501", - ] - let base_message: [String] = [ - "18114495772705111902", - "2254271930739856077", - "2068851770", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - ] - - var inputs = [String: [String]]() - inputs["signature"] = signature; - inputs["modulus"] = modulus; - inputs["base_message"] = base_message; - - - // Generate Proof - let generateProofResult = try moproCircom.generateProof(circuitInputs: inputs) - assert(!generateProofResult.proof.isEmpty, "Proof should not be empty") - - // Verifying the Proof - let isValid = try moproCircom.verifyProof(proof: generateProofResult.proof, publicInput: generateProofResult.inputs) - assert(isValid, "Proof verification should succeed") - -} catch let error as MoproError { - print("MoproError: \(error)") -} catch { - print("Unexpected error: \(error)") -} diff --git a/mopro-ffi/tests/bindings/test_mopro_rsa_static.swift b/mopro-ffi/tests/bindings/test_mopro_rsa_static.swift deleted file mode 100644 index 9c9efb4..0000000 --- a/mopro-ffi/tests/bindings/test_mopro_rsa_static.swift +++ /dev/null @@ -1,167 +0,0 @@ -import mopro -import Foundation - -// Helper function to convert bytes to bits -func bytesToBits(bytes: [UInt8]) -> [String] { - var bits = [String]() - for byte in bytes { - for j in 0..<8 { - let bit = (byte >> j) & 1 - bits.append(String(bit)) - } - } - return bits -} - -func serializeOutputs(_ stringArray: [String]) -> [UInt8] { - var bytesArray: [UInt8] = [] - let length = stringArray.count - var littleEndianLength = length.littleEndian - let targetLength = 32 - withUnsafeBytes(of: &littleEndianLength) { - bytesArray.append(contentsOf: $0) - } - for value in stringArray { - // TODO: should handle 254-bit input - var littleEndian = Int32(value)!.littleEndian - var byteLength = 0 - withUnsafeBytes(of: &littleEndian) { - bytesArray.append(contentsOf: $0) - byteLength = byteLength + $0.count - } - if byteLength < targetLength { - let paddingCount = targetLength - byteLength - let paddingArray = [UInt8](repeating: 0, count: paddingCount) - bytesArray.append(contentsOf: paddingArray) - } - } - return bytesArray -} - -do { - // Initialize - try initializeMopro() - - // Prepare inputs - let signature: [String] = [ - "3582320600048169363", - "7163546589759624213", - "18262551396327275695", - "4479772254206047016", - "1970274621151677644", - "6547632513799968987", - "921117808165172908", - "7155116889028933260", - "16769940396381196125", - "17141182191056257954", - "4376997046052607007", - "17471823348423771450", - "16282311012391954891", - "70286524413490741", - "1588836847166444745", - "15693430141227594668", - "13832254169115286697", - "15936550641925323613", - "323842208142565220", - "6558662646882345749", - "15268061661646212265", - "14962976685717212593", - "15773505053543368901", - "9586594741348111792", - "1455720481014374292", - "13945813312010515080", - "6352059456732816887", - "17556873002865047035", - "2412591065060484384", - "11512123092407778330", - "8499281165724578877", - "12768005853882726493", - ] - - let modulus: [String] = [ - "13792647154200341559", - "12773492180790982043", - "13046321649363433702", - "10174370803876824128", - "7282572246071034406", - "1524365412687682781", - "4900829043004737418", - "6195884386932410966", - "13554217876979843574", - "17902692039595931737", - "12433028734895890975", - "15971442058448435996", - "4591894758077129763", - "11258250015882429548", - "16399550288873254981", - "8246389845141771315", - "14040203746442788850", - "7283856864330834987", - "12297563098718697441", - "13560928146585163504", - "7380926829734048483", - "14591299561622291080", - "8439722381984777599", - "17375431987296514829", - "16727607878674407272", - "3233954801381564296", - "17255435698225160983", - "15093748890170255670", - "15810389980847260072", - "11120056430439037392", - "5866130971823719482", - "13327552690270163501", - ] - let base_message: [String] = [ - "18114495772705111902", - "2254271930739856077", - "2068851770", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - ] - - var inputs = [String: [String]]() - inputs["signature"] = signature; - inputs["modulus"] = modulus; - inputs["base_message"] = base_message; - - // Generate Proof - let generateProofResult = try generateProofStatic(circuitInputs: inputs) - assert(!generateProofResult.proof.isEmpty, "Proof should not be empty") - - // Verifying the Proof - let isValid = try verifyProofStatic(proof: generateProofResult.proof, publicInput: generateProofResult.inputs) - assert(isValid, "Proof verification should succeed") - -} catch let error as MoproError { - print("MoproError: \(error)") -} catch { - print("Unexpected error: \(error)") -} diff --git a/mopro-ffi/tests/test_generated_bindings.rs b/mopro-ffi/tests/test_generated_bindings.rs deleted file mode 100644 index 4a082f0..0000000 --- a/mopro-ffi/tests/test_generated_bindings.rs +++ /dev/null @@ -1,17 +0,0 @@ -#[cfg(feature = "gpu-benchmarks")] -uniffi::build_foreign_language_testcases!("tests/bindings/test_mopro_gpu_benchmarks.swift",); - -#[cfg(not(feature = "gpu-benchmarks"))] -uniffi::build_foreign_language_testcases!( - "tests/bindings/test_mopro.swift", - "tests/bindings/test_mopro.kts", - // "tests/bindings/test_mopro.rb", - // "tests/bindings/test_mopro.py", - "tests/bindings/test_mopro_keccak.swift", - // "tests/bindings/test_mopro_keccak.kts", // FIXME: java.lang.OutOfMemoryError: Java heap space - "tests/bindings/test_mopro_keccak_static.swift", - "tests/bindings/test_mopro_keccak_static.kts", - "tests/bindings/test_mopro_rsa.swift", - // "tests/bindings/test_mopro_rsa.kts", // FIXME: java.lang.OutOfMemoryError: Java heap space - // "tests/bindings/test_mopro_rsa_static.swift", -); diff --git a/mopro-ffi/uniffi-bindgen.rs b/mopro-ffi/uniffi-bindgen.rs deleted file mode 100644 index f6cff6c..0000000 --- a/mopro-ffi/uniffi-bindgen.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - uniffi::uniffi_bindgen_main() -} diff --git a/mopro-ffi/uniffi.toml b/mopro-ffi/uniffi.toml deleted file mode 100644 index f14925e..0000000 --- a/mopro-ffi/uniffi.toml +++ /dev/null @@ -1,2 +0,0 @@ -[bindings.swift] -module_name = "mopro" diff --git a/mopro-core/.gitignore b/mopro-msm/.gitignore similarity index 100% rename from mopro-core/.gitignore rename to mopro-msm/.gitignore diff --git a/mopro-msm/Cargo.toml b/mopro-msm/Cargo.toml new file mode 100644 index 0000000..4df7895 --- /dev/null +++ b/mopro-msm/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "mopro-msm" +version = "0.1.0" +edition = "2021" + +[dependencies] +## Shared dependencies +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +once_cell = "1.8" +instant = "0.1" + +# Error handling +thiserror = "=1.0.39" +color-eyre = "=0.6.2" +criterion = "=0.3.6" + +## Circom dependencies +ark-circom = { git = "https://github.com/vimwitch/circom-compat.git" } +ark-serialize = { version = "=0.4.1", features = ["derive"] } +num-bigint = { version = "=0.4.3", default-features = false, features = ["rand"] } +wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } +ruint = { version = "1.10.0", features = ["rand", "serde", "ark-ff-04"] } + +# ZKP generation +ark-ec = { version = "=0.4.1", default-features = false, features = ["parallel"] } +ark-crypto-primitives = { version = "=0.4.0" } +ark-std = { version = "=0.4.0", default-features = false, features = ["parallel"] } +ark-bn254 = { version = "=0.4.0" } +ark-groth16 = { version = "=0.4.0", default-features = false, features = ["parallel"] } +ark-relations = { version = "0.4", default-features = false } +witness = { git = "https://github.com/philsippl/circom-witness-rs.git" } + +# GPU explorations +ark-ff = { version = "=0.4.1", default-features = false, features = ["parallel"] } +metal = { version = "=0.28.0" } +objc = { version = "=0.2.4" } +proptest = { version = "1.4.0" } +rayon = "1.5.1" +itertools = "0.13.0" + +[build-dependencies] +color-eyre = "0.6" +enumset = "1.0.8" +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +serde_derive = "1.0" + +## Circom dependencies +wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } +witness = { git = "https://github.com/philsippl/circom-witness-rs.git" } + +# [dependencies.rayon] +# version = "1" +# optional=false \ No newline at end of file diff --git a/mopro-msm/README.md b/mopro-msm/README.md new file mode 100644 index 0000000..bd4338b --- /dev/null +++ b/mopro-msm/README.md @@ -0,0 +1,22 @@ +# mopro-msm-benchmarks + +Core crate for outputting multi-scalar multiplication integration and implementations + +## Catagories + +### GPU-based (metal) msm + +* window-wise msm +* bucket-wise msm + +### CPU-based msm + +* precomputation + window-wise msm +* bucket-wise msm +* arkworks pippenger +* trapdoorTech (integrated from trapdoorTech) + +## Results on MacOs + + +## Results on IOS diff --git a/mopro-msm/benchmark_results/bucket_wise_msm_benchmark.txt b/mopro-msm/benchmark_results/bucket_wise_msm_benchmark.txt new file mode 100644 index 0000000..e1ed5e2 --- /dev/null +++ b/mopro-msm/benchmark_results/bucket_wise_msm_benchmark.txt @@ -0,0 +1,4 @@ +msm_size,num_msm,avg_processing_time(ms) +16,5,563.822834 +18,5,1615.4173584 +20,5,9367.2433832 diff --git a/mopro-msm/benchmark_results/metal_msm_benchmark.txt b/mopro-msm/benchmark_results/metal_msm_benchmark.txt new file mode 100644 index 0000000..d2635a5 --- /dev/null +++ b/mopro-msm/benchmark_results/metal_msm_benchmark.txt @@ -0,0 +1,5 @@ +msm_size,num_msm,avg_processing_time(ms) +8,10,76.07561229999999 +12,10,856.7078458 +16,10,3936.7850999 +18,10,26981.7295124 diff --git a/mopro-core/src/lib.rs b/mopro-msm/src/lib.rs similarity index 90% rename from mopro-core/src/lib.rs rename to mopro-msm/src/lib.rs index 22a3ec3..3020b7b 100644 --- a/mopro-core/src/lib.rs +++ b/mopro-msm/src/lib.rs @@ -1,4 +1,4 @@ -pub mod middleware; +pub mod msm; use thiserror::Error; #[derive(Debug, Error)] diff --git a/mopro-core/src/middleware/gpu_explorations/arkworks_pippenger.rs b/mopro-msm/src/msm/arkworks_pippenger.rs similarity index 95% rename from mopro-core/src/middleware/gpu_explorations/arkworks_pippenger.rs rename to mopro-msm/src/msm/arkworks_pippenger.rs index 4378d95..fafd17e 100644 --- a/mopro-core/src/middleware/gpu_explorations/arkworks_pippenger.rs +++ b/mopro-msm/src/msm/arkworks_pippenger.rs @@ -2,7 +2,7 @@ use ark_bn254::{Fr as ScalarField, G1Projective as G}; use ark_ec::VariableBaseMSM; use std::time::{Duration, Instant}; -use crate::middleware::gpu_explorations::utils::{benchmark::BenchmarkResult, preprocess}; +use crate::msm::utils::{benchmark::BenchmarkResult, preprocess}; pub fn benchmark_msm( instances: I, @@ -85,8 +85,8 @@ mod tests { const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 5; - const UTILSPATH: &str = "mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; #[test] fn test_msm_correctness_small_sample() { diff --git a/mopro-core/src/middleware/gpu_explorations/bucket_wise_msm.rs b/mopro-msm/src/msm/bucket_wise_msm.rs similarity index 81% rename from mopro-core/src/middleware/gpu_explorations/bucket_wise_msm.rs rename to mopro-msm/src/msm/bucket_wise_msm.rs index e14d803..f2d9121 100644 --- a/mopro-core/src/middleware/gpu_explorations/bucket_wise_msm.rs +++ b/mopro-msm/src/msm/bucket_wise_msm.rs @@ -1,16 +1,14 @@ use ark_bn254::{Fr as ScalarField, G1Projective as G}; use ark_ec::VariableBaseMSM; -use ark_ff::{BigInteger, Field, PrimeField}; -use ark_std::{self, cfg_into_iter, One, Zero}; +use ark_ff::{BigInteger, PrimeField}; +use ark_std::{self, cfg_into_iter, One}; use std::sync::Mutex; use std::time::{Duration, Instant}; use crate::{ - middleware::gpu_explorations::utils::{benchmark::BenchmarkResult, preprocess}, + msm::utils::{benchmark::BenchmarkResult, preprocess}, MoproError, }; - -#[cfg(feature = "parallel")] use rayon::prelude::*; // Helper function for getting the windows size @@ -92,11 +90,6 @@ fn bucket_wise_msm( indices_lists.par_drain(0..k); println!("Sort buckets indices time: {:?}", sort_start.elapsed()); - // TODO: traverse once and find the indices which can apply precomputation - // e.g. (bucket_idx, point_idx) - // (1, 2), (1, 2), (1, 2), (1, 2) - // -> (1, idx_to_get_precomp_point_of_4 * p[2]) - // find the start and end of each bucket let total_buckets_size = num_window * bucket_len; let mut bucket_start = vec![0; total_buckets_size]; @@ -140,26 +133,30 @@ fn bucket_wise_msm( // do window-wise reduction let reduction_start = Instant::now(); - let window_sums: Vec<_> = ark_std::cfg_into_iter!(buckets.lock().unwrap().clone()) - .chunks(bucket_len) - .enumerate() - .map(|(window_idx, bucket)| { - let mut res = zero; - if window_idx == 0 { - for i in 0..instance_size { - if scalars[i] == one { - res += &bucket[i]; + let window_sums: Vec<_> = { + let buckets_vec: Vec<_> = + ark_std::cfg_into_iter!(buckets.lock().unwrap().clone()).collect(); + buckets_vec + .par_chunks(bucket_len) + .enumerate() + .map(|(window_idx, bucket)| { + let mut res = zero; + if window_idx == 0 { + for i in 0..instance_size { + if scalars[i] == one { + res += &bucket[i]; + } } } - } - let mut running_sum = zero; - bucket.into_iter().rev().for_each(|b| { - running_sum += b; - res += &running_sum; - }); - res - }) - .collect(); + let mut running_sum = zero; + bucket.into_iter().rev().for_each(|b| { + running_sum += b; + res += &running_sum; + }); + res + }) + .collect() + }; println!("Sum reduction time: {:?}", reduction_start.elapsed()); // We store the sum for the lowest window. @@ -257,8 +254,42 @@ mod tests { const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 1; - const UTILSPATH: &str = "mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; + + #[test] + fn test_msm_correctness_medium_sample() { + let dir = format!("{}/{}/{}x{}", preprocess::get_root_path(), UTILSPATH, 8, 5); + + // Check if the vectors have been generated + match preprocess::FileInputIterator::open(&dir) { + Ok(_) => { + println!("Vectors already generated"); + } + Err(_) => { + preprocess::gen_vectors(INSTANCE_SIZE, NUM_INSTANCE, &dir); + } + } + + let instances = preprocess::FileInputIterator::open(&dir).unwrap(); + + for (i, instance) in instances.enumerate() { + let points = &instance.0; + // map each scalar to a ScalarField + let scalars = &instance + .1 + .iter() + .map(|s| ScalarField::new(*s)) + .collect::>(); + let arkworks_msm = G::msm(&points[..], &scalars[..]).unwrap(); + let msm = bucket_wise_msm::(&points[..], &scalars[..]).unwrap(); + assert_eq!(msm, arkworks_msm, "This msm is wrongly computed"); + println!( + "(pass) {}th instance of size 2^{} is correctly computed", + i, 8 + ); + } + } #[test] fn test_benchmark_msm() { diff --git a/mopro-core/src/middleware/gpu_explorations/halo2curve_msm.rs b/mopro-msm/src/msm/halo2curve_msm.rs similarity index 97% rename from mopro-core/src/middleware/gpu_explorations/halo2curve_msm.rs rename to mopro-msm/src/msm/halo2curve_msm.rs index 12ddf4a..ccb8bb2 100644 --- a/mopro-core/src/middleware/gpu_explorations/halo2curve_msm.rs +++ b/mopro-msm/src/msm/halo2curve_msm.rs @@ -104,8 +104,8 @@ mod tests { const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 10; - const UTILSPATH: &str = "mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; #[test] fn test_benchmark_msm() { diff --git a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/errors.rs b/mopro-msm/src/msm/metal/abstraction/errors.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/abstraction/errors.rs rename to mopro-msm/src/msm/metal/abstraction/errors.rs diff --git a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/limbs_conversion.rs b/mopro-msm/src/msm/metal/abstraction/limbs_conversion.rs similarity index 97% rename from mopro-core/src/middleware/gpu_explorations/metal/abstraction/limbs_conversion.rs rename to mopro-msm/src/msm/metal/abstraction/limbs_conversion.rs index 4c5f449..ff9f7d2 100644 --- a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/limbs_conversion.rs +++ b/mopro-msm/src/msm/metal/abstraction/limbs_conversion.rs @@ -1,7 +1,7 @@ use ark_bn254::Fq; use ark_ff::biginteger::{BigInteger, BigInteger256}; -use crate::middleware::gpu_explorations::metal::abstraction::mont_reduction; +use crate::msm::metal::abstraction::mont_reduction; // implement to_u32_limbs and from_u32_limbs for BigInt<4> pub trait ToLimbs { diff --git a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/mod.rs b/mopro-msm/src/msm/metal/abstraction/mod.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/abstraction/mod.rs rename to mopro-msm/src/msm/metal/abstraction/mod.rs diff --git a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/mont_reduction.rs b/mopro-msm/src/msm/metal/abstraction/mont_reduction.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/abstraction/mont_reduction.rs rename to mopro-msm/src/msm/metal/abstraction/mont_reduction.rs diff --git a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/state.rs b/mopro-msm/src/msm/metal/abstraction/state.rs similarity index 98% rename from mopro-core/src/middleware/gpu_explorations/metal/abstraction/state.rs rename to mopro-msm/src/msm/metal/abstraction/state.rs index 441c95b..7ce1d5c 100644 --- a/mopro-core/src/middleware/gpu_explorations/metal/abstraction/state.rs +++ b/mopro-msm/src/msm/metal/abstraction/state.rs @@ -1,6 +1,6 @@ use metal::{ComputeCommandEncoderRef, MTLResourceOptions}; -use crate::middleware::gpu_explorations::metal::abstraction::errors::MetalError; +use crate::msm::metal::abstraction::errors::MetalError; use core::{ffi, mem}; diff --git a/mopro-core/src/middleware/gpu_explorations/metal/compile_metal.sh b/mopro-msm/src/msm/metal/compile_metal.sh similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/compile_metal.sh rename to mopro-msm/src/msm/metal/compile_metal.sh diff --git a/mopro-core/src/middleware/gpu_explorations/metal/mod.rs b/mopro-msm/src/msm/metal/mod.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/mod.rs rename to mopro-msm/src/msm/metal/mod.rs diff --git a/mopro-core/src/middleware/gpu_explorations/metal/msm.rs b/mopro-msm/src/msm/metal/msm.rs similarity index 98% rename from mopro-core/src/middleware/gpu_explorations/metal/msm.rs rename to mopro-msm/src/msm/metal/msm.rs index 9b234b1..206cda9 100644 --- a/mopro-core/src/middleware/gpu_explorations/metal/msm.rs +++ b/mopro-msm/src/msm/metal/msm.rs @@ -5,17 +5,15 @@ use ark_std::{cfg_into_iter, vec::Vec}; // For benchmarking use std::time::{Duration, Instant}; -use crate::middleware::gpu_explorations::metal::abstraction::{ +use crate::msm::metal::abstraction::{ errors::MetalError, limbs_conversion::{FromLimbs, ToLimbs}, state::*, }; -use crate::middleware::gpu_explorations::utils::{benchmark::BenchmarkResult, preprocess}; +use crate::msm::utils::{benchmark::BenchmarkResult, preprocess}; use metal::*; use objc::rc::autoreleasepool; - -#[cfg(feature = "parallel")] use rayon::prelude::*; pub struct MetalMsmData { @@ -495,8 +493,8 @@ mod tests { const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 5; - const UTILSPATH: &str = "mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; #[test] fn test_msm_correctness_medium_sample() { diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/all.metal b/mopro-msm/src/msm/metal/shader/all.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/all.metal rename to mopro-msm/src/msm/metal/shader/all.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/u128.h.metal b/mopro-msm/src/msm/metal/shader/arithmetics/u128.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/u128.h.metal rename to mopro-msm/src/msm/metal/shader/arithmetics/u128.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/u256.h.metal b/mopro-msm/src/msm/metal/shader/arithmetics/u256.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/u256.h.metal rename to mopro-msm/src/msm/metal/shader/arithmetics/u256.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/unsigned_int.h.metal b/mopro-msm/src/msm/metal/shader/arithmetics/unsigned_int.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/arithmetics/unsigned_int.h.metal rename to mopro-msm/src/msm/metal/shader/arithmetics/unsigned_int.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/curves/bn254.h.metal b/mopro-msm/src/msm/metal/shader/curves/bn254.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/curves/bn254.h.metal rename to mopro-msm/src/msm/metal/shader/curves/bn254.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/curves/ec_point.h.metal b/mopro-msm/src/msm/metal/shader/curves/ec_point.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/curves/ec_point.h.metal rename to mopro-msm/src/msm/metal/shader/curves/ec_point.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/fields/fp_bn254.h.metal b/mopro-msm/src/msm/metal/shader/fields/fp_bn254.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/fields/fp_bn254.h.metal rename to mopro-msm/src/msm/metal/shader/fields/fp_bn254.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/fields/fp_u256.h.metal b/mopro-msm/src/msm/metal/shader/fields/fp_u256.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/fields/fp_u256.h.metal rename to mopro-msm/src/msm/metal/shader/fields/fp_u256.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/bigint_to_hex.py b/mopro-msm/src/msm/metal/shader/helper/bigint_to_hex.py similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/bigint_to_hex.py rename to mopro-msm/src/msm/metal/shader/helper/bigint_to_hex.py diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/bn254_addchain.acc b/mopro-msm/src/msm/metal/shader/helper/bn254_addchain.acc similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/bn254_addchain.acc rename to mopro-msm/src/msm/metal/shader/helper/bn254_addchain.acc diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/mu.py b/mopro-msm/src/msm/metal/shader/helper/mu.py similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/mu.py rename to mopro-msm/src/msm/metal/shader/helper/mu.py diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/r_sqr_mod_n.py b/mopro-msm/src/msm/metal/shader/helper/r_sqr_mod_n.py similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/r_sqr_mod_n.py rename to mopro-msm/src/msm/metal/shader/helper/r_sqr_mod_n.py diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/r_sub_n.py b/mopro-msm/src/msm/metal/shader/helper/r_sub_n.py similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/r_sub_n.py rename to mopro-msm/src/msm/metal/shader/helper/r_sub_n.py diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/helper/requirements.txt b/mopro-msm/src/msm/metal/shader/helper/requirements.txt similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/helper/requirements.txt rename to mopro-msm/src/msm/metal/shader/helper/requirements.txt diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/msm.h.metal b/mopro-msm/src/msm/metal/shader/msm.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/msm.h.metal rename to mopro-msm/src/msm/metal/shader/msm.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/msm.metallib b/mopro-msm/src/msm/metal/shader/msm.metallib similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/msm.metallib rename to mopro-msm/src/msm/metal/shader/msm.metallib diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/tests/test_bn254.h.metal b/mopro-msm/src/msm/metal/shader/tests/test_bn254.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/tests/test_bn254.h.metal rename to mopro-msm/src/msm/metal/shader/tests/test_bn254.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/shader/tests/test_unsigned_integer.h.metal b/mopro-msm/src/msm/metal/shader/tests/test_unsigned_integer.h.metal similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/shader/tests/test_unsigned_integer.h.metal rename to mopro-msm/src/msm/metal/shader/tests/test_unsigned_integer.h.metal diff --git a/mopro-core/src/middleware/gpu_explorations/metal/tests/mod.rs b/mopro-msm/src/msm/metal/tests/mod.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/metal/tests/mod.rs rename to mopro-msm/src/msm/metal/tests/mod.rs diff --git a/mopro-core/src/middleware/gpu_explorations/metal/tests/test_bn254.rs b/mopro-msm/src/msm/metal/tests/test_bn254.rs similarity index 99% rename from mopro-core/src/middleware/gpu_explorations/metal/tests/test_bn254.rs rename to mopro-msm/src/msm/metal/tests/test_bn254.rs index c580d6f..2c42abc 100644 --- a/mopro-core/src/middleware/gpu_explorations/metal/tests/test_bn254.rs +++ b/mopro-msm/src/msm/metal/tests/test_bn254.rs @@ -1,6 +1,6 @@ #[cfg(all(test))] mod tests { - use crate::middleware::gpu_explorations::metal::abstraction::{ + use crate::msm::metal::abstraction::{ limbs_conversion::{FromLimbs, ToLimbs}, state::MetalState, }; diff --git a/mopro-core/src/middleware/gpu_explorations/mod.rs b/mopro-msm/src/msm/mod.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/mod.rs rename to mopro-msm/src/msm/mod.rs diff --git a/mopro-core/src/middleware/gpu_explorations/precompute_msm.rs b/mopro-msm/src/msm/precompute_msm.rs similarity index 74% rename from mopro-core/src/middleware/gpu_explorations/precompute_msm.rs rename to mopro-msm/src/msm/precompute_msm.rs index 213211d..112b4b0 100644 --- a/mopro-core/src/middleware/gpu_explorations/precompute_msm.rs +++ b/mopro-msm/src/msm/precompute_msm.rs @@ -1,18 +1,13 @@ -use crate::middleware::gpu_explorations::utils::{ - benchmark::BenchmarkResult, - precomputation::{ - deserialize_precomputed_points, precompute_points_from_instances, - serialize_precomputed_points, - }, - preprocess, -}; use ark_bn254::{Fr as ScalarField, G1Projective as G}; use ark_ec::VariableBaseMSM; use ark_ff::{BigInteger, PrimeField}; use ark_std::{self, cfg_into_iter, One}; use std::time::{Duration, Instant}; - -#[cfg(feature = "parallel")] +use crate::{msm::utils::{ + benchmark::BenchmarkResult, + precomputation::precompute_points_from_instances, + preprocess, +}, MoproError}; use rayon::prelude::*; // Helper function for getting the windows size @@ -24,13 +19,15 @@ fn ln_without_floats(a: usize) -> usize { fn precompute_msm( bases: &[V::MulBase], // precomputed_bases scalars: &[V::ScalarField], -) -> V { +) -> Result { println!("bases length: {:?}", bases.len()); let bigints = cfg_into_iter!(scalars) .map(|s| s.into_bigint()) .collect::>(); - let size = ark_std::cmp::min(bases.len(), bigints.len()); + // let size = ark_std::cmp::min(bases.len(), bigints.len()); + let size = bigints.len(); + println!("size: {:?}", size); let scalars = &bigints[..size]; // let scalars_and_bases_iter = scalars.iter().zip(bases).filter(|(s, _)| !s.is_zero()); @@ -82,8 +79,8 @@ fn precompute_msm( }) .collect(); - let total_sums = window_sums.iter().sum(); - total_sums + let total_sum = window_sums.iter().sum(); + Ok(total_sum) } pub fn benchmark_msm( @@ -104,9 +101,9 @@ where .map(|s| ScalarField::new(*s)) .collect::>(); let mut instance_total_duration = Duration::ZERO; - for _i in 0..iterations { + for _ in 0..iterations { let start = Instant::now(); - let _ = precompute_msm::(&points[..], &scalars[..]); + let _ = precompute_msm::(&points[..], &scalars[..]).unwrap(); instance_total_duration += start.elapsed(); } let instance_avg_duration = instance_total_duration / iterations; @@ -183,18 +180,84 @@ pub fn run_benchmark( #[cfg(test)] mod tests { use super::*; - - use crate::middleware::gpu_explorations::utils::precomputation::{ - deserialize_precomputed_points, precompute_points_from_instances, - serialize_precomputed_points, - }; use ark_serialize::Write; use std::fs::File; const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 5; - const UTILSPATH: &str = "mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; + + #[test] + fn test_msm_correctness_medium_sample() { + let dir = format!("{}/{}/{}x{}", preprocess::get_root_path(), UTILSPATH, 8, 5); + + // Check if the vectors have been generated + match preprocess::FileInputIterator::open(&dir) { + Ok(_) => { + println!("Vectors already generated"); + } + Err(_) => { + preprocess::gen_vectors(8, 5, &dir); + } + } + + // computing the precomputation factors + let size = 1 << 8; + let c = if size < 32 { + 3 + } else { + ln_without_floats(size) + 2 + }; + + let num_bit_of_scalar = ScalarField::MODULUS_BIT_SIZE as usize; + let precompute_factor = (num_bit_of_scalar + c - 1) / c; + + let benchmark_data = preprocess::FileInputIterator::open(&dir).unwrap(); + let instance_vec: Vec<_> = benchmark_data.collect(); + + // check precomputed points is generated + match preprocess::FileInputIterator::open_precomputed_point(&dir) { + Ok(_) => { + println!("Precomputed points already generated"); + } + Err(_) => { + let _ = precompute_points_from_instances( + instance_vec.clone().into_iter(), + 8, + 5, + precompute_factor as u32, + c as u32, + &dir, + ); + } + } + + let precomputed_instances = preprocess::FileInputIterator::open_precomputed_point(&dir).unwrap(); + let precomputed_instances: Vec<_> = precomputed_instances.collect(); + + for (i, (original_instance, precomputed_instance)) in instance_vec.iter().zip(precomputed_instances.iter()).enumerate() { + let original_points = &original_instance.0; + let scalars = &original_instance + .1 + .iter() + .map(|s| ScalarField::new(*s)) + .collect::>(); + + let precomputed_points = &precomputed_instance.0; + + let arkworks_msm = G::msm(&original_points[..], &scalars[..]).unwrap(); + let msm = precompute_msm::(&precomputed_points[..], &scalars[..]).unwrap(); + + // Compare results + assert_eq!(msm, arkworks_msm, "MSM computation mismatch for instance {}", i); + + println!( + "(pass) {}th instance of size 2^{} is correctly computed", + i, 8 + ); + } + } #[test] fn test_benchmark_msm() { @@ -261,6 +324,7 @@ mod tests { } #[test] + #[ignore] fn test_run_multi_benchmarks() { let output_path = format!( "{}/{}/{}_benchmark.txt", diff --git a/mopro-core/src/middleware/gpu_explorations/trapdoortech_zprize_msm/local_msm.rs b/mopro-msm/src/msm/trapdoortech_zprize_msm/local_msm.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/trapdoortech_zprize_msm/local_msm.rs rename to mopro-msm/src/msm/trapdoortech_zprize_msm/local_msm.rs diff --git a/mopro-core/src/middleware/gpu_explorations/trapdoortech_zprize_msm/mod.rs b/mopro-msm/src/msm/trapdoortech_zprize_msm/mod.rs similarity index 96% rename from mopro-core/src/middleware/gpu_explorations/trapdoortech_zprize_msm/mod.rs rename to mopro-msm/src/msm/trapdoortech_zprize_msm/mod.rs index d9e1327..b8b8fe7 100644 --- a/mopro-core/src/middleware/gpu_explorations/trapdoortech_zprize_msm/mod.rs +++ b/mopro-msm/src/msm/trapdoortech_zprize_msm/mod.rs @@ -105,8 +105,8 @@ mod tests { const INSTANCE_SIZE: u32 = 16; const NUM_INSTANCE: u32 = 5; - const UTILSPATH: &str = "../mopro-core/src/middleware/gpu_explorations/utils/vectors"; - const BENCHMARKSPATH: &str = "../mopro-core/gpu_explorations/benchmarks"; + const UTILSPATH: &str = "src/msm/utils/vectors"; + const BENCHMARKSPATH: &str = "benchmark_results"; #[test] fn test_benchmark_msm() { diff --git a/mopro-core/src/middleware/gpu_explorations/utils/benchmark.rs b/mopro-msm/src/msm/utils/benchmark.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/utils/benchmark.rs rename to mopro-msm/src/msm/utils/benchmark.rs diff --git a/mopro-core/src/middleware/gpu_explorations/utils/mod.rs b/mopro-msm/src/msm/utils/mod.rs similarity index 100% rename from mopro-core/src/middleware/gpu_explorations/utils/mod.rs rename to mopro-msm/src/msm/utils/mod.rs diff --git a/mopro-core/src/middleware/gpu_explorations/utils/precomputation.rs b/mopro-msm/src/msm/utils/precomputation.rs similarity index 98% rename from mopro-core/src/middleware/gpu_explorations/utils/precomputation.rs rename to mopro-msm/src/msm/utils/precomputation.rs index 8bf92d2..f5ad61e 100644 --- a/mopro-core/src/middleware/gpu_explorations/utils/precomputation.rs +++ b/mopro-msm/src/msm/utils/precomputation.rs @@ -1,7 +1,6 @@ -use crate::middleware::gpu_explorations::utils::preprocess::{self, Point}; +use crate::msm::utils::preprocess::{self, Point}; use ark_bn254::{Fr as ScalarField, G1Projective as G}; use ark_ec::Group; -use ark_ff::PrimeField; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use rayon::prelude::*; use std::fs::File; diff --git a/mopro-core/src/middleware/gpu_explorations/utils/preprocess.rs b/mopro-msm/src/msm/utils/preprocess.rs similarity index 99% rename from mopro-core/src/middleware/gpu_explorations/utils/preprocess.rs rename to mopro-msm/src/msm/utils/preprocess.rs index a4611df..8036194 100644 --- a/mopro-core/src/middleware/gpu_explorations/utils/preprocess.rs +++ b/mopro-msm/src/msm/utils/preprocess.rs @@ -259,7 +259,7 @@ pub fn get_root_path() -> String { let current_dir = std::env::current_dir().unwrap(); let mut current_dir = current_dir; loop { - if current_dir.ends_with("mopro") { + if current_dir.ends_with("mopro-msm") { break; } current_dir = current_dir.parent().unwrap().to_path_buf(); diff --git a/mopro-web/.gitignore b/mopro-web/.gitignore deleted file mode 100644 index 14deec9..0000000 --- a/mopro-web/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Dependencies -/node_modules - -# Production -/build - -# Generated files -.docusaurus -.cache-loader - -# Misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnp.* - -/.yarn \ No newline at end of file diff --git a/mopro-web/LICENSE b/mopro-web/LICENSE deleted file mode 100644 index d987f2e..0000000 --- a/mopro-web/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Mopro - -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/mopro-web/README.md b/mopro-web/README.md deleted file mode 100644 index 0c6c2c2..0000000 --- a/mopro-web/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Website - -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/mopro-web/babel.config.js b/mopro-web/babel.config.js deleted file mode 100644 index e00595d..0000000 --- a/mopro-web/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/mopro-web/blog/2024-04-24-first-blog-post.md b/mopro-web/blog/2024-04-24-first-blog-post.md deleted file mode 100644 index aad5978..0000000 --- a/mopro-web/blog/2024-04-24-first-blog-post.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -slug: first-blog-post -title: First Blog Post -authors: - name: CJ - title: Welcome to Mopro - url: https://github.com/zkmopro - image_url: https://github.com/wgao19.png -tags: [welcome] ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet \ No newline at end of file diff --git a/mopro-web/docs/FAQ.md b/mopro-web/docs/FAQ.md deleted file mode 100644 index 865bbc5..0000000 --- a/mopro-web/docs/FAQ.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -sidebar_position: 7 ---- - -# FAQ - -## What are the design goals of Mopro? - -1. Modularity -2. Developer-friendly -3. Performance -4. Multi-platform - -See one of the recent [talks](/docs/community) for more details. - -## What proof systems does Mopro support? - -Currently Circom/Groth16, but due to its modular architecture it is easy to add support for new proof systems. - -There's experimental support for Kimchi, a Plonkish proof system, that was done during a hackathon in this [PR](https://github.com/zkmopro/mopro/pull/34). - -There's a grantee working on adding Halo2 support. Please see the [Telegram group](https://t.me/zkmopro) for more information. - -We welcome people to contribute support for [more proof systems](https://github.com/zkmopro/mopro/issues/15). - -## What platforms does Mopro support? - -Mopro is multi-platform and aims to support as many platforms as possible. iOS, Android and Desktop (through Rust/CLI) are the main platforms supported. - -There's also support for Web, but this is more for convenience and won't give any performance improvements over what people usually do on web (right now). - -There's also very experimental React Native support [here](https://github.com/anon-aadhaar/anon-aadhaar-react-native/commit/d6443316200cd3e1f17ad2679458cc6e6e9fe1f2). We aim to make this easier to consume. - -We welcome people to contribute support for [more platforms](https://github.com/zkmopro/mopro/issues/16). - -## Is Mopro just for verifying proofs on mobile? - -Mopro is for both proving and verifying ZKPs on mobile. - -## Does Mopro run natively on a phone? - -For the most part, yes. The one exception is that we currently do some witness generation for Circom using WASM. We hope to get rid of this soon to be 100% native. - -See [this issue](https://github.com/zkmopro/mopro/issues/109) for more details. \ No newline at end of file diff --git a/mopro-web/docs/circom/android.md b/mopro-web/docs/circom/android.md deleted file mode 100644 index 545c6cc..0000000 --- a/mopro-web/docs/circom/android.md +++ /dev/null @@ -1,191 +0,0 @@ -# Android - -## Getting started with a new project - -1. Install `mopro-cli`. See [Getting Started](../getting-started#install-dependencies). -2. Create a new project - -```sh -mopro init --platforms android \ -cd mopro-example-app -``` - -3. Prepare circuits - -```sh -mopro prepare -``` - -4. Build the project - -```sh -mopro build --platforms android -``` - -5. Open the project in Android Studio - -```sh -open android -a Android\ Studio -``` - -## Getting started with exported bindings - -1. Install `mopro-cli`. See [Getting Started](../getting-started#install-dependencies). -2. Prepare circuits - -```sh -mopro prepare -``` - -3. Build the project - -```sh -mopro build --platforms android -``` - -4. Export bindings - -```sh -mopro export-bindings --platforms android --destination out -``` - -5. Add dependencies in `app/build.gradle.kts` - -```kotlin -dependencies { - ... - implementation("net.java.dev.jna:jna:5.13.0@aar") - ... -} -``` - -6. Sync gradle (shift+command+O) -7. Drag and drop folders.
- Move the `out/android/jniLibs/` folder into `app/src/main/jniLibs/`.
- Move the `out/android/uniffi/mopro/mopro.kts` file into `app/src/main/java/uniffi/mopro/mopro.kt`.
- ![android bindings](/img/android-bindings.png) -8. Use the generated `mopro` library by - -```kotlin -import uniffi.mopro.initializeMopro - -func initialize(){ - initializeMopro() -} -``` - -## Kotlin API - -### `MoproCircom` - -Initialize a `MoproCircom` object.
- -Usage: - -```kotlin -var moproCircom = MoproCircom() -``` - -### `initialize` - -Initializes the instance with the given `zkeyPath` and `wasmPath`. - -```kotlin -@Throws(MoproException::class) -fun `initialize`( - `zkeyPath`: String, - `wasmPath`: String, -) -``` - -Usage: - -```kotlin -moproCircom.initialize(zkeyPath, wasmPath) -``` - -### `generateProof` - -Generates a proof based on the provided circuit inputs. - -```kotlin -@Throws(MoproException::class) -fun `generateProof`(`circuitInputs`: Map>): GenerateProofResult -``` - -Usage: - -```kotlin -val inputs = mutableMapOf>() -inputs["a"] = listOf("3") -inputs["b"] = listOf("5") -var generateProofResult = moproCircom.generateProof(inputs) -``` - -### `verifyProof` - -Verifies the provided proof against the given inputs. - -```kotlin -@Throws(MoproException::class) -fun `verifyProof`( - `proof`: ByteArray, - `publicInput`: ByteArray, -): Boolean -``` - -Usage: - -```kotlin -var isValid = moproCircom.verifyProof( - generateProofResult.proof, - generateProofResult.inputs -) -``` - -### `generateProofStatic` - -Generates a proof based on the provided circuit inputs.
-:::warning -**Note: The function is different from [`generateProof`](#generateproof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```kotlin -@Throws(MoproException::class) -fun `generateProofStatic`(`circuitInputs`: Map>): GenerateProofResult -``` - -### `verifyProofStatic` - -Verifies the provided proof against the given inputs.
-:::warning -**Note: The function is different from [`verifyProof`](#verifyproof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```kotlin -@Throws(MoproException::class) -fun `verifyProofStatic`( - `proof`: ByteArray, - `publicInput`: ByteArray, -): Boolean -``` - -### `toEthereumInputs` - -Convert public inputs data to a string array. - -```kotlin -fun `toEthereumInputs`(`inputs`: ByteArray): List -``` - -### `toEthereumProof` - -Convert proof data to a proof structure which can be submitted to a verifier contract. - -```kotlin -fun `toEthereumProof`(`proof`: ByteArray): ProofCalldata -``` diff --git a/mopro-web/docs/circom/configuration.md b/mopro-web/docs/circom/configuration.md deleted file mode 100644 index 813f311..0000000 --- a/mopro-web/docs/circom/configuration.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Mopro Configuration - -This config file is best used together with `mopro-cli`. - -By creating a `toml` configuration file you can specify what build settings you want to use. Example is provided in `config-example.toml`: - -```toml -# mopro-config.toml - -[build] -# For iOS device_type can be x86_64, simulator, device -ios_device_type = "device" # Options: x86_64, simulator, device -# For Android device_type can be x86_64, x86, arm, arm64 -android_device_type = "arm64" # Options: x86_64, x86, arm, arm64 - -# debug is for Rust library to be in debug mode and release for release mode -# We recommend release mode by default for performance -build_mode = "release" # Options: debug, release - -[circuit] -# multiplier2 -adapter = "circom" -dir = "core/circuits/multiplier2" -name = "multiplier2" -ptau = "02" # ptau to use for trusted setup of circuit, "01" to "27" - -[dylib] -# NOTE: Dylib support is experimental and requires some fiddling in iOS -# See https://github.com/zkmopro/mopro/pull/37 and https://github.com/zkmopro/mopro/pull/38 -use_dylib = false # Options: true, false -name = "multiplier2.dylib" # Name of the dylib file, only used if use_dylib is true - -[witness] -# Note: circom-witness-rs is experimental -# See https://github.com/zkmopro/mopro/issues/32 for updates -# Only works for keccak256_256_test circuit now -use_native_witness_generation = false # Options: true, false -``` - -## `build` options - -### `ios_device_type` - -- `x86_64` -- `simulator` -- `device` - -### `android_device_type` - -- `x86_64` -- `x86` -- `arm` -- `arm64` - -### `build_mode` - -- `debug` -- `release` - -## `circuit` options - -### `adapter` - -Now we support the following adapters: - -- `circom` -- `halo2` - -### `dir` - -- path to the circuit directory
- e.g. `core/circuits/multiplier2` - -### `name` - -- the name of the circuit
- e.g. `multiplier2` - -### `ptau` - -- ptau is to used for trusted setup
- e.g. `02` - -## `dylib` options (experimental) - -:::warning -Dylib support is experimental and requires some fiddling in iOS.
-See https://github.com/zkmopro/mopro/pull/37 and https://github.com/zkmopro/mopro/pull/38 -::: - -### `use_dylib` - -- `true` -- `false` - -## `witness` options (experimental) - -:::warning -circom-witness-rs is experimental.
-https://github.com/zkmopro/mopro/issues/32 for updates. -::: - -### `use_native_witness_generation` - -- `true` -- `false` diff --git a/mopro-web/docs/circom/core-api.md b/mopro-web/docs/circom/core-api.md deleted file mode 100644 index 183f433..0000000 --- a/mopro-web/docs/circom/core-api.md +++ /dev/null @@ -1,105 +0,0 @@ -# Core API - -## `CircomState` - -This object stores the states required to generate a ZK proof. - -Example of usage: - -```rust -// Instantiate CircomState -let mut circom_state = CircomState::new(); - -// Initialize with keys -let wasm_path = "./multiplier2.wasm"; -let zkey_path = "./multiplier2_final.zkey"; -let setup_res = circom_state.initialize(zkey_path, wasm_path); - -// Prepare inputs -let mut inputs = HashMap::new(); -let a = 3; -let b = 5; -inputs.insert("a".to_string(), vec![BigInt::from(a)]); -inputs.insert("b".to_string(), vec![BigInt::from(b)]); - -// Proof generation -let generate_proof_res = circom_state.generate_proof(inputs); - -// Proof verification -let (serialized_proof, serialized_inputs) = generate_proof_res.unwrap(); -let verify_res = circom_state.verify_proof(serialized_proof, serialized_inputs); -``` - -### `new` - -Creates and returns a new instance of the struct. - -```rust -pub fn new() -> Self -``` - -### `initialize` - -Initializes the instance with the given `zkey_path` and `wasm_path`. - -```rust -pub fn initialize( - &mut self, - zkey_path: &str, - wasm_path: &str -) -> Result<(), MoproError> -``` - -### `generate_proof` - -Generates a proof based on the provided circuit inputs. - -```rust -pub fn generate_proof( - &mut self, - inputs: CircuitInputs, -) -> Result<(SerializableProof, SerializableInputs), MoproError> -``` - -### `verify_proof` - -Verifies the provided proof against the given inputs. - -```rust -pub fn verify_proof( - &self, - serialized_proof: SerializableProof, - serialized_inputs: SerializableInputs, -) -> Result -``` - -## `generate_proof_static` - -Generates a proof based on the provided circuit inputs.
-:::warning -**Note: The function is different from [`generate_proof`](#generate_proof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```rust -pub fn generate_proof_static( - inputs: CircuitInputs, -) -> Result<(SerializableProof, SerializableInputs), MoproError> -``` - -## `verify_proof_static` - -Verifies the provided proof against the given inputs.
-:::warning -**Note: The function is different from [`verify_proof`](#verify_proof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```rust -pub fn verify_proof_static( - serialized_proof: SerializableProof, - serialized_inputs: SerializableInputs, -) -> Result -``` diff --git a/mopro-web/docs/circom/ios.md b/mopro-web/docs/circom/ios.md deleted file mode 100644 index a14ca23..0000000 --- a/mopro-web/docs/circom/ios.md +++ /dev/null @@ -1,192 +0,0 @@ -# iOS - -## Getting started with a new project - -1. Install `mopro-cli`. See [Getting Started](../getting-started#install-dependencies). -2. Create a new project - -```sh -mopro init --platforms ios \ -cd mopro-example-app -``` - -3. Prepare circuits - -```sh -mopro prepare -``` - -4. Build the project - -```sh -mopro build --platforms ios -``` - -5. Open the project in xcode - -```sh -open ios/ExampleApp/ExampleApp.xcworkspace -``` - -## Getting started with exported bindings - -1. Install `mopro-cli`. See [Getting Started](../getting-started#install-dependencies). -2. Prepare circuits - -```sh -mopro prepare -``` - -3. Build the project - -```sh -mopro build --platforms ios -``` - -4. Export bindings - -```sh -mopro export-bindings --platforms ios --destination out -``` - -5. Create an `xcframework` with `xcodebuild` - -e.g. for simulator - -```sh -xcodebuild -create-xcframework \ - -library out/ios/aarch64-apple-ios-sim/release/libmopro_ffi.a \ - -headers out/ios/Bindings \ - -output "out/ios/Mopro.xcframework" -``` - -e.g. for both simulator and device
-Please specify `ios_device_type` in [mopro-config.toml](configuration) to build for both `device` and `simulator`. - -```sh -xcodebuild -create-xcframework \ - -library out/ios/aarch64-apple-ios-sim/release/libmopro_ffi.a \ - -headers out/ios/Bindings \ - -library out/ios/aarch64-apple-ios/release/libmopro_ffi.a \ - -headers out/ios/Bindings \ - -output "out/ios/Mopro.xcframework" -``` - -:::info -Ref: [Building an iOS App with Rust Using UniFFI](https://forgen.tech/en/blog/post/building-an-ios-app-with-rust-using-uniffi) -::: - -6. Import both the XCFramework `Mopro.xcframework` and the Swift file bindings `Bindings/mopro.swift` files into your project (drag and drop should work). -7. Use `moproFFI` in swift like - -```swift -import moproFFI - -... -try initializeMopro() -... -``` - -## Swift API - -### `MoproCircom` - -Initialize a `MoproCircom` object.
- -Usage: - -```swift -let moproCircom = MoproCircom() -``` - -### `initialize` - -Initializes the instance with the given `zkeyPath` and `wasmPath`. - -```swift -func initialize(zkeyPath: String, wasmPath: String) throws -``` - -Usage: - -```swift -try moproCircom.initialize(zkeyPath: zkeyPath, wasmPath: wasmPath) -``` - -### `generateProof` - -Generates a proof based on the provided circuit inputs. - -```swift -func generateProof(circuitInputs: [String: [String]]) throws -> GenerateProofResult -``` - -Usage: - -```swift -var inputs = [String: [String]]() -let a = 3 -let b = 5 -inputs["a"] = [String(a)] -inputs["b"] = [String(b)] -let generateProofResult = try moproCircom.generateProof(circuitInputs: inputs) -``` - -### `verifyProof` - -Verifies the provided proof against the given inputs. - -```swift -func verifyProof(proof: Data, publicInput: Data) throws -> Bool -``` - -Usage: - -```swift -let isValid = try moproCircom.verifyProof( - proof: generateProofResult.proof, - publicInput: generateProofResult.inputs -) -``` - -### `generateProofStatic` - -Generates a proof based on the provided circuit inputs.
-:::warning -**Note: The function is different from [`generateProof`](#generateproof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```swift -func generateProofStatic(circuitInputs: [String: [String]]) throws -> GenerateProofResult -``` - -### `verifyProofStatic` - -Verifies the provided proof against the given inputs.
-:::warning -**Note: The function is different from [`verifyProof`](#verifyproof).**
-In this function, the zkey and wasm are precompiled during `cargo build`.
-You can specify the [mopro-config.toml](configuration) to build the default circuits. -::: - -```swift -func verifyProofStatic(proof: Data, publicInput: Data) throws -> Bool -``` - -### `toEthereumInputs` - -Convert public inputs data to a string array. - -```swift -func toEthereumInputs(inputs: Data) -> [String] -``` - -### `toEthereumProof` - -Convert proof data to a proof structure which can be submitted to a verifier contract. - -```swift -func toEthereumProof(proof: Data) -> ProofCalldata -``` diff --git a/mopro-web/docs/community.md b/mopro-web/docs/community.md deleted file mode 100644 index bc66a14..0000000 --- a/mopro-web/docs/community.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Community and Talks - -Join the Telegram group [here](https://t.me/zkmopro). This is the main place where coordination around development takes places. - -## Talks - -- Talk by @vivianjeng at [IC3 Camp 2024](https://www.initc3.org/events/2024-06-10-ic3-blockchain-camp-2024) (New York City, June 2024): [Slides](https://docs.google.com/presentation/d/1UoHA2C-SB7qmmIcKBA8if5pCtzU4AbdnH0EX59TQcoE/edit?usp=sharing) (no video) -- Talk by @vivianjeng at [Signature Singularity Residency](https://sigsing.com/) (Osaka, May 2024): [Video](https://www.youtube.com/live/rT7zLiOYX8s?si=Hy3cxL1Kg8xxX7Ti&t=5260), [Slides](https://docs.google.com/presentation/d/1r4hqV7jPTYf2WjtAzah-w9r5LKbf_-Se9t0HPWCLAs4/edit?usp=sharing) -- Talk by @oskarth at [ZK Summit 11](https://www.zksummit.com/) (Athens, April 2024): [Video](https://www.youtube.com/watch?v=06CLMAuEXE4), [Slides](https://hackmd.io/TNZCDbu-T9e6lx8_Wft5ww?view). -- Workshop by @oskarth and @vivianjeng at ZK Day (Taipei, March 2024): [Video](https://www.youtube.com/watch?v=K-h7blwnXbQ). -- Talk by @oskarth at [ETHTaipei](https://ethtaipei.org/) (Taipei, March 2024): [Slides](https://hackmd.io/@oskarth/S1yGjF8C6#), [Video](https://www.youtube.com/live/JB6zP9enkbc?si=04xz9XRLkChNiupw&t=14708) -- Talk by @oskarth at [ProgCrypto/Devconnect](https://progcrypto.org/) (Istanbul, November 2023): [Slides](https://docs.google.com/presentation/d/1afIEgm8oYRvteWxUd04CcMOxChAiHaD55d5AKd0RkvY/edit#slide=id.g284ac8f47d5_2_24) (no video) - - -## Contribute - -Contributions of all kinds welcome! Please see [open GH issues](https://github.com/zkmopro/mopro/issues). Also feel free to join the Telegram chat. - -You can also check out [good first issues](https://github.com/zkmopro/mopro/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). - -## Acknowledgements - -This work was initially sponsored by a joint grant from [PSE](https://pse.dev/) and [0xPARC](https://0xparc.org/). It is currently incubated by PSE. \ No newline at end of file diff --git a/mopro-web/docs/getting-started.md b/mopro-web/docs/getting-started.md deleted file mode 100644 index 8e8e216..0000000 --- a/mopro-web/docs/getting-started.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Getting Started - -We recommend you use [mopro-cli](/docs/mopro-cli) to create and maintain your application. Here's how you can get started with your example app in a few minutes. - -You can also watch this short (~5m) [tutorial](https://www.loom.com/share/6ff382b0497c47aea9d0ef8b6e790dd8). - -## Install dependencies - -First, make sure you've installed the [prerequisites](/docs/prerequisites). - -Then, run the following commands: - -1. Clone the mopro repo - -```sh -git clone --branch v0.0.1 https://github.com/zkmopro/mopro.git -``` - -2. Go to your newly cloned checkout - -```sh -cd mopro -``` - -3. Install mopro-cli locally - -```sh -(cd mopro-cli && cargo install --path .) -``` - -4. Set `MOPRO_ROOT` (replace with path to your git checkout of mopro) - -```sh -export MOPRO_ROOT=$(PWD) -``` - -5. Install `mopro` dependencies - -```sh -mopro deps -``` - -## Create a project - -Create and initialize a project: - -1. Initialize a project - This will create a new project in your current directory - -```sh -mopro init --platforms ios android -``` - -2. Go to your project folder - -```sh -cd mopro-example-app -``` - -## Configure mopro settings - -You may adapt [`mopro-config.toml`](circom/configuration.md) to your needs. For example, if you already have a Circom project you can use that. - -Prepare your circuit artifacts: - -```sh -mopro prepare -``` - -This only has to be done once when changing the circuit. - -## Build, test and run your project - -Depending on what platforms you are targetting, you can run the following commands: - -- Build the project - - ```sh - mopro build - ``` - -- Run end-to-end test (in Rust only) - - ```sh - mopro test - ``` - -## iOS - -- Build the project for iOS - - ```sh - mopro build --platforms ios - ``` - -- Open in Xcode to run on simulator - - ```sh - open ios/ExampleApp/ExampleApp.xcworkspace - ``` - - Use `command`+`U` to run tests. - -## Android - -- Build the project for Android - - ```sh - mopro build --platforms android - ``` - -- Open in Android Studio to run on simulator - - ```sh - open android -a Android\ Studio - ``` - - Use `^R` (`control`+`R`) to execute a simulator. - -> See [mopro-cli](/docs/mopro-cli) for more details on usage. -> Edit [mopro configuration](/docs/circom/configuration) to build for device or build for other circuits. diff --git a/mopro-web/docs/halo2/configuration.md b/mopro-web/docs/halo2/configuration.md deleted file mode 100644 index d0dfbcb..0000000 --- a/mopro-web/docs/halo2/configuration.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Mopro Configuration - -This config file is best used together with `mopro-cli`. - -By creating a `toml` configuration file you can specify what build settings you want to use. Example is provided in `config-example.toml`: - -```toml -# mopro-config.toml - -[build] -# For iOS device_type can be x86_64, simulator, device -ios_device_type = "device" # Options: x86_64, simulator, device -# For Android device_type can be x86_64, x86, arm, arm64 -android_device_type = "arm64" # Options: x86_64, x86, arm, arm64 - -# debug is for Rust library to be in debug mode and release for release mode -# We recommend release mode by default for performance -build_mode = "release" # Options: debug, release - -[circuit] -# Halo2 Fibonacci -adapter = "halo2" # Proving system options: circom (default), halo2 -dir = "core/circuits/halo2-fibonacci" # Directory of the circuit -name = "fibonacci" # Name of the circuit -ptau = 4 - -[dylib] -# NOTE: Dylib support is experimental and requires some fiddling in iOS -# See https://github.com/zkmopro/mopro/pull/37 and https://github.com/zkmopro/mopro/pull/38 -use_dylib = false # Options: true, false -name = "multiplier2.dylib" # Name of the dylib file, only used if use_dylib is true - -[witness] -# Note: circom-witness-rs is experimental -# See https://github.com/zkmopro/mopro/issues/32 for updates -# Only works for keccak256_256_test circuit now -use_native_witness_generation = false # Options: true, false -``` - -## `build` options - -### `ios_device_type` - -- `x86_64` -- `simulator` -- `device` - -### `android_device_type` - -- `x86_64` -- `x86` -- `arm` -- `arm64` - -### `build_mode` - -- `debug` -- `release` - -## `circuit` options - -### `adapter` - -Now we support the following adapters: - -- `circom` -- `halo2` - -### `dir` - -- path to the circuit directory
- e.g. `core/circuits/halo2-fibonacci` - -### `name` - -- the name of the circuit
- e.g. `fibonacci` - -### `ptau` - -- ptau is to used for trusted setup
- e.g. `02` diff --git a/mopro-web/docs/halo2/introduction.md b/mopro-web/docs/halo2/introduction.md deleted file mode 100644 index c278d30..0000000 --- a/mopro-web/docs/halo2/introduction.md +++ /dev/null @@ -1,23 +0,0 @@ -### Halo2 configuration - -We currently support Halo2 circuits in an experimental stage. To use Halo2, you need to set the `adapter` to `halo2` in the `mopro-config.toml` file. - -```toml -[circuit] -adapter = "halo2" # Options: circom, halo2 -dir = "mopro-core/examples/halo2/fibonacci" # Directory of the circuit -name = "fibonacci" # Name of the circuit -``` - -The `dir` should point to the directory where the Halo2 circuit is located. The `name` should be the name of the circuit. - -Note that currently the Halo2 circuit **must** be a cargo crate, with the package name hardcoded to `halo2-circuit`. This is due to us swapping out the default implementation of the `halo2-ciurcuit` crate with the user's circuit during the build process. -This is done using the `build.rs` script in the `mopro-core` crate, which changes the path to the default `examples/halo2/fibonacci` to `$dir`. This also requires the name of the package to be `halo2-circuit` for the substitution to work. - -Additionally, the `halo2-circuit` crate **must** implement and expose three items, which you can see in the `mopro-core/examples/halo2/fibonacci/src/lib.rs`: - -- `Circuit` - the struct that represents the circuit -- `prove` - the function that generates the proof -- `verify` - the function that verifies the proof - -This is then used by the `mopro-core` crate to generate the proof and verify it. diff --git a/mopro-web/docs/intro.md b/mopro-web/docs/intro.md deleted file mode 100644 index 784de4d..0000000 --- a/mopro-web/docs/intro.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -Mopro makes client-side proving simple. You can think of it as a toolkit for ZK app development. It primarily focuses on running natively mobile, but it works for any platform. - -How? Mopro connects different adapters with different platforms. You can think of an adapter as a way to use a library with some proof system and performance profile. Because Mopro takes care of hooking up your circuit to some library, and generating bindings for use on multiple platforms, you can focus on what you do best: ZK app development. - -![mopro adapters and platforms](/img/roadmap.png) - -Note that above is a work in progress, and the dashed lines indicate things that are still experimental and/or in an an early stage. - -If you just want to get started using mopro, see [getting started](/docs/getting-started). - -## Overview - -Mopro consists of a set of libraries and utilities. The following subprojects are including in the [mopro monorepo](https://github.com/zkmopro/mopro). - -Primary libraries and utilities of interest: - -- `mopro-cli` - core Rust CLI util. -- `mopro-core` - core mobile Rust library. -- `mopro-ffi` - wraps `mopro-core` and exposes UniFFI bindings. -- `templates/mopro-example-app` - example multi-platform app template. -- `ark-zkey` - helper utility to make zkey more usable and faster in arkworks. - -Secondary subprojects: - -- `web-prover` - Prove example circuits through a browser, used for benchmarking. -- `scripts` - various helper scripts for `mopro-cli` and testing. -- `mopro-web` - Mopro website. -- `research` - Ongoing research, e.g. GPU explorations. - -## Architecture - -The following illustration shows how mopro and its components fit together into the wider ZKP ecosystem: - -![mopro architecture](/img/architecture.png) diff --git a/mopro-web/docs/mopro-cli.md b/mopro-web/docs/mopro-cli.md deleted file mode 100644 index d13f950..0000000 --- a/mopro-web/docs/mopro-cli.md +++ /dev/null @@ -1,237 +0,0 @@ -# mopro-cli - -`mopro` is a CLI tool for client-side proving of Zero Knowledge Proofs. It simplifies the process of initializing, building, updating, and testing projects across different platforms and configurations. - -Think of it as Foundry for client-side proving. - -## Installation - -To use `mopro`, you need to have Rust and Cargo installed on your system. You can install them from [the official Rust website](https://www.rust-lang.org/learn/get-started). - -Run `cargo install --path .` to install the `mopro` CLI util. - -## Usage - -Here are the basic commands of `mopro`: - -- `mopro init`: Initialize a new project with support for multiple platforms. - - - options: - ```sh - --adapter [default: circom] - --platforms ... [default: core] - --project-name [default: mopro-example-app] - ``` - -- `mopro deps`: Install required dependencies. -- `mopro prepare`: Prepare and build circuit and its artifacts. - - options: - ```sh - --config [default: mopro-config.toml] - ``` -- `mopro build`: Build the project for specified platforms. - - - options: - ```sh - --config [default: mopro-config.toml] - --adapter [default: circom] - --platforms ... [default: core] - ``` - -- `mopro test`: Run tests for specific platform and test cases. - - options: - ```sh - --config [default: mopro-config.toml] - --adapter [default: circom] - --platforms ... [default: core] - --test-case - ``` -- `mopro export-bindings`: Export platform bindings to some other directory. - - - options: - ```sh - --platforms ... [default: ios] - -d, --destination - ``` - -(May be added soon: `mopro update`: Update bindings with new API for specified platforms.) - -## Prerequisites - -To use `mopro-cli`, make sure you have installed the [prerequisites](/docs/prerequisites). - -## Examples - -### Basic example - -Initialize, build and test a circuit with Rust bindings: - -- Set `MOPRO_ROOT` - - ```sh - export MOPRO_ROOT=/Users/user/repos/github.com/zkmopro/mopro - ``` - -- Install dependencies - - ```sh - mopro deps - ``` - -- Default to circom adapter and core Rust bindings - - ```sh - mopro init - ``` - -- Go to the newly created directory - - ```sh - cd mopro-example-app - ``` - -- Prepare circuit artifacts - - ```sh - mopro prepare - ``` - -- Build the project - - ```sh - mopro build - ``` - -- Run end-to-end-test - - ```sh - mopro test - ``` - -### iOS - -Initialize and build an app with iOS support. - -```sh -mopro init --platforms ios -cd mopro-example-app -mopro prepare -mopro build --platforms ios - -# Open project in XCode -open ios/ExampleApp/ExampleApp.xcworkspace - -# Currently testing only available for Rust bindings, -# Can run iOS tests from newly created Xcode project -mopro test -``` - -### Android - -Initialize and build an app with Android support. - -```sh -mopro init --platforms android -cd mopro-example-app -mopro prepare -mopro build --platforms android - -# Open android project in Android Studio -open android -a Android\ Studio -``` - -### Web - -Initialize and build a web app. - -```sh -mopro init --platforms web -cd mopro-example-app -mopro prepare -mopro build --platforms web -``` - -Open web project directory and run frontend locally. - -```sh -cd web -npm install -npm run dev -``` - -### Exporting bindings - -To export bindings to a different directory: - -`mopro export-bindings --destination --platforms ` - -This will the following files, assuming they've been built, to the destination directory: - -``` -├── android -│ ├── jniLibs -│ │ └── arm64-v8a -│ │ └── libuniffi_mopro.so -│ └── uniffi -│ └── mopro -│ └── mopro.kt -└── ios - ├── Bindings - │ ├── module.modulemap - │ ├── mopro.swift - │ └── moproFFI.h - └── aarch64-apple-ios-sim - └── release - └── libmopro_ffi.a -``` - -#### Use the bindings in iOS - -- Create a XCFramework with `xcodebuild` - ```sh - xcodebuild -create-xcframework \ - -library /ios/aarch64-apple-ios-sim/release/libmopro_ffi.a \ - -headers /ios/Bindings \ - -output "/ios/Mopro.xcframework" - ``` -- Import both the XCFramework `Mopro.xcframework` and the Swift file bindings `Bindings/mopro.swift` files into your project (drag and drop should work). -- Use moproFFI in swift like - - ```swift - import moproFFI - - ... - try initializeMopro() - ... - ``` - -> Reference: https://forgen.tech/en/blog/post/building-an-ios-app-with-rust-using-uniffi - -#### Use the bindings in Android - -- Add dependency in `/app/build.gradle.kts` - ```kts - dependencies { - ... - implementation("net.java.dev.jna:jna:5.13.0@aar") - ... - } - ``` -- Sync gradle -- Move the `/android/jniLibs/` folder to `app/src/main/` -- Move the `/android/uniffi/` folder to `app/src/main/java/` -- Use moproFFI in kotlin like - - ```kotlin - import uniffi.mopro.initializeMopro - - ... - initializeMopro() - ... - ``` - - > Reference: https://sal.dev/android/intro-rust-android-uniffi/ - -## Contributing - -Contributions to `mopro` are welcome. Please feel free to submit issues and pull requests. diff --git a/mopro-web/docs/mopro-core.md b/mopro-web/docs/mopro-core.md deleted file mode 100644 index 8b9db35..0000000 --- a/mopro-web/docs/mopro-core.md +++ /dev/null @@ -1,72 +0,0 @@ -# mopro-core - -Core mobile Rust library. For FFI, see `mopro-ffi` which is a thin wrapper for exposing UniFFI bindings around this library. - -## Overview - -TBD. - -## Examples - -Run `cargo run --example circom`. Also see `examples/circom/README.md` for more information. - -## Build dylib - -Experimental support. - -Turns `.wasm` file into a dynamic library (`.dylib`). - -Run: - -`cargo build --features dylib` - -After that you'll see location of the dylib file: - -``` -warning: Building dylib for aarch64-apple-darwin -warning: Dylib location: /Users/user/repos/github.com/zkmopro/mopro/mopro-core/target/debug/aarch64-apple-darwin/keccak256.dylib -``` - -Right now this is hardcoded for `rsa`. - -Note that: - -- It has to be built for the right architecture -- Have to run `install_name_tool` to adjust install name -- Run `codesign` to sign dylib for use on iOS - -### Script - -- Add third argument `dylib` -- Add forth argument with name of dylib, e.g. `rsa` if you want `rsa.dylib` - -`./scripts/update_bindings.sh device release dylib rsa` - -Note that `APPLE_SIGNING_IDENTITY` must be set. - -## To use ark-zkey - -Experimental support for significantly faster zkey loading. See `../ark-zkey` README for how to build arkzkey. - -## To run msm benchmark report on laptop - -`cargo run --release --features gpu-benchmarks --package mopro-core --bin generate_benchmark_report` - -The report will be in `mopro-core/benchmarks/gpu_explorations/msm_bench_rust_laptop.csv`. - -## To use [circom-witness-rs](https://github.com/philsippl/circom-witness-rs) (Experimental) - -- Set - ```toml - [witness] - use_native_witness_generation = true - ``` - in `config.toml` file -- Or build witness with - ```sh - WITNESS_CPP= cargo build --features build-native-witness --release - ``` - Test with - ```sh - cargo test --features calc-native-witness - ``` diff --git a/mopro-web/docs/mopro-ffi.md b/mopro-web/docs/mopro-ffi.md deleted file mode 100644 index d28429e..0000000 --- a/mopro-web/docs/mopro-ffi.md +++ /dev/null @@ -1,71 +0,0 @@ -# mopro-ffi - -Thin wrapper around `mopro-core`, exposes UniFFI bindings to be used by `rust-ios`, etc. - -## Overview - -TBD. - -## Development - -### Prerequisites - -1. Ensure you have Rust installed -2. Add platform targets `rustup target add x86_64-apple-ios aarch64-apple-ios aarch64-apple-ios-sim` -3. Install `uniffi-bindgen` locally with `cargo install --bin uniffi-bindgen --path .` -4. In order to locally run the bindings tests, you will need - - Kotlin: - - `kotlinc`, the [Kotlin command-line compiler](https://kotlinlang.org/docs/command-line.html). - - `ktlint`, the [Kotlin linter used to format the generated bindings](https://ktlint.github.io/). - - The [Java Native Access](https://github.com/java-native-access/jna#download) JAR downloaded and its path - added to your `$CLASSPATH` environment variable. - - Swift: - - `swift` and `swiftc`, the [Swift command-line tools](https://swift.org/download/). - - The Swift `Foundation` package. - -### Platforms supported - -Currently iOS is the main target, but Android will soon follow. PRs welcome. - -### Building - -Run `make` to build debug and release static libraries for supported platforms. - -### Generate UniFFI bindings - -The following command generates Swift bindings: - -`uniffi-bindgen generate src/mopro.udl --language swift --out-dir target/SwiftBindings` - -## Test bindings - -To test bindings: - -`cargo test --test test_generated_bindings` - -To test bindings in release mode without warning: - -`cargo test --test test_generated_bindings --release 2>/dev/null` - -## Generate MSM benchmark report in swift on laptop - -1. Comment `default=[]` and uncomment `default=["gpu-benchmarks"]` to enable `gpu-benchmarks` feature flag -2. run `RUSTFLAGS="-C opt-level=3" cargo test --test test_generated_bindings --release` -3. The benchmark result will be shown in the console log - -![msm benchmarks of time (rust vs. swift)](https://hackmd.io/_uploads/BkxRMMtca.png) - -The above report was conducted on an M1 Pro MacBook Pro. - -For more information, read this report we have completed, which compares the time performance of MSM running in rust and swift. - -## To use [circom-witness-rs](https://github.com/philsippl/circom-witness-rs) (Experimental) - -1. Comment `default=[]` and uncomment `default = ["calc-native-witness"]` to enable `calc-native-witness` feature flag -2. Test with - ```sh - # Run all tests - cargo test --features calc-native-witness - # Run bindings tests - cargo test --test test_generated_bindings --features calc-native-witness - ``` diff --git a/mopro-web/docs/performance.md b/mopro-web/docs/performance.md deleted file mode 100644 index 90d8fbc..0000000 --- a/mopro-web/docs/performance.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Performance and Benchmarks - -Preliminary benchmarks on an iPhone 14 Max Pro: - -- Keccak256 (150k constraints): 1.5s - - ~x10-20 faster vs comparable circuit in browser -- anon-aadhaar / RSA Verify: ~6.5s - - ~5s for witness generation (still in WASM), ~2s prover time - - 80% of time on witness generation - - ~x10 faster vs browser on phone -- Bottlenecks: loading zkey and wasm witness generation - -See [Project MoPerf results](https://hackmd.io/5ItB2D50QcavF18cWIrmfQ?view=#tip1) for more benchmarks. \ No newline at end of file diff --git a/mopro-web/docs/prerequisites.md b/mopro-web/docs/prerequisites.md deleted file mode 100644 index f179288..0000000 --- a/mopro-web/docs/prerequisites.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Prerequisites - -Depending on what platforms and adapters you use, there are several prerequisites to install before getting started. - -- General - - [Rust](https://www.rust-lang.org/learn/get-started) -- Circom - - [circom](https://docs.circom.io/) - - [snarkjs](https://github.com/iden3/snarkjs) -- iOS - - [Xcode](https://developer.apple.com/xcode/) - - [CocoaPods](https://cocoapods.org/) -- Android - - [Android Studio](https://developer.android.com/studio) - - Also see [configuration](#android-configuration) below - -## Android configuration - -Some additional configuration is required for Android. - -First, install the latest SDK. In Android Studio, go to `SDK Manager > SDK Tools` and install `NDK (Side by Side)` (see [Android Developer site](https://developer.android.com/studio/projects/install-ndk#default-version)). - -After that, set the following environment variables: - -1. Export `$ANDROID_HOME` and change `{USER_NAME}` to your username - -```sh -export ANDROID_HOME="/Users/{USER_NAME}/Library/Android/sdk" -``` - -2. Locate which NDK version you have - -```sh -ls $ANDROID_HOME/ndk # => 26.1.10909125 -``` - -3. Set it to your `NDK_PATH` environment variable - -```sh -NDK_PATH=$ANDROID_HOME/ndk/26.1.10909125 -``` - -> Reference: [Running Rust on Android with UniFFI](https://sal.dev/android/intro-rust-android-uniffi/). diff --git a/mopro-web/docusaurus.config.ts b/mopro-web/docusaurus.config.ts deleted file mode 100644 index d7a16a3..0000000 --- a/mopro-web/docusaurus.config.ts +++ /dev/null @@ -1,129 +0,0 @@ -import type { Config } from '@docusaurus/types'; -import type * as Preset from '@docusaurus/preset-classic'; - -const config: Config = { - title: 'Mopro', - tagline: 'Making client-side proving on mobile simple.', - favicon: '/img/logo_sm.svg', - url: 'https://zkmopro.org', - baseUrl: '/', - organizationName: 'zkmopro', - projectName: 'mopro', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - presets: [ - [ - 'classic', - { - docs: { - sidebarPath: './sidebars.ts', - editUrl: - 'https://github.com/zkmopro/mopro/tree/main/mopro-web', - }, - blog: { - showReadingTime: true, - editUrl: - 'https://github.com/zkmopro/mopro/tree/main/mopro-web', - }, - theme: { - customCss: './src/css/custom.css', - }, - } satisfies Preset.Options, - ], - ], - - themeConfig: { - colorMode: { - defaultMode: 'dark', - disableSwitch: true, - respectPrefersColorScheme: false, - }, - prism: { - additionalLanguages: ['powershell', 'bash', 'toml'], - }, - image: 'img/logo_title.svg', - navbar: { - style: 'dark', - logo: { - alt: 'Mopro Logo', - src: '/img/logo_title.svg', - width: '325', - height: '80', - }, - items: [ - { - type: 'docSidebar', - sidebarId: 'docsSidebar', - position: 'right', - label: 'Docs', - }, - { to: '/blog', label: 'Blog', position: 'right' }, - { - type: 'html', - position: 'right', - value: - `
` - - }, - ], - }, - footer: { - links: [ - { - title: 'Resources', - items: [ - { - html: - `` - }, - { - label: 'Blog', - to: '/blog', - }, - { - label: 'Documentation', - to: '/docs/intro', - }, - ], - }, - { - title: 'Community', - items: [ - { - html: - `` - }, - { - html: - `` - }, - ], - }, - ], - logo: { - alt: 'Mopro Logo', - src: 'img/logo_lg.svg', - }, - copyright: `Copyright © ${new Date().getFullYear()} Mopro`, - }, - } satisfies Preset.ThemeConfig, -}; - -export default config; diff --git a/mopro-web/package.json b/mopro-web/package.json deleted file mode 100644 index 50b3be7..0000000 --- a/mopro-web/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "my-website", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc" - }, - "dependencies": { - "@docusaurus/core": "3.2.1", - "@docusaurus/preset-classic": "3.2.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.1", - "prismjs": "^1.29.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.2.1", - "@docusaurus/tsconfig": "3.2.1", - "@docusaurus/types": "3.2.1", - "typescript": "~5.2.2" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 3 chrome version", - "last 3 firefox version", - "last 5 safari version" - ] - }, - "engines": { - "node": ">=18.0" - }, - "packageManager": "yarn@3.6.3" -} diff --git a/mopro-web/sidebars.ts b/mopro-web/sidebars.ts deleted file mode 100644 index cf0a2ce..0000000 --- a/mopro-web/sidebars.ts +++ /dev/null @@ -1,95 +0,0 @@ -import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; - -const sidebars: SidebarsConfig = { - docsSidebar: [ - { - type: 'doc', - label: 'Introduction', - id: 'intro', - }, - { - type: 'doc', - label: 'Prerequisites', - id: 'prerequisites', - }, - { - type: 'doc', - label: 'Getting Started', - id: 'getting-started', - }, - { - type: 'doc', - label: 'Mopro Core', - id: 'mopro-core', - }, - { - type: 'doc', - label: 'Mopro FFI', - id: 'mopro-ffi', - }, - { - type: 'doc', - label: 'Mopro CLI', - id: 'mopro-cli', - }, - { - type: 'category', - label: 'Circom', - items: [ - { - type: 'doc', - label: 'configuration', - id: 'circom/configuration', - }, - { - type: 'doc', - label: 'Core API', - id: 'circom/core-api', - }, - { - type: 'doc', - label: 'iOS', - id: 'circom/ios', - }, - { - type: 'doc', - label: 'Android', - id: 'circom/android', - }, - ], - }, - { - type: 'category', - label: 'Halo2', - items: [ - { - type: 'doc', - label: 'configuration', - id: 'halo2/configuration', - }, - { - type: 'doc', - label: 'introduction', - id: 'halo2/introduction', - }, - ], - }, - { - type: 'doc', - label: 'Performance and Benchmarks', - id: 'performance', - }, - { - type: 'doc', - label: 'Community and Talks', - id: 'community', - }, - { - type: 'doc', - label: 'FAQ', - id: 'FAQ', - }, - ], -}; - -export default sidebars; \ No newline at end of file diff --git a/mopro-web/src/components/HomepageFeatures/index.tsx b/mopro-web/src/components/HomepageFeatures/index.tsx deleted file mode 100644 index 2117415..0000000 --- a/mopro-web/src/components/HomepageFeatures/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import styles from './styles.module.css'; - -type FeatureItem = { - title: string; - Svg: React.ComponentType>; - description: JSX.Element; -}; - -const FeatureList: FeatureItem[] = [ - { - title: 'Ease of use', - Svg: require('@site/static/img/gold_arch.svg').default, - description: ( - <> - mopro simplifies the complexity of integrating zk-proofs into mobile apps, making it accessible even for developers new to mobile development. - - ), - }, - { - title: 'Performance', - Svg: require('@site/static/img/red_angle.svg').default, - description: ( - <> - By optimizing for mobile GPUs, mopro significantly enhances the speed and capacity for handling large circuits, surpassing traditional browser-based solutions. - - ), - }, - { - title: 'Scalability', - Svg: require('@site/static/img/blue_angle.svg').default, - description: ( - <> - Designed to scale with your needs, mopro supports a wide range of proving systems, facilitating the development of versatile, high-performance applications. - - ), - }, - { - title: 'Security', - Svg: require('@site/static/img/gold_leaf.svg').default, - description: ( - <> - Users can generate claims securely on their devices, ensuring data privacy and integrity. - - ), - }, - { - title: 'X-platform compatibility', - Svg: require('@site/static/img/yellow_drop.svg').default, - description: ( - <> - Whether you're developing for iOS, Android, Windows, or Mac, mopro supports you with a unified toolkit that works seamlessly across all platforms. - - ), - }, -]; - -function Feature({ title, Svg, description }: FeatureItem) { - return ( -
-
- -
-
-
{title}
-

{description}

-
-
- ); -} - -export default function HomepageFeatures(): JSX.Element { - return ( -
-
Developer Capabilities
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
- ); -} diff --git a/mopro-web/src/components/HomepageFeatures/styles.module.css b/mopro-web/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index 2d8608c..0000000 --- a/mopro-web/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,65 +0,0 @@ -.heading { - font-size: 5.5rem; - line-height: 5.6rem; - font-weight: 600; - width: 75%; -} - -.featuresContainer { - display: flex; - flex-wrap: wrap; - gap: 4rem; - padding-top: 5rem; - } - - .feature { - display: flex; - gap: 1.25rem; - width: 45%; - } - -.featureSvg svg { - width: 120; - height: 110px; -} - -.featureHeading { - font-size: 2.5rem; - font-weight: 600; - line-height: 2.6rem; -} - -@media screen and (max-width: 996px) { - - .heading { - font-size: 3.3rem; - line-height: 3.4rem; - font-weight: 500; - width: 100%; - } - - .featuresContainer { - gap: 1rem; - padding-top: 3rem; - } - - .feature { - width: 100%; - gap: 0.75rem; - } - - .featureSvg svg { - width: 70px; - height: 60px - } - - .featureHeading { - font-size: 2rem; - font-weight: 400; - line-height: 2.1rem; - } - - .featureText { - font-size: .9rem; - } -} diff --git a/mopro-web/src/css/custom.css b/mopro-web/src/css/custom.css deleted file mode 100644 index 2282354..0000000 --- a/mopro-web/src/css/custom.css +++ /dev/null @@ -1,150 +0,0 @@ -/* You can override the default Infima variables here. */ - -@import url('https://fonts.googleapis.com/css2?family=Lexend:wght@100..900&display=swap'); - -:root { - --ifm-font-family-base: 'Lexend'; - --ifm-color-primary: #000000; - --ifm-color-primary-dark: #000000; - --ifm-color-primary-darker: #000000; - --ifm-color-primary-darkest: #000; - --ifm-color-primary-light: #000; - --ifm-color-primary-lighter: #000; - --ifm-color-primary-lightest: #000; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: white; - --ifm-color-primary-dark: white; - --ifm-color-primary-darker: #000; - --ifm-color-primary-darkest: #000; - --ifm-color-primary-light: #000; - --ifm-color-primary-lighter: #000; - --ifm-color-primary-lightest: #000; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} - -img { - border-radius: .5rem; -} - -a { - /* color: #D6D2B9; */ - color: #FFB546; - /* color: white; */ -} - -a:hover { - /* color: #FFB546; */ - color: white; - /* color: #D6D2B9; */ - text-decoration: none; -} - -a:active { - color: #FFB546; -} - -.navbar { - height: fit-content; - background-color: #000; -} - -.navbar__logo { - height: fit-content; - padding-left: 1.25rem; - padding-top: 1.25rem; -} - -.navbar__item { - font-size: 1rem; - padding-right: 2rem; -} - -.custom-navbar-link { - display: flex; - font-weight: 500; -} - -.menu__link { - /* color: #FFB546; */ - /* color: white; */ - color: #D6D2B9; -} - -.menu__link:active, .menu__link:hover { - color: #FFB546; -} - -.table-of-contents__link { - color: #D6D2B9; -} - -.table-of-contents__link:hover { - color: #FFB546; -} - -.blogSidebar { - color: #D6D2B9; -} - -.pagination-nav__label { - color: #FFB546; -} - -.footer { - background-color: #000; -} - -.footer__links { - padding: 3% 25% 3% 25%; -} - -.footer__col { - display: flex; - flex-direction: column; - align-content: space-between; - text-align: left; - padding-left: 15%; -} - -.footer__title { - text-decoration: underline; - font-size: 1.5rem; - font-weight: 400; -} - -.footer__item { - font-size: 1.25rem; - font-weight: 200; -} - -.custom-footer-link { - display: flex; - font-size: 1.25rem; - font-weight: 200; -} - -.footer__bottom { - font-size: 1rem; - font-weight: 200; -} - -@media screen and (max-width: 996px) { - .navbar__logo img { - height: 70px; - width: 220px - } - - .menu__link { - color: white; - padding-left: 1rem; - } - - .custom-navbar-link { - padding-left: 1rem; - } -} diff --git a/mopro-web/src/pages/index.module.css b/mopro-web/src/pages/index.module.css deleted file mode 100644 index f1c005b..0000000 --- a/mopro-web/src/pages/index.module.css +++ /dev/null @@ -1,82 +0,0 @@ -p { - color: #D6D2B9; -} - -.mainContainer { - padding: 5% 18% 0%; - background-color: #000; -} - -.introContainer { - display: flex; - flex-wrap: wrap; - gap: 3rem; - } - -.heading { - font-size: 5.5rem; - line-height: 5.6rem; - font-weight: 600; - width: 55%; - order: 1 -} - -.firstP { - font-size: 1.125rem; - font-weight: 500; - width: 35%; - align-self: center; - order: 2; -} - -.secondP { - font-size: 1.125rem; - font-weight: 500; - width: 40%; - align-self: center; - order: 3; -} - -.phoneImg { - width: 50%; - order: 4; -} - -.separator { - display: flex; - justify-content: center; - padding: 15% 0; -} - -@media screen and (max-width: 996px) { - .mainContainer { - padding: 10% 10% 0%; - } - - .introContainer { - gap: 2rem; - } - - .heading { - font-size: 3.5rem; - line-height: 3.6rem; - font-weight: 500; - width: 100%; - } - - .firstP { - width: 100%; - } - - .secondP { - order: 4; - width: 100%; - } - - .phoneImg { - order: 3; - width: 100%; - justify-self: center; - } -} - diff --git a/mopro-web/src/pages/index.tsx b/mopro-web/src/pages/index.tsx deleted file mode 100644 index a3cad8d..0000000 --- a/mopro-web/src/pages/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; -import styles from './index.module.css'; - -function Homepage() { - return ( -
-
-
Mobile proving made simple
-

With mopro, developers can overcome the limitations of existing tools like snarkjs, which struggles with small circuit sizes and slow performance in browsers. Our solution leverages the growing power of mobile GPUs to deliver a fast, scalable, and secure proving experience directly on client-side applications

-

mopro, short for Mobile Prover, redefines the landscape of mobile app development by introducing an innovative toolkit designed for zero-knowledge (zk) proofs. With mopro, developers can overcome the limitations of existing tools like snarkjs, which struggles with small circuit sizes and slow performance in browsers. Our solution leverages the growing power of mobile GPUs to deliver a fast, scalable, and secure proving experience directly on client-side applications.

- abstract mobile illustration -
-
- ); -} - -export default function Home(): JSX.Element { - const {siteConfig} = useDocusaurusContext(); - return ( - -
- -
- separating line -
- -
- separating line -
-
-
- ); -} diff --git a/mopro-web/src/theme/prism-include-languages.js b/mopro-web/src/theme/prism-include-languages.js deleted file mode 100644 index a6fa60e..0000000 --- a/mopro-web/src/theme/prism-include-languages.js +++ /dev/null @@ -1,24 +0,0 @@ -import siteConfig from '@generated/docusaurus.config'; -const Prism = require('prismjs'); -export default function prismIncludeLanguages(PrismObject) { - const { - themeConfig: {prism}, - } = siteConfig; - const {additionalLanguages} = prism; - // Prism components work on the Prism instance on the window, while prism- - // react-renderer uses its own Prism instance. We temporarily mount the - // instance onto window, import components to enhance it, then remove it to - // avoid polluting global namespace. - // You can mutate PrismObject: registering plugins, deleting languages... As - // long as you don't re-assign it - globalThis.Prism = PrismObject; - additionalLanguages.forEach((lang) => { - if (lang === 'php') { - // eslint-disable-next-line global-require - require('prismjs/components/prism-markup-templating.js'); - } - // eslint-disable-next-line global-require, import/no-dynamic-require - require(`prismjs/components/prism-${lang}`); - }); - delete globalThis.Prism; -} diff --git a/mopro-web/static/.nojekyll b/mopro-web/static/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/mopro-web/static/img/android-bindings.png b/mopro-web/static/img/android-bindings.png deleted file mode 100644 index 2c1a13fdb4f47e23199e9002ec9d07174ccc085b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33164 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 KXvqhCzyATHkj5JT diff --git a/mopro-web/static/img/architecture.png b/mopro-web/static/img/architecture.png deleted file mode 100644 index 52f171dc8e3f8b16aef02adfebbea69e65445290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106576 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

!De!n@;W{=lps^FH(J_J@YS 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

(Dk5YQN{S^2@te#VA}89{1qSr-V1YO$w1 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 - - diff --git a/mopro-web/static/img/favicon.ico b/mopro-web/static/img/favicon.ico deleted file mode 100644 index c01d54bcd39a5f853428f3cd5aa0f383d963c484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 - - diff --git a/mopro-web/static/img/gold_leaf.svg b/mopro-web/static/img/gold_leaf.svg deleted file mode 100644 index 99510a9..0000000 --- a/mopro-web/static/img/gold_leaf.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/mopro-web/static/img/link_arrow.svg b/mopro-web/static/img/link_arrow.svg deleted file mode 100644 index 47a40ee..0000000 --- a/mopro-web/static/img/link_arrow.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/mopro-web/static/img/logo_lg.svg b/mopro-web/static/img/logo_lg.svg deleted file mode 100644 index ddbda79..0000000 --- a/mopro-web/static/img/logo_lg.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/mopro-web/static/img/logo_sm.svg b/mopro-web/static/img/logo_sm.svg deleted file mode 100644 index cd6efa2..0000000 --- a/mopro-web/static/img/logo_sm.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/mopro-web/static/img/logo_title.svg b/mopro-web/static/img/logo_title.svg deleted file mode 100644 index 0b64ad7..0000000 --- a/mopro-web/static/img/logo_title.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mopro-web/static/img/mobile.svg b/mopro-web/static/img/mobile.svg deleted file mode 100644 index 3503144..0000000 --- a/mopro-web/static/img/mobile.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mopro-web/static/img/mopro_adapters_platforms.png b/mopro-web/static/img/mopro_adapters_platforms.png deleted file mode 100644 index a04aabebaa1b50cd5204aab08f4f905238759282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149409 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

3z?p|k!a*?*NFhvvw@0NAw zLfZ;vIae|sb{oml-=CKBg?g{m3?-nHSR7sk?I=Y}@K|x>UCq0}PB+HN?!eR~`#wna z8ov^aB;MWiSukgErPfC*9^Y?%u4EAJnmoF?X?r64wD3GWO^f~PeA9fyW6X$oMOK8A zImu%&U#f{IBR#; z=1*h>kdlFT2^~F>CyAZOgj!jxN!Xx8SqH}sVfDqaX(LZN8P2{6`NU40!k^56@U<}_ zzB{xeb)#0P_vw{I3xQ8#({P@G{279OYeuD?Bd_)0_Xnj5ZA!d8-y;B5e3D-qVwOEf zcHuj3PDWm5cFXIBM<WU2PEmJuG+HyG9Lq_pW5VT}HKj)aqe9Pu;uVGQ7RmD~4Xv zaBMWX<-hmlt+2~$VrKhYOv1)h5dvyjM%oOa+WF@_ryKTRqN!IbF3u5RLkwG$4;gu} zAy+l}KI+`-!=_EZoM2+TFhVt(`QwE!t5;bhR`A2Z7o=y;in~91!hZ;t;vjw8TW%L( zaqAsQ>`h$59@?PcY4X9eErWVwS_+qyBd3#CWUF98imhEEGyt#P{1Uk3&GEu3fg=dI z>TTaopyc@s8TWjmS9k;}_(yJ3>xxs_2T*!Ue4f%Lly!xwlxuf1>h!w4J?ddNrbwuT zVl|;LVuG0HFMQ75z^(G#Tp${WOFoELD7$-@6Gpt#h`0q!?oQ+IXCDF8yixBqdH9FB zy39>=Hi4k(p0MCgJ1ghA0{31~kdkN`lF~~+c9Nrm8i=pEAi9X{T4v9c^$%%(1U}P`90Cm zVpg|-VUVU=eL)O4;($5zDoW^~D@o)-y5|7M178w2>M#a=wL0e#R-_@cw z&1t1_o(INLcq zvtwW6`3j4Lm>Hch)S+5@u$ltVQg&gK9(=dEp2&Q-`913aY2wB%%zJy$a6qkN14Bbh z66A> zVAHLQl}#74*YYzI6|pK4v?rV_buQ9qyq6N;8(-%f+Qv#wTF2)0LjlRJNkd9iXTEU_ zV-(`GgP2D3Q617WhO2^hYfgbyH+}6t*))0I7lxl$%v1^Y51aI8E3Jr&k%#F>6`-W% zjfVN#{ui)g*tx|B7(GELTc!8WtBUvoo0ZL7#uG2vHul+^&&+VQu+gViJ*X{Y$Fk@- zMSg_<_k$GI6BofCV!z&U<1_)Sz!*yYl34 zp^baWuS5_(C~eLTDco6|(PHgj_j@N9&Z=}&c5Xa%#uY^t&!1}`D?33jw)5?0OJ!A( zae9OQ(>&n)PT1(On^0nZB1a3HuXiq|b<~W)Ft+Y%S>(`$>cLr+}Qc2|A79`gip>sW$AjC;s&-& zZ!#WS%6GGMJ-aY97bQ>Jx;bglK3$}DL~D&yMRQ8CC|wITs2xrXW&!MsWo?2%Kyelc zu-}O3);st?0=b#QlT_(+*ekaIDJU)Ofeo{07EjWR5z)>}19V*o^0y)|Gxl;qU#4x{XG>tG3dD?u9f;q12_wPV^ zGV;erBnv#SiWGZ0h}4+XWTicZMk{>6=t;Kv$I_%#_9cY#4AOO(I0>_^Xt zBj;r!w@{9FU43f`bwA#QSr6h}EZQFw30;G{Eu}O!J*>LJdMS|h*&Ww6bp&t1cA{O8^; znEB-F+tBWC9rYv<3xi;l0x=j96c86;?;UZn^tBXGbWGNSFNB%eWnk@$)oR$LTc_~Z zJ>NKEyZAa2@ic8fJ``WEYfyF_=EA-za=>Q1aV2ryZ!wma)ndcnFaK$7C1Xn$+1}5X;nOtv9cg_p=NjIG`Txx|RZ9CkR%`;ys6yfh^aTI=pWAI>Hf_D}(&}L`VZhP7h z;Zh=u@0NZ<(zyK6UJh1RH$D(Ko)kj!UAg%1+~2Lgr|soMEnLW|@{@jj$6b35=&tJr zV3eJ5%#peEtq0Ws3Yn+6(W~izam_nT`KczDVLn-Pi9!S)IliJ+hSBq$;7zGCJOFjj zPeg8YyO&{WOz=+PyZA7Hw5zy}hew4=&ReeuEHD1LzTVNZR2e~75m!y}AsOXCy>XwI z;fB7~NBKEKeILYb3Ir46Ew^hN5RhI@jtKo}o5B&EsaouP?h61~j|@?}cw&avYd&n^ z>#Yt*yO6x4WsH=%buR_kMyLbUg-4=kmi)Yl2tW4_bsV%?w$x5t910h`zjR0^s$-)n zDHC6U`veKqJ5f?6YHPtGrZmC^7VJ^EM})-LajG>6nsDa$-_lD{9< zkIE3(qL!NHvG+&?7w(Zit9{1vTKq_MuDOF1Rpw(1TYL*v!O z+ZbF~Q{q@N?{ux~G1GVDNmfUXM}`oSmk@D8Ai+loO~pi$PzU0X>VR@TLbc+e*4ye1 zrXbmkWaf+^W-)VCkqbL!t?TT>@w*+`k2ltK0ZpMj0zFD zi%_{0JTVf6ed926y4ShxvyKbmrua--AM`O{xk4wjwr5E0+PL-MuZ1e#;e*@)*Wq{% zs<;|SR*0pS2odSXLH)A=dI<*`O{+p5evUBnN6c)$Jb7`POb!Y=&~-zizT_wsHKCeI zB9+LoK3HXZ?H?XNhi;J`9U0uZLd!(G*ioOVg7M_TEe8)NJ!@af7CKHugIxmgITnPS8*vPqpwtHWDg_A4R zfCSyUZ$MIbzN)7KRIUr{M!h!Lto7s>YXr-+znJ<5qbU> zQJHP6pRsPKhS>CMkln{$%NU|A9`6(2u2vrGm6#^iwol(450zu9gfz~I9{Y=ZpMGG} zMzQbBT~%FA>@wA8DZ{(}=rZK3A>a2T3X2ejJvSl!=qDx!5q=mx4Hf8dOFLeFnT}KW zCxF`~&$4a1+gD2QzFS9obZ!wQmP8Z*X@@elHxgR7VFs2nv$c- zuT$pq331o=H@=Cz5#AV?4|Vuw68~?d;E??9Yg7vKV)KNY(`?l0o2AKX8)E4!Efc>8 z-n$e>bNETYz4gn=%g=tyjx`tou2hmAbU6E}{0S-CT_zv@RDa1$eyKN+oix>R@#t!s zGDOY)R7NWF)T^s?MS0@)pJIwBWpV;Z(sBcfF>OLTcg6&ozFlnbP$_VhnQK$@E?bGhCt}f+hVR0Sapo$2Sncr)Xk%*S?Ug?N zlT!Xg+n9x+t#mQvVwPV}{&FaVs2+Ro2$)c}!a<-X#-4xXw5Y@v&ajlqYKk7UVR|q9 zbFqF{H`d{LSsw;drKO0VdW#zNxoTO)wGA!xqmGCUKhmmfuS+`r`x(euy^#6}F?eVC z0mykT`b_)@LNiDJJCds$5njp^e`f=X%SqkqWGe7!I<`cA1;LT}_CLnpBI?^gQ|57X zP_4$1mU3pjxNrdIbpMmSm(GO(@qxMg8*oJ5olxz8ayfu&(wP$D0l81cg8CoI_G0Xi z(&IC3ZA&5xkKR}PBl-VM!1lf)Q;l_j(Qz^CN%5Nk z68Io5ve3%wuW4H+k9EAO<+;A|IAaD5e-y!s=#~#TtI&+!80{e`oxq)Y>UtPl-=t+} zXUi>&_fP^b-Px}SFcel?jraq%ZP2YUMu(RHt5+rOJpBH`cNVdmfG+tJU@=_-Y(J6w zb>+N3^<_AfGb!nfqt(EOVf@F$%+t_R~ShWOw8LSv&NH^#YoMzFE3cY{KzR}(P(QLI0yBFW00-T-y$GofxHuq!!=L=j=jskv?*5aLmeX$<&V7F>Gy+-<7o zsx-ldbyyt9Ir|C9=6>xa9F}*e0d}hU_o#QK9oOR;N7I-CH(rw=lr$BNkCdxuxzjcI z?hzau;rdEP5t4?Wid{Knb)dE9JO+8rz6+RlgwxAyfX12la;$ZCB(ssm8<9U1{tK0{`pQNa6fe7ijWP7SQ9daeuY>Tv8)?Q^S06~`Yi_caVhf|+*%vTTD z>*6MzTydYS9ui37^A;v2(GkDRI9Fiqb_5bs@VkoK` zk*9`P1YIU7id55=qn5usetLKTe^))`6VHQWw{u}s->FiSw~6LSe0K>y@k^HH^&VVP z&$H1>eboph=r8XtLqVYW?8+frb3;E>(X1jwx7JCjZ0yHPfKS0!YJnW62_X>602IDW zLgr*=)X&ZWv$GjauI2_Ju5Or+#%~uXc=OnX)3@dBt1{%^2)o_SZ!ODK=-%3MZgtKG zcX~G$yX0LFdS8xd)Eu=QTz4=D$FTw6R99oLg;5L2blg5gqZkLr!*GdvdeJkE%;_2N%Y`iNJGk zVOX|&0V!~N$WRjHh_3H9U;Hg>J-IhMG`ferL=~dY&~k~2TD!~)oo62aeIoc$;XVWZ zJ{3wpU%-6l(&i=phsK7_v8FQf_Nw+(bpNG6DWs2;4BqlXUCqaogKHuNF@rXFJmFcf zHyNFUR_yqHY3`7evfImT9Bwb3F1`=LGpt-XhJA9l|LT99ehI;EUif(AI?u4m zeDwn{_rzFn9O^4lH>(GEJxj{!GsK_*{bVXp9B`kx???H|O<;omh8^_nic}3O@V+jON2Dm}$1X4!(+)0k(?c z316Uy*g^WlJBrT74P=iJSxZWPFvrZTWV&ub^Np`tjz_+5I@sR}Pnm^v@kEgnM#63G zfL=aqDkE8GB;aZ$DZGLmUneA+A0orJiw-BeZr5ZtHvWa3u-`qNdZXK<2??sSD4EQ> zyuMb&Q+>}$9s{oR75sjKs{yrdBcN)RMg)ezv%Us8WXiDyO81&wpjy%g>FlxN1aDV$ z_POL)}Z7KKJIe)vDy2Ozn(z~}*vmv5|U>wJlX1#`!MT*W?pVY?Q-1%8ne zY%_#AX#t0KTRqPiq$A~%r9xs2?wAFMyj|qhY3p-@yO5XxL}D()7sf0ezzHWP8~EAG zHxpX=5uhCVr3%?|Jy+*`8J_1ig?5dtqE6b(#&!3;)4*YtmNY_eAmS})Utjg6Fh@ip}v5xn-MR$DQS~R46ipVSTx4_AT1^_;W z9?NF@i5jmd%S;{{?I4`x9DwpU;7~G>l11U5WrURq1=giJE0@Wk1=KRg#PSd}y+@3c z$}c^6NZ&y42@PT-X&(%TGMsT?B6Ts~E*sV?`fnLxq?~pb1@k}6W+fSr!offN)sohI zyi>Mvo!6IgkUGU4ro2T{a(8jE6Cq_Ht{jxkPjXYy9>^$%A&P4s046 z2P!qG8pGa8>J6iso`e0Vo`>ZcyXOoq4p zcolO3j-x+A|E@eBsXQ~C>(e_~aXi3m)dD>|0uB&EQpHK94KH3?#7~byDua&PluiC# z+C{b7M@y{PP~1oaKh3^yY3lmyO5&nJ;SW&cVi}Zf;VkzVz=Wq#)n1jiGK?``4`=qD zdX^?n%bk36oSJ~6DEZrubOdcPI-jCZU?7IMb;*8gYuXUBS8Q1#L%ucX9rdI`-hCdW2ii4W4-Owz5 zb*ZB^a#SjYqe#B!^(qq_w<=Qf<%N7z!}WR>?+uxRms_vY)Jh=g7qGc3Qg#-MArcQ=-2UC+~w_&jqScY`0_4p1p`Q% zvb^&E>Nj`>E)6ipT>D0hxJ^LB-{-3e!H+~V_^6fJ8MU;xZSYbweQG^iLD!ROsn1G} z;M*!~{Ama^(VBl#lLaW+XoKG#={zy%cPVCIAkB1AO&7?|EdJu{onIrUX-Gr1T(QtX z8u{qt<12;7k7s2VTfknyPkuH2No<4e@{NsL1O|ql!=7U#bKv_K*q3<5)Wq&B%b|! z2mXGNjJuV5_LE5KfOz4fA>kP(d+An&u3f}8NWfjHA*?b%FEx&F5pE;guz!(`NsRUQ z7q+}8u~|Hwm^zg^@7$4V$VFHYVIcXPwrY-STYgXTyjb8Qs$H*-S7wKmu|_eHJ5Amh zQewg7>$8~8zq<&t7_HPAllzN{dB*>_XrXLki$9U0)`S)ODqXx~57&*0pRghL^9L=? z>fo)Y;CPQ`mqX=s>KeSGz#s<264CoM#k1j33INJ7<0Ccr9qyPN|Ni;qorsTJbvgb~ zYWqnyPy5NvnO7giu`sSoj*;EJFD5j#52N#{yf#A0lk}^ELQS`vRT-1!e6qZx{ilhj zbQy@6ajK}&>w`8w?-#c+Gmf=;@)mQZKK7M2cOmxKQrlk0WLbz#D&wpabXt=YV)uW{Q(b@i0)+wEi~65CT%yllFJiAw zS<%T(z<|Mr0I^^RllEcufBOu@R!@_4b85G88a*{AqJ%wVMF(L;-!(TY+4aY0?pb&@ zozK+!U`U^MuAb&8B_??BV_sNafeuL5O(q7@tuGjA*QYHpF~rxE$r%152%TUgNsM9I zp30z&N#x3_cU~N#uF|AU(k6#11QQXmXS*>_F%g8}7b&j0MxZN+vmM&0Z$vU;k-mDz zfFIsI8iZ$>S4_UL=vKG_cuzFU9=A~JfYX$%-=ajgR30WCDzAOL}#HFNbn!m*9R`r6PCND`ma4-^IP^b zB1s}51x{l%r{?zsN_5QMpI9+Ub6GUA8a56%TD&jF6sHNW(5BXWN3Rqqs8p)DsamBi zx6$anm=HvTRcCPf&-x8S929{$%gxmpqV5(-hu0DZ*v@ZMX9`wR;>e!M=KaG|*xV$~ zST8ors=Vd8yb?ZM*$?gVxGnSFAn%(2d+h_KeJS>I|Cq=vkqn@pkVrX;lydev2xj?y zStHGmw9EHz|AGY>t=o2;$WP8^5WlBo0N>SPSSItY@LR}fojo``X4|w8>-fYlV{Uc= z>b@^xZk~ZEiaChh+MeE2dJzI}(MC3S*rG$-@@Jp0K@9N8Hd8(PlwmOclw9zvixpvu6J}~79`$u}fL%2hyMxj8! zcXTEB>~J%r-pmX*g$HQ6f_>NP?a|5&+re_vho{~N`#>ld@9w__3o1u+ROB`Yj9IgT z@jNK1kkbvZxg)8ZUDXMO5} zLAqni<1CIbSpI*A3R}TlcXDc5)jllJ{4@WuX6Cb)pfxG1Pgw2XzE-w?FA`@v7;a{& z&@d=!ay+61)p-;8ws|4f`N1*RckG{YnY>YdnJsQ=6)#WLKszl5ca89jd_Eb@9wU}M z4KcgE6Tb81i9{XEP9Uoac}fD1$D%-G2#I9a7o-Ozi|*oBC$}ostZpwvF*GBS5#{VT zD$)uee5<4R)a$qFd@SnTEWcelok>jfxXOtGf8ri3%=6hPdEZWDoEN$)uobGM3v?q~ z(a3ryf;-(I@6KMEZ-1!N7~oPk2!(++28(%N&|mj$BR=p5}T$g4qXE_!F}%D z2x6i%VnAzx`@RKQ6eV3+1&YBmQxJNbI(qIL-9fMqklF<@EvI- zxbldU72|n7fa1S@vJ>ZPx-pe>jVyhr*>=2Ya<8Kln5$@KU&@fZQzwE_W!5`rzPBm0 z7a`JYbT*gWoPKhr)|_PZV){0!VFS zxIhc`R~MLIu9_V|{D*NSB|YvWJP0uZCw?VoS8)R;Uhs2momz9mZsQ9Zvjte7<6jqC zHrozN5PTb$kRJBopYsslWn-)`h7&)P^-S{4%|zl-kM`{zng=1)VTEuN3PzvBn4U1Z z55_yAsQjw5?3PNCCpP6LsF@)NUS|%un&|dE;$FPaJ1@4=3_<4VKYz6Q;r&9*x?#v8 zm9^UOTOyBUm&D``^(IULoqgd_?)h?-eUrko43fioR$e*o-3llc?*0(54~<^PEJTE= zTqPinSN5HC?>*{8I=NWhVVoZYTQ`P3)%@Tam7dt71} z5hG)I0V~A>T$DStk|VY#$vPx|zQ}A^1}|EuXf@fL$o90B2OHZ*;=pPo14OLV9lb>^ zkC&j)+WU)XXsq0!_m(7`Ohv6Dx7PA{Qf-Av`2;5V^ttorW;}O+W*RlX+4Uz-y| zR5#9WH@j_UHS#lA!|&O29is4Gz;q&g8#!2c2>6hu2+wcOFeYq43B4;WaX#&e!~%AI zSs~u;-Bp?as9IR(*Eb72PaBn37wB@H$zd0(=h9dqk>Q(`xogx&6TrRe}}CA|O6-tSN9zEt0O zU!KUk-@hiu_n{x6*U@u^T9pjJe$%4Cf95LidmKtXA-XV{Gv`z@tgI8jJrJDN}2V0e*YK` zu<*9{Tq^inn%zXYOW&uCvc9~c2~C!sB3*9UEbw<3SM=`)UIeqMDj;gow{E4#Q}Y7=3LrYP+Z@CrM-EVX{nz0m&vUSj`Nq?5b^W2;6s z{xV3IzAq+HDEVpX6$58EJ&oa3F)0ZI!FMbEYCFZ3WT?X*`J3XXS-l#sc#hr;*EY*N zk_I}`sh`gmAf``+$~mN)#}!T+&e+ihYTPjqk*jpRvkNsLCtWFI9a!h^g&b_bs=L)2 zVu@7jA|}iBDB1`r`O0C`HbFFXLampdi8Gb5 zTe{jK98H>`8QZN(I+5zPe&*%1B82!qGD-@L&r!@@z8t2(5ObJ-`epvH!K!n?mBPQ$ zcyvpQzD3{R*d~p~dh9UqlZg$PZaT4;g{vvLX;`#0e4j3lQ0722U&ao+v+<&? z^TK1`s)_&kN0$@vk(0pY^KPnKb;p*z*F}EC%7*yjL#RvsDiWe}k&?~gRZ5ePm>JVH z>5y-ZJ~3VhrDzPHV`){SF1_U>FM&0!&og14M%e}tbix4~z8`giOpdBwZ?MYb=p%)M zlnKU3BhcyeG%ABjwq7Q@njnUU<%~qfs_J^z4VD|*cN{6E!3Y;j?e&i2Ey8g?40#bo zE3emW?f3ywjIFJzm@cyj>_`286n;jVZVtaCug`v(SLbE~9fTfI5*gOIk}6`LH^y+w z27^ypCBFO{r1jUaG&&6DMyV_JXIh<}de(3+m>{!DDXyn^QB_Ri;cbBnajZwO@6dEC zexr#>3+>0EHGDo>O&H0oe0okJEsxKNwN;24}J7;}w`Y4jROSv|->r&#$-B|68Q zy7>2N(!1aL?>xHLm@b2b^>lid)OJvX^8&7#=mKi%d{wkKz^$_^CVwk*%(XDeuZdT#GtblC3u8S3If z_nAgBn@I5}5-hG<%4sMw_k@K=oE7P!}_cJ`U+6bvrk(No$-)QMAJ zE&K>6Hk4C>gSpCJ-)2kzQJuYNW^tjnb{k|fKU`1-{C|tW?OeYr6qr3y3RUiKks%jE ztB!K2vN&p*NRLK#dxcKF@4o2q#5gR4SnQP1DgFDnfTV@)E7I1XT~We3?Y*2s12gmB)wRy<}u_~GBvgG8I<95HgmX*Y3S@XPprqROSbwn)F; zgPDh-rc>9{un*H$2eH4${axrd_cKww&sHznXaU!6Yh9!r=_m5&@_IjqxERM%js}t+ zJUH_u*!#lgyVnR%jJEuv&W0q6M*3wInb;-uaS2{Nag|;^mcgE}87C@lAF7N!E zpZfKrmC_oDK^hjg&uZHQKUdE^;4=1QdG{x}N9pj)LqoaL*^o8K!WqN-S@plNS{>vnIPa7$J z{BuKgv@*gDst3bP7aX6q*oW~n%#JbWIeTARd3ff91X*Y(LiC|RA=pbD)x zz7}cGgWG&0Wig5FoO4n#W8Xbh>>o-ATP={v9DQ`r~PWEGhdwU6CzoWrs|hDwG%u2V=C)I>Ce z*)>&S$!F&~28jt4uk1F+UX&QeV=*3~GJnt$6m{da3O-%}*EqcsymU0d&8b3Tuu@4# zN9_xAoDj&guYMHMk&z$EQ|%~~@;pr%zI z5$+QIHxo6zE5hl*&KbTtS`6-8r1<>~A2yUT(A=gZ?Nxl7U&Ea6e70$sKX+6Q_tw); z{iJzA`sJn9n9_rpiw5s=<1Q8uQ-!!`Ej@?&nkD{{9;*5~mHjcH574W6zdC8pQTMPr z)r7PX>Edqa*OXH=qypr_9k5SZTm1Z1SVK)Frvcq%#baed+HYY0X@CFnE5Cnt=m1*q zmWTnQe2EtZ?9be%;$JMk7bkcx_x|Yn%PpvC>temVd-;+nNs>|HowPu+z{IfUqgdfq z7TGvV6kJ({@8-`eqnPdA4Cjx|%4bqUPzgG#8fae}Gqul84iYA*BJmn3LwazwCz8uk zt$4EQJZza1`inOEbH#k*c_v*wyUp8on~rTASB#+c%moq-RiCvT-rRg>R+%;di?~$h z14`w4V%`(njLoNXnpT!fq4MXxa3_s-oKN8^V{R<+{76AtJ+2n~R;cepHH9FrS}+nT zQT0>K)dm?uS7N)0>Yc7)_8CVm{1=z4I2gc;n-=MmFDh;+?~|f$v;Dp@RIc~2DHMjC zgfN!vvi<@f{v-Mx+CnGlqlv1a>OTIPlg^22bX@+rGXk>TN1{4#@3-D6wW{%c^!^e9 z8OzhfQohCy4!(^6bWug$v+?2V6*(X5>H)x4ml*ngA-HMSqY|CS{ z8@Q~rHh#>pr}X0V#Z_O};|9;)AuT{}*y~Du`7!(WCbqCux(J^u7srs$ZKycvl9Q$) zc9yEW@X?Rx`{kj#qldCZtb%itJ!LEG>O&u@49U8a{lpr(U9Bbf@UcG*HDCl8c;zV`ruNlA|Lxf&A?}dIWBLXMi08w(6N)PIlB&72_-y4E0b{}^Ah??+Xxo18- z0&{(s=ZptFNA~b>2%q9tOMSAt_1O30o_35RaCOV^e6YS=ClO0W40E4? z-~DS@QBV4Ke!lVgu+PuIRNfPXOZjTcjwKwhExp9RJ5=v@lHa8H=YjjwsysjLGOeOr z?Gxy~ORuixY3D5@pJ|gKNP9!jF?()khvF&^i&E#UDjLc^eKr|bNMC~36blV;La2t*X~8<8N{qT^y$PeYH`44ujWYl zjS$;sbBnU~bs9z083x=+ce{W7=JF1Tz~Kl>u6mZFc4-)gw7$%lwbr&Xl%{EWyGK2v zuB_Xnh!9FZzS7m<-?p#1my1rkKBM31D>WaY@R04vb%YAyl$Y{+ttD>Y-%Fcx?)4aP ztb_GixMBcT9>4 z{hyKb8goc=jE6@jkw_!3Ce^c+2N1a@9Y1=I%!AV*ShPodDy3|1otD|W<72HaQa>r; zvD8QJFY|6^sB5HZA-l#|Mf5}sbVzyV-LopMvJfGKOM(`%Tl~g%^Lf8PO9QvL9>s** zZH0=1gIatmXO#jfd#ya#CjrkBEC@oKpzqC_whA!AsHI?zHw*@#n#n*zi|RiDkOWMI z|Jt@N6cO=j5ac?^^ZSeV?<|pxBRmyi_wogUN#NhbXJR7^xb=V~ITrYCVx&*OFob7OgRcx}ArQ!X0G+}-$vM=13&-8;%j#@bWVrDRNDk9iZk^Irv_>Pd>25%# zLDja8Q^GoMdFg3m-!#058DvGTRnn6uC_VD<&1+73ugT>Jk>Z<)XkjQ&5~qc zxkmJft3(bJ<=+pDh59gB;$9r6o$!$O>WS-^&nIHqmouphB#nz`b!<9{87jh)kX8_k z$j45_2NnNov|cP$d+f>+}X^AjHj_#D3uXSm<-VyaO zpw?hu!FA)K{n(q&d%DLmj33ay9>_d3Find%m>AF^(uEx*tN7tRhbs8OFJl`{4F?ic z?KzM+bP6a0A`YM{=d$OavMT$&{2z)~j0RFcmvHXK0BKFv6>+~xr2ejLI(%xqV>DNG z4m^Dekrx>@k-lFHk(Dt#^=ZH_F3&<1H^bpsC<*)T$2s? zAT5QVyt4p~0Nl4`Y1Jy!LZCuB9G_G%5S70m|Sh4VP*ml{y!8j#Lo(8t4 z$Yi3!c08y}iucV`y-Nr5f(XzH8$=FISWq4zSXMczvsYc%cnsP1?LJ_XoicD!kEW9a z<-a_VX{NeDQ;*HG@g@6BZ%PF`(hE7pdXeFY7HAvfRjo*|8(CZVRzFW(zVJ5!HfdSR zP-WVo{|`~`9Z%&S_m6WrI0(lkWMq{+L+IFBR>raSJoYAguVjldLb8=Ddo)D$&Q?ie zWRHID>vP}V`}cVG(}Q!J>pfnt=X!;FJ(oV5fB?$NJ6gLde9BWmW+k2}rf}f{^hlon z&S$!UyY>K#?axAei09CKaPqF;>dP=VFnMmo$@M2OEm_7gptByelTVM#``+2j2c?;H z4Sh69mo&_RheJS|@C-|vhQtX|sOFE5pI8&r5g>Lu%k45%F=uEkT9?dPq)j>Q|9?QV z3v;Sn@5W5mbz`&N^hg?dS@mV+x&F3piN?anwDx~KIP&nE5{&)QXEpGV!3h`j8=TeS z&tTRQ$Ek9}9w4Bul1oX{uf#&*V@81Vy3Vk99+n-EN?dt0HY*M(EI^@KLWg}{^qIY} zTWb%m*zro&z6yU7-H-w399vx8ji?8aXj=ay*X z#iU$9=LHw6jLG7OiOJJCa~^8;lvfwQOwdrGP>V?b&TNX#*^s+E5@uvGxclFh9G0<& z`Of-E?`<4Pz1y}v>7MQ%q{SZkX%t$2)q;v83v<(v6|0Mpc=8P!UvSm(XCB)(&VMdB!okR;Ot2tAj zhjKFOovR7$sQA=oz_hJakVqp!uJ9a08bMK--`1Z#TpB-sAYhsI`spC|>LV1Qw+onm z?>kB<-XOTH86xN^6(+o(!x2>kZSeB%dbUw02^jMj7B-#cF0&D{%aFzaEvHaDb#6`y zMyk{DLDYV?;b}}92#0?gjrGU1rSLJ={;k2S;k7pdD(@6D3oKc2&-BpzLgSHtPjy4n ztCzD???8d^h*5(gR*NUbNrcvq2dgsA+r>1qcExRe0^I#%IlXZjJp=_iFz_t_sq3E@ zBD(KCu<4^F3B*^U$QPmT637Yu_R~LL>_6JL04Y4rqRyaf7vRb% z!c=LI8QzyIlz|I}xFEYFiWAGLZ&baCqCvFd#0Q|)U~5J`JiDUeg{ALSn%)C{(kW3UV=6>=*bThQY|2!nLFQl7&XdcP-o!j=OeUTG<@K{h^(F8?WJ>dZ*zl@) zVSjg8_R`Q0+Exw^Vcd4nWMqX!p+AWmowkjB6Esrw3M=Q?A1BwAXwZ=}1}yW^uib-M z-2qfsNX2t1Ou0*HGg^)xYAm7H9e0Pxn26BV199ljq*;6#?Nme-zqBj&swKb_5-!|- zK#;fy>5)c%i$LR`7C}tQ_GtNVLe%m`RYtsL|9T{MriSfZV%TcSyJkswk5Pw58bD%= zXTQk;N5`O~Uf5O*8>QGVK!SbKeI!MxKMWwUz+DiI z;g|F9XG1X1PpXg-OP^XaPw5*&H0B5oP$|Ad0aE(t8;~{TL*PAXxc9Pqhb#IUl*0oAt(~m0)U9)8mM(dZYtj&@aoEP2{wu>5b$u!&;knEYvS; ze2(}S9qgJjlD$*w^<`TlZPnXFr#c@fMKwNgC&*UNYUh@<)pi{uitwTlfMoszhm&NX7jRWMQ;|m;|XY9aCWJ z{|3OAH4QO~YbX>3!?B@amVr$c4A_jnQNRBHyZr`jlwfF)-3}CS#IJ!Qz>9oL{_7L~ zKKeIfn)X2&$&09-m>u5*O!nfCHbc03(pc5N%CFXYQP8!lXi=tbU-)++5hY1#twVFs z*ew6KdJ2&-QC5+`=b?TlaT#&rdro)b>17Cwax{5pkfO;o4Qu}~9ZynCCMnkaI3suA zp5y|45qaQ)os;c8SKC(Fak{p2Tz7LXy%tTPZtD}~=6m`2=$~b1ai_SvwktT6B$BZR zHU3(z=5TP6KS84(-irCub^)5-y;!egdhv1U%$SG*ZBrVSD;>@Tqn9MISbN%K9YZe*eYYIc(z5rSg);rxxXCzGWZE# z0`8Ud^nn+T)8I-ImH*F!`ZfwR9}#NUsW_OL^l0Mz3;&gG zD@Yumw`bjf6lc7hr&ds$Ra?FFhd^CCdQSaHcPu0EygG;g;}8Wh^!4;Sa4FD%eAWAJ z!l=060}ez;Bkr;fSITj#MX}*unLC9*=*= zxxMJR;uZ4a9a#PJgC`c~e@f;U9j;u9C|8>MzyGa=h_N~bP-PDvKx{BL6gA;A#`;2D z-6PeipJ6-PZg&Ep$p6*LPyphR||K#XInKOhvWV0TQ3ac5`EO6eH%Xw5+Iye*mAK6uNy1<=-$3okl; zRaDY{Cx#jUrQ10U`~t&9?N4i=qUq!u(6MT_!3>wd7eE!d3kXl%{bss5z7V^3=n1?T znu|GTF<^X_R7vDmy$e3d?pEWo^f1rAD5iY87}5P8cm|ZT*9xh5YMxj6MK^vj`(wqW zpM^v;zIm=){5RlfC2R)jq4vl6Mgt6h#@~e~MY6w;XL)VVqz5=Ze}XOp=TRLbzQ3lm z`GJi`zXF6kZYO}WeHYLJp7aacs>oq81Y?Bg=UW_VpF_H?@9G`5 z#uAQs4*;SUBzShe>nxe$70A;t#Z#eAoO_Q$oh}^l{B7N69LAhnID*$rr58=BRDex>3{=!-|S(2)8m#JJ$s1Rj`Z(59-fcJ!c#7=_|Rv{Pn~jp zwt`nOCm$xDCISY;U9T%tDLPN6B==^U1>R*=8}l{=Qz3$Vm^6&K<@%cPb8xpn;?wV% zmNkM}w!}d$LH8BZzhq|VTeZk4NK7%4F9j~hG)W!|@kRt9=5&ApHeX{m66OX+Hx%V$ zafj5GxzG^b|9%tME7PfC_C+X4wiD7ztx?{VKaOO)WZHj-xNZDB{lIR$BCdR*YSjn$er=&&=>PNQq!Ney|F!RjV-h=oGW_(V~);aWluJ zJbTt2HK6J`Ul`p$lb>Kyb@f9zsDDGeUSWDVrAU?_-1m;w5X@1zFy=`>>)Tsr1pBFF z8j0rR9b9Qm^l1l>iuwhD|2x;rhp|VL17Bp4wjc<|p9hH1x)mH9ttpgIA}mGvh->`-Cfv0YP#qUhi{|0G(n zGUgs9#~6c&@@T^);9Dlsn1MV9L?G}EZ(su!%3fq@lKAyqD%1Dd6Zl1gJ5Z447oOii z%KsCUS4am{wWIne9LajRHb$LvdB=o!_f|`~#-0y!WiO>hI4JU;s@-u>dDP_W>{gm1 z*__kiNS#;-1(GZah+0e*Biie||+u_|J(7$1zc_ z-_J7xjm5=UhTz7HjxcGEqv3hrP@1XlnL~t16gBbh>kn5^cX-}qy2CG^tVv9)M*eXP zN>YD#4kmW0Mi>T5%IRcY08D5+PwNyE#H||eWK$ufu#RuQa{t8?wD6w}wVdxyjuVmK z$mz~Tz5NQxEZ^-~hc(R{{+@Q`Qb?-qO^iMGg5A;UNl=;dA$aTsNp7KRolCO#jZY@z zQzlHfU90j^W<<5(MFiN+%(VC9Po6T-FuTYJ_O9jlV&=0f2w!cVAo_PKAN{=z@_q@z zk6F6g4U+4Umlu{gYgfZ^Iwz>MPHT+Kof=ry$6@KF$*eaO(ojkndNm^2XBaoT}~DCTKL5EvAlV$WW-`T0rtump(sF+@Tp1lC>Q4>yH^@4rwo zZZw$%G6RWv2D-f191weuW&?V?zW(HONZSH#aC_O$A)sbs`#N?!Ak7=`25*8@l#Kdc z>g9`o@45R2z1a44VDJ?I6o4Tlgg@J<@NV|^?(=HX|9O==3Sr`%9%>$p<4bAYk6c-t z2p6Xvjmv``ICAr==hmV@(D*`=?6`7FDu21iqw%}1O$k3?&5h-GI}dkpuC5)|1#U@! zNGD2IwGz|rkpI7XJ0QBFv4^{qaM|Ex?uvP0|7vg0vxY{da{m9pH0WN(<`)wcbgVP|0{c@PRWqA%NQMRX`f|EAqm4uLyKmUMi zfbFY*PuNzB79g5+LxX@IpS47wq*A3^JMqEg%YEZ{hgZq;$4|zD6`iSN7NBmw9(pz? z*>!ez&YgRqsMuSf34BRQUx0DIQN*rmm9~yQj1W%%iCYa~BA?~ZbKgI0+S{zjc$e?X z<1xGTIQ}p+6 z+h|uF0@xCFv3*0H*~ba}S3pr}dvp}z}C zp*#D8@n}hiZNN;R!$7ppgI^YgVU*vg!Qfnb842Gf0H~M9Y8Iq|8Oan*Ny_X0%8m8} zCNf#BhL)S}wdxg-H*PtKG|`-zv3~7tURI;6%JluwicO}y zwOPyJJY@ZfL$=TqG5T*1k3+UQ>mn^z23xllI*AE}(4**qMj!1n0Pzl1;#rOC=%G9WtRv82qZ#noRiH zzmUTOSqX%X<|?McM-z7zu2}eBxm@hALY{!Rx z*G0MQz@&284giNUX9u(;sI*BUgHFIqk4-r8b{mu2sQ%(l<=xu%CBIvMZmITh;u&A>Oc&nN|^zg^QM z?JKwQom~4~lyDMpo#BV;v!Kis3ouvr14@r9_aCUyG+^XHKQ0^2VvuDF(lZygi(kvY+<(O*QYGH$fikqkBc6OMRiG7oOwlxD)ARTE${ zv2V3tyPkcfkPft=1xMG&_aK$#)%|pS&`EGu77;-yc3r64vRpM3F_(1_nJ$S#Z*hDO zu=7a7Er5(siTd?C)?4EInf#!kkneoaMbtHP%=0JsjUEiF?gS|M9s~?#21YaHH53Mi z$>Jv~+BKsiSAJsD8lUD~Nv#r1 z4NJb0dMrKo$BI7YM;y<{z-oYg%~N$kHUIyjcL00de`T0My>4+{rq6XhDqwI|lDrX_ z3;Lv%+HqjBGkHxs0^ve(AR%zMv-9R=gPZm5_D$(aUi;kgMnB58@6-R-G+*-SJz^fc z2brD;=JHGO$|y6^i>cdkZelU{=G7~RR-zuC@7P+77Cc_$%qHqx6Liv|x>Fp)JQ@fe zKY!aolDKT7oa{cvJ6$0%-lNL++Ws24Bmr>iGB^g`%wIvtmpdK5 zMys5ZeRc!P;?P0VDAmJ=kt?%|cSr{cP^=`g7#5zYi^^$y<#rr-F6wk^v6|N&xJIwP ze~@n@t(Tz6&DZFAJ=xE82ika9$v0*K}`L8rRTU zE-MBjK+sSdr-|x?y+_wS^yE%+!6_LzVa@okA>O{OwL99-N2J@6xw--|<4V zFyH1J)dejA!FVi2gfy{Z?@Hv9)yJEk{18zK`8Ubk(~`~Q0BU z;0UVaVDE5yx_CW^bcG+lNQnhU3?Y{A6xx2l~?cdX1I0}$9zUVP+1*=i(4s11+B_%C3T*u_Q z{*;b`l^UY-Y?h)C==Atk^jq?IV7+#}T zs1w>h8!qR1SUks9+*BF*8S^GsjPcXZqBXul`J#VzTm zSo}XKA807x+BAil@AYWpkXW1*_(?{<2~@DI?JcnrM;)4_&)vTH3F$?;eW-Y%dt!pk6P2m zj9u99DYCF$60ICynKQAU(Y~qE131g}b$5{L*+sT2=IkO&gb92#kyyAibu~WU^iql7 zs&TC5lM(ckoWJ3^i47h zGs0R{P+d~-Ut{Y>&xiQ^Ps5fCRnVVfJ(zpg@cRp}6y{G)JUV$AOc_@Em#7a)4fFp} zI3@OFwx(g>Q{}QI1tg7PPjWfLExnOHx=+a*y1B&~ocuF-Ei}Yr1h@ z%iy~z%#tIO;#t-qMbwr0qE1&PmqEp^sme+TpI`E?dhu)6Y8b#s@Ot(z`@8Uj_qXJJ zU+0>av!At!Co!lMi6(XQN`S%Ha2BTN#u_7yXV~&8H-+8TRo1ZN`VC3#aVlJfLgIg< zft6SXcX{SpiG#8HMhYi&aWpla?X-1eMe4&;NFDk0s<#L`tW#flyXZ`Kc^V#GTY47 z;|vusyg>%uT)AYp3kioxh}zE&Y@gKcg*FM`k?nC<5H=_qsfO0q)eV$bg%oA@>{s4c z2MdwlQTLw^KDL4VPPfh~l5I&G=jkeKF!R~~O4s&Q7-8!lUg`+i_I@GZqvQ5|Uvb2` zH)AE5+Dr>_*^JzisgeR-iU#*QArD&eoUUrI>lF2dny;(FS7$YNXQt1))|t-alA^fY zn=mg2M;=!PNN-f!IPOz&uSsC0B? zSKEjP4h0_l+G^{KIEH3ow(a#2PJ#5*Nq`C!+Axwyg0kutaPJX4X*c;wRaEPZ!-c@6 z_^R9DTKLVLF(j621BrH=#y(GG)EZAg-yVxGF zD}fX7c_P;lojgR2?;h+lq&F9Etulo<$85J*5~PI8FucQ& zDd5wh>R)9FVEI>grrO5Td(T8%Iq)4(jgN^zB<{wxl_MkHO?M5FHT_=crA6X-;zOF6 z*hKJ*QI!u3>A*J+Bl~!SMZTe%57XzMFlvRn=yAud`EW`^WyVQj&&Zoudh@K1rQw9o zY;*angMHPl0hS=|n{-d}4~BohY=H4$;`Nr1->(7v@%Wp2AJMo%=MZ49%dJzy761Gh zFHH>GZT%5Eq3`>l&1ZYESRqjl#0)-8XV zt&@NL!$>E@*wXTAU@D3Xf3#RMzGFl*9VLrc8D^DU7Qp*tHz805ghui2Eh*K|tIP{; z&DUDN9kIu;LiVulUZCB(nrJRKyu=c0F~oiBE`j99=PYTdh!1a_rY@z3py?H6n}isR z#4Sh2Nht!Rqg>s$AEB@1PQn4hNVhT6PMZKw(gLzD14Z9&Z9WrJt6=i;r&;QzI3}uR zmX$)=axhk;DeP=nym&!>Iv?B-MQ|qR-p{?8*7yapsJem3M>;V76`2uYnnI5F$ZsL8 z=_qM%BvHXIZ=Q^O*EKJR{xgpk>+N%1Q@T7K>?kOOpYal$v*SXwF7Y+>uQ$$s1L`iK zzDzCZaizW^p>B!e+}lzKAc6pqil2a{+ANu!Oc&AwsiaPK2Pl2b*mjq^=b6b$?rnWki6yQG%sR+oJ!Q>75JE9YdMaVMRwHD(@vrf=Qqn%FmKlt~VQ8pJuoQf>RX_8m;o0EhH@f{hqu$JM3sMYy~+5e@jdqpLMw|`Yk{CmGWR$c_BK! zGe!E`L5kEAB+(p|*gN9W(;+i~*_!-`3HUyI5B1}PnIx4_rfK3AA}ZgcY#1@&&bRw~zy=&A zcTYC>f@Zb-V$~$By4~nBrL)&ZU^#trZ|+_Xg$W2CCXLtU$ajxu=H+@MxgT{7;y_vQ z0_Te4@OUDC74e1B)_CbJFhodo;c4<4-PdIUrojF93rLL~CBC~qU29&8OH5x5&dO38 zixxE+pw7`e2B>j42;@;Vz5z77T{An8dkH`CYE0Y9Y^OS(1RVkXvJ%|E+QZL9)HL!$ zHU2R_RBwpsy1u$_-amr?)cN{Fu(6oJS;BladZ9D zTdk{!UfCr(NuMO)t*3e-SKqW~&pAXwh^U~<$@JrsPM8jFxsc%ZUBwm+pN7O41 z-mA$pBlZHelXY9TD}!LWWfR~t6TA2+Aa4z4Xc~N!H+NFRWIq&9*0ntWUgf_ndhCi1 zz+R>dZhyWCsFcUh40#`lnAbz^^BDBT_#LBfrQs=0$;#F84I} z6+3_sMX(X5&0m*hCfg2W-93G#kRuh;M5Vjxgk1!pR|E4AiHie?)Z1d0k(7H-m_Nqe zIQ#*wA>LCO0ok5=)T`hKpK*E1U{Ld9XTEVl;jr1D=C(yEYbrgA!YO@Xrmd9b3o7HY z9T7peYL!*JD=ulnB{$l(D?nXudZ(%F7mta_#TT)z_uWdfIF*Ht^5{G3%Lk}j6xuGYXKDk!(mcE(L;WGAXgNA2U=1jTcga@e}C>*Jt7u|?%bnn*0FYNt7Qz6$KhdLSL=Kef2$BPvRMM5t94SOG-14&z>!v!!u8WC2zV^ZD1 z3;|p9!O4ICOo51$0E3qghl_u1^@Y5oWWXW>+k}%A`@Eco_SXTG4aub{^T>0aly}{> zO+p1emJ#>Y5OYzo^udPw%K5FF4X`>SI;d@cEL4j|VXwM(^y* z(k(g?u(}!%d!`Sp2XBI)YJ)AzWnYQKag+%mHSgrbYFRgha4Z~j~l(8J$!{FZ|hMX_Iu^m3fNi4i*ZF#r|HMJn|8*r zKJI^(IvTYILz^tgod&wujp3a>&8m(+Quspy;JiOapk6fSJzl4y}FrO=0Z z;1*KtmbXUQj``xd$79VP_Uwnijix0AYn4aS7_8Xd-5t9*#)@UB2dgq71qI0MuhiS1 zlWj!B`?tt+7cj`@M-xWVxxLqx0_HLFm#85aJOkU=G_DM>N4N0$5u=FTu1QC7D6ojO z`nK}hex_h(2FWbtguE@Nc3TM7eea#a{~K_Udrh`DSv3%p=i;>7#=`%nVM5dF5^TEC z8D^FOz#7aa_W{@Q_Ksh5p(Zkp^w)ItwrZ~!RQfC5#3pDI_~SGop@|zP;O4oJ#}QF& zD3wPPVL@f^Y}CcRb*7YrX|^pQ?z=~DyJr3L)OwN{0XE`U-R;cOzmKk&HJ8CX(o=Lb zW2GaK(0H4yCKVNpZy{-aOLvymlAd#r@>tqcDY5%=CfCHho7#UNySMZqWmK zQ3K}KpNma2b8}-fD$Py@pl|OnsOOFZ>T(8HEkvBBCl`+GH*kNl{R2&1DoO`mt327`YaW$5&F`@Y zQS^)CYtQ&bB>vs$tTH}k^cwT0DH7!HJ_~EglW^aQ#<}-38D-Rl1o#vMSXB-u7ZZ6) z@@SQY;-gnLK|@MmO(uembnZ!la0x3ozi(>oHxqI9#ogjHMh^4hPf;D$cZc4+R(g8d ztOv;qvQ~<#6T6{6AbzeZ{hyOadlQzH}=W1 znh;>)$C|A%_Af18e!qWi+XHIJS3uZu-v?xp23>4VzIj#cT?zrca*s4|v*8daKow)$ z?7CC>A)%qtX^MyJ20N8dAIOKB0^?k&fgY{wL$26YFtgQn$5m#$hb?lb*znj(1uE85 zn7TjpTg?yE{Y|G6#^w9VNBb@1nC^>L#Ov|nyCJ&%7mBFWswbA1) z=FvTY$I#@A5ynkWC#%eSdmO{iY}tqV^)uDQ%CzN3zPJ-$=Lpi1EF<1-4rOl##^dnh zpoC+d&Vy=f!6?RR;d1A|?^Xh@C7UwSG`JxK8-i^0RfS0k+WR$7369NYqC@ob$}GfW zQSy%2HJz!q`s*KE&eMHpQhn%|OAl+>i~D+MDf4;d5tb{7g*F#?K`I&wLu^3LA;D>v{HV9mb>1w2={nwY(P=Rzy#Hr*TR3QNjf`U6;wQRn{<5h*3 z)Ge>Pp&=~cTPge>1>hVO2YuQqCqL-&>2=wY!vZvUeN+yPFRM6L^V0tJ}rGD#Ikg(HVwrxjxi zPiT~l8Y&?}SScj#M>@M?>)Ay+H9OYnluPE4;3KeSa?FoC{#(`2ELuDBdYpQ8UtV9r znFuUJHQ-;$9ls75UEg|(o5^ND5c<=cnC6~Z!@-A>Kg;GPePF8kR0Iy;xM2Su(s#&L zwZ+##8D7JZcw>fhSyzr&Eiy1>X4JDLF@`az%?Urbd)uGhHMcxN-K|wOtXi*o8V*mB z$Aa;6mOr~F{^q;LAt24jZxPm!xPZgNwAds5%en@(VnKz&;tqyx_^)4xV&*xME@%PL zpg?>8!du9~P*oKaIy0L8(PhO@daMQf#rd`)?piEtWM=zB7=$bqrK7uGH|!i35^5mBl$y0OmURe zcbT$k%RX_=xfj=``Qa0C!?4j~RM<}8 z?}TxhVD`hm$z;2m%0$fJtZ?i+u*kI7K{-AIe>niKO4djeavR+u7w7a5M7WpS*2d6n zGiZR4QZ2M$b4w|%v1u6%-q0iSy2)PB?k7Yizg<|E`su;nPYI9~pIdZ%oJS&6)`*{j ztJP4}xaFSr-@4$Oq)Ki=YW}GOa-m1MlEJmN2>pm3ndZ+lF%Xxew zn6so~v!K_j8>v7U7k2tegoEhf=bzYn=dXB>D+D&{&uwnbeU!JR{FoM-ikd^9{`Nf? zrf~c6d6c?Z{vu8-ClcmT5oval(ujMs;Tn5sY zHnG^PM6j0+HHH+qT4Y|q=C4RkE;6k_)lVx#dqlIZ94HYcYQ`LpyK4x>pnKY~YLK6o zA6Ch@!de&US8%wi9lX4_9}~Q%xo@6eP2Y=xossb?py`Kx)CS`Ns3H|*3*K7wO{v>z z(A`AIgzRUKrFb|KiM2yO;cTi$W55Y(s=T3jOP}*?^w0;lGy(9f(p!JmqldLnFGM68 zk-^dL%NriH-k)&q_zVA?{XyGT;BjCeH)&VUgy)i5u$m6|v#eU&;MFB6WSym<@DVvw zH`q8+6ex1AZvVcla^AO~5!pr~MnfWv&#xR&dGm#<@}8Ln_ z1rrVRHu_YKD)&EukPv5Wp%&RfL*r{{RaGJjg;+jm&$HrE6y2~8?Al4A zo~k;oIOvVT_*2Dd3|Am}T=CVip&A)DGzc0!c1@d-0qm6q-{VJAGF_^V88hshm(eR6Lr46%K7_lEB=f z!?4uQLfvjVqekho%j^_2)KOs=nIE4sB9aqTz1QC+E7_>CS@B+xC^Z*&P0@Effd`p< zUJl~*Tzmx9qblrih)T2$)yKC9N?65sxVI46NcRLKmL>5#5^8$A{`T78>D(*VL2D_3 zAK~U#ueAK~?l-GJIFO@)vBdEvC;s%iJ?(9R-$B%rgO8)amami#)}E*+_xt5;)2H%1 zcjwh=NInh->r@OQO_$_Y;8}B9V(-O3ZI>mYBJ z5?scy@ESfiB0C&$`YmX~Vkt68UND%n34`x() zZ_8iS1=6^%_w{CN-j0QTJv3N*E5&IjMIGMJ79?VGvq0BvLSrk6(*5DmwRIh>!Zy0z z1gVDZVfhbrR;R+w7E=ms_#}Z>(%5=At@EB*$HeXqDqNI~VV4|++)*z$qv5dT=C)oB z9vn!s?^Ju3I2L>uuXAqYNvTaGS*K|!s%nqBtqKm(qO2b%8^n7MNAA=cg}N%;gclrb0cw6B`Rtse)*T;xyV3-fpwch%UjXRgLrNvDHKjFf7! zW3dJeWul~#8Y4@%9&xRi-kbZ-9y%vMrYr$=yvoBHpGU7jlgEiDgObix#zAmh%?KD% z_Tn1Y10F++(~9+Q6o94Emt5u>-q13f`A8-)p;CEbXq-DYo3B)~^|=0Q-MBs#GA&R} zW(r=*@9uM$z0JDup44NyN@&`)tKW;(4Hg;mNc~Vn^_l3>)r&{lE6vA%HmdmT1rHc? z!$`BHr)R-1p66|gJVXn#6^oLpM$&WHX`(}bvEdW}AG4I*tp6Z^d6crP4SZn}RQ1cD z|2o=$`C<~J5Z$1}Rzu@gqZ`wv-e+@CTY{j}p^MqN+hO-VH_c{N*08*PUR>F~YDgU7 zNqTcRB={}IkB9)CZi(yBuJ86wEFG}>4QGaM#0&0D#}s8J7~?G@P?c(z@bDg%e@{{A zH~B%x&am+3k=wntk8w_4scM#x4yGp*@8IaM=fZ#ug6=f%gH#09THh>}K+Oap-}^#& z?&wUH(flru~j;TWMPaZ)RVs8TGt3^U=0qEP0+wyJoh=_cnH zUhnHDZS#lD7Jp#_^A0Z)Wt=dHuKBF@5REpkKYb^_-X-Nc;5fN-|8}B&i^4(UmI>%! zAlMdAB0}L6mNoR-R1aZ!qL|O^+8`rc8%*$wm#$IE=6!jZfPp5@Ky>{IJFM(n@h?Ed88OD?M_94|JGx@gTueBv5w+Irto z{ot0nM9i}Az(oz!*M$6V$v!G#{XkUNGyh(|u0guH3b4k8B{^@X-82}wJKk2#p90-i z&<|4;xQt^O?XA$Y6^{=eZbISePZfEc(WhNkK)P|rYJL{)Ig+!7^j zs3n_0UZf_Ss1!ICdqv?Y!x|z}d&eGwDXnhtRMenFw^qam@qoE`FUxK6* zo~4vFmb2`4spA@v#~!=0*gvQ)=L7-Uy=&PDM68;i0e68(ije7(gs@nk1&xeO1;6m}M)W7|f$z zQ)=LM&3=JXTX#A5Fgbe{7=ZSso9FE4+@yH9LVD?MTUp2?u6!_$dZ62qOqgBL+{d;? zNG^WAmnEuA-gc7mhppi+&fhIx3b42t_5<2zImf}GddY{~BI_RCxYkU?hfA}j#FS0R zGbnLd5e36sp1Jzt*f8m?^lA0ESlqT!vF>hrnzR zxDCZ{gU)xN`T&Gu{YSe3U}C3KAq2_{_%-qRDZ1V&I;B9wIjea&^J%lt8W*pnW|Se~ z)ZZVBKQVir@|R^-l|FlnZG~g)m4c^hR8Je#QGe^!e^p^IxqZ7txBWKb)s+@bQF1u^ zo*dQ>qzQ8i%T?^21NC3-0v3`cdD?fa$Q3w*Iv z#9}L0jX=h@_2^$cJ?Q;F^Pe$+iJ+&>EJb)V{lpyGYW1Q?_L>9R@I=Mn7}x(E<|eBaCnzhhRtrL$2^EBc&oyjP(BR6UMu4jYG89OJ0*E>gno4T`V3(6| zi%l?md2*Mij(DFs0vH1O^p-oHOaV!Eq5}gJw_#!S_Dt92DgFbaNtc*e=IEzur(@Cv%Mq5sZuF(A10t??(V(G{FPZ_I!VV>!mSc-Bg?oFfFvf$84V#dLUdlgyW`$Wlb#=e+DGh5syvWZCvm-EP@3=oN5iURjug3&e1(+?L@&Q_~JYDCB=X^0}a$ z;yf{v-(IS-lr!}*Z0L34t}-0f>I!*s1fH$jV|{ST;j}S24<^(taSS|&6WTd8HzA-4 z8n`_bD#3C@0;}C74?#$Q<<~9&*e5-}EH~P&0xFa%_6?Y1Fl+pDDB-k5WZ?#}6_N8G zo@s23ow4nj;lou?hfZ|^37Dr@%Q-2@$4v2u_ZA2yhuNmrE@eAtdR4l=LQiDR6t08p zZjGV7(ZmIh1DvaI!tHVsTF}2S`7P2#gq-QN&hI(=?}-l%0Ztz1a@-sq*MavJQ}IJn z+K1sag#CUyNwh+fU~qEj`u-mfzM=yu51Q%)K`w#YMLfsLQK~xk0IV^pGkX7(@L!OR z4l(Kybc4c0s{=GU}?1d>p_3dIQ9t@xPCo2~DQu@3iHhj4 ztY&k=wu41X4*7gIVH3x&Sv6LF#K2+6o^yYu-cBuK&6EQ7}t32=PKVZyMHK zB63)8qbO!xe>vMU%%6n9AfF36re&XjnH0qXS>G-aux<#190)A6b@&-E;YYPJ!WD zgQIREkVns|2sS|wGrHNedL@zyo8>DAWO)5D;5)5|$C^B!6t_PZ>hlK^i@`~w zmR?JZ*u%YMa4YdWjH^PfcjJdr;(Kz_B8zW%9bax?jmxK4nd zk&Zga@YykY)8&>``&cd1@W*4EZN}36d8#*FnLjFHOEq)234X|GyeG zCM`%CB_qyV42ScdJ%!(NP{SOt+x|eyS};JwH7+(ur&Xo?x3%aSy}zOE;iSj@x3&_) z<`-88vIcnWl8qHKeD?W3RlsP)~6r&=|1y0yxIdEB$NZu|sC?WQIcAC>wEy(cSAceMOgR>+Lk8|<3xmYIxm={uYM z1K|J93fN=<@EZMOqMn^z6k7NnaKaggI8AB+>z^}ja-;LiJw&~rilJhJ`JEN^o`%t= zb{L|4C2ak*=8Fnw%8r|kpt>?{XcL0&zN?Q+?I76}#66uMWp zb5wc4TBFeI=JKral8h@Z64A>e(;TJJ4@cYT@++e`7+%od9anr^YdE0}t2v~8b6U)t z{#d}u{ZS90{h=Cvd%owQ@oxzT-TI%3EDZix24ENB<{M;v)B%VXwfwD8>52%V@go%muMl1Y`S*!o?9;2baQyPEj{ySZ!`=a;Ct5TDgE zi(_?!=a{uF$=D`KUsR%M{@^1gho7kp3>2?!G>B`H|~kZ~R->&Z-` zJS%h=#X|9Pm2yV4wzgkfYzQ{}eq9_Y(fFb2_5OEp$Jh6!bH8P!Aqc5sJ}<^pe#We`{h5%KYb=ZvbBpx>4yE3H9UbFSwAU4budI} ztt<4g{_IlU^J@3Y&z9Q)LgtmSA}Y^p!;M1j zeij`{JZR(588fiY2uk;<<;1@53kzNo`$PjLM<~cd=ebB?v_EJLZP#f;EqE}eZZFn4 zJczuuyBw4b*~AUd{380&Ym-h7OSHhi^la8cG}7gWY?bN*lU8@5qbJzoOkie^QfYA& z2eij1BEoLYZxl_kEq+GTA~)H1NcNznt1;A&v@aUFi5X#m#dF1ULD1OW7dtc@J;_#X zzAih(;dFNMmh`h4;^Jw?DmQIJw;QH;Qr@cUf}{nz$BmUYJt=pMY&V*+gE#N2MWT-i zZQ=;-L~XXP<&-1=f^RW}>)J_ABBrs)_i@jv?+|_VqZMwMj}MN7mk>VZI3WCt<;Z4k z#F8?@sAT~vnYdfn=t;%u4{s-D=sEEMbf2?v?GgxJA8H8VF>Y>izGLK%>+dEXVv1Zo zm}+Za8|q6Gx5&ChakwaQq4+tStu|Sf<;m9D+a;Be-inK=yx12wxXKm>^|$Xb->>MQ z7g}3l}b8tUJk?^}{TW>Vio{MWuPsX~p*n`Y0+DSB_+q>tEKYwerl9MV{swReV>^GpeE zw%uKHElo>)Twn8;roWxrS-a9Iv$b(x4E;_4-6j#I|F6EOl-c5+rk0bQx!vr{hXfPy zccwEvG3(_2eGi;${~uFt9TnyGhI`W~Fo2Axbc&=REh!*~wA9cjIixt0Fm$7cbSntb zJ#@J3#@ADDUCu zkj7IUF#qfNDE(;RhO$cM4+J`xDCL;t5s!azh_&9qk@JhZMcYQDKrkM>gx5zNw?T5R z^5<$@Z@63ThzHC@@!qfwL$7+hz65gYH5yJW7aNoZ zBYbvQ$L4QA?N=BWeTB@+c=5b9B1NA&(?;d;fbxO!yC3X7wP-0Tj1-fxejuW#KT7F_ zy=Gi9bpI6;+F8G>`IA!A9 zkz_zCiVAxv(=ICeKt+8YVfoRyWfH2G--HkwFF2ZoS^nGxsmP9=4v?& zeku3W{G{x-fAGC|D%bjri~u`JLxCfN$T(a7^9>v;>0vP>LB>yoPc2L<1Y{mEtt&*z zyDspIKH*F`U-7Nuh4?CX4rp!gVdvY+!o+y2Sbc9A{|Y?O=e%86>MvXBbL3)WSZ?wg zj!KuVQT`N%XCLXBF`x6rw7Ft?i>@U4_qli1&T63~m;h3Rv4Ym%!KRMk-%nw;vVRDr zumtveqA=+CY(yr8eJ;W?s$kk}P>Uk$v1%X{)A*sQMrC5J`6XU3QibXs9d;P%I68gV zAdhvutd7!U*3e8fRW)e0!GuJN5-hKtl9$=^q z$#ZkKAD3;GVBmp63gyuNu(mg_E?OnQj>uME-7UI1lB;@mw8i(@Lx^v&*mkxaRh`@E zGrbDglR9a%z-E|;| zm_vpHtRd`aJ7I=??LrWiLT<4Bhav{vKuXQbImR_z8ON2G3h>Q|rOwy7hqB*UvxM5J+jK{+o$v*khJ_s`)dzDliy&Md+9Uw2!Y3l|3%_aOYQ?aOM4(xMSul1(Q5i493M-vSGg(I30a(=A&J^ASJiI**_ z>5+m5IY;(vVop($WY3#;di+IULy7xu-wFB}a%A?d!Pj&m4qu1M<=EWqWAe|V^5YKr z{EgFdlpm;iuUVsLNBn2=P~3H_mI#VjVn>w8lP|PXTKh( z+!_E|tpAE=aNdym+l}YS8QuBjX1^y(Ob)Ty#$pa+PQmLpNct5Gm^#r`PxQAcAU5EI zm$G)AYrO;JgjQ7!!@2KZWoELlbfz~Ur!fC|<;#Kkm&R5OB}$iVYXC*|V}W^mC}Jg< zpgQdCP1{JKM1xovY$E&l+V|omPq`0&ZLivGP;C93=ca}hlI1rx+|nrOJS17h7nJen zL?HpnbLxKojCBbsJ>IN<=~n;Q>-7J>16q3K2Sq*DHjs`aF3$@yk9|4I)*w9@UH<1! z#UnKy$Ailv(r%rR02G7_<$L!dXAnUcIZeLd2oKyLrh0@LO6C1)SgpI8+e$%el|1~?H9D5N3j*I9SI-5v>?h<8Gpn-r9uX;_BHs$NLtFGQ&zu?WXw-Ns1lyxsiSN3dM>aV`J`S$x z;dYzFNIP1=`_%{S&>dlsnm!!tG%R^3D{pY_AvX4YUHE^49q>(M%rO`9jqaaoOLrQd z$hXNfj3hXH4!$`Qk<7wdkW@NxbI7V3_JG+BPAcV(FfdG3$O_CvI5Zy;73!avwu%{=FS!lVBhl}=XB zjeFQXiLIPx%Fw0!ypa_Z0ah00_i-s%<>Y1Xv|fBa+%?@i7~e?=JzLdIlv@paO-gxh z2pYh0z~sM6nb+?$&A|Vn8o|=f!uVY3`~QYKn6It@1LvAbUxR&4_y;Ni${c$Li$+-= zjyR(^7mn&H8fqDt5)m6aG2ZeEycbPA|NGoJ0>P8w@%QC|ZkXQ^m3?PK zKxPfVa(@VdSW_BRKGgogOJre1g^ja@%KtFVB4~Q|$VYT0G}-QGvvT#0*>|<_=3Oq6HBQO-3x$ zkZ4htVAKt}=Wa`l(fGrbSy{Q9rgSkf^XI%ch$RoZh6(Y>fwDFro zI9ASqa`7P?oR7ec0;9m!3&L`gAzJ%-Vt!LNr&&{f$^Sb|2P|2ak54>Gg$4WkY}p-6 z%u;l=cR+2lCoy1Yyyec*dp{0At^jMvIEc<{Hp>zBnK-G!d-8rKPfhIS{N`=|p_Ddt zu1{%nzE)1e*%ntr{+u!F%W4}L)jdvZ!y;7irs^-Q9wEwcJtOUb()<8AJv9QLAR$p; zvd5VQ7>ZF$ypIkTej`9WRKDHlNky54kMXv5Kiuha7qYWN@Bl0q!=V0~zY6%^h9o!^ z#*4>Xp+sDHkt*^Jq|qW#dxHA>XxyurLg((PiS!Jyo*)6{nky}%3pi)$8%LX z58cRp9TUXO60Hg@-4KFDyoPmc)VAdZiE+w*P}$8I2)Lehlbb_AOa>*J204y1!s4tr zT^t@9;K9wO;auD<#GN{Ef2n9IMd!V6`EyVP@Zw=WCkWtp*nC&*FkMh$yfGEFPVn!z z0_Ry(-fHrHZ#m>P4uoF5pG?bEzjbMq(xh2tq%2wiiEMVMJk2<)EE?e0Un?l(>R~Fr z%y%tWj&1b)9T+=$!vC;y>W74g?s57sJMKV-Sl{Re-{-wy^FG~*o1YI(%hIqzC@tB| zOz*x{y-zEjHo);G0aebEh8H2<+BmPbW@4PTN$>Ob7e-Di-T!@5ghfAR!*Voyfl;3ngx4BrW~r@s@8&P#inbu$vf8aN0 zb@55JWHzbX>8b*C+a)Y1F(nE}t=knB8t3T$M&8Z8#RCWJ(iby-Cjz4b=gT%!pQUUh z9D3zE5L=4dzg(w=`a^ljf~VzViB$cI!WG$F;r_xTATm)KNEYm_>>1cv zfUv(;k&p|D(*eg#7%`|f*v5{wPT5Bt=Y2_EKJ) zjw$d{=cNe2QzjLxB>B)`H=K3jKvne+?}Uvixx_*NT>YR}-)F{x8+d;Vkq#^8D>PUk zG^c^u=*t-e=b00NzuB7Vg^dky7ORS1qZxHCi+uXe=udmUu-|Ur`0>0({t;LA5Uh@=K(`ak;-sTS*yFVusEelQk>8rfVhS+NQ~9mQpKlns<#1A3_gDKyLB#T~ zO_*6SG}$s6?5yVI@JXQ_TbhR9DiT>;>4)G+Ad&{tl#rHa{U`seib<#-dc+p9B<_Sn z7Wkwtx&cIW5Yuvok$ULHfWZj6^vXN+n9hCOrGeGUm+Ky>RbLJ@R!|S!^QY1NuO6Nj zuG;EWaBJySRyG@OH3%l$6?XU$_7aacF2b+&)q}oo2t3&m!!;>aW0QxL4Qojo;4xs+ z@WKID#7bC`_+{bydW0ZnQ@?KI=4g#n`!^q%P;x__Kb7>~9x&(hdngr1#ItNTnFT$z(S&AWjzNeiRnH3CwfuAssBG>mT z`CMh4+VRxNbJFRe+Z`U97str!VFDc#jAqnsdaA(7?z;v94#dWM()8EQ&+FlHpINqh z`#7DtOSxauS1s46;wUpO98ceKJIC0w>}v>19*Q{5>$%a8TB$NzBNnsAIM^8Bn;zK9ZBK!S#5ae)8k!IOkavWhp6*KLeCZRE9bgSX>4$L{x1 z3-{_ces!aQ;HfyPLI&UEEqi6|3z<}*VF)_yk$bS$@54H~p~OBxBgGe`x;p4GA0NcU zb(PlBonfuf5@ia5oK11heC=QRYf+{so#q&X2_2z>h0GM~~z z1B=h+XiV-_<0aUrk3%!Txl(clD4rw0D;~G;x>d!d*c&X}VJixc@Wz1r-$qXhV!|9H z3?F+A9B~GRTjT1VCEff4A`{giZ_yyZi7*dHpCq5WQ4}YtMxy<&Bwnv534uhkM=oRi zzQ3{*ZrZ6bVT3keY~Xf}*%sDK`PV{xdV$9z+G;U2xI{+b&GJL8w)G2>hs*<9JZehS zlDkJA?i?;cx1j$OJ{+rF40ys0R|=|0)uSJ~c79%~8Ru##k8;OC3oZM`PuYj}481tu zAFI+KzTG~D>0a)=$98-BD7({MvI5-!y8?ymse;aG)QjWvJB5z))x~9~&7sV(!l&~W zFxBK^urM@_wfj|DEpB$4ySdv`qy27kRH;y8ga5FRMvf zv7@*H18;8mUKy?OWO>lr4DQ2Pte6Z^Ikb7EXoSgGP*i~FQa z>lnB=RbBJ3M6iHyFK=_AJR3v)N1Te90TcFS3cO_Ub=jcr$uG%+e!-?DjJ_+O%tYSK za;-nPeg^0Ye*0iNMsAW!wism9P1|zDu`-Mdq#j*8%~nS;M7|PUo$?v1ZN&MBhNkT+ z!GFClu`YEBb67x>adfmq-jA>nfWh8>y^st9=P5lR4%u4p8(ry=DmlV0L04=iGHZab z@Q!9LSIb6N-XZjlwz~RsH6Nx<|Mp>aNP1;W{ZY8Bou%D=x&7k2?-k={wSl9rKLnZS zy#qhoVE?{QBAkya*Tafjse(R2ZQ1)08S-Sg&TK;pUWyKh^{5Q90B$%^tVQbD2EVW zn={pQ6D7F$IHm z%j9*r*o=calWn>xXZAhD+zTihf~rv=cZtV$#Cfw>?32df-kPhgopgdMlG#C<7(fI_ z0J7-=x&N&LUu3j`huSw!AKVBmSmQC|^^ooxAICvS>yBji*h1c(A zO5^M8TKNiKI=<7!C+{UMONi~-sE%=qUR@!3=lQPA7=9`mzxL*wf83%TK5Tut!|9p+ zRjaFyk@p3o?`gW%LV#m|PH)Ps&lBjxirA`~BHT!%9Wy~vR+jCe`2J|!ozcPhfuAaW zhmZ2-u>+FTo_1WARv&?9C)iR-zaJ?O?MkeOv~{5iHj6c}9qVhO+PYehezKcXs{jcEKnZ-Ufswc1CU8E zFq)^aEdrbQkd&=u1MtX_@Hajn-U8Z|LJez)+9}Oqm=O9%_GFQksLOfP85q+y>L*YC zTOns*MkktRv9bRa%AdaAy$WD>Y*fo|a*+Q#-S{j|^IK`QMk>Xlr&EEY9wOgT5W5c~ z3g`{Tv=gOw>z2c2H1)2KdZS;Ta$C3SYzgPzed?P(m;ATb)%Ryl`jiMb=Y|zVi*QjF$7?Q|(>r5U+kHU!nK3Yu{&gqE=xm3EOLMaHhXZUxTlLP^v+%}eyr<^rrJ^^k zQQro4vaSxV2{r|)K2##nqxz7w14*bttl zglwg8Piz?3w$l-Ym^%e#)~Yaz_FE@3I65;s13_8=aE-&6DYLAA=OS%Mn+4{7xX; z{<`MmSr*^~tAFe)GswCbdCDy)52HiAsYxiX4NS>bKP%8YWJqk$E@<1c}_8dN1uv$FL4d~uw*;U;BAahN(tzeXVO;5V) zQ?L@xADRU%^TqbyO(5_58SA^KAJ!~dW7c{9vwEhKS`763L3vV8Ch|ly}Z`a(=rH!J_PNWS1BD`)D!-X{%~QW8nL@xKxlFp1jZ7VB9Nyb1{s8xAM$g zA*Eq(vq-J}F#FLSVr)rgBA!wzwdOIev0}iB4tyVp{MffB)#=040G&-=)3ki4)V(LL z$1@zC>`yx4#b3UzYRJe;PWUnB2l3i(a~Lhm1oL;E=cQYwl8fr z_?XIY*MINEDU|XKS(q-zIlt}oN55#fgcUZJro~&-_E6iqhF8TqNcUP#$YIGPJ+}yh zf8-r9zv~MjHvc8mizR{>gT{1(-QO%wsdDYaFP6^_Hcc%a8Gc_=b2-F32X$gEZi-9v z$o+th5R5)33{B>kuAkp4Iq}{JMWPdglMnY*43k~E`&-hsoQa)*@M}}K@?z6pxkI;f zZa)hGEp>)7Eko#VKacZ22XxzM1bBlApE7vLuOool*fX5f{Y+rPcFU?}Gu` za%U$dT~yvU-~%U^CzCLimjFd30iut$#-l;p{ZA2wPTd4X4M+S>?hn5QLKNk;P<|f! za_`OjuWyofJI_Jcxk)_fHskWN)WqoDe)b+EP?O}$Ss4HKp^|{#gx}-1wR0vrJuHgU zeMkht@P(|{y;3{7eF0*|=99d7^mcbuYrFEjpl7?Q5u?)Z`JyArr(Zh^h`-WJ2p4Lc zOLOUACj}K6_h$0)7_s+1Q>|Ymfrwn<6uIw+msW00F>CwH=OBF0Yi5eiUNmjT432)> zsgbH}7e79-ZW+=o>$z)Nq3SlqqciVoTAo>;U72$B0$>aLl)em3 zjk0cVc!S^^yyVKBvZkACJ1|cvKNt`5;;Ol!mr+)Eg}WmnWtw$$w8JZ*c_RW2jLINvP11qZ5p}A4n{Mz^Y1_G)cS7thq{9P&F#OU zdg6L%Ty`m2uXkjdzFb+Qjodol_E6@xeYJ7l^k@}!M!yv?xIPE3o-7KSfwOA%211;^?L zb+GwcU?9-OsDPXYv9@NC1#243E&zci7Xv0|NBapqz%vt*AaHEx)X z?R?gdr*YL{diRTUO>U|W_U2uJF<{vB9a#?-6H0`7(VyQFz>>Yhe zPo$t80eyAnW|hxDy{#PZw4a2d5R*U9calTjZlScYHnMLa^d#){1|waIw;O$Y4hL0^ zb$n@sO?XYJ5g*GaIQexTa(71yKj-rH+|(Ip{3F#+3ALppG_4XzYixiudj+QawX8?| z`R4RP+gJJ}zt8WBogrfh8Rw9&bak28_rGV_xkjKBm!~6KwzkYN-%*{&+j!8sE$3R- zi)T2$+zyn-xkg=DzL>wR9%rAcTS_C8U@>mz|2S#!iaA(A!YMz2dyZzkfN{wP=ibtD z>=(Vg)&@P**)vQI?K?|br7b_crr@iSYEn@fzN44WUH4h=C*1sA3t$VWnh9Z*6aL@Z zj(`i~5%&}TAoZqJ^-0mPaN!i0E*3)h2n59;LJIE1L-qo7AuT^yv*sIE2ki!a9e8(!$WJy=68y0-B(bBw=bQTiCu z@<1{c<*@(U!Jzx`$H~pG;g(^2W*Wc!=EE9ob|uD1jX4fj0RsXGPWA7bPSs!s=Z8ln zD-&dJZa~0?P+gutsTo#!1~maOqTWR5%I9h_=0ily8T;g)GQ8d*yRegG`a8m-z7w2#ZWl--Q^`>3}16}5dEVHU5+O`Vmg_&3e6Q#_j z$gjOFSk`azm@*g0tpqg$O`+h0ZGnV^02joP%~MO!+F|C*k3|Y|8TSi6RQZf9vG)J1+hF zazoW%RHc^XWKgI@IkFE`?)c3L@pIMbEBoE4(%3s5GKPl@5>mPc(46!1_#jsP?c5{B zc@5#=1Xh#u!iD|T8`tig*Z1^k7(HhRZK+d6RSdeDJzw$*+AbVg)JQukBniBeS=Uy~ ziyzJy$8ne%> zIm%`J;xw7xAx9vr)qTb#w7_Kc@}tg>&Ks^}wY1R265TkKXz(WOvTCGpCz{$u{a=%l zKMv#r_G{W;16zj8dzoFzX>~<&_JxBm!HlgdJf!|%W&O8BPLy&s4Af*|ZLg2ouE&ip zJx6Y$w6`2a7|HEoIXsRg@|6|+wY3t8`96=SP2>+irOVvBs~t|fP~Uz`JC*-2-oF%o zn^@Ci;6Rho)MKjW^~Nra%5M1OtrGq0;3*;aP;t0r*cD*Jxu#I0*)FeI$e~R3b<<=&`rnRiYTmFRT zacfLlFL7IHHhON39?@3U0sEL8op*OOOx9wK!W(4SgQ2`~(Kg0`#kD7}^&YlBu`F z<9YA3GwwS1o=<0;=dKDp(l~xd3EFRbuoNz45@k^Qr`XmI$6@KWqLvCAQ)9aooc(!MLY9x&(Cn!&p6lOoemq)g ztcp@I$l%kj7Zuw+SUD>ExOObAKfG?PvWT~vZ)|>FY5XXOIP=Qv z^X8D$um!DcL5>mK1a=7pMEIgn%wfDM^Adl)DhOMcWcCV6;bFMK0`l9(I{^+gmq$8a zome1E7Gh>;8VL!NHd5I@b_RSOkii4D3Hjehin#ok9(5u`s?LH@#iox?QA=3X|{;<2?+;-X0tPaJT+bn8W6x#a&P<->Tj`V>D zXuC5iS0aB>i2N_Pf6q|%vTo*^Ir5S(lzvKY2U>FT^SQQUB{0L#!|Tj3w>Ku!lI~6g zS52?BIOCEu?7v5Ejk=M+b5;YxE61EBRyr@;dmjqDT)dBRwaY3qTAW{o=Cw#)>ZFho z(7DQ$3KuB%*8E91G(1489Lii}wA~Z2 zIp19-6FTjEt6$d*s+#@W4bPwNh^R`(2#sr)UnE<^hrM|1punO%^Q{ zgz-#Bl^#P~6!w=NrnmMY?v8FzL%%+~sz-S3(7zbi)JZ=NP-LijDtPFmvhDqHp9=B1 z^o`2w%eRiD8Awj!o011R)FTeo=zL_Q>u}UkLh;Nelk_V6rrlo_hXXZ*f=Ayz9%o4z z^0@ozqYw$(Q9&(=k1zJ^QTCnULZ7VRqvbk2LY(pIJtK8^Z4>0Go1<0Pjc7~m@xry~ zFOfgze(-RE-$jB&U7sx0IGN!W$-^*uEq-J*;>(-`I!w6-vXauL?w+1U`~PSLEHQwL zq7wsA%#e^R+Aj?6h_jA{UDIBVU~-e)VXyK+VRl7Z#Rc_~m;FnaMr5O9x<#?{22G)_ z+n*qzV%}VF>b0<$2ID7^8>kxoTqPmc3aLJ*jzg2C=}-+9h()m&$b)Q zE9o4`;gUV<&b;W<3#&TLoLAL3AGO_vg(^72$4wR*a6Vd=UWRVA*sE?f8&Z#cR*;-$ zGvzZfVE$a4gg!3jaR;2`zMFN9JwGJHg-I^jyQ{0?AJ+m@=KmUhs(aFy&TR~-Lih`Qh}3*L;dxdDb*lR zQmX_Sa_OS3!y3viz#%Jf{zv`cR66eg0hb7gUS^eLu2Ze3b1>HdQme^rpbE<^M`-!k zEV9zR#EBUz217--E!wdv+eNPUeKm(zK(A&FD%8bvL~L;9n)o>O1@Zo-3|*QgY~t~1nRpLJIXHl^<-dTq*Xln^(j)98!6&V+)py29gV zIrz3N%9?J|HxMZv>@}EAm7wKnZot`$D zanY36vlM$uIvXGV6yBrcIz*@v;K2=HVyrq*Nehb!SDLMMf>Ar#6W1 zm!s@vIS>=^J6~3@xaZ164z&(%6vC9tn1mK5mbrXU%grZhyoSwcS%L`zT8Qn~eTTP8 zPOw6U&65_!%sQKR@zwXyP0Nc%3oY&pSv9_}2F=-nA^XGjP}0WBihwu9ZgaZn$rXHm zrkIDNHFyOQFpVxS{@R?Ee zNBmpP02!rR>vi~Nrb)rrG6;m3J(Whke3OK=X9P{u*3sg3fMVwe8E$&xrW?Mcr> z>F?ljEU?&?rv#u0oO+4WRx@EniziadjBt_R2ob&8vIhg4>Tw29-j%Cd7SP_1Fjm=) z*V;XwHMrl@-nff>;Lfq`Xt_yCW3D@uv~^}{xO$Q^X!UD{v;AjyhWbUC(~{C-0ldwiV7hvS+T@2!!n#?O@;PvwxSIovX;nvFG7!dWGzKX`Jq-!_+x5P;TM?h;{R_f2g z+s!xDRJqH3R|}*Fg<^%Y5*FATnHs^<-q-Bju{FYVZTTz9Ky=wb8-cQlj%@)%^3KIU7kz#1#+B(K&WWo+D;bJHk~w7g>G5Lg-&vyCNxrn4C9*7`Z! za=7k`$5uys4<0qdoQx=7CXqTSLUm9U>!qbj+xi`fHPN&N%zTH56Qi^ZzjsC~Kufu$ zN>aJFp-xh@xDm-VE*~`6dsYYysqJc=RgNnaLI!Y8g<;nfIv~68d}z00_UlOYRspL+ zv@I#^xh2do^R=zO+5WYrDZgR%n8QSoo4sZYk5GO@aw{#BN-O)&pI_xMZizVeYN3|r zy|P_C6&(nb_uoFgguDy9rjloRRx&{~!s{u7=#Asr1c_;ym;pu;$X5ZIGJTWoTdXdY zvkNrYYW=a`r#{1&7+NS?tFZ!I$a`EZEO4ll@UTfLuV%M7t9vPty41*Sd>UJJ-!PP< zxSP%q-pjuR+(FN3f)uBkJ#F!)Qbr4Ng`5S~y;PTDzK|snVyQ~&L0vF> z)d02XAgn8ll63?O>(+8^OL|p-^y8}>ucPgaPM2WJo4q6lTn9#8AJP9VJ3{QRFrum? zMC*gBiw<43J!+fs!JS%f1=tEZHg(jb99hQ{prE`Rd-E}&?*w8qSEdVl34R3OCViNe zV@H_Z<@D2G0C0AJq*NG;S}+E25mlCKwGdTTfblrBE;gwH0B!XGM=m;Lr1GIBbaMg- z6yTKmK#VhNU;>g3H~R$#d0rgR^sWQbx1M!6B0&lqws=jkXp!)du5%P>a&dQ?IFeJ*Vi{RhnU zGgSr+CV9q!vqQp2UhBvp8I2g-p_g*nL`6&7noH#!C}JGmlBW;%Y^(Y2GfkvqIgA)j zB=G>rr8zs+)+9!SBwH4w&utF!FDqcx?3)~mAQqs#9$$2yHsXpT#wR;^Z)S2iDy7wR>)r0SBYVp6<<)q3*uy?$nis^4!t@)=3-A{ z5mVuCrO1m_(Yn$w6z@@T_si7(IFij*XK+Lt{;fRVy0?Dy6J*^))oMLWk}Kw7ahhv1 z&?!#2!r22pV{J_M4`#b;H&g5KqhM*u6_7VARYMaKe6J2NhvlalcA6XV9BC_b!z3`r z!>1tdq9s6tBU${tiL2n_YK$xt2B!>zfA?5r%&Yf(0LMzVXz=3M{a__-%O^#EH~(rt zxy#Hz;>{SFMy7Z%ZvqmRxw?m0|v-{K`b-!82k^0ifm#?rPf=0^ZOj-N35f5UGwoC!*O$k~?_GN>LN44mEZ zh!>7|Df*EV3vQLpydPd}`%H9wdyF%bOtCHgaP1nj84LdEKCYKPR#M>E_t*MvwkUTo z{lP1*t=#HG?^4-JR+XewI>+m^SxcQLroZhV=Sn0pxv6I%&t$4cIGMsX&e!rbIII|X zRk?~}Vkw&O-R7tGKyjpeW{+3`>lXj#I2egS{a)AICVE0TXTN%Ye0{P0BfY8ibx~`@ zF?gQG<+j0y;~%fwj>n`?e{t{z#C}m4`Wd*ky~F^^K247IVmD%N+75i{;#m`LR4b-bS~^S7&a*S5?QT{iji--M4Wsb8+9 z_`M-w>E}3|Vlui+T4SxK-|tyJ;ce0?zedJJF^jmwYLusWzR)My9{&9K%z0m{RJ>5{ zx=1Q%FCC~Nb4}>EP zK1UfoN0YZLiju3q()ld-2-xp)cSF%&S+>On4(gwM>?#RKp`zo26bwZIVv_)n`n5X` z{L=v?ckqH;(f2)Wn77pDUQd1Mh2Ed1(gOn8p@)mKol_T{ zA?Pp$dO@Fa$*Uu85|sH?-m|f?QJ$B-|3l_l|w{W)Qk6_1Wx zfb^e9#NYf|h$oA~bhX1Mz%~?udA-9S81ve3j{t1x`j3_In@Kb9RzK|9CDaSYh@YQi zr{rpYG)epr3?N4_c6<|`Lmhl(8k`66y3a30v!7B7I<$q58D3_yl5L6tDOY;8WukE| zP*E%yN>kb;@*1wCD!P3#Sz=fO&i{`#PIWfFSPlV!`?o{>7LdjiGyQI#Z3m9`9E{@` zO;O{8cy^mXv;=b#M99R)W&hzFChaaT_--2|MmuQTnocM8%Zck;^vvfTFVX$}XJ*60Xg#)>E|U@1s=IlpO3f)&z;f)G2ZhrHpeY2@4Spe>Ep)>z<+Sy&a@ zvp}j}pgZR6+8JxST2#mcgr7ujz}I1oNEzku{|Pw($dXY&S3>wO`2hxQrQOgM<;|kX zAN!j`D*Cmuzb7ldV(8&Fd0ur|jH<-J3{ZCQQ2hbo=Kf3lPzdRD`7YO6K&C#0^;QFX zj(GqdQ8h--ieZ0LkrFh1@F&8gl-oQw!JtiW%8cLJe~ZU85~p+NpzN&*2`0jXX>45> z^Lv^lN4lkf^ur7ZqG_R^ICFk}kXtPD=C_7K{j2GH@2>TokIdGxY#;97c$3jA{z(}8 z`4jI(m9a=Gkw~--c>f-ona5_*DQ;D@etRg#7YU|u4r1JU6&=VEO$DV2ZrsJinnwyG z5@bmA(~2j^>Q>Dd@9p{*R)!a2DOnU8x4-r8VFoFp-}NnjC+z5-WJzwcR&OpQT7T8C zII1ZW%h$gXW8=7R96p~PWO1650H@=zbwRiL;3ia;z*&#h;l|vDnD81VTI{e0qB2M@ z;{+&#?tAw-g^0PX-MeTDEyOEl!fgGmgGsjZDQzhvwgns{NzL6c82})bRSU$A7eZ|Y zMVD{jn^s!2zOsb4U=k7>zLU08mi2d{Fm&_V?VK~zpVaESd&f$Q4R2KB=>viERnk}itk%f7qX32F#M_T z<4;iHChHV>X2j4#dc_BdpV4Z@BC8FkLkd-GW1S9QCV4#!f!xgS`m zZxu16WJ%GUCsVs8ugWk5FNC*%)K5iBn&;FVy`dS9+g<=9lU~#b_27Cc!34}>5`n7B zxHrl=f{gB|!)rAG*h8kH%*5g3J9D6+I&8TTAKdQYXkj9 zL^2)U7^NaZ6{r}H#uTj{0*W7UF5E1+iaU`v681tx4$J)70}=Z2via5%3BPd{oyJv@ zbb~%;Dy71y7#hes=Ryv7f(*Rnc(JAI%^mt6k~m~rx_Z}dO{{ea*PwcYoD4I%=rOB4 zdEQ@eGWd-cXv@>`FP%F#TgJ6c;<}pT0{|}z>P#khtbAuC)>&GxW#Xfc(MOpP;vOfN zgdDrUD%;`4EH{vx;zZvJW6o$7Y6X(AufbZA;mX~ZtYZ8~1LAR0-==og@RN7JzwfgY ze`%wVyO;56L06_7u(IMghFFk5iZnjx?Ck63r+$KF%Gv-TPqeY^bgn`%*HBgy@U$=$ zEhRq-u=U~Yewi88{P7PXpigrSv6O&~@9kw<X-QHdLw4%j}JamH?213 zD|ec-#*&ZTErpjDo8 z`L9h8rTmnvnC4a4D_I7l@&@%G%EnOF8O5{6Ea@F<|DR-CW-LFoNHEGMM^#9{)kq)$TwEyxwMgpaw)kx zVkSc`r3sq#D;R^HttLQjUvOAc&*cilIN54KZF7ptN-hDQ!_FU?X}IjvBHg6ig2D*{ zwrmz`!%qsDoqun?OAM<$TEvf^_aQi6X%5NpQK#C14g0ch@*a!OnI>=D-?w1$|3cMz z&<@g6n-bX)jb4X)fe_@w9Y{MyKwiRmL?s1^k$PeBR^bduOipPNsUxK08I%$eAhCzM zHmf^tC*}Vg-nx6Yc_Dzb%6A52y4jKHc{8(_Dg%2&FX{<~oIeuBrQK*ek326%jy;hF z&HbB3$;k2+Wl7BS@t$FtYS|h4e1bFSr-*3GD$!vceqxv#@uRPJci|Cs9 zvFByD3GFu2{{*@nF`$1)`g@;Xwv!yf%iO`zy63$$R@@}g0kPj32PqDRAPm`N{g1PE zv@^(2-Aqx~DLRtkQd zJI}}3x{SJokF=BU!QP&*Dv(YIdJLeIk6IvrUL zIQ{QYw>l99pn;y~jbJVy{p?y35Je~5xZz7>ws(J!&ZCP8{$jhkQoq`HMDwZbIIinj zzb2?`vaVcnLQz}1H8V?(Wc;P|@$}0q-haf@-EhLqpfd)rF7=Y;cpmGwg`Yt@@U!Wy zd$2Xf2)-kPX+&-}-i!nl_U((+t}3@2&--tgcyW?;Bll3VZqv#)6aP)pxPcs6_hU;( zfdaAJ4SD=>Wb4eBNhLUF1$|iBlBFDr%*j1oM%JJJk?0q+ z{h{c7q2N@YGFHdX7{9UQ(g3mxH|f$@C%G~9O%YKgaxAI6{pQO7#H16SLaVDJZR$p? zi5N~N)J9X{z};%B`o*|zWxrf$-z&wBPWc_IT+skKEP;8Z->MvHbs&5?B)_v4w4dqX z97XzZyHxybV6gD5US9D4ChRD@{zS-Xea#blZ!k>(X;M}LcO-Aq%Bw!Vz$eu@7b6~Y zgD6u*hripSVa3ybe$Nf4MeNES-i3#KW>t*($x>{47_pwf8vR&Ho&240=LJr0TgR&s ztm{fhG$m6CsOU$%_A7xry(iwN>1Ya$DRi|03CM*D*g(tE~;Z^ni!alZ> z=c1@@qOqGMNSt^%^;L56eerLp1Ak%))0=jIF&Ed{>4X#X3X?5_I7CW`KdJELcFg43 z6^NBc>2a~+?$gUP-28AqNF&FGQI#3*!+W+DTm<=ASB&fx5u@EbK=$g`7 z^CqKbHbl$1Qxq*P&1c-mR@xsvvSTcF8>!WcjbB%;Nggi0tK*o%ietd}Q!Qp};!8Lx zEfRlP)FfxVR%4=~acGEa(AE^M;u%w8Cim>QK|U@H-*PrM66Oq>wD`KXYt>qfv9Fv8 z$-qaD@r|D+(scl&*N>X4Dd+_0ldd!X)egcyKFYPWZ3~pow_o54*LWX+VFlZc>36i+HHU^d^M7=+$?v6sa^K6j9}> zyur{%0n*^3pxx$Zm7l+NWJNtH8}}cERqpFHyi>^0HMrC~>3ZgL$$Us*d> zHuc_95P8)DVf;T#eRWinUH7((qY_FxAc&NdFaj!wbc?it0}LSD-61K>NT)OiBGNEJ zDj=zZbPXjSUD6HT8Q=H)t#7UQ!?k>#aqe@Uv(MhwzV>zL+BrlZ`K!=u*|9ub;^Zhr zEG6ioYfS`Wcnzw^5Ge+A*wPGf?BP&}Z7@42@g!HK@Xg;vMHt%y%ijC#dcjyK z+qwnXUA|hh-?;=l>_5st;sj?VWdB85fBz+IvOT$8z2a&4-a}BSat|>b1i!Oe{xSxXe`9ul7zAYd^fSQ)ab`lX37?p^qE{S5{t zS1S97`2x|^Wq>_W2Tb+q-h2a=bPu&*j6%R-^sJmEQL|YnOV2zz=xhlL8gu|Utc4GK zrVKttv!0kPVyR~Pz=!WHKpeQ)FG{D=f)U*yBQ1I` zW;6xn8jSPntvygSj8zO(^F7nSbXTB-vca0vg{EaAKhC=HOqz=biu2}D@``NWK3M$( z|ND#z`&_R}l?Ct3gcwYv@*Q!r47hfFsE&gNr9BD}TTjjuc_lI2bI z1LFS*fz~3kFlgOM61gg6dfl09Tybjo*N5VO+03F$vt% zA+$HgEH7=__k4f!Cno-z93!k_fa{~S)(kR83o5+HOJQtdWn!uy?n0KGg7;ZB-)0TJ z^-w?A3FuGnFw7kJSeW`4e5;JH@LgRY+QkNrn_PjeH}uGRs1uWs;^98*GT?AR&MugKhaIMiO-;k z1YQ_RZdPwUk@#kiregou$BVXetzj?F z0OIQ2nm@fQhCa##>E{k?))kP;_k4`1#|%+_Ql3t`w``Hz73k~XX>r?v{nhGX(g(wC zZsfhLI4#$$!4c8a8b!fBS_;VkLWo<|oDTMH>m$tt4w5l{?LQro71;aO1qeVNT(|An ztYPYotzPIo@AOV(t$GxCe{7^P1(vk48HYXhhl5B3sjk$9Q@62$%J?K&P@KVnBX&H4V+$P71ZnFcakE^ zI2!$hw>;iFLb1N@@;JFst{o_lepH!vo1RT1WB*UVzt{r83+|&Tf~Pfv=zS2!tJG@w zdbT@>>)0Ep2v1eu(3E4LOjX{aYKDkbZgJP=Re*;~oukPVO*CrVluGrPg25*jN z+wF5~0@m(k(^V2@T)$0MGl`-8VZG*%VHoPiDG)SfT_W|`Mk$nC>y3@OHBB&4!}iXS z>lL3`)|U~(k?UbYG3R9^v!Zg(qVh;5GVIOmciC$n5ZGTPAY;CMILx`t-EjGAI@}9> z`PF)XkdYgn=g5z`QbOEaC;W>URYE-XDDkZ*7WLqbG8st>--V5|&cd^x&pO~hK<&6s=QyCVwzcTlk4^%n$|!5CD3B_*tDBE zB*Ch{{&b`IRHjit<+=BAU-q;M-YA*9MOiZ;=h3<2C8-RV=3sL>tsPJ;YOy>3?977z zsME*3Qav&5&AH110PDIXmgcn_gHf_!Zduu9iElhDLP+n1*i?}cG|?``p-enp^M}VUD%SNH7xL9U^Si-sf?Kz#bak4JzRx6KUCv%;vN z)*vtvZ4iQ{fCucdX_`ZOg-L6y%hBK2O#lZu14Qr>l`xqoL5)}qXf@X##oeL+kjUXA zn9ADdodNBN%`u}Wr6SE*7>bn3sD}{yCxOK84dMRKcfjlS_hc zZie)(dY;^}Skb%yX1M>|8d?mb2X@2x-IA!!H@`$)1QiAmfzcQkf9%eoAj6P zdl$x1y!(ApBrc%eY~u)*d`Nc)OvB$AxB~5PVynp{J)iN8XX|AxU&l@tlJrgz!nA6- zV7v`;05pvZ>bd8+oc$NA7i!%aN~Rn6QqOB? z&MC=H?!9<-j>$r2KT8b17rqdg@l0GKG~nTN+hJt)Kt`Z_*%Ar#lAXlA27_FO{xp9Y z0A2SnXrd3vm<(}1CWxvLSGt$gkQ2O@-k;EHYOaG(5fCz|LLue*?wa|++OZ+$Qg5e& z8-FhN5DoeWt(6ByoH8;_cn%PijyB*n1{x)PG%?cYV^hCc=p`c#MXG>nYwg3+Cmm(X z8K!joecd$i)RL<}&wE`q>YncFaMK9w*MDf3U&79M8+JN5-zb_IR6fC@@yCrN@0XAv zv`i8nHakUV@r!tld6acqZb(O8muM~`8>&J=EDkeuwb#7OM~5qwC}=tfDE9yKzZeB| zjAKyW3pa7zHJX`G1Ng43$h}Kg{&95iUh3WammEGndJm4_k;Tp%IwC9M7;HE$uc!we z;SncvRvMh_dSvXlz5L8>Mwk#2e3#6A=<~}>;NOdu@y0*<1u(l@FKp zv!D2v&5LsdatM+pa3N|VRbM2tz_07%YX3qeqC*uJZ1c{%rO&(g{Ew!II0qw@t&b+; zwC)cC!(Yub=r9g-C~26)iO0wwLpvIO9thpNJb7vu^;2VF8Mj13I4p59(0wlNhJC8Jf2ReuH#P@TM!fvACs&VWR{TqC!e|gZ;d-t zqd(^lrtPj49;p$u2C!wdUcEO*dcWKA=E*1n_)QrsbTa|2U&kl@K8^W$e}F&4-8v%K zOfRE{F;~4(j-kP>TAUZn5G9vOt!UE<+AMzY%OEjPYxsfJk}D`n>^#DRKp_ew!+T3-iL(|3rKdMv#HC z?LD%$VVB>_9Zd88@)@6xT#j}*S)l!yWR1NXa>p4_Sf0!>4U`SM$SabSn8&p`1~x^Q z^$)YWZ5Q~@M9^OQ_2&0!8kH&)xnlVY=fgPKT)|x70Bpa3&!Dp=q_KB<%N;)Vnz@Ml zg;ax8u?gDdntxeT-)aLM>MlsvMjBE87@9A1vi!0B_3`JAk&YTV4ncb87v_U-?R~m$_z<83Hnyd`jSQl%yTKq}JR(X`TdFi#gaMZ~uc+byt9Oe12{~>Rr zYg_`q@2g}b0b1>Io-J2~SHBEZEeT3BFQo$d*`T-iy5)nfN9|0$arc~$6D+5j&uas*;$N) zEJ$OOwXbkf8iC)9p6PQ9#h|T_S^~;?G9#F1)nx*IS3(T%a{gKmD!j==ZQB*k!_5uQ z+UIxs!59)>M9jo~z6ZEt!VLkmnH{FTskXFZX%4Eq*)Yl9$>%tzNekg8(TROc>ytDoEdY2n=Ep3 z_GT=*4t5YT;T*#2K^@mS>*N|Ga$pYxDpcCAM)1?!%*)9RDNXdX<7T4M{k0_=iGVxJ z@eJ??TpxF}6N2dd*g`L+K1Qg!RCnsEBO}c8&hih# zs=K`DoX;7Qu3(O|?y%=4#8d=90u!_*M#uo-P~+}PMQ9R=iBd_MJD?e`Tdl3t)}US( zih&A_)7unW&ll4_hw8AmWyfp2?cp13eVKakVa9$(=``YbQ{LH0v7P5*%0~fz-!>g) zXIwxYPx_or%y^0_=8FN1iO!0YM<(GD-iK3h0*Oli8o!&E50#cJGT{bhw8k;zj!f`T z)nMQ=ew0L`8S=(;+ywBpPwDc#j=q!l{BC4B7_Z7ta|}NP1AXT7=P=H3g@?7RIJ|Zf z$Y1Pt5DWhm-^yWpU(@-Zum-%k8B{iYYrqW>VwHN&l9gETAd=in)&a*mh{kvuU{7{X zN!pU@vlEwDqx5uYh__N7yKc%17&Jia2cpPY7trqBlA(hXy0 z$({%8zxsg+(VyV&f|0Yl8*Z%r=;hDn{CaFp87!Z1;MvQaH>X^;{@6RFv58 zo8;+n`uE+s11npAoFC#W?#tyw&i4kV?0j}<8&#=u<^f}8W?=`+F+M$hkKxKOEbw#T zz+2Olo>t9WIQsnZi|Q8kVXiH<=v02i{k8#DtwUSNrpRW~Jl~=tc^_M08ol%hlaj2^iJZikuDm9Wp z&VS#^4SLmkF!nBSNur=85%IV>^hrDiSN+2C@xRZ$FhGj$^MEtWHVy|8Yd)8N-}v`J zRSb|_{@fMfy6XxwhE9y|E00pzOqu~qI>VCT-9$J78L3-%mk@BRvkI6u++PK{O&f>X zA}D){S&&e=;3%M%HLc_dM?pQrz_p?ph}5v!-Vq2Bx~jw4I`ejp&i8CPY}p#98f943 z9E37Q{xy+c55D!aEHbY&#CIG-=3k&2p)s9by5KSw#^#xc#vca^jT~xX&HMB~xaFbF zpLL-0vbr8W+oSmpqivk1%QwR*DO8xM(hfW(t-M|`GiFaZUt`;3$@ zS_rPHdJ{?7GscuP8y6>b{ZVN3Fk#K`UxidAtsa-~IC_Zlqd_RrGMW!hoyo>$ zlarIfaAW!WDg;})LRq|oq+(j~85g}|@wGr~?UHSpO7m4>fu?dtwqJ8AlrFFI zE!B`b)z_+S&9??nUFX9DmVH#~atTi*frO%+AI(Se`Hyr`CGiz5pm!{VBK+X2rYO`0 z&OqgiNYRMMgH;v=U-WR?yoYULwzY!D%!l?Kcjk*bYhf3pyTH6A28m)F6fr$Pw-+P2h+x z7iDnQL|8}U>?8jf9%;Qv!Q^X?H))Tgyku{_@!D?Nh)t=+MCM!m5~l)Xp0hC6&UC&+ zLpS`0uanfQL`R|_i!%Iy$$XtXj-^KO%Tnd|N8 z)L1c16~~Gvk(+598HZbq@&0nus+>C6;7mU*rsLau9ipnBUsqRjZ(@|yqo+1a3^}Ee zr_D#H?-8T@MMa;5Q}gO_FCMd;`G03u?8$T4_YH(WEpbzrz_|mTy6RHNQ8zNQ%2sTr8#ax;rvBaC3Fl}pI)MoX*&LE5b@>Rr-z_D-Al*L`oS5a2iq_wdA zGDC7pfMkE@8(O1@H%ifbCuBeTV*gK}71+6gA>wWc#ZIell2h6daXlqt;MB0;S|ILh zd$Xw~U59#?CrL9VK|OslvFTesM|AG}HlK!oY4`8?(2(z@`pr^yLqGx zU!%Ck1bDRjngN;Bu-@lHjGokIyUUU&%;6@lBLFGZSq;Gdw14`Zq`X^3m6hRaZUW{I z>nM6S=`?MF|IR8!4t1rANw>*L&yH+IFgv=0=c<40JTn z2so3)xZY_O<|;V=9RH)i(Ejcp(mHK?nL!}o=o0zcboJmrf%gX`*r^{ZBe8@nSE<+h z5pMEI)a~PMQ(S^Xs0Z(zV1~=AtnUpR$R?~jEke|dAg!JW5})<+&PH&2zc<%vhWrJ{ z3s^p0Z*qTPW_<*DTRh0$HW5aIN|j-zG-||5-)>f4Lmn5yWl#AFVLQ(!oGMst z5k}Ww_2j=<^b)02TmL+n!NkXzh3sp*RaWAl^cQ#U4S~gAhTxQMHU!VU&Ano{iJxWx ztFMt{2z*znOI0WP`<|)dW3MB7I|BJMz=NHrS8W5La@^L9>;mA*$i+r|7oe422*0!x}+ZuIJ3Nkzz%;pS5 zmzyPDN3`Jgr`l9~5Sk67n9O|_*ZEdF83Ajz2;;+UVQdL*?lECA6Y92=sTChtfjiRdb@ zk{4c9{hn*vjQDo0>!zy2_PR z)h9`m5FYFK_2uD9%Q-=I9F#vpkt}gvItvC-r00!ETr<2ZH7%|K6-hj$MZV&PxxYPu zq2bXAW^L20!6pQ7w`advjzMyH_|o3PzU{U~V87bo3UqugCyauP)#2jeurZ0!@Q z2k{US@YjkZADIIL=mZzd5?%{Fv3O_eXh7mheUo=Nn#F*G!F4RpBEXXLk3?2pn!_>6 zfMnhn-b;RTa_jA8%f^N-?a8@OMD}BXz(Z+8aa3@dbjsoQ3H>Ze?2Wlb%Dc(0SfufYY9v;^}jVeEXE6+f=YQ)=^h~~ZE=^90rRMrr2mHBPBPRt?w?*tqrw6%$+ zEZ9_|!KztPjX=M1+`m=f^jLoZyN=G^!zi( zL2Fj+oy}L#b>o{fPd>A-d^hC3IZKNO)Yv_(1pJM_{xeY`KU{{bJH6}(>C&8@`z3aH zrd#s;nP`LAhc^KWTy)ISS03MDR~p-Jbm+XXOVq}p!;pKe$YSL;#WELf+fT?vvL^47 zo1r6$Zl0hfBEPJeJ(gV`EWas~6d|W(K^Z45EPz2i5|CN%ZteBPP zj&D2nzjna#<4(jcY$CaZiOp2TDT7kc!XY-YI$wRI_7!UeUAYT9b6e@b8rIoXFy$6R zvzEz^|B?PicwykJr;~l!pTMG|>&BXKRe_@REuIr71hyWr&LabrF23B_*HN>Hr}ZW8M-hElmcTg@+l%Ww(T z6Jk|N{tb+u1R8-d&iT2vl{E5QEkDCIdA#R4ictpPWOy-_V5DjPwCeYVOVYEJ;de?; zo9QX+f(f_?^_k$xr+~t%C)U&PNqDwqI&JvIPYVqwQkDTG05_^+h?N7VOwS{{BD3wM zG$+O10PaFOicgp>l?A8`=G;lt8}%fHFJZHBW-73&y}~;0wr}3NDoebhOG~~|Fh?0lVofeiZX*>=ad+nvnn@>#`x>OHjR22cE|#Rr#f z09n7lm;2nKmx?KF#gCbd_a%JC3Ax)#fm1Izf=jac_;La3-Wxuv?`z@u*Oc!L4{`_q zI)m4fRxF@{4ZL>zV7+V1&fC{k8`)l4tdX9hlqy-+`cW{zg!)*&OT> z;ZBP(@~%u=u(4iFxsqA3$b|P4PiO-j*Mdy+E7c@AB0E{ryR@WNtJVWEEUVk-07P(K zl}-9H z*n3doM5Xoy*XOBFc&<7VzZijGN#)_GMH1mWA)b{&&>UHou2eM@LJEp3DypTY#Hw6T z7#@?q-T%1jU4D_(gzwB}D3dBBWLC3+-Q|@CuAq7j8Vm>6`;{zp0L}6m=N~tw*uq}< zp6F)|Bzb?dO7fu}nMjo3@FDk*yN+^mo_<%4iul|hqRm6Tp>@NdafXn#IlAks7JqNzCkib@VRzu2bz++azjt?5GUZ%rDlni}Ey!;7OVxh*B$ zFH^&-x`L1$&uYBfsN=-@Q-7c>$tT4R{7QUY$&3SrAHur=c%os5>b!TyN{{qvV0M7u zOe|JTrDN|;Cx13R*M8&5{r_nJK=8hgH3O`C(apiYem01zPV9U|WpmQ0cfSKbTB*5j z?&9l;L|*_v=xe2Sku8~R^`xVM8(^Hc)wZ(@{r1IoQtVe-wuUSeneYBtWUy`(W+MW(QpL@9WSd0zLCEUgGFqvK&SNSl=C2qMG)ds zOf*+sT>w7c#QxTd*wJ=-?AZrTo&-lgUyF)73>%vaWJ5s4jMP8$(rwwW=VEf`eS<9dU0s9t2tKN9y zo;$;fpI(h~aeS0kWXP6Y9lt_<0DX??or30`U@Nj!N&5%tTI*4Z;66y3b}kIUynrxh zo!zQp`;c{pGi=y@tj5Pb}Y%rQRoy&SXIe^ z0$DU?;49-Dm&vn!rm7GLqTrw>JLUBC;=er-l9Duoltx`i5n(IX`$({p@+a;uTRFxFt?mUN+*gRdX21o8|R1{xv5SU`Z>H<_N zOcPb;5BdfZ%BLF-3XA5tcMd>%H zs%_m*I7sacC>tAba9YP-|5H%fvSrSv10b_k1RU8ge7ek0GqTS?SFY-A{yfTq%;bNq zdscR$R^1nyC}=_Wp})V12I3f`dMnSm{e_cD+1Z@aanSsqRfbd>M2Y%d{Xi>LI4mu% z$ck6=M}Sa>LahwG%$ zOF>Ebr((7x~rSs2Kt$7qF%UZu;*#A!3c~Kb5{|1mAUCRjO;PY+=I78 zzS4v0Nsr{%vRp17Id(+KZ)LYe3_qagkrd51R)xZ1_|3TGM^6Qc%c?l#$ESJwiIoE` z7W=5X1w_hC?`mfB<_xQDYAmg{VDf zW*BdoW~X@J5Q^%>6e|P;W>uirdg%*MUg#}0RZBljO5VpMdM{Up|I$hjj3{2w%b$JX z8RpB!Y`uC7fAwSgH*8+S57mt!^>w(4@I}PZHRgw&J1}>HltoAO(*2*bz6l!t{Xv4b zc39dBUUug5uzNi=ibY<}BWM;j0W$dT&g>h!!f8N4eM?0;`_4?4>EL%jAogBU*Y~{b z-y`8Vxm(UU9ZbVLScQoL^3Y=97xLDh@LP9&#!f8v&APL672 zyh*JJ)Rry5;Qjx-Y^FYT0Q=L*R4AErP}jL-6G znRSNmu7cL+Vy&{r*HU%U{}S((@Bia;U>!mPqAr>or=d#RK4a}EuA|PA@Gb@zH+(+l z)IEOKuf7N$C^km<&{6JLbB93S^-#3VTH zK3n3u(Qw&a)cuh&>FXnnTA8dt0>zn?D?4v4Yt+66NJ~Ja8S0@&k%o+P+^}H3pQyyI z+%Q;dk{sPfUPH|=4HltAkoBD)q^mZQ5d>gKZj9CaIR!}OH0$0Rdh z$Rl!Fkx0tggf^qAMbt&oS~d;S)SNk_;BCho+Y8?mG=F|#x~EMk&2Ycz+(5L@#W&Cx z%?)_Sir}$RUsTIjbfnM1ObV@$(tiGaK@tJi$4jc7-EY!=2s7_t%9n${m6&7rL!O#{ z4;Kbqyv_AdBEL`HF-z-jlgzgXves`em+P{l+*ikC zg3CY(!WQLERC}r1b5syU4~*1zJciqrY+W1()AhIp3}xPazc_EJ?JIuM;An6epS-6= zaJSbf>+B44j-M4!xX=o@7L_8V*OHd13i8+Y3X3uI-Z{hdcA08 zC1G3}{gE(u;wqOV{D;|>nB{SPnE4AOqTv1a7X2l}RML62GM?8HQ#mN=**KB)umVvB zA=t`2_$why#lzLEs@SR>ay+t7f*(2jtU0|*(Gn2TZ!zC<3glSu`&O2ezG_KnqjTIY zhRZRDBm7p-vJzc~FSj?u^1T+PkAFK|x}AQs`&n0YT~T zhJ#JS05QRDMcjd5mLc%{n?hALZH-@86_?tK;O7#&=W@+c74c8bE;27P8x7+f%!uI1 z(#nlSJkJOczBJKIjY^E1Q1$-ch1UKkA12<*C6Ibswl2NT*N##Q3@tGA2|y}7+uT*i zyAS?63!Nht67KHYN@WR1j}oD`63W3A-Gp4xv&4OAxPrP5@u zb`wleZea67x}Atm*i`E#8Hb;py+8e}p627ug>=KqA^E>cfldM3ks(jKxjqLDf2tHP z?_-#;D7rs6Vz{r`l`1!ocQ;Qm&oQCyAyJ1?d>&Ue4{efC`a!ZBzgW`A!`mLwA4bS| zZ-k*O;+?sopvKPxi-!$iX)$s_5m5)LY@}jRas}onRFLyPtHrOi@jI_NFMWhF3S7>b z_wyh|p*-rGd->j@&Cbo|mK{v|RbgiFK*7*GQq&Q{Wf*L5{6#5Xhpd}A_|faPHp!U> z|Kgf1$U>`7UbH(4*|$rLKOo+}dZ$*PY>K40TX4~d-rSVk}(57%Z= zx*x})sEu8F@@lyKq7VB2|< zyh-svy)Mz!fhUYruP)NKcTicDtEB>9sgId>q#D8t2Mz+S*paVL{ zYV;^tFp%>MjgKIX_jjJJXggNzDBGpaBoWj0o+nnL?l>3}9CLkWqaAsNj!P1r*kR$Z zthq~&>vFengW+kTb8!#jW?D=3z+pLtMctOE&k1r=Ovf|4;14>;bfCHsYP$__;iDq$ zGw$a}W)Br-Cg{5)(DNHGoAc2A;}f&rA~i~~CpDY3WWl^uVx8aiP1*Osx>&-a6ZY2> z?UuvP%|go#>EY>s_{2kiH)_wT!uSD6qnZ5j<^u;LMkJIwR>E=`wJXYQ&(NF{n&yx8N?><5BUwkoL zr+!oFjZ037?=qHUWIrJ9=dR@JfM+=_$!bStD%9*hzh4kZT zr%DAlb|j7p)K!PiX0?FhrOFPi5lFowq zqa~PL@~JvLyel65Jd9Q@L?~F?+9SnG;&BOz&oE=n*rku(7dp4ZlbAPLL?7Ll@+nDk z1hb;!tp2~;G(xNU*|u3 zR5dr$I6?2-rFSyaN-}k+lr{%THiM0tt?Ipz1kEUgkdMB#MW@G2K|8N*B~*$-*F8}B zFOr{F#Li$HF0-31Pe3g@YS1K>Kb*cXR&FE|F6E!9`5Jc<;I98K_~0IVpcoGBCsk=k z9u$l8f>FhwhB^K)D!sHkb#4Dv zg8bj|(|}iPq3)~*mZ=XaiT9|;oQ?Q;%Sp&7BeMg+PjfwJ9eHSwO3|xBnt|S1X_hXj z7}BKSPPUj4IrG$O5DO-ge9@3*E%*q3dS~-$=|2uPc&(JUTpqU|Y~T(J5@#3365R59 z-|99I{WAX;e_dWOQ#wl!qE%f22Ug!gVd!B@xgjP|{OE2)nvjJ9Z{g#KC$lMLkG+$I z5!&$gU;gdNf6or2fK|2qWYuqjcl>}tj&_gthe6p#|6fmh7}>(mgEi(V&@YT-9Uk*j zff}NUIi}z15KJ}$cdY{5kGNTQr*sK_}3TnzxK)0Km}$rb}w2 zwS>;cbvx@0fUD6@Pqi<&z5JigYk*yAv#`s6clU$d-`(%|EkW;SjW4&25IE^56AK-} z#7LAlSjZC6n%vv(Y@YciK9b7~dMBBI-G`RLR>7Lc7g>3vxXW4bq2tJ{ zXyQx@oLqbW_wFn&;U_liaxL&-CY#|m9KJ*J7K_B;1gW7|DQsd zi6NU`ZzFF2{6p~!(fpxt;@Xgr!w@4*7BCa7U?u|+bopATvL{MtOfQbf=NbpM5a!>H zQhkwzLERsqA+Xt1X7Ksdm2`rJMU30a_U>7Dp~2Sr_w63IZ&xYK!>x}qb2Ptz!Qb{P zCV)G-2GhF%a*!B=+dF)8h&ao4ey-bd8(?4DBzgUf+rP?EJv^Bivi(@k@DI9uzV@E> z=ohgk;BNj;eJstujboMO<>97){B5Cgc(i0s%-4boCh)@0Q_;(SlAb2M+;~vD=H~Rc zyB@tJa#StyFa(Od$E*&y!$!)To44dMdR=YiGbf2R$e{mi->+oLe1?`kw6kBo0blxy zwTU6npXS}iYu7E0j9WaVv!8(P&KqBTkB^QO&-5^Lcxye>+w=El;pViEt?P`}Nk(e< z;lO60%8c9NZb7>q8HucK`j;2B!<0z`d~BbHq#0VExY&W4M2qh`fp}i{hCqpNb;dZL zmj0v<>~A3vTi5T%{Kr527k*uFiG97z$Jj7Gd}%1D`5p5>lqnDOohRner~9S8bZsLY zPar@m!roC6AxA*C5h^}`AIPnesO{nR_TXp7B$tBS$|BOWE8Ijfjpb(MgQEwb;%sDc zl{CW;x20U>|GX-uXcn+{D~D(vpull^0im&umsZ;kv#(=^90K8fwS7!D z=%w}Dg=DMJF7hmvu*F4H`BC4vu82ui(l+M`E21M?CWSaOiuYpnf|s7kHdqagFMs~; zNj8r0)1fymf3406mNxLpRo>cXa`r>tm}9DJo$FMgDe`_6KSJ3ZK)Kd!JN8M;sYb3T z-T!=B3)I6+EG3boOa%Nr^xqK%GwMb zwVUeOggI=Dw%ZOK;mLM$~TZ60}es7B!gGG15)i& zjltVjZUpo14dYfHH}3)hWf3~ClM(!9q@nqb9VM@pLRFN6X0IRyC9Nd$e=zkug5(7v z&o?ne1o1C_5wy-Qdb@Q#{d}UeaJ*df-)Be1HQn6k*75i^$|xs(H6&WL_i*;k!>{d4 zufg;E!+gSJ{g$)^u7-HOQ7);%TFMk!O0Bj)ivIe??Nf}IeMe}9Yo90E$WnW?FnnT+ zI63HXdCsSiG_Q0i0AGH}91$J~b_hDakIQmG;+v93I|+-R5%g0m#T;>v81-3Yq>laP zk}3IP^;GlP8}=BBp`E5u{vOLYzMS>pKXLg2pkVf9dU|8OTEAPZ&|tLpl}5ODB|+pg3xpLLRSKsX6zq1GmDo=ak6Y05<;L)v1Dk_98}5zjjnygqIXZzzEZZ-=%zw!- z8#vAffp3UQFgHxj^t&bciS(oe@$h3X&R*g8EXDJAc#^$HK~vzc0{FX#Y$@#-mt{Y~S{#`xH~9 z*W;~crS&sEg({?nozo-ft+Jyiao$No&jY=*M$vz-NCp4LzJ$uM$q^PwFL|d#-T)>0 zoO^x!^LbrhwzKK)|D^OyuQ8cJ;_8r2-saaTAD_ zM%kaoSFceF?a@8xjr4)!SdWGHG0tgnd@uA0ZxbX+`rA-}9rrfPoW2|RjY#EX(vCy+jV6)L{_0-OM-HAXKKO*$ zR*M3Ce;t(*53JBswSqefTZURdI=W}Y{=0>a`TASDw~`F zN#qppb9*Zjf~dTW(K-J2kK$?L0#`-{o^$U*DiTkEJ*qutI!RKIt5d6v55&MRoWotP zWmOB`$xmb}s-w20k|VE4kYpZAT|vK|B&!%-UpU zbW~5hXvh63%t)fwhB>!su!v*XYN=&URXlPjUUS4)_y1qDe`> zEKSoRxCEe*HNNi#kW4pYdjecaIw z>`GLHmWsA{wZ1&> zb{|;63La{GvodV=ni1*`(Lqc+Um*9Fhf0oKchGTiA#MM;w#!hGDvA>4Bxv=?+86l} zC2Dj_8mrmLl|v@SzD!l_vpZorm26;bFUYSEFIWT98;PA#`Rn*nI%;|hlz3BRo} zC1zz#2Z80vr7PUJyL()6g-MZN;)MjiHyO}!)mw253K$G@p1_ID;O00^0@bJJW$yO% z!{GB_*%#$PVOI{tyd6$Om!IavA@y8t`!AA5uLUgb*l4X9+=y2+f%iSyyVV=|{nL7&Pky#^x#g-q#2rG#+~SqB33Q$_BFc*D3%J_dw3{#eu0ft-)y z1cTAoz-st-aH2XT!y3uuD@d`IC*Q?Em<-bKM`78FyP*6_@azm;wi*@K*tHxlbbbj%GymnBB41&+L?6ATkSn#A3X>xI9{ zd0Ii-^JwB1rFxSO(tLks$Vf=VR;>5Zy8Fp%L1g5W^`lf_kBR`ZqY2iMg&!+AFYy&Y z3o(qA`P8QWn_m3LYZ2)zZ>aIh3DJXFUC$_gJ~^*7(45Fn6(%K_sND!kMfw3L0EgO2 z)e)w6|6h8`n|^{Xa^aF)Ux?G?7|ukN7Dm97Ri|O-4etsp2TFlWChI=l3468)d`8AQ zQ-1EtYG9F7VRNqBH5O9sVHi5)OCs29D3B@J@cuP5r6T#0@*!!!_LjdrPk+i?&ZSrK zSqZ5Do$H?D%#^NjA#bG;(ISjrtYor8pzbS%o8j)Z8oMH_kr~??7TgO+VaPU-Nf;)= z!l)+r@s~gKRlGV0@&^QgjT{cXBByy81mNbXz^PZjwDW==1zm063isqwmwBm%A4uY( zJQ1G~{~7))P>$AByk_ZsA3wc_=#1hRic!%AG5CKXKzi~O zqpAMp)(8{BwM*)7mxV8u>AkYI1m)~N%XyP^K%R?hlrZ8MTTB)2-Gp#_;}~(i5j0}+ z=n!#Lg85@H{*bcY)*JSs=yxYW7$+{5YmFLORV53DaR-UwdS9-&d}V{;EJZVPO8!Cf zO)oz894nC$x?ye}IlkG5eBdJ-{aO9EZ1>JIeL{(XkO~q%X!du|&W~{Z2*iBUi(DIF zwLEsn#(mOX?+Q8+B#wmp#LLp*1z%C(S9p2Pl>5yFh@#su)``Vd`={eIt_b-VGJL&H z2hL|KpZ>+k>?(#sagnPH@6>gN@$r-8tU^2;^)!(q;|%a3=H|%Ig^xD#1aklTXIM!a z_a10u$UkOUuddah5d<}eYKA!1$PQhCrgnx_v6(>{%Nq7?&>feUY=vU@m!mw8Ec?i} z^*i9=;^$znnwIPwk@)Bsag1RhK_Nn2kZ9jo^aWc_51wep>Wkjak2d>I^8nSrY=DJm z^s4a6Fcd=9-}Y>IiZteLZ}~ygn_C=w?RiDsyh})R(XL+=l~d_`2DirZ!Y808wu=umtK>J&PSFu zU5iPto`H09NS*;5z47z0_SGijPtFE>b=Iu5wg-jDh+o4-ChHC^+5}jl25#Q)_GF%9TDJM|DR%hwp~Toq(ets#4t+)6K7T3_(4H9^ zAx?a3^CCnA*Mho)&dscNT2T^TSuiVq6JDnbkcO<%+l^3y#!6kIH8mA{^h6#1`Wj-@ z=rA{a}1OkD>!mGA%NM2?viS&_1jl}&LF$%wL!Ei>boS(%5d%*x7$ z%E-*#Av-d%M@X_q_8$M|RsFvI>r&U%={V7HxP>%qbZOac|x~F}c zHQUC1#Mjk@0T5bb*^l>k#;A~5RLs5dFjkUv7%LT?wfCrX{Z^a>U2aC6TpAyaJHE*j zH)qRUm}QBKGu-TRb-9?3dd^?p*((6@6wg*w?J%Ss2vV;qvxVXMmBMbWM<)dc-dq)< z3M-9arbm=#X>@1;d;0*Vk%lkg)GpXcB&SyKE{=FC*b{v{FHz&QHE#!p%BFvt=kvBF z-j(KnqCcqWr42s6X0w-#teqZHs7^x_iIIJ*((pYaLb7hT4fb8&6$4174UslGiQ# zSvk0u9Vj~D6*FLip>L3ed4`n6KGQ0AkrW^-tgATWC_xUe#susP;;0MKXv!O_g#{lje0dj%i-u|DV&m+m{Mhs7 zkM|Lv#nQMJf((X`dT)t8TF=M(xnSj8L}|uSScNhY`V%2Zi8~A|7j4GrVU9`BN@ZH# zx;S1u1hurstl0QDUFo@{a%n|4`*om|7ttk`ok7O8tSb>*+3}QUI|;N9mjRLiD)~S| zC>9G=u;iM*hE%djIeY}6~i4} zglr?z3&2A1ujbW$5u3t1pV2~3;!VUustU?Vcl;xjkn-c%vZ-xoPBGr_=@%6sd-(}q zpdse2p31Z1c_~eip8)3e^CHoeAJC+G&c{WoJI{VWV5lzf<-E1_>rpFKPSu9zsbLy~ z?YNA!SPC}_MY8wx-HXWT>wBGX!R7*fM`UjpBM&j>*wo8u<0i#d!=HmQ&*cMpMCdrXOasETq5ic3k)_tAV0k5|ot50wEGxDPb|ΝBV|2^dYoMVsTq;xp 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

-QERsr^?0_w!o5^P@6g+$FwWA)>k2+$PdF$`gvi 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 diff --git a/mopro-web/static/img/mopro_architecture2.png b/mopro-web/static/img/mopro_architecture2.png deleted file mode 100644 index ef6c39e896f7dadcdd731d37d4493ae236c73783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243002 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 aHjise9mgoKS78(QId|6NOo8sD+y4WKP)-E^ diff --git a/mopro-web/static/img/red_angle.svg b/mopro-web/static/img/red_angle.svg deleted file mode 100644 index b110bbe..0000000 --- a/mopro-web/static/img/red_angle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/mopro-web/static/img/roadmap.png b/mopro-web/static/img/roadmap.png deleted file mode 100644 index 31d632141be950200fbdc0c6e126278b51b43a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134800 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 z 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%0DmAyOK@w+5X~F?ugVXgo=+Gc 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�oeO1?iEQrAcU$*Tv)jAR45k|c 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 hpN8H3v;D*pqWh;5 - - - - diff --git a/mopro-web/static/img/yellow_drop.svg b/mopro-web/static/img/yellow_drop.svg deleted file mode 100644 index 35e2915..0000000 --- a/mopro-web/static/img/yellow_drop.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/mopro-web/tsconfig.json b/mopro-web/tsconfig.json deleted file mode 100644 index 314eab8..0000000 --- a/mopro-web/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // This file is not used in compilation. It is here just for a nice editor experience. - "extends": "@docusaurus/tsconfig", - "compilerOptions": { - "baseUrl": "." - } -} diff --git a/mopro-web/yarn.lock b/mopro-web/yarn.lock deleted file mode 100644 index 5dcd880..0000000 --- a/mopro-web/yarn.lock +++ /dev/null @@ -1,11810 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@algolia/autocomplete-core@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-core@npm:1.9.3" - dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.9.3" - "@algolia/autocomplete-shared": "npm:1.9.3" - checksum: ce78048568660184a4fa3c6548f344a7f5ce0ba45d4cfc233f9756b6d4f360afd5ae3a18efefcd27a626d3a0d6cf22d9cba3e21b217afae62b8e9d11bc4960da - languageName: node - linkType: hard - -"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 030695bf692021c27f52a3d4931efed23032796e326d4ae7957ae91b51c36a10dc2d885fb043909e853f961c994b8e9ff087f50bb918cfa075370562251a199f - languageName: node - linkType: hard - -"@algolia/autocomplete-preset-algolia@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 1ab3273d3054b348eed286ad1a54b21807846326485507b872477b827dc688006d4f14233cebd0bf49b2932ec8e29eca6d76e48a3c9e9e963b25153b987549c0 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-shared@npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 06014c8b08d30c452de079f48c0235d8fa09904bf511da8dc1b7e491819940fd4ff36b9bf65340242b2e157a26799a3b9aea01feee9c5bf67be3c48d7dff43d7 - languageName: node - linkType: hard - -"@algolia/cache-browser-local-storage@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/cache-browser-local-storage@npm:4.23.3" - dependencies: - "@algolia/cache-common": "npm:4.23.3" - checksum: bbce762cc69952d8e02a228bbc1b9795bd076e637fd374a6e52c4f117f44de465231731f00562dbdda72aca9c150d53a0efb22d5d9e5b0d57674c8f853bc5a85 - languageName: node - linkType: hard - -"@algolia/cache-common@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/cache-common@npm:4.23.3" - checksum: c4502b9f188c451905d47c50e4706df3c188854615119b470a4d993d8c66d41ae1d9aec2464bc8a174c6ba2bfc939835b98cb7d4afddaa6c3ccb766231e1dbbc - languageName: node - linkType: hard - -"@algolia/cache-in-memory@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/cache-in-memory@npm:4.23.3" - dependencies: - "@algolia/cache-common": "npm:4.23.3" - checksum: 9a26f6213873ec99ab3fb1bc4ba3bb7c64fc433f46ac9365689921e7c1ddaae437ee78c42d85d4426fc18ef0410d8fc9b78824759000b16fc2da60aba490cb87 - languageName: node - linkType: hard - -"@algolia/client-account@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/client-account@npm:4.23.3" - dependencies: - "@algolia/client-common": "npm:4.23.3" - "@algolia/client-search": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: 56404a43dfe53eb0168e9be568482fb4b8b00adb73b978f7f5c02627d179f51eb273ea4880428d26aa692253f11cdd1d6b62796571f6e3ada1397c64f28fc591 - languageName: node - linkType: hard - -"@algolia/client-analytics@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/client-analytics@npm:4.23.3" - dependencies: - "@algolia/client-common": "npm:4.23.3" - "@algolia/client-search": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: a108bdbad64eed6166bbce16ab4f9f10c46ad8d689142e7c48bc7743b34e5d0770b21745a87fab3d04131420b57a73baf0a2cd1a2c8baa547c899ff33a4051bd - languageName: node - linkType: hard - -"@algolia/client-common@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/client-common@npm:4.23.3" - dependencies: - "@algolia/requester-common": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: 0767cd7a4f38abc0290a9c055d39730c5f507a0e9cd6657fbad749c15a9ba9cceb788c18fec0b5a25f49e6184fb40e8dd26c3e8b29824aa3df82822618399f08 - languageName: node - linkType: hard - -"@algolia/client-personalization@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/client-personalization@npm:4.23.3" - dependencies: - "@algolia/client-common": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: 393a6a2c53185090c141c50dfc4896baa7b93af836479e9e43ad29e71de1bcce00e1273bb51ba512376a996f75f10146ba6443c3d53d2e4acc50eef43b65582e - languageName: node - linkType: hard - -"@algolia/client-search@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/client-search@npm:4.23.3" - dependencies: - "@algolia/client-common": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: 0249aeeaffa94608948f047dabd25a1c452c52cfbf5ce3abaad4f41134e87344d55733f03b512f64ffd23d43ff78d4339a8abfb83887ea23ede1d2d6567bf421 - languageName: node - linkType: hard - -"@algolia/events@npm:^4.0.1": - version: 4.0.1 - resolution: "@algolia/events@npm:4.0.1" - checksum: 4f63943f4554cfcfed91d8b8c009a49dca192b81056d8c75e532796f64828cd69899852013e81ff3fff07030df8782b9b95c19a3da0845786bdfe22af42442c2 - languageName: node - linkType: hard - -"@algolia/logger-common@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/logger-common@npm:4.23.3" - checksum: a6710ac3e790dc896d7f32eefc9e2967c765f0955fabd33291c14d61ad12d34259709370a18eb299518e36cc3b538c385ab1cc85b021b1acbf463315a61df67c - languageName: node - linkType: hard - -"@algolia/logger-console@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/logger-console@npm:4.23.3" - dependencies: - "@algolia/logger-common": "npm:4.23.3" - checksum: 881eab328986626deaa20f6b7e51b1a86b47678681869f20e89ec47cfdf4a0547081fa4315149ac8c5e2ed3cb16a9547e1265a48c14ed6b7d549ba7abc5a71e9 - languageName: node - linkType: hard - -"@algolia/recommend@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/recommend@npm:4.23.3" - dependencies: - "@algolia/cache-browser-local-storage": "npm:4.23.3" - "@algolia/cache-common": "npm:4.23.3" - "@algolia/cache-in-memory": "npm:4.23.3" - "@algolia/client-common": "npm:4.23.3" - "@algolia/client-search": "npm:4.23.3" - "@algolia/logger-common": "npm:4.23.3" - "@algolia/logger-console": "npm:4.23.3" - "@algolia/requester-browser-xhr": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - "@algolia/requester-node-http": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: b8030c85cd9b62aed42ae73931b0586f460d61f68265e292dd6ecad3a473d84abcaf56d9a5e444f9c6c196b1635d41825850cc330ccc78d436f679127039845c - languageName: node - linkType: hard - -"@algolia/requester-browser-xhr@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/requester-browser-xhr@npm:4.23.3" - dependencies: - "@algolia/requester-common": "npm:4.23.3" - checksum: afe1f81915d2386aa25c91c6d41d00a3958516a3567f1ec95a7d95eb976f87676cfb0dcc39e3fe7646e150c6cb5a8e3526c23be706cb09e56e0928a96da8eb6b - languageName: node - linkType: hard - -"@algolia/requester-common@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/requester-common@npm:4.23.3" - checksum: b7b308e46dc6158fd8adad82c301f60e1dd759e585cb90514b9a0be6b67cfba3d9ff6ad87f6299657a5ab4b5e94a2d330fc14de6c447012f32f846219c9e6971 - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/requester-node-http@npm:4.23.3" - dependencies: - "@algolia/requester-common": "npm:4.23.3" - checksum: 3d751c063e0f96e41a61d87a3428b2cb13b30aaa9e0ba3e70a3b92ad642afbb26c5095405dd1ed6dd16755d47faece0f42c5677f30673898658461ad51ec2235 - languageName: node - linkType: hard - -"@algolia/transporter@npm:4.23.3": - version: 4.23.3 - resolution: "@algolia/transporter@npm:4.23.3" - dependencies: - "@algolia/cache-common": "npm:4.23.3" - "@algolia/logger-common": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - checksum: e2573d308d7f41aa74b47c4dc052186fc9eab350ca5fec7c830ff5ca34337eeef01a7168bdd10f2e13c0cb1283385be211e7dd0a896be0aabfd900c056aa3606 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.8.3": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" - dependencies: - "@babel/highlight": "npm:^7.24.2" - picocolors: "npm:^1.0.0" - checksum: 70e867340cfe09ca5488b2f36372c45cabf43c79a5b6426e6df5ef0611ff5dfa75a57dda841895693de6008f32c21a7c97027a8c7bcabd63a7d17416cbead6f8 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/compat-data@npm:7.24.4" - checksum: 52ce371658dc7796c9447c9cb3b9c0659370d141b76997f21c5e0028cca4d026ca546b84bc8d157ce7ca30bd353d89f9238504eb8b7aefa9b1f178b4c100c2d4 - languageName: node - linkType: hard - -"@babel/core@npm:^7.19.6, @babel/core@npm:^7.23.3": - version: 7.24.4 - resolution: "@babel/core@npm:7.24.4" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.4" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.4" - "@babel/parser": "npm:^7.24.4" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 15ecad7581f3329995956ba461961b1af7bed48901f14fe962ccd3217edca60049e9e6ad4ce48134618397e6c90230168c842e2c28e47ef1f16c97dbbf663c61 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/generator@npm:7.24.4" - dependencies: - "@babel/types": "npm:^7.24.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 1b6146c31386c9df3eb594a2c36b5c98da4f67f7c06edb3d68a442b92516b21bb5ba3ad7dbe0058fe76625ed24d66923e15c95b0df75ef1907d4068921a699b8 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 53da330f1835c46f26b7bf4da31f7a496dee9fd8696cca12366b94ba19d97421ce519a74a837f687749318f94d1a37f8d1abcbf35e8ed22c32d16373b2f6198d - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" - dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" - dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 75b0a51ae1f7232932559779b78711c271404d02d069156d1bd9a7982c165c5134058d2ec2d8b5f2e42026ee4f52ba2a30c86a7aa3bce6b5fd0991eb721abc8c - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - regexpu-core: "npm:^5.3.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 2bba965ea9a4887ddf9c11d51d740ab473bd7597b787d042c325f6a45912dfe908c2d6bb1d837bf82f7e9fa51e6ad5150563c58131d2bb85515e63d971414a9c - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" - dependencies: - "@babel/types": "npm:^7.23.0" - checksum: 494659361370c979ada711ca685e2efe9460683c36db1b283b446122596602c901e291e09f2f980ecedfe6e0f2bd5386cb59768285446530df10c14df1024e75 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" - dependencies: - "@babel/types": "npm:^7.24.0" - checksum: c23492189ba97a1ec7d37012336a5661174e8b88194836b6bbf90d13c3b72c1db4626263c654454986f924c6da8be7ba7f9447876d709cd00bd6ffde6ec00796 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: c70ef6cc6b6ed32eeeec4482127e8be5451d0e5282d5495d5d569d39eb04d7f1d66ec99b327f45d1d5842a9ad8c22d48567e93fc502003a47de78d122e355f7c - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: e2baa0eede34d2fa2265947042aa84d444aa48dc51e9feedea55b67fc1bc3ab051387e18b33ca7748285a6061390831ab82f8a2c767d08470b93500ec727e9b9 - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-wrap-function": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-replace-supers@npm:7.24.1" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: c04182c34a3195c6396de2f2945f86cb60daa94ca7392db09bd8b0d4e7a15b02fbe1947c70f6062c87eadaea6d7135207129efa35cf458ea0987bab8c0f02d5a - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 1012ef2295eb12dc073f2b9edf3425661e9b8432a3387e62a8bc27c42963f1f216ab3124228015c748770b2257b4f1fda882ca8fa34c0bf485e929ae5bc45244 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.24.1 - resolution: "@babel/helper-string-parser@npm:7.24.1" - checksum: 8404e865b06013979a12406aab4c0e8d2e377199deec09dfe9f57b833b0c9ce7b6e8c1c553f2da8d0bcd240c5005bd7a269f4fef0d628aeb7d5fe035c436fb67 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.6": - version: 7.24.6 - resolution: "@babel/helper-string-parser@npm:7.24.6" - checksum: c8c614a663928b67c5c65cfea958ed20c858fa2af8c957d301bd852c0ab98adae0861f081fd8f5add16539d9393bd4b10b8c86a97a9d7304f70a6a67b2c2ff07 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.6": - version: 7.24.6 - resolution: "@babel/helper-validator-identifier@npm:7.24.6" - checksum: a265a6fba570332dca63ad7e749b867d29b52da2573dc62bf19b5b8c5387d4f4296af33da9da7c71ffe3d3abecd743418278f56d38b057ad4b53f09b937fe113 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-wrap-function@npm:7.22.20" - dependencies: - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.22.19" - checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/helpers@npm:7.24.4" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: ecd2dc0b3b32e24b97fa3bcda432dd3235b77c2be1e16eafc35b8ef8f6c461faa99796a8bc2431a408c98b4aabfd572c160e2b67ecea4c5c9dd3a8314a97994a - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/highlight@npm:7.24.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 5f17b131cc3ebf3ab285a62cf98a404aef1bd71a6be045e748f8d5bf66d6a6e1aefd62f5972c84369472e8d9f22a614c58a89cd331eb60b7ba965b31b1bbeaf5 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/parser@npm:7.24.4" - bin: - parser: ./bin/babel-parser.js - checksum: 94c9e3e592894cd6fc57c519f4e06b65463df9be5f01739bb0d0bfce7ffcf99b3c2fdadd44dc59cc858ba2739ce6e469813a941c2f2dfacf333a3b2c9c5c8465 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 0be3f41b1b865d7a4ed1a432337be48de67989d0b4e47def34a05097a804b6fc193115f97c954fd757339e0b80030ecf1d0a3d3fd6e7e91718644de0a5aae3d3 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: ec5fddc8db6de0e0082a883f21141d6f4f9f9f0bc190d662a732b5e9a506aae5d7d2337049a1bf055d7cb7add6f128036db6d4f47de5e9ac1be29e043c8b7ca8 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: e18235463e716ac2443938aaec3c18b40c417a1746fba0fa4c26cf4d71326b76ef26c002081ab1b445abfae98e063d561519aa55672dddc1ef80b3940211ffbb - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: b5e5889ce5ef51e813e3063cd548f55eb3c88e925c3c08913f334e15d62496861e538ae52a3974e0c56a3044ed8fd5033faea67a64814324af56edc9865b7359 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d97745d098b835d55033ff3a7fb2b895b9c5295b08a5759e4f20df325aa385a3e0bc9bd5ad8f2ec554a44d4e6525acfc257b8c5848a1345cb40f26a30e277e91 - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2a463928a63b62052e9fb8f8b0018aa11a926e94f32c168260ae012afe864875c6176c6eb361e13f300542c31316dad791b08a5b8ed92436a3095c7a0e4fce65 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87c8aa4a5ef931313f956871b27f2c051556f627b97ed21e9a5890ca4906b222d89062a956cde459816f5e0dec185ff128d7243d3fdc389504522acb88f0464e - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 712f7e7918cb679f106769f57cfab0bc99b311032665c428b98f4c3e2e6d567601d45386a4f246df6a80d741e1f94192b3f008800d66c4f1daae3ad825c243f0 - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf4bd70788d5456b5f75572e47a2e31435c7c4e43609bd4dffd2cc0c7a6cf90aabcf6cd389e351854de9a64412a07d30effef5373251fe8f6a4c9db0c0163bda - languageName: node - linkType: hard - -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 58f9aa9b0de8382f8cfa3f1f1d40b69d98cd2f52340e2391733d0af745fdddda650ba392e509bc056157c880a2f52834a38ab2c5aa5569af8c61bb6ecbf45f34 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 309af02610be65d937664435adb432a32d9b6eb42bb3d3232c377d27fbc57014774d931665a5bfdaff3d1841b72659e0ad7adcef84b709f251cb0b8444f19214 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 429004a6596aa5c9e707b604156f49a146f8d029e31a3152b1649c0b56425264fda5fd38e5db1ddaeb33c3fe45c97dc8078d7abfafe3542a979b49f229801135 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d8e18bd57b156da1cd4d3c1780ab9ea03afed56c6824ca8e6e74f67959d7989a0e953ec370fe9b417759314f2eef30c8c437395ce63ada2e26c2f469e4704f82 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5229ffe1c55744b96f791521e2876b01ed05c81df67488a7453ce66c2faceb9d1d653089ce6f0abf512752e15e9acac0e75a797a860f24e05b4d36497c7c3183 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 95779e9eef0c0638b9631c297d48aee53ffdbb2b1b5221bf40d7eccd566a8e34f859ff3571f8f20b9159b67f1bff7d7dc81da191c15d69fbae5a645197eae7e0 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-static-block@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.4" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-classes@npm:7.24.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e5337e707d731c9f4dcc107d09c9a99b90786bc0da6a250165919587ed818818f6cae2bbcceea880abef975c0411715c0c7f3f361ecd1526bf2eaca5ad26bb00 - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/template": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f2832bcf100a70f348facbb395873318ef5b9ee4b0fb4104a420d9daaeb6003cc2ecc12fd8083dd2e4a7c2da873272ad73ff94de4497125a0cf473294ef9664e - languageName: node - linkType: hard - -"@babel/plugin-transform-destructuring@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 994fd3c513e40b8f1bdfdd7104ebdcef7c6a11a4e380086074496f586db3ac04cba0ae70babb820df6363b6700747b0556f6860783e046ace7c741a22f49ec5b - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7f623d25b6f213b94ebc1754e9e31c1077c8e288626d8b7bfa76a97b067ce80ddcd0ede402a546706c65002c0ccf45cd5ec621511c2668eed31ebcabe8391d35 - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a3b07c07cee441e185858a9bb9739bb72643173c18bf5f9f949dd2d4784ca124e56b01d0a270790fb1ff0cf75d436075db0a2b643fb4285ff9a21df9e8dc6284 - languageName: node - linkType: hard - -"@babel/plugin-transform-dynamic-import@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 59fc561ee40b1a69f969c12c6c5fac206226d6642213985a569dd0f99f8e41c0f4eaedebd36936c255444a8335079842274c42a975a433beadb436d4c5abb79b - languageName: node - linkType: hard - -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f90841fe1a1e9f680b4209121d3e2992f923e85efcd322b26e5901c180ef44ff727fb89790803a23fac49af34c1ce2e480018027c22b4573b615512ac5b6fc50 - languageName: node - linkType: hard - -"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bc710ac231919df9555331885748385c11c5e695d7271824fe56fba51dd637d48d3e5cd52e1c69f2b1a384fbbb41552572bc1ca3a2285ee29571f002e9bb2421 - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-for-of@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 990adde96ea1766ed6008c006c7040127bef59066533bb2977b246ea4a596fe450a528d1881a0db5f894deaf1b81654dfb494b19ad405b369be942738aa9c364 - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-function-name@npm:7.24.1" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 31eb3c75297dda7265f78eba627c446f2324e30ec0124a645ccc3e9f341254aaa40d6787bd62b2280d77c0a5c9fbfce1da2c200ef7c7f8e0a1b16a8eb3644c6f - languageName: node - linkType: hard - -"@babel/plugin-transform-json-strings@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f42302d42fc81ac00d14e9e5d80405eb80477d7f9039d7208e712d6bcd486a4e3b32fdfa07b5f027d6c773723d8168193ee880f93b0e430c828e45f104fb82a4 - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-literals@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2df94e9478571852483aca7588419e574d76bde97583e78551c286f498e01321e7dbb1d0ef67bee16e8f950688f79688809cfde370c5c4b84c14d841a3ef217a - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 895f2290adf457cbf327428bdb4fb90882a38a22f729bcf0629e8ad66b9b616d2721fbef488ac00411b647489d1dda1d20171bb3772d0796bb7ef5ecf057808a - languageName: node - linkType: hard - -"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4ea641cc14a615f9084e45ad2319f95e2fee01c77ec9789685e7e11a6c286238a426a98f9c1ed91568a047d8ac834393e06e8c82d1ff01764b7aa61bee8e9023 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-amd@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3d777c262f257e93f0405b13e178f9c4a0f31855b409f0191a76bb562a28c541326a027bfe6467fcb74752f3488c0333b5ff2de64feec1b3c4c6ace1747afa03 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-simple-access": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 11402b34c49f76aa921b43c2d76f3f129a32544a1dc4f0d1e48b310f9036ab75269a6d8684ed0198b7a0b07bd7898b12f0cacceb26fbb167999fd2a819aa0802 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" - dependencies: - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-identifier": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 903766f6808f04278e887e4adec9b1efa741726279652dad255eaad0f5701df8f8ff0af25eb8541a00eb3c9eae2dccf337b085cfa011426ca33ed1f95d70bf75 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-umd@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4922f5056d34de6fd59a1ab1c85bc3472afa706c776aceeb886289c9ac9117e6eb8e22d06c537eb5bc0ede6c30f6bd85210bdcc150dc0ae2d2373f8252df9364 - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 3ee564ddee620c035b928fdc942c5d17e9c4b98329b76f9cefac65c111135d925eb94ed324064cd7556d4f5123beec79abea1d4b97d1c8a2a5c748887a2eb623 - languageName: node - linkType: hard - -"@babel/plugin-transform-new-target@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-new-target@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f56159ba56e8824840b8073f65073434e4bc4ef20e366bc03aa6cae9a4389365574fa72390e48aed76049edbc6eba1181eb810e58fae22c25946c62f9da13db4 - languageName: node - linkType: hard - -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 74025e191ceb7cefc619c15d33753aab81300a03d81b96ae249d9b599bc65878f962d608f452462d3aad5d6e334b7ab2b09a6bdcfe8d101fe77ac7aacca4261e - languageName: node - linkType: hard - -"@babel/plugin-transform-numeric-separator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3247bd7d409574fc06c59e0eb573ae7470d6d61ecf780df40b550102bb4406747d8f39dcbec57eb59406df6c565a86edd3b429e396ad02e4ce201ad92050832e - languageName: node - linkType: hard - -"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d5d28b1f33c279a38299d34011421a4915e24b3846aa23a1aba947f1366ce673ddf8df09dd915e0f2c90c5327f798bf126dca013f8adff1fc8f09e18878b675a - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-object-super@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-replace-supers": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d34d437456a54e2a5dcb26e9cf09ed4c55528f2a327c5edca92c93e9483c37176e228d00d6e0cf767f3d6fdbef45ae3a5d034a7c59337a009e20ae541c8220fa - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ff7c02449d32a6de41e003abb38537b4a1ad90b1eaa4c0b578cb1b55548201a677588a8c47f3e161c72738400ae811a6673ea7b8a734344755016ca0ac445dac - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-chaining@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0eb5f4abdeb1a101c0f67ef25eba4cce0978a74d8722f6222cdb179a28e60d21ab545eda231855f50169cd63d604ec8268cff44ae9370fd3a499a507c56c2bbd - languageName: node - linkType: hard - -"@babel/plugin-transform-parameters@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-parameters@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d183008e67b1a13b86c92fb64327a75cd8e13c13eb80d0b6952e15806f1b0c4c456d18360e451c6af73485b2c8f543608b0a29e5126c64eb625a31e970b65f80 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-methods@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7208c30bb3f3fbc73fb3a88bdcb78cd5cddaf6d523eb9d67c0c04e78f6fc6319ece89f4a5abc41777ceab16df55b3a13a4120e0efc9275ca6d2d89beaba80aa0 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 47c123ca9975f7f6b20e6fe8fe89f621cd04b622539faf5ec037e2be7c3d53ce2506f7c785b1930dcdea11994eff79094a02715795218c7d6a0bdc11f2fb3ac2 - languageName: node - linkType: hard - -"@babel/plugin-transform-property-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a73646d7ecd95b3931a3ead82c7d5efeb46e68ba362de63eb437d33531f294ec18bd31b6d24238cd3b6a3b919a6310c4a0ba4a2629927721d4d10b0518eb7715 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-constant-elements@npm:^7.18.12": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 37fd10113b786a2462cf15366aa3a11a2a5bdba9bf8881b2544941f5ad6175ebc31116be5a53549c9fce56a08ded6e0b57adb45d6e42efb55d3bc0ff7afdd433 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-display-name@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d87ac36073f923a25de0ed3cffac067ec5abc4cde63f7f4366881388fbea6dcbced0e4fefd3b7e99edfe58a4ce32ea4d4c523a577d2b9f0515b872ed02b3d8c3 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" - dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 36bc3ff0b96bb0ef4723070a50cfdf2e72cfd903a59eba448f9fe92fea47574d6f22efd99364413719e1f3fb3c51b6c9b2990b87af088f8486a84b2a5f9e4560 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/types": "npm:^7.23.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d8b8c52e8e22e833bf77c8d1a53b0a57d1fd52ba9596a319d572de79446a8ed9d95521035bc1175c1589d1a6a34600d2e678fa81d81bac8fac121137097f1f0a - languageName: node - linkType: hard - -"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 06a6bfe80f1f36408d07dd80c48cf9f61177c8e5d814e80ddbe88cfad81a8b86b3110e1fe9d1ac943db77e74497daa7f874b5490c788707106ad26ecfbe44813 - languageName: node - linkType: hard - -"@babel/plugin-transform-regenerator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - regenerator-transform: "npm:^0.15.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a04319388a0a7931c3f8e15715d01444c32519692178b70deccc86d53304e74c0f589a4268f6c68578d86f75e934dd1fe6e6ed9071f54ee8379f356f88ef6e42 - languageName: node - linkType: hard - -"@babel/plugin-transform-reserved-words@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 132c6040c65aabae2d98a39289efb5c51a8632546dc50d2ad032c8660aec307fbed74ef499856ea4f881fc8505905f49b48e0270585da2ea3d50b75e962afd89 - languageName: node - linkType: hard - -"@babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.24.3 - resolution: "@babel/plugin-transform-runtime@npm:7.24.3" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.1" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 719112524e6fe3e665385ad4425530dadb2ddee839023381ed9d77edf5ce2748f32cc0e38dacda1990c56a7ae0af4de6cdca2413ffaf307e9f75f8d2200d09a2 - languageName: node - linkType: hard - -"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 006a2032d1c57dca76579ce6598c679c2f20525afef0a36e9d42affe3c8cf33c1427581ad696b519cc75dfee46c5e8ecdf0c6a29ffb14250caa3e16dd68cb424 - languageName: node - linkType: hard - -"@babel/plugin-transform-spread@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-spread@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 622ef507e2b5120a9010b25d3df5186c06102ecad8751724a38ec924df8d3527688198fa490c47064eabba14ef2f961b3069855bd22a8c0a1e51a23eed348d02 - languageName: node - linkType: hard - -"@babel/plugin-transform-sticky-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e326e96a9eeb6bb01dbc4d3362f989411490671b97f62edf378b8fb102c463a018b777f28da65344d41b22aa6efcdfa01ed43d2b11fdcf202046d3174be137c5 - languageName: node - linkType: hard - -"@babel/plugin-transform-template-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4c9009c72321caf20e3b6328bbe9d7057006c5ae57b794cf247a37ca34d87dfec5e27284169a16df5a6235a083bf0f3ab9e1bfcb005d1c8b75b04aed75652621 - languageName: node - linkType: hard - -"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 90251c02986aebe50937522a6e404cb83db1b1feda17c0244e97d6429ded1634340c8411536487d14c54495607e1b7c9dc4db4aed969d519f1ff1e363f9c2229 - languageName: node - linkType: hard - -"@babel/plugin-transform-typescript@npm:^7.24.1": - version: 7.24.4 - resolution: "@babel/plugin-transform-typescript@npm:7.24.4" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.24.4" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-typescript": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 57a9a776b1910c706d28972e4b056ced3af8fc59c29b2a6205c2bb2a408141ddb59a8f2f6041f8467a7b260942818767f4ecabb9f63adf7fddf2afa25e774dfc - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d4d7cfea91af7be2768fb6bed902e00d6e3190bda738b5149c3a788d570e6cf48b974ec9548442850308ecd8fc9a67681f4ea8403129e7867bcb85adaf6ec238 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 276099b4483e707f80b054e2d29bc519158bfe52461ef5ff76f70727d592df17e30b1597ef4d8a0f04d810f6cb5a8dd887bdc1d0540af3744751710ef280090f - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 400a0927bdb1425b4c0dc68a61b5b2d7d17c7d9f0e07317a1a6a373c080ef94be1dd65fdc4ac9a78fcdb58f89fd128450c7bc0d5b8ca0ae7eca3fbd98e50acba - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 364342fb8e382dfaa23628b88e6484dc1097e53fb7199f4d338f1e2cd71d839bb0a35a9b1380074f6a10adb2e98b79d53ca3ec78c0b8c557ca895ffff42180df - languageName: node - linkType: hard - -"@babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.22.9": - version: 7.24.4 - resolution: "@babel/preset-env@npm:7.24.4" - dependencies: - "@babel/compat-data": "npm:^7.24.4" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" - "@babel/plugin-transform-block-scoping": "npm:^7.24.4" - "@babel/plugin-transform-class-properties": "npm:^7.24.1" - "@babel/plugin-transform-class-static-block": "npm:^7.24.4" - "@babel/plugin-transform-classes": "npm:^7.24.1" - "@babel/plugin-transform-computed-properties": "npm:^7.24.1" - "@babel/plugin-transform-destructuring": "npm:^7.24.1" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" - "@babel/plugin-transform-for-of": "npm:^7.24.1" - "@babel/plugin-transform-function-name": "npm:^7.24.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.1" - "@babel/plugin-transform-literals": "npm:^7.24.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" - "@babel/plugin-transform-modules-amd": "npm:^7.24.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" - "@babel/plugin-transform-modules-umd": "npm:^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" - "@babel/plugin-transform-object-super": "npm:^7.24.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" - "@babel/plugin-transform-parameters": "npm:^7.24.1" - "@babel/plugin-transform-private-methods": "npm:^7.24.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" - "@babel/plugin-transform-property-literals": "npm:^7.24.1" - "@babel/plugin-transform-regenerator": "npm:^7.24.1" - "@babel/plugin-transform-reserved-words": "npm:^7.24.1" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" - "@babel/plugin-transform-spread": "npm:^7.24.1" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" - "@babel/plugin-transform-template-literals": "npm:^7.24.1" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.4" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.31.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5a057a6463f92b02bfe66257d3f2c76878815bc7847f2a716b0539d9f547eae2a9d1f0fc62a5c0eff6ab0504bb52e815829ef893e4586b641f8dd6a609d114f3 - languageName: node - linkType: hard - -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@babel/types": "npm:^7.4.4" - esutils: "npm:^2.0.2" - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 4855e799bc50f2449fb5210f78ea9e8fd46cf4f242243f1e2ed838e2bd702e25e73e822e7f8447722a5f4baa5e67a8f7a0e403f3e7ce04540ff743a9c411c375 - languageName: node - linkType: hard - -"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.22.5": - version: 7.24.1 - resolution: "@babel/preset-react@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-transform-react-display-name": "npm:^7.24.1" - "@babel/plugin-transform-react-jsx": "npm:^7.23.4" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 70e146a6de480cb4b6c5eb197003960a2d148d513e1f5b5d04ee954f255d68c935c2800da13e550267f47b894bd0214b2548181467b52a4bdc0a85020061b68c - languageName: node - linkType: hard - -"@babel/preset-typescript@npm:^7.18.6, @babel/preset-typescript@npm:^7.22.5": - version: 7.24.1 - resolution: "@babel/preset-typescript@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-syntax-jsx": "npm:^7.24.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" - "@babel/plugin-transform-typescript": "npm:^7.24.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f3e0ff8c20dd5abc82614df2d7953f1549a98282b60809478f7dfb41c29be63720f2d1d7a51ef1f0d939b65e8666cb7d36e32bc4f8ac2b74c20664efd41e8bdd - languageName: node - linkType: hard - -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 89c338fee774770e5a487382170711014d49a68eb281e74f2b5eac88f38300a4ad545516a7786a8dd5702e9cf009c94c2f582d200f077ac5decd74c56b973730 - languageName: node - linkType: hard - -"@babel/runtime-corejs3@npm:^7.22.6": - version: 7.24.4 - resolution: "@babel/runtime-corejs3@npm:7.24.4" - dependencies: - core-js-pure: "npm:^3.30.2" - regenerator-runtime: "npm:^0.14.0" - checksum: 0c2e7c477de3dbf5cc6f2434cee3d78a34d87e8f1e2ea65840eb948d00f7d6968e0ef055449adf372a39d6214f8b9b2532506149b9d0e7ea3d09b1b84678ae6c - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.8.4": - version: 7.24.4 - resolution: "@babel/runtime@npm:7.24.4" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 2f27d4c0ffac7ae7999ac0385e1106f2a06992a8bdcbf3da06adcac7413863cd08c198c2e4e970041bbea849e17f02e1df18875539b6afba76c781b6b59a07c3 - languageName: node - linkType: hard - -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" - dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: f257b003c071a0cecdbfceca74185f18fe62c055469ab5c1d481aab12abeebed328e67e0a19fd978a2a8de97b28953fa4bc3da6d038a7345fdf37923b9fcdec8 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/traverse@npm:7.24.1" - dependencies: - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 92a5ca906abfba9df17666d2001ab23f18600035f706a687055a0e392a690ae48d6fec67c8bd4ef19ba18699a77a5b7f85727e36b83f7d110141608fe0c24fe9 - languageName: node - linkType: hard - -"@babel/types@npm:^7.20.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.4.4": - version: 7.24.0 - resolution: "@babel/types@npm:7.24.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 4b574a37d490f621470ff36a5afaac6deca5546edcb9b5e316d39acbb20998e9c2be42f3fc0bf2b55906fc49ff2a5a6a097e8f5a726ee3f708a0b0ca93aed807 - languageName: node - linkType: hard - -"@babel/types@npm:^7.8.3": - version: 7.24.6 - resolution: "@babel/types@npm:7.24.6" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.6" - "@babel/helper-validator-identifier": "npm:^7.24.6" - to-fast-properties: "npm:^2.0.0" - checksum: 58d798dd37e6b14f818730b4536795d68d28ccd5dc2a105fd977104789b20602be11d92cdd47cdbd48d8cce3cc0e14c7773813357ad9d5d6e94d70587eb45bf5 - languageName: node - linkType: hard - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:0.5.7": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 - languageName: node - linkType: hard - -"@docsearch/css@npm:3.6.0": - version: 3.6.0 - resolution: "@docsearch/css@npm:3.6.0" - checksum: 6fa5d7a386f56dc90a2e060e3e368e075356709dd412df2a03bb7b4041c5c6dcf379078163c16d022c2a27fdd4c75596c33485d1bd6b37ad6fbac80f51704af1 - languageName: node - linkType: hard - -"@docsearch/react@npm:^3.5.2": - version: 3.6.0 - resolution: "@docsearch/react@npm:3.6.0" - dependencies: - "@algolia/autocomplete-core": "npm:1.9.3" - "@algolia/autocomplete-preset-algolia": "npm:1.9.3" - "@docsearch/css": "npm:3.6.0" - algoliasearch: "npm:^4.19.1" - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - search-insights: ">= 1 < 3" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - checksum: 1025c6072661eb4427ffe561d9f6f4a8ca08b509a8e1bb64ff92eccad544d0dc1705c9cddbea74f9672e1d960dc3c94b76cfa8a8665346128aea2e19a3745a55 - languageName: node - linkType: hard - -"@docusaurus/core@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/core@npm:3.2.1" - dependencies: - "@babel/core": "npm:^7.23.3" - "@babel/generator": "npm:^7.23.3" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.22.9" - "@babel/preset-env": "npm:^7.22.9" - "@babel/preset-react": "npm:^7.22.5" - "@babel/preset-typescript": "npm:^7.22.5" - "@babel/runtime": "npm:^7.22.6" - "@babel/runtime-corejs3": "npm:^7.22.6" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/cssnano-preset": "npm:3.2.1" - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - "@svgr/webpack": "npm:^6.5.1" - autoprefixer: "npm:^10.4.14" - babel-loader: "npm:^9.1.3" - babel-plugin-dynamic-import-node: "npm:^2.3.3" - boxen: "npm:^6.2.1" - chalk: "npm:^4.1.2" - chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.2" - cli-table3: "npm:^0.6.3" - combine-promises: "npm:^1.1.0" - commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" - core-js: "npm:^3.31.1" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^4.2.2" - cssnano: "npm:^5.1.15" - del: "npm:^6.1.1" - detect-port: "npm:^1.5.1" - escape-html: "npm:^1.0.3" - eta: "npm:^2.2.0" - eval: "npm:^0.1.8" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - html-minifier-terser: "npm:^7.2.0" - html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.5.3" - leven: "npm:^3.1.0" - lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.7.6" - p-map: "npm:^4.0.0" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" - prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" - react-router: "npm:^5.3.4" - react-router-config: "npm:^5.1.1" - react-router-dom: "npm:^5.3.4" - rtl-detect: "npm:^1.0.4" - semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.5" - shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.9" - tslib: "npm:^2.6.0" - update-notifier: "npm:^6.0.2" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - webpack-bundle-analyzer: "npm:^4.9.0" - webpack-dev-server: "npm:^4.15.1" - webpack-merge: "npm:^5.9.0" - webpackbar: "npm:^5.0.2" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - bin: - docusaurus: bin/docusaurus.mjs - checksum: 9267f08b41240cb9d399abbd8a41ff66e0082551284325db3f17fcce9643bef81d06564797a7cc4c528fe8bde2858c20666e74a0308f3ecc80f3be1dbee14bb5 - languageName: node - linkType: hard - -"@docusaurus/cssnano-preset@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/cssnano-preset@npm:3.2.1" - dependencies: - cssnano-preset-advanced: "npm:^5.3.10" - postcss: "npm:^8.4.26" - postcss-sort-media-queries: "npm:^4.4.1" - tslib: "npm:^2.6.0" - checksum: ee23a1229d23732d936fe1d68732d1305abf0132b43a398336fee500504a3e7566d3b0c6222f89f565e24e68e00e353765e0cbbab5611a3b35ecf88305558b6d - languageName: node - linkType: hard - -"@docusaurus/logger@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/logger@npm:3.2.1" - dependencies: - chalk: "npm:^4.1.2" - tslib: "npm:^2.6.0" - checksum: 9d5db5253eda98871563faddb5318bcb6b17ddf5882ababad4803d526917844819751e84ee8028e794fd5507646db6409f9041fd7f41b7f7971015df11cc6376 - languageName: node - linkType: hard - -"@docusaurus/mdx-loader@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/mdx-loader@npm:3.2.1" - dependencies: - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - "@mdx-js/mdx": "npm:^3.0.0" - "@slorber/remark-comment": "npm:^1.0.0" - escape-html: "npm:^1.0.3" - estree-util-value-to-estree: "npm:^3.0.1" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" - mdast-util-mdx: "npm:^3.0.0" - mdast-util-to-string: "npm:^4.0.0" - rehype-raw: "npm:^7.0.0" - remark-directive: "npm:^3.0.0" - remark-emoji: "npm:^4.0.0" - remark-frontmatter: "npm:^5.0.0" - remark-gfm: "npm:^4.0.0" - stringify-object: "npm:^3.3.0" - tslib: "npm:^2.6.0" - unified: "npm:^11.0.3" - unist-util-visit: "npm:^5.0.0" - url-loader: "npm:^4.1.1" - vfile: "npm:^6.0.1" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 4609faf2d8b76085a3aa86ac5ca4ac3b3420e3cfd796f1b39c46f368c82b3db0db5b1308646cf35fdad0a1f6f088d367116eb0e2a8c3fa728ed886ee37516476 - languageName: node - linkType: hard - -"@docusaurus/module-type-aliases@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/module-type-aliases@npm:3.2.1" - dependencies: - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/types": "npm:3.2.1" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:*" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 37b4a40f9afebbe76e350c10c857737b544c141a988462436904ae16993a52e4429018d406e2f55ad57a533e5a108dd7cdb903434abb84721deeec0d5f195d80 - languageName: node - linkType: hard - -"@docusaurus/plugin-content-blog@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-content-blog@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - cheerio: "npm:^1.0.0-rc.12" - feed: "npm:^4.2.2" - fs-extra: "npm:^11.1.1" - lodash: "npm:^4.17.21" - reading-time: "npm:^1.5.0" - srcset: "npm:^4.0.0" - tslib: "npm:^2.6.0" - unist-util-visit: "npm:^5.0.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: d95147a28aad832cd2dc39af634e1902a8a36f958dd2ff5fa6eaa47b574b58df42609a64da823951826f647337ad35c1f1c8be8a0a085913e192936f38839413 - languageName: node - linkType: hard - -"@docusaurus/plugin-content-docs@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-content-docs@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/module-type-aliases": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - "@types/react-router-config": "npm:^5.0.7" - combine-promises: "npm:^1.1.0" - fs-extra: "npm:^11.1.1" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: c182466c3ff513b36a8975a3899b07ffc4b227ab45ef69eacc0a77119d6f0cd6a0727a3e886cfcf4a56e4f522f64e1e6a2647ddc57eb8493b93c03240b1d9b39 - languageName: node - linkType: hard - -"@docusaurus/plugin-content-pages@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-content-pages@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 3cce99f8aa863b97cbb54a50b448073222a0678528b09f5bec2196e73ec4740f412f8675ed05d283ff672756a5d3005f7a1e4d8c8f882cd0d6d5691cbccb604c - languageName: node - linkType: hard - -"@docusaurus/plugin-debug@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-debug@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - fs-extra: "npm:^11.1.1" - react-json-view-lite: "npm:^1.2.0" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: b3fb1c8935463afb97f233042692c247d4147c03e18ef9fb37fbf0c46d4adaefa4af0d5c357025992dadfe7b83a9fd3754946b8947bfb8b9535dca390a3668d0 - languageName: node - linkType: hard - -"@docusaurus/plugin-google-analytics@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-google-analytics@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: e1e881fd6adbe408029257d526759b9217f7d70e5e068c7e9241a5f0c3050b0fa46acfeb4f8a23c3f36e1739d0a3d810642d69c6648ff6801ce13b646e44e6c1 - languageName: node - linkType: hard - -"@docusaurus/plugin-google-gtag@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-google-gtag@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - "@types/gtag.js": "npm:^0.0.12" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: b7758289d8453e98baf95d41e754c1e4c8fd5b1c000ba444c4bdf13fc97674a3cddf3215b6406266729e23898641b5bae297c5422c5bd079ef04773fa5a15c1b - languageName: node - linkType: hard - -"@docusaurus/plugin-google-tag-manager@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 82355aed046b12ce0fead68339e24a3c6f2f517bc2b80c9c26c502cc49d86c1b6d0f797d5269d1d5e73ac78fd748c8a2f4528f7f3feee1137ae8e73876426426 - languageName: node - linkType: hard - -"@docusaurus/plugin-sitemap@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/plugin-sitemap@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - fs-extra: "npm:^11.1.1" - sitemap: "npm:^7.1.1" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: b2e4c4fddd0fbdd4a6a4c93a0f9c16b1294162146eb9911ce378f33d70396f08dfa98d92aed133bba2a8df2b1710c257bf00c0657933ee6cd9c5edb36c8054dc - languageName: node - linkType: hard - -"@docusaurus/preset-classic@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/preset-classic@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/plugin-content-blog": "npm:3.2.1" - "@docusaurus/plugin-content-docs": "npm:3.2.1" - "@docusaurus/plugin-content-pages": "npm:3.2.1" - "@docusaurus/plugin-debug": "npm:3.2.1" - "@docusaurus/plugin-google-analytics": "npm:3.2.1" - "@docusaurus/plugin-google-gtag": "npm:3.2.1" - "@docusaurus/plugin-google-tag-manager": "npm:3.2.1" - "@docusaurus/plugin-sitemap": "npm:3.2.1" - "@docusaurus/theme-classic": "npm:3.2.1" - "@docusaurus/theme-common": "npm:3.2.1" - "@docusaurus/theme-search-algolia": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 343c896f22bffbda9db4af7d652588f353c5f60336e545eb07be0dfe9bc29ca04a3978d88d5a8b3fa7caafc56a48b341349ffd08006885fa0d4de216cfdc5401 - languageName: node - linkType: hard - -"@docusaurus/react-loadable@npm:5.5.2, react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version: 5.5.2 - resolution: "@docusaurus/react-loadable@npm:5.5.2" - dependencies: - "@types/react": "npm:*" - prop-types: "npm:^15.6.2" - peerDependencies: - react: "*" - checksum: 930fb9e2936412a12461f210acdc154a433283921ca43ac3fc3b84cb6c12eb738b3a3719373022bf68004efeb1a928dbe36c467d7a1f86454ed6241576d936e7 - languageName: node - linkType: hard - -"@docusaurus/theme-classic@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/theme-classic@npm:3.2.1" - dependencies: - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/module-type-aliases": "npm:3.2.1" - "@docusaurus/plugin-content-blog": "npm:3.2.1" - "@docusaurus/plugin-content-docs": "npm:3.2.1" - "@docusaurus/plugin-content-pages": "npm:3.2.1" - "@docusaurus/theme-common": "npm:3.2.1" - "@docusaurus/theme-translations": "npm:3.2.1" - "@docusaurus/types": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - "@mdx-js/react": "npm:^3.0.0" - clsx: "npm:^2.0.0" - copy-text-to-clipboard: "npm:^3.2.0" - infima: "npm:0.2.0-alpha.43" - lodash: "npm:^4.17.21" - nprogress: "npm:^0.2.0" - postcss: "npm:^8.4.26" - prism-react-renderer: "npm:^2.3.0" - prismjs: "npm:^1.29.0" - react-router-dom: "npm:^5.3.4" - rtlcss: "npm:^4.1.0" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 7b38e47e9334ba6ad84f6432ec9ae81caad7f6c630b2a332617b0f32f1559b0e56f3d8857c732da62d1d7213ad0f493853bf18b1707a2f8d8bcccef32f1d81a1 - languageName: node - linkType: hard - -"@docusaurus/theme-common@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/theme-common@npm:3.2.1" - dependencies: - "@docusaurus/mdx-loader": "npm:3.2.1" - "@docusaurus/module-type-aliases": "npm:3.2.1" - "@docusaurus/plugin-content-blog": "npm:3.2.1" - "@docusaurus/plugin-content-docs": "npm:3.2.1" - "@docusaurus/plugin-content-pages": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - clsx: "npm:^2.0.0" - parse-numeric-range: "npm:^1.3.0" - prism-react-renderer: "npm:^2.3.0" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 13de70293476e05f1b52c2d99a1b26c73bf99ac92aba3c8ddc413b5336725d2b54c56c167d12244fdb0b518ee9cdecbbfb3258fb8cc91272e9b795361b131fbb - languageName: node - linkType: hard - -"@docusaurus/theme-search-algolia@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/theme-search-algolia@npm:3.2.1" - dependencies: - "@docsearch/react": "npm:^3.5.2" - "@docusaurus/core": "npm:3.2.1" - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/plugin-content-docs": "npm:3.2.1" - "@docusaurus/theme-common": "npm:3.2.1" - "@docusaurus/theme-translations": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-validation": "npm:3.2.1" - algoliasearch: "npm:^4.18.0" - algoliasearch-helper: "npm:^3.13.3" - clsx: "npm:^2.0.0" - eta: "npm:^2.2.0" - fs-extra: "npm:^11.1.1" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: befbb86bf309f2b770ae21bc1d5c91eb6e840a5a72858cdfd3b21dbabadd1738d6d427ada7745f9d3424bb1a6e01839e20bf35c15a4c13d59b63d259e52de5df - languageName: node - linkType: hard - -"@docusaurus/theme-translations@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/theme-translations@npm:3.2.1" - dependencies: - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - checksum: 43bdb90d143576d2e8eb56bfe2c9daa0e4250cdb2dcfd10096b86466e6ee253548ac5ef2f9a4986a5bc9a573d118fe4695ee5004f0ef00b57b720dac7f124337 - languageName: node - linkType: hard - -"@docusaurus/tsconfig@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/tsconfig@npm:3.2.1" - checksum: ea3c28b79b0de069c50f7b3a67d3ff682b6ded2ef02d2c7a4c2eaeddc8fcf79c9d9f5e60fbd2966cf3d247fbb8f63897b80a61fdd8b485c745a12eb684ae241a - languageName: node - linkType: hard - -"@docusaurus/types@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/types@npm:3.2.1" - dependencies: - "@mdx-js/mdx": "npm:^3.0.0" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - commander: "npm:^5.1.0" - joi: "npm:^17.9.2" - react-helmet-async: "npm:^1.3.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - webpack-merge: "npm:^5.9.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 4f19e162bff627675df160ae5c33c6063646050c4de5c9698018fbd9d198300b9ce7a7333e4d1b369b42cfa42296dc9fb36547e4e37664d594deb08639e6b620 - languageName: node - linkType: hard - -"@docusaurus/utils-common@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/utils-common@npm:3.2.1" - dependencies: - tslib: "npm:^2.6.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: bc0b7e74bc29134dbdb7fbc2e8f9f39f0f460923a07d0ccd7f0542088e92c47faf06bdbd253b7ba2b9250b0869118a3b7bf3faa3a075a2a35f5f8545eb3345f2 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/utils-validation@npm:3.2.1" - dependencies: - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/utils": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - joi: "npm:^17.9.2" - js-yaml: "npm:^4.1.0" - tslib: "npm:^2.6.0" - checksum: c7b5142083c8e4798c7f6aa1f7a06bc2e93e8e08a8a7a2c5eaf24aa6939e12e401f180f02164764805c40ec0f7179479e0ee98a935c2cb77037ca73ab33d80fd - languageName: node - linkType: hard - -"@docusaurus/utils@npm:3.2.1": - version: 3.2.1 - resolution: "@docusaurus/utils@npm:3.2.1" - dependencies: - "@docusaurus/logger": "npm:3.2.1" - "@docusaurus/utils-common": "npm:3.2.1" - "@svgr/webpack": "npm:^6.5.1" - escape-string-regexp: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - github-slugger: "npm:^1.5.0" - globby: "npm:^11.1.0" - gray-matter: "npm:^4.0.3" - jiti: "npm:^1.20.0" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - micromatch: "npm:^4.0.5" - prompts: "npm:^2.4.2" - resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.6.0" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: ea862b178e303b49e644e77a663df6e42909632022918b77dc1ee69c4de46dde3f210052b1063e96a820e1443141f70e44aa51372f2bf9cfde65e080ea639889 - languageName: node - linkType: hard - -"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": - version: 9.3.0 - resolution: "@hapi/hoek@npm:9.3.0" - checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 - languageName: node - linkType: hard - -"@hapi/topo@npm:^5.1.0": - version: 5.1.0 - resolution: "@hapi/topo@npm:5.1.0" - dependencies: - "@hapi/hoek": "npm:^9.0.0" - checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 - languageName: node - linkType: hard - -"@jest/types@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/types@npm:29.6.3" - dependencies: - "@jest/schemas": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 - languageName: node - linkType: hard - -"@leichtgewicht/ip-codec@npm:^2.0.1": - version: 2.0.5 - resolution: "@leichtgewicht/ip-codec@npm:2.0.5" - checksum: 4fcd025d0a923cb6b87b631a83436a693b255779c583158bbeacde6b4dd75b94cc1eba1c9c188de5fc36c218d160524ea08bfe4ef03a056b00ff14126d66f881 - languageName: node - linkType: hard - -"@mdx-js/mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/mdx@npm:3.0.1" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdx": "npm:^2.0.0" - collapse-white-space: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-build-jsx: "npm:^3.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-util-to-js: "npm:^2.0.0" - estree-walker: "npm:^3.0.0" - hast-util-to-estree: "npm:^3.0.0" - hast-util-to-jsx-runtime: "npm:^2.0.0" - markdown-extensions: "npm:^2.0.0" - periscopic: "npm:^3.0.0" - remark-mdx: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-rehype: "npm:^11.0.0" - source-map: "npm:^0.7.0" - unified: "npm:^11.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 82221662279c39a755b88f63b031a30b9bc04365e5bfc3e45590f4fa7bf6bff12364f4caee31c768ae588145eed74fda10c327d53f9272b1a2cffbc8bd537ce6 - languageName: node - linkType: hard - -"@mdx-js/react@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/react@npm:3.0.1" - dependencies: - "@types/mdx": "npm:^2.0.0" - peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: 1063a597264f6a8840aa13274a99beef8983a88dd45b0c5b8e48e6216bc23d33e247da8e2d95d6e1874483f8b4e0903b166ce5046874aa7ffa2b1333057dcddf - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@pnpm/config.env-replace@npm:^1.1.0": - version: 1.1.0 - resolution: "@pnpm/config.env-replace@npm:1.1.0" - checksum: a3d2b57e35eec9543d9eb085854f6e33e8102dac99fdef2fad2eebdbbfc345e93299f0c20e8eb61c1b4c7aa123bfd47c175678626f161cda65dd147c2b6e1fa0 - languageName: node - linkType: hard - -"@pnpm/network.ca-file@npm:^1.0.1": - version: 1.0.2 - resolution: "@pnpm/network.ca-file@npm:1.0.2" - dependencies: - graceful-fs: "npm:4.2.10" - checksum: d8d0884646500576bd5390464d13db1bb9a62e32a1069293e5bddb2ad8354b354b7e2d2a35e12850025651e795e6a80ce9e601c66312504667b7e3ee7b52becc - languageName: node - linkType: hard - -"@pnpm/npm-conf@npm:^2.1.0": - version: 2.2.2 - resolution: "@pnpm/npm-conf@npm:2.2.2" - dependencies: - "@pnpm/config.env-replace": "npm:^1.1.0" - "@pnpm/network.ca-file": "npm:^1.0.1" - config-chain: "npm:^1.1.11" - checksum: d64aa4464be584caa855eafa8f109509390489997e36d602d6215784e2973b896bef3968426bb00896cf4ae7d440fed2cee7bb4e0dbc90362f024ea3f9e27ab1 - languageName: node - linkType: hard - -"@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 4ab1d7a37163139c0e7bfc9d1e3f6a2a0db91a78b9f0a21f571d6aec2cdaeaacced744d47886c117aa7579aa5694b303fe3e0bd1922bb9cb3ce6bf7c2dc09801 - languageName: node - linkType: hard - -"@sideway/address@npm:^4.1.5": - version: 4.1.5 - resolution: "@sideway/address@npm:4.1.5" - dependencies: - "@hapi/hoek": "npm:^9.0.0" - checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d - languageName: node - linkType: hard - -"@sideway/formula@npm:^3.0.1": - version: 3.0.1 - resolution: "@sideway/formula@npm:3.0.1" - checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a - languageName: node - linkType: hard - -"@sideway/pinpoint@npm:^2.0.0": - version: 2.0.0 - resolution: "@sideway/pinpoint@npm:2.0.0" - checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.6.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^5.2.0": - version: 5.6.0 - resolution: "@sindresorhus/is@npm:5.6.0" - checksum: 2e6e0c3acf188dcd9aea0f324ac1b6ad04c9fc672392a7b5a1218512fcde066965797eba8b9fe2108657a504388bd4a6664e6e6602555168e828a6df08b9f10e - languageName: node - linkType: hard - -"@slorber/remark-comment@npm:^1.0.0": - version: 1.0.0 - resolution: "@slorber/remark-comment@npm:1.0.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.1.0" - micromark-util-symbol: "npm:^1.0.1" - checksum: c96f1533d09913c57381859966f10a706afd8eb680923924af1c451f3b72f22c31e394028d7535131c10f8682d3c60206da95c50fb4f016fbbd04218c853cc88 - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: cab83832830a57735329ed68f67c03b57ca21fa037b0134847b0c5c0ef4beca89956d7dacfbf7b2a10fd901e7009e877512086db2ee918b8c69aee7742ae32c0 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-attribute@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ff992893c6c4ac802713ba3a97c13be34e62e6d981c813af40daabcd676df68a72a61bd1e692bb1eda3587f1b1d700ea462222ae2153bb0f46886632d4f88d08 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0fb691b63a21bac00da3aa2dccec50d0d5a5b347ff408d60803b84410d8af168f2656e4ba1ee1f24dab0ae4e4af77901f2928752bb0434c1f6788133ec599ec8 - languageName: node - linkType: hard - -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b7d2125758e766e1ebd14b92216b800bdc976959bc696dbfa1e28682919147c1df4bb8b1b5fd037d7a83026e27e681fea3b8d3741af8d3cf4c9dfa3d412125df - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-dynamic-title@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0fd42ebf127ae9163ef341e84972daa99bdcb9e6ed3f83aabd95ee173fddc43e40e02fa847fbc0a1058cf5549f72b7960a2c5e22c3e4ac18f7e3ac81277852ae - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-em-dimensions@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c1550ee9f548526fa66fd171e3ffb5696bfc4e4cd108a631d39db492c7410dc10bba4eb5a190e9df824bf806130ccc586ae7d2e43c547e6a4f93bbb29a18f344 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4c924af22b948b812629e80efb90ad1ec8faae26a232d8ca8a06b46b53e966a2c415a57806a3ff0ea806a622612e546422719b69ec6839717a7755dac19171d9 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-svg-component@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e496bb5ee871feb6bcab250b6e067322da7dd5c9c2b530b41e5586fe090f86611339b49d0a909c334d9b24cbca0fa755c949a2526c6ad03c6b5885666874cf5f - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-preset@npm:6.5.1" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": "npm:^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute": "npm:*" - "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:*" - "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title": "npm:^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions": "npm:^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg": "npm:^6.5.1" - "@svgr/babel-plugin-transform-svg-component": "npm:^6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9f124be39a8e64f909162f925b3a63ddaa5a342a5e24fc0b7f7d9d4d7f7e3b916596c754fb557dc259928399cad5366a27cb231627a0d2dcc4b13ac521cf05af - languageName: node - linkType: hard - -"@svgr/core@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/core@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - camelcase: "npm:^6.2.0" - cosmiconfig: "npm:^7.0.1" - checksum: fd6d6d5da5aeb956703310480b626c1fb3e3973ad9fe8025efc1dcf3d895f857b70d100c63cf32cebb20eb83c9607bafa464c9436e18fe6fe4fafdc73ed6b1a5 - languageName: node - linkType: hard - -"@svgr/hast-util-to-babel-ast@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/hast-util-to-babel-ast@npm:6.5.1" - dependencies: - "@babel/types": "npm:^7.20.0" - entities: "npm:^4.4.0" - checksum: 37923cce1b3f4e2039077b0c570b6edbabe37d1cf1a6ee35e71e0fe00f9cffac450eec45e9720b1010418131a999cb0047331ba1b6d1d2c69af1b92ac785aacf - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-jsx@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/hast-util-to-babel-ast": "npm:^6.5.1" - svg-parser: "npm:^2.0.4" - peerDependencies: - "@svgr/core": ^6.0.0 - checksum: 42f22847a6bdf930514d7bedd3c5e1fd8d53eb3594779f9db16cb94c762425907c375cd8ec789114e100a4d38068aca6c7ab5efea4c612fba63f0630c44cc859 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-svgo@npm:6.5.1" - dependencies: - cosmiconfig: "npm:^7.0.1" - deepmerge: "npm:^4.2.2" - svgo: "npm:^2.8.0" - peerDependencies: - "@svgr/core": "*" - checksum: cd2833530ac0485221adc2146fd992ab20d79f4b12eebcd45fa859721dd779483158e11dfd9a534858fe468416b9412416e25cbe07ac7932c44ed5fa2021c72e - languageName: node - linkType: hard - -"@svgr/webpack@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/webpack@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@babel/plugin-transform-react-constant-elements": "npm:^7.18.12" - "@babel/preset-env": "npm:^7.19.4" - "@babel/preset-react": "npm:^7.18.6" - "@babel/preset-typescript": "npm:^7.18.6" - "@svgr/core": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - "@svgr/plugin-svgo": "npm:^6.5.1" - checksum: d10582eb4fa82a5b6d314cb49f2c640af4fd3a60f5b76095d2b14e383ef6a43a6f4674b68774a21787dbde69dec0a251cfcfc3f9a96c82754ba5d5c6daf785f0 - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^5.0.1": - version: 5.0.1 - resolution: "@szmarczak/http-timer@npm:5.0.1" - dependencies: - defer-to-connect: "npm:^2.0.1" - checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 - languageName: node - linkType: hard - -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 11226c39b52b391719a2a92e10183e4260d9651f86edced166da1d95f39a0a1eaa470e44d14ac685ccd6d3df7e2002433782872c0feeb260d61e80f21250e65c - languageName: node - linkType: hard - -"@types/acorn@npm:^4.0.0": - version: 4.0.6 - resolution: "@types/acorn@npm:4.0.6" - dependencies: - "@types/estree": "npm:*" - checksum: 60e1fd28af18d6cb54a93a7231c7c18774a9a8739c9b179e9e8750dca631e10cbef2d82b02830ea3f557b1d121e6406441e9e1250bd492dc81d4b3456e76e4d4 - languageName: node - linkType: hard - -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 - languageName: node - linkType: hard - -"@types/bonjour@npm:^3.5.9": - version: 3.5.13 - resolution: "@types/bonjour@npm:3.5.13" - dependencies: - "@types/node": "npm:*" - checksum: e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee - languageName: node - linkType: hard - -"@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.4 - resolution: "@types/connect-history-api-fallback@npm:1.5.4" - dependencies: - "@types/express-serve-static-core": "npm:*" - "@types/node": "npm:*" - checksum: e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 - languageName: node - linkType: hard - -"@types/debug@npm:^4.0.0": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "npm:*" - checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 - languageName: node - linkType: hard - -"@types/eslint-scope@npm:^3.7.3": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "npm:*" - "@types/estree": "npm:*" - checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e - languageName: node - linkType: hard - -"@types/eslint@npm:*": - version: 8.56.10 - resolution: "@types/eslint@npm:8.56.10" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: fb7137dd263ce1130b42d14452bdd0266ef81f52cb55ba1a5e9750e65da1f0596dc598c88bffc7e415458b6cb611a876dcc132bcf40ea48701c6d05b40c57be5 - languageName: node - linkType: hard - -"@types/estree-jsx@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree-jsx@npm:1.0.5" - dependencies: - "@types/estree": "npm:*" - checksum: a028ab0cd7b2950168a05c6a86026eb3a36a54a4adfae57f13911d7b49dffe573d9c2b28421b2d029b49b3d02fcd686611be2622dc3dad6d9791166c083f6008 - languageName: node - linkType: hard - -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.19.0 - resolution: "@types/express-serve-static-core@npm:4.19.0" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 39c09fcb3f61de96ed56d97273874cafe50e6675ac254af4d77014e569e4fdc29d1d0d1dd12e11f008cb9a52785b07c2801c6ba91397965392b20c75ee01fb4e - languageName: node - linkType: hard - -"@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5 - languageName: node - linkType: hard - -"@types/gtag.js@npm:^0.0.12": - version: 0.0.12 - resolution: "@types/gtag.js@npm:0.0.12" - checksum: 34efc27fbfd0013255b8bfd4af38ded9d5a6ba761130c76f17fd3a9585d83acc88d8005aab667cfec4bdec0e7c7217f689739799a8f61aed0edb929be58b162e - languageName: node - linkType: hard - -"@types/hast@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" - dependencies: - "@types/unist": "npm:*" - checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 - languageName: node - linkType: hard - -"@types/history@npm:^4.7.11": - version: 4.7.11 - resolution: "@types/history@npm:4.7.11" - checksum: c92e2ba407dcab0581a9afdf98f533aa41b61a71133420a6d92b1ca9839f741ab1f9395b17454ba5b88cb86020b70b22d74a1950ccfbdfd9beeaa5459fdc3464 - languageName: node - linkType: hard - -"@types/html-minifier-terser@npm:^6.0.0": - version: 6.1.0 - resolution: "@types/html-minifier-terser@npm:6.1.0" - checksum: eb843f6a8d662d44fb18ec61041117734c6aae77aa38df1be3b4712e8e50ffaa35f1e1c92fdd0fde14a5675fecf457abcd0d15a01fae7506c91926176967f452 - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:^4.0.2": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 7f4dd832e618bc1e271be49717d7b4066d77c2d4eed5b81198eb987e532bb3e1c7e02f45d77918185bad936f884b700c10cebe06305f50400f382ab75055f9e8 - languageName: node - linkType: hard - -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 - languageName: node - linkType: hard - -"@types/http-proxy@npm:^1.17.8": - version: 1.17.14 - resolution: "@types/http-proxy@npm:1.17.14" - dependencies: - "@types/node": "npm:*" - checksum: 491320bce3565bbb6c7d39d25b54bce626237cfb6b09e60ee7f77b56ae7c6cbad76f08d47fe01eaa706781124ee3dfad9bb737049254491efd98ed1f014c4e83 - languageName: node - linkType: hard - -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 - languageName: node - linkType: hard - -"@types/istanbul-lib-report@npm:*": - version: 3.0.3 - resolution: "@types/istanbul-lib-report@npm:3.0.3" - dependencies: - "@types/istanbul-lib-coverage": "npm:*" - checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 - languageName: node - linkType: hard - -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 - languageName: node - linkType: hard - -"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": - version: 4.0.3 - resolution: "@types/mdast@npm:4.0.3" - dependencies: - "@types/unist": "npm:*" - checksum: 345c5a22fccf05f35239ea6313ee4aaf6ebed5927c03ac79744abccb69b9ba5e692f9b771e36a012b79e17429082cada30f579e9c43b8a54e0ffb365431498b6 - languageName: node - linkType: hard - -"@types/mdx@npm:^2.0.0": - version: 2.0.13 - resolution: "@types/mdx@npm:2.0.13" - checksum: 195137b548e75a85f0558bb1ca5088aff1c01ae0fc64454da06085b7513a043356d0bb51ed559d3cbc7ad724ccd8cef2a7d07d014b89a47a74dff8875ceb3b15 - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a - languageName: node - linkType: hard - -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "npm:*" - checksum: 1e86bd55b92a492eaafd75f6d01f31e7d86a5cdadd0c6bcdc0b1df4103b7f99bb75b832efd5217c7ddda5c781095dc086a868e20b9de00f5a427ddad4c296cd5 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 20.12.7 - resolution: "@types/node@npm:20.12.7" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 7cc979f7e2ca9a339ec71318c3901b9978555257929ef3666987f3e447123bc6dc92afcc89f6347e09e07d602fde7d51bcddea626c23aa2bb74aeaacfd1e1686 - languageName: node - linkType: hard - -"@types/node@npm:^17.0.5": - version: 17.0.45 - resolution: "@types/node@npm:17.0.45" - checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 - languageName: node - linkType: hard - -"@types/parse-json@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/parse-json@npm:4.0.2" - checksum: 5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 - languageName: node - linkType: hard - -"@types/prismjs@npm:^1.26.0": - version: 1.26.3 - resolution: "@types/prismjs@npm:1.26.3" - checksum: c627fa9d9f4277ce413bb8347944152cddfc892702e34ff4b099dc1cf3f00c09514d36349c23529b903b0e57f3b2e0dc91ee66e98af07fbbe1e3fe8346b23370 - languageName: node - linkType: hard - -"@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe - languageName: node - linkType: hard - -"@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a - languageName: node - linkType: hard - -"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.7": - version: 5.0.11 - resolution: "@types/react-router-config@npm:5.0.11" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:^5.1.0" - checksum: 4b72d9b71e0576e193c11e5085bbdac43f31debfa3b6ebc24666f3d646ef25c1f57f16c29b1ddd3051c881e85f8e0d4ab5a7bbd5fc215b9377f57675b210be7c - languageName: node - linkType: hard - -"@types/react-router-dom@npm:*": - version: 5.3.3 - resolution: "@types/react-router-dom@npm:5.3.3" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:*" - checksum: 28c4ea48909803c414bf5a08502acbb8ba414669b4b43bb51297c05fe5addc4df0b8fd00e0a9d1e3535ec4073ef38aaafac2c4a2b95b787167d113bc059beff3 - languageName: node - linkType: hard - -"@types/react-router@npm:*, @types/react-router@npm:^5.1.0": - version: 5.1.20 - resolution: "@types/react-router@npm:5.1.20" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - checksum: 128764143473a5e9457ddc715436b5d49814b1c214dde48939b9bef23f0e77f52ffcdfa97eb8d3cc27e2c229869c0cdd90f637d887b62f2c9f065a87d6425419 - languageName: node - linkType: hard - -"@types/react@npm:*": - version: 18.2.79 - resolution: "@types/react@npm:18.2.79" - dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 85aa96e0e88725c84d8fc5f04f10a4da6a1f507dde33557ac9cc211414756867721264bfefd9e02bae1288ce2905351d949b652b931e734ea24519ee5c625138 - languageName: node - linkType: hard - -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 61a072c7639f6e8126588bf1eb1ce8835f2cb9c2aba795c4491cf6310e013267b0c8488039857c261c387e9728c1b43205099223f160bb6a76b4374f741b5603 - languageName: node - linkType: hard - -"@types/sax@npm:^1.2.1": - version: 1.2.7 - resolution: "@types/sax@npm:1.2.7" - dependencies: - "@types/node": "npm:*" - checksum: 7ece5fbb5d9c8fc76ab0de2f99d705edf92f18e701d4f9d9b0647275e32eb65e656c1badf9dfaa12f4e1ff3e250561c8c9cfe79e8b5f33dd1417ac0f1804f6cc - languageName: node - linkType: hard - -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" - dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: cf4db48251bbb03cd6452b4de6e8e09e2d75390a92fd798eca4a803df06444adc94ed050246c94c7ed46fb97be1f63607f0e1f13c3ce83d71788b3e08640e5e0 - languageName: node - linkType: hard - -"@types/serve-index@npm:^1.9.1": - version: 1.9.4 - resolution: "@types/serve-index@npm:1.9.4" - dependencies: - "@types/express": "npm:*" - checksum: 72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 - languageName: node - linkType: hard - -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" - dependencies: - "@types/http-errors": "npm:*" - "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: bbbf00dbd84719da2250a462270dc68964006e8d62f41fe3741abd94504ba3688f420a49afb2b7478921a1544d3793183ffa097c5724167da777f4e0c7f1a7d6 - languageName: node - linkType: hard - -"@types/sockjs@npm:^0.3.33": - version: 0.3.36 - resolution: "@types/sockjs@npm:0.3.36" - dependencies: - "@types/node": "npm:*" - checksum: b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc - languageName: node - linkType: hard - -"@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/unist@npm:3.0.2" - checksum: 3d04d0be69316e5f14599a0d993a208606c12818cf631fd399243d1dc7a9bd8a3917d6066baa6abc290814afbd744621484756803c80cba892c39cd4b4a85616 - languageName: node - linkType: hard - -"@types/unist@npm:^2.0.0": - version: 2.0.10 - resolution: "@types/unist@npm:2.0.10" - checksum: e2924e18dedf45f68a5c6ccd6015cd62f1643b1b43baac1854efa21ae9e70505db94290434a23da1137d9e31eb58e54ca175982005698ac37300a1c889f6c4aa - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.5": - version: 8.5.10 - resolution: "@types/ws@npm:8.5.10" - dependencies: - "@types/node": "npm:*" - checksum: 3ec416ea2be24042ebd677932a462cf16d2080393d8d7d0b1b3f5d6eaa4a7387aaf0eefb99193c0bfd29444857cf2e0c3ac89899e130550dc6c14ada8a46d25e - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: ef236c27f9432983e91432d974243e6c4cdae227cb673740320eff32d04d853eed59c92ca6f1142a335cfdc0e17cccafa62e95886a8154ca8891cc2dec4ee6fc - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 4505bdebe8716ff383640c6e928f855b5d337cb3c68c81f7249fc6b983d0aa48de3eee26062b84f37e0d75a5797bc745e0c6e76f42f81771252a758c638f36ba - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.0.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 - languageName: node - linkType: hard - -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 31bcc64147236bd7b1b6d29d1f419c1f5845c785e1e42dc9e3f8ca2e05a029e9393a271b84f3a5bff2a32d35f51ff59e2181a6e5f953fe88576acd6750506202 - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: c3ffb723024130308db608e86e2bdccd4868bbb62dffb0a9a1530606496f79c87f8565bd8e02805ce64912b71f1a70ee5fb00307258b0c082c3abf961d097eca - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: c19810cdd2c90ff574139b6d8c0dda254d42d168a9e5b3d353d1bc085f1d7164ccd1b3c05592a45a939c47f7e403dc8d03572bb686642f06a3d02932f6f0bc8f - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: ae23642303f030af888d30c4ef37b08dfec7eab6851a9575a616e65d1219f880d9223913a39056dd654e49049d76e97555b285d1f7e56935047abf578cce0692 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 5787626bb7f0b033044471ddd00ce0c9fe1ee4584e8b73e232051e3a4c99ba1a102700d75337151c8b6055bae77eefa4548960c610a5e4a504e356bd872138ff - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 0e8fa8a0645304a1e18ff40d3db5a2e9233ebaa169b19fcc651d6fc9fe2cac0ce092ddee927318015ae735d9cd9c5d97c0cafb6a51dcd2932ac73587b62df991 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 176015de3551ac068cd4505d837414f258d9ade7442bd71efb1232fa26c9f6d7d4e11a5c816caeed389943f409af7ebff6899289a992d7a70343cb47009d21a8 - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 2974b5dda8d769145ba0efd886ea94a601e61fb37114c14f9a9a7606afc23456799af652ac3052f284909bd42edc3665a76bc9b50f95f0794c053a8a1757b713 - languageName: node - linkType: hard - -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 - languageName: node - linkType: hard - -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 - languageName: node - linkType: hard - -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" - peerDependencies: - acorn: ^8 - checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.0.0": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.0.0": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 - languageName: node - linkType: hard - -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.7.1, acorn@npm:^8.8.2": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" - bin: - acorn: bin/acorn - checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c - languageName: node - linkType: hard - -"address@npm:^1.0.1, address@npm:^1.1.2": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: ace439960c1e3564d8f523aff23a841904bf33a2a7c2e064f7f60a064194075758b9690e65bd9785692a4ef698a998c57eb74d145881a1cecab8ba658ddb1607 - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - peerDependencies: - ajv: ^8.8.2 - checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 - languageName: node - linkType: hard - -"ajv@npm:^6.12.2, ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 - languageName: node - linkType: hard - -"algoliasearch-helper@npm:^3.13.3": - version: 3.18.0 - resolution: "algoliasearch-helper@npm:3.18.0" - dependencies: - "@algolia/events": "npm:^4.0.1" - peerDependencies: - algoliasearch: ">= 3.1 < 6" - checksum: 07b924b0aa3d134065865dc262439d87ec8cf1e1c80800931c6f0c12930bbb05a50f249f6b1d34762534cd05707868c9f4b9f5447756c660ad9c601029da9797 - languageName: node - linkType: hard - -"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1": - version: 4.23.3 - resolution: "algoliasearch@npm:4.23.3" - dependencies: - "@algolia/cache-browser-local-storage": "npm:4.23.3" - "@algolia/cache-common": "npm:4.23.3" - "@algolia/cache-in-memory": "npm:4.23.3" - "@algolia/client-account": "npm:4.23.3" - "@algolia/client-analytics": "npm:4.23.3" - "@algolia/client-common": "npm:4.23.3" - "@algolia/client-personalization": "npm:4.23.3" - "@algolia/client-search": "npm:4.23.3" - "@algolia/logger-common": "npm:4.23.3" - "@algolia/logger-console": "npm:4.23.3" - "@algolia/recommend": "npm:4.23.3" - "@algolia/requester-browser-xhr": "npm:4.23.3" - "@algolia/requester-common": "npm:4.23.3" - "@algolia/requester-node-http": "npm:4.23.3" - "@algolia/transporter": "npm:4.23.3" - checksum: e5035b1234941b48821727feef38cb8438a0aab6343f23138392180f3de13769e0b3bc42f9fa34a7573c16c988a4e7897a5335be6e729803d749147dc04bf807 - languageName: node - linkType: hard - -"ansi-align@npm:^3.0.1": - version: 3.0.1 - resolution: "ansi-align@npm:3.0.1" - dependencies: - string-width: "npm:^4.1.0" - checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d - languageName: node - linkType: hard - -"ansi-html-community@npm:^0.0.8": - version: 0.0.8 - resolution: "ansi-html-community@npm:0.0.8" - bin: - ansi-html: bin/ansi-html - checksum: 04c568e8348a636963f915e48eaa3e01218322e1169acafdd79c384f22e5558c003f79bbc480c1563865497482817c7eed025f0653ebc17642fededa5cb42089 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"arg@npm:^5.0.0": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"astring@npm:^1.8.0": - version: 1.8.6 - resolution: "astring@npm:1.8.6" - bin: - astring: bin/astring - checksum: 6f034d2acef1dac8bb231e7cc26c573d3c14e1975ea6e04f20312b43d4f462f963209bc64187d25d477a182dc3c33277959a0156ab7a3617aa79b1eac4d88e1f - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"autoprefixer@npm:^10.4.12, autoprefixer@npm:^10.4.14": - version: 10.4.19 - resolution: "autoprefixer@npm:10.4.19" - dependencies: - browserslist: "npm:^4.23.0" - caniuse-lite: "npm:^1.0.30001599" - fraction.js: "npm:^4.3.7" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 3a4bc5bace05e057396dca2b306503efc175e90e8f2abf5472d3130b72da1d54d97c0ee05df21bf04fe66a7df93fd8c8ec0f1aca72a165f4701a02531abcbf11 - languageName: node - linkType: hard - -"babel-loader@npm:^9.1.3": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" - dependencies: - find-cache-dir: "npm:^4.0.0" - schema-utils: "npm:^4.0.0" - peerDependencies: - "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28 - languageName: node - linkType: hard - -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: "npm:^4.1.0" - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" - dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f098353ce7c7dde1a1d2710858e01b471e85689110c9e37813e009072347eb8c55d5f84d20d3bf1cab31755f20078ba90f8855fdc4686a9daa826a95ff280bd7 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": - version: 0.10.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.1" - core-js-compat: "npm:^3.36.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: b96a54495f7cc8b3797251c8c15f5ed015edddc3110fc122f6b32c94bec33af1e8bc56fa99091808f500bde0cccaaa266889cdc5935d9e6e9cf09898214f02dd - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f - languageName: node - linkType: hard - -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 - languageName: node - linkType: hard - -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 - languageName: node - linkType: hard - -"bonjour-service@npm:^1.0.11": - version: 1.2.1 - resolution: "bonjour-service@npm:1.2.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - multicast-dns: "npm:^7.2.5" - checksum: b65b3e6e3a07e97f2da5806afb76f3946d5a6426b72e849a0236dc3c9d3612fb8c5359ebade4be7eb63f74a37670c53a53be2ff17f4f709811fda77f600eb25b - languageName: node - linkType: hard - -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 - languageName: node - linkType: hard - -"boxen@npm:^6.2.1": - version: 6.2.1 - resolution: "boxen@npm:6.2.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.1.2" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.0.1" - type-fest: "npm:^2.5.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.0.1" - checksum: 2b3226092f1ff8e149c02979098c976552afa15f9e0231c9ed2dfcaaf84604494d16a6f13b647f718439f64d3140a088e822d47c7db00d2266e9ffc8d7321774 - languageName: node - linkType: hard - -"boxen@npm:^7.0.0": - version: 7.1.1 - resolution: "boxen@npm:7.1.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^7.0.1" - chalk: "npm:^5.2.0" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.1.2" - type-fest: "npm:^2.13.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.1.0" - checksum: ad8833d5f2845b0a728fdf8a0bc1505dff0c518edcb0fd56979a08774b1f26cf48b71e66532179ccdfb9ed95b64aa008689cca26f7776f93f002b8000a683d76 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: "npm:^7.0.1" - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" - dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" - bin: - browserslist: cli.js - checksum: 436f49e796782ca751ebab7edc010cfc9c29f68536f387666cd70ea22f7105563f04dd62c6ff89cb24cc3254d17cba385f979eeeb3484d43e012412ff7e75def - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f - languageName: node - linkType: hard - -"cacheable-lookup@npm:^7.0.0": - version: 7.0.0 - resolution: "cacheable-lookup@npm:7.0.0" - checksum: 9e2856763fc0a7347ab34d704c010440b819d4bb5e3593b664381b7433e942dd22e67ee5581f12256f908e79b82d30b86ebbacf40a081bfe10ee93fbfbc2d6a9 - languageName: node - linkType: hard - -"cacheable-request@npm:^10.2.8": - version: 10.2.14 - resolution: "cacheable-request@npm:10.2.14" - dependencies: - "@types/http-cache-semantics": "npm:^4.0.2" - get-stream: "npm:^6.0.1" - http-cache-semantics: "npm:^4.1.1" - keyv: "npm:^4.5.3" - mimic-response: "npm:^4.0.0" - normalize-url: "npm:^8.0.0" - responselike: "npm:^3.0.0" - checksum: 56f2b8e1c497c91f8391f0b099d19907a7dde25e71087e622b23e45fc8061736c2a6964ef121b16f377c3c61079cf8dc17320ab54004209d1343e4d26aba7015 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camel-case@npm:^4.1.2": - version: 4.1.2 - resolution: "camel-case@npm:4.1.2" - dependencies: - pascal-case: "npm:^3.1.2" - tslib: "npm:^2.0.3" - checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 - languageName: node - linkType: hard - -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"camelcase@npm:^7.0.1": - version: 7.0.1 - resolution: "camelcase@npm:7.0.1" - checksum: 86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d - languageName: node - linkType: hard - -"caniuse-api@npm:^3.0.0": - version: 3.0.0 - resolution: "caniuse-api@npm:3.0.0" - dependencies: - browserslist: "npm:^4.0.0" - caniuse-lite: "npm:^1.0.0" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: db2a229383b20d0529b6b589dde99d7b6cb56ba371366f58cbbfa2929c9f42c01f873e2b6ef641d4eda9f0b4118de77dbb2805814670bdad4234bf08e720b0b4 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": - version: 1.0.30001612 - resolution: "caniuse-lite@npm:1.0.30001612" - checksum: 2b6ab6a19c72bdf8dccac824944e828a2a1fae52c6dfeb2d64ccecfd60d0466d2e5a392e996da2150d92850188a5034666dceed34a38d978177f6934e0bf106d - languageName: node - linkType: hard - -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chalk@npm:^5.0.1, chalk@npm:^5.2.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 - languageName: node - linkType: hard - -"character-entities-html4@npm:^2.0.0": - version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d - languageName: node - linkType: hard - -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 - languageName: node - linkType: hard - -"character-entities@npm:^2.0.0": - version: 2.0.2 - resolution: "character-entities@npm:2.0.2" - checksum: cf1643814023697f725e47328fcec17923b8f1799102a8a79c1514e894815651794a2bffd84bb1b3a4b124b050154e4529ed6e81f7c8068a734aecf07a6d3def - languageName: node - linkType: hard - -"character-reference-invalid@npm:^2.0.0": - version: 2.0.1 - resolution: "character-reference-invalid@npm:2.0.1" - checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee - languageName: node - linkType: hard - -"cheerio-select@npm:^2.1.0": - version: 2.1.0 - resolution: "cheerio-select@npm:2.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-select: "npm:^5.1.0" - css-what: "npm:^6.1.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - checksum: 843d6d479922f28a6c5342c935aff1347491156814de63c585a6eb73baf7bb4185c1b4383a1195dca0f12e3946d737c7763bcef0b9544c515d905c5c44c5308b - languageName: node - linkType: hard - -"cheerio@npm:^1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "cheerio@npm:1.0.0-rc.12" - dependencies: - cheerio-select: "npm:^2.1.0" - dom-serializer: "npm:^2.0.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - htmlparser2: "npm:^8.0.1" - parse5: "npm:^7.0.0" - parse5-htmlparser2-tree-adapter: "npm:^7.0.0" - checksum: 5d4c1b7a53cf22d3a2eddc0aff70cf23cbb30d01a4c79013e703a012475c02461aa1fcd99127e8d83a02216386ed6942b2c8103845fd0812300dd199e6e7e054 - languageName: node - linkType: hard - -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 - languageName: node - linkType: hard - -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.2, clean-css@npm:~5.3.2": - version: 5.3.3 - resolution: "clean-css@npm:5.3.3" - dependencies: - source-map: "npm:~0.6.0" - checksum: 941987c14860dd7d346d5cf121a82fd2caf8344160b1565c5387f7ccca4bbcaf885bace961be37c4f4713ce2d8c488dd89483c1add47bb779790edbfdcc79cbc - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-boxes@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-boxes@npm:3.0.0" - checksum: 637d84419d293a9eac40a1c8c96a2859e7d98b24a1a317788e13c8f441be052fc899480c6acab3acc82eaf1bccda6b7542d7cdcf5c9c3cc39227175dc098d5b2 - languageName: node - linkType: hard - -"cli-table3@npm:^0.6.3": - version: 0.6.4 - resolution: "cli-table3@npm:0.6.4" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 0942d9977c05b31e9c7e0172276246b3ac2124c2929451851c01dbf5fc9b3d40cc4e1c9d468ff26dd3cfd18617963fe227b4cfeeae2881b70f302d69d792b5bb - languageName: node - linkType: hard - -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 - languageName: node - linkType: hard - -"clsx@npm:^2.0.0": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 - languageName: node - linkType: hard - -"collapse-white-space@npm:^2.0.0": - version: 2.1.0 - resolution: "collapse-white-space@npm:2.1.0" - checksum: c8978b1f4e7d68bf846cfdba6c6689ce8910511df7d331eb6e6757e51ceffb52768d59a28db26186c91dcf9594955b59be9f8ccd473c485790f5d8b90dc6726f - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"colord@npm:^2.9.1": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 - languageName: node - linkType: hard - -"colorette@npm:^2.0.10": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - -"combine-promises@npm:^1.1.0": - version: 1.2.0 - resolution: "combine-promises@npm:1.2.0" - checksum: ddce91436e24da03d5dc360c59cd55abfc9da5e949a26255aa42761925c574797c43138f0aabfc364e184e738e5e218a94ac6e88ebc459045bcf048ac7fe5f07 - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d - languageName: node - linkType: hard - -"commander@npm:^10.0.0": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"commander@npm:^5.1.0": - version: 5.1.0 - resolution: "commander@npm:5.1.0" - checksum: 0b7fec1712fbcc6230fcb161d8d73b4730fa91a21dc089515489402ad78810547683f058e2a9835929c212fead1d6a6ade70db28bbb03edbc2829a9ab7d69447 - languageName: node - linkType: hard - -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc - languageName: node - linkType: hard - -"commander@npm:^8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0 - languageName: node - linkType: hard - -"common-path-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "common-path-prefix@npm:3.0.0" - checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 - languageName: node - linkType: hard - -"compressible@npm:~2.0.16": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: "npm:>= 1.43.0 < 2" - checksum: 58321a85b375d39230405654721353f709d0c1442129e9a17081771b816302a012471a9b8f4864c7dbe02eef7f2aaac3c614795197092262e94b409c9be108f0 - languageName: node - linkType: hard - -"compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" - dependencies: - accepts: "npm:~1.3.5" - bytes: "npm:3.0.0" - compressible: "npm:~2.0.16" - debug: "npm:2.6.9" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.1.2" - vary: "npm:~1.1.2" - checksum: 35c0f2eb1f28418978615dc1bc02075b34b1568f7f56c62d60f4214d4b7cc00d0f6d282b5f8a954f59872396bd770b6b15ffd8aa94c67d4bce9b8887b906999b - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"config-chain@npm:^1.1.11": - version: 1.1.13 - resolution: "config-chain@npm:1.1.13" - dependencies: - ini: "npm:^1.3.4" - proto-list: "npm:~1.2.1" - checksum: 828137a28e7c2fc4b7fb229bd0cd6c1397bcf83434de54347e608154008f411749041ee392cbe42fab6307e02de4c12480260bf769b7d44b778fdea3839eafab - languageName: node - linkType: hard - -"configstore@npm:^6.0.0": - version: 6.0.0 - resolution: "configstore@npm:6.0.0" - dependencies: - dot-prop: "npm:^6.0.1" - graceful-fs: "npm:^4.2.6" - unique-string: "npm:^3.0.0" - write-file-atomic: "npm:^3.0.3" - xdg-basedir: "npm:^5.0.1" - checksum: 81995351c10bc04c58507f17748477aeac6f47465109d20e3534cebc881d22e927cfd29e73dd852c46c55f62c2b7be4cd1fe6eb3a93ba51f7f9813c218f9bae0 - languageName: node - linkType: hard - -"connect-history-api-fallback@npm:^2.0.0": - version: 2.0.0 - resolution: "connect-history-api-fallback@npm:2.0.0" - checksum: dc5368690f4a5c413889792f8df70d5941ca9da44523cde3f87af0745faee5ee16afb8195434550f0504726642734f2683d6c07f8b460f828a12c45fbd4c9a68 - languageName: node - linkType: hard - -"consola@npm:^2.15.3": - version: 2.15.3 - resolution: "consola@npm:2.15.3" - checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.2": - version: 0.5.2 - resolution: "content-disposition@npm:0.5.2" - checksum: 298d7da63255a38f7858ee19c7b6aae32b167e911293174b4c1349955e97e78e1d0b0d06c10e229405987275b417cf36ff65cbd4821a98bc9df4e41e9372cde7 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a - languageName: node - linkType: hard - -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: f56a7d32a07db5458e79c726b77e3c2eff655c36792f2b6c58d351fb5f61531e5b1ab7f46987150136e366c65213cbe31729e02a3eaed630c3bf7334635fb410 - languageName: node - linkType: hard - -"copy-text-to-clipboard@npm:^3.2.0": - version: 3.2.0 - resolution: "copy-text-to-clipboard@npm:3.2.0" - checksum: df7115c197a166d51f59e4e20ab2a68a855ae8746d25ff149b5465c694d9a405c7e6684b73a9f87ba8d653070164e229c15dfdb9fd77c30be1ff0da569661060 - languageName: node - linkType: hard - -"copy-webpack-plugin@npm:^11.0.0": - version: 11.0.0 - resolution: "copy-webpack-plugin@npm:11.0.0" - dependencies: - fast-glob: "npm:^3.2.11" - glob-parent: "npm:^6.0.1" - globby: "npm:^13.1.1" - normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - peerDependencies: - webpack: ^5.1.0 - checksum: df4f8743f003a29ee7dd3d9b1789998a3a99051c92afb2ba2203d3dacfa696f4e757b275560fafb8f206e520a0aa78af34b990324a0e36c2326cefdeef3ca82e - languageName: node - linkType: hard - -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": - version: 3.37.0 - resolution: "core-js-compat@npm:3.37.0" - dependencies: - browserslist: "npm:^4.23.0" - checksum: cab5078e98625f889fd9bbbb19e84cb408f31c87e68302d380db0d26ae8e35c1b38cde084358ff345d4aa461af5f3c60d8a913a5b30bff3a83b4b7859374db36 - languageName: node - linkType: hard - -"core-js-pure@npm:^3.30.2": - version: 3.37.0 - resolution: "core-js-pure@npm:3.37.0" - checksum: 206797d88046f4f5a62ecb9a7158bc6ba38127db2239bcbd1e85b2c8cf3cfb9bb3bbc6a312ecf0f87702f87659959d10625aeac74de6336a9303866f7010d364 - languageName: node - linkType: hard - -"core-js@npm:^3.31.1": - version: 3.37.0 - resolution: "core-js@npm:3.37.0" - checksum: 212c3e9b3fc277dbb63739ef58a61c5709ccd0b36f09c3ce6946aa91fa180c60f57f976d4a5fdb9cda0c6cb55417379ba5a008fc3a1384ec94ec8ec61826469d - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 8eed7c854b91643ecb820767d0deb038b50780ecc3d53b0b19e03ed8aabed4ae77271198d1ae3d49c3b110867edf679f5faad924820a8d1774144a87cb6f98fc - languageName: node - linkType: hard - -"cosmiconfig@npm:^7.0.1": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.3.5": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" - dependencies: - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - path-type: "npm:^4.0.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypto-random-string@npm:^4.0.0": - version: 4.0.0 - resolution: "crypto-random-string@npm:4.0.0" - dependencies: - type-fest: "npm:^1.0.1" - checksum: 91f148f27bcc8582798f0fb3e75a09d9174557f39c3c40a89dd1bd70fb5a14a02548245aa26fa7d663c426ac5026f4729841231c84f9e30e8c8ece5e38656741 - languageName: node - linkType: hard - -"css-declaration-sorter@npm:^6.3.1": - version: 6.4.1 - resolution: "css-declaration-sorter@npm:6.4.1" - peerDependencies: - postcss: ^8.0.9 - checksum: cbdc9e0d481011b1a28fd5b60d4eb55fe204391d31a0b1b490b2cecf4baa85810f9b8c48adab4df644f4718104ed3ed72c64a9745e3216173767bf4aeca7f9b8 - languageName: node - linkType: hard - -"css-loader@npm:^6.8.1": - version: 6.11.0 - resolution: "css-loader@npm:6.11.0" - dependencies: - icss-utils: "npm:^5.1.0" - postcss: "npm:^8.4.33" - postcss-modules-extract-imports: "npm:^3.1.0" - postcss-modules-local-by-default: "npm:^4.0.5" - postcss-modules-scope: "npm:^3.2.0" - postcss-modules-values: "npm:^4.0.0" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.5.4" - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 5c8d35975a7121334905394e88e28f05df72f037dbed2fb8fec4be5f0b313ae73a13894ba791867d4a4190c35896da84a7fd0c54fb426db55d85ba5e714edbe3 - languageName: node - linkType: hard - -"css-minimizer-webpack-plugin@npm:^4.2.2": - version: 4.2.2 - resolution: "css-minimizer-webpack-plugin@npm:4.2.2" - dependencies: - cssnano: "npm:^5.1.8" - jest-worker: "npm:^29.1.2" - postcss: "npm:^8.4.17" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - source-map: "npm:^0.6.1" - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - "@parcel/css": - optional: true - "@swc/css": - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - lightningcss: - optional: true - checksum: 5417e76a445f35832aa96807c835b8e92834a6cd285b1b788dfe3ca0fa90fec7eb2dd6efa9d3649f9d8244b99b7da2d065951603b94918e8f6a366a5049cacdd - languageName: node - linkType: hard - -"css-select@npm:^4.1.3": - version: 4.3.0 - resolution: "css-select@npm:4.3.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.0.1" - domhandler: "npm:^4.3.1" - domutils: "npm:^2.8.0" - nth-check: "npm:^2.0.1" - checksum: d6202736839194dd7f910320032e7cfc40372f025e4bf21ca5bf6eb0a33264f322f50ba9c0adc35dadd342d3d6fae5ca244779a4873afbfa76561e343f2058e0 - languageName: node - linkType: hard - -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda - languageName: node - linkType: hard - -"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3": - version: 1.1.3 - resolution: "css-tree@npm:1.1.3" - dependencies: - mdn-data: "npm:2.0.14" - source-map: "npm:^0.6.1" - checksum: 79f9b81803991b6977b7fcb1588799270438274d89066ce08f117f5cdb5e20019b446d766c61506dd772c839df84caa16042d6076f20c97187f5abe3b50e7d1f - languageName: node - linkType: hard - -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 - languageName: node - linkType: hard - -"cssnano-preset-advanced@npm:^5.3.10": - version: 5.3.10 - resolution: "cssnano-preset-advanced@npm:5.3.10" - dependencies: - autoprefixer: "npm:^10.4.12" - cssnano-preset-default: "npm:^5.2.14" - postcss-discard-unused: "npm:^5.1.0" - postcss-merge-idents: "npm:^5.1.1" - postcss-reduce-idents: "npm:^5.2.0" - postcss-zindex: "npm:^5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: d21cb382aea2f35c9eaa50686280bbd5158260edf73020731364b03bae0d887292da51ed0b20b369f51d2573ee8c02c695f604647b839a9ca746be8a44c3bb5b - languageName: node - linkType: hard - -"cssnano-preset-default@npm:^5.2.14": - version: 5.2.14 - resolution: "cssnano-preset-default@npm:5.2.14" - dependencies: - css-declaration-sorter: "npm:^6.3.1" - cssnano-utils: "npm:^3.1.0" - postcss-calc: "npm:^8.2.3" - postcss-colormin: "npm:^5.3.1" - postcss-convert-values: "npm:^5.1.3" - postcss-discard-comments: "npm:^5.1.2" - postcss-discard-duplicates: "npm:^5.1.0" - postcss-discard-empty: "npm:^5.1.1" - postcss-discard-overridden: "npm:^5.1.0" - postcss-merge-longhand: "npm:^5.1.7" - postcss-merge-rules: "npm:^5.1.4" - postcss-minify-font-values: "npm:^5.1.0" - postcss-minify-gradients: "npm:^5.1.1" - postcss-minify-params: "npm:^5.1.4" - postcss-minify-selectors: "npm:^5.2.1" - postcss-normalize-charset: "npm:^5.1.0" - postcss-normalize-display-values: "npm:^5.1.0" - postcss-normalize-positions: "npm:^5.1.1" - postcss-normalize-repeat-style: "npm:^5.1.1" - postcss-normalize-string: "npm:^5.1.0" - postcss-normalize-timing-functions: "npm:^5.1.0" - postcss-normalize-unicode: "npm:^5.1.1" - postcss-normalize-url: "npm:^5.1.0" - postcss-normalize-whitespace: "npm:^5.1.1" - postcss-ordered-values: "npm:^5.1.3" - postcss-reduce-initial: "npm:^5.1.2" - postcss-reduce-transforms: "npm:^5.1.0" - postcss-svgo: "npm:^5.1.0" - postcss-unique-selectors: "npm:^5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: d3bbbe3d50c6174afb28d0bdb65b511fdab33952ec84810aef58b87189f3891c34aaa8b6a6101acd5314f8acded839b43513e39a75f91a698ddc985a1b1d9e95 - languageName: node - linkType: hard - -"cssnano-utils@npm:^3.1.0": - version: 3.1.0 - resolution: "cssnano-utils@npm:3.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 975c84ce9174cf23bb1da1e9faed8421954607e9ea76440cd3bb0c1bea7e17e490d800fca5ae2812d1d9e9d5524eef23ede0a3f52497d7ccc628e5d7321536f2 - languageName: node - linkType: hard - -"cssnano@npm:^5.1.15, cssnano@npm:^5.1.8": - version: 5.1.15 - resolution: "cssnano@npm:5.1.15" - dependencies: - cssnano-preset-default: "npm:^5.2.14" - lilconfig: "npm:^2.0.3" - yaml: "npm:^1.10.2" - peerDependencies: - postcss: ^8.2.15 - checksum: ca9e1922178617c66c2f1548824b2c7af2ecf69cc3a187fc96bf8d29251c2e84d9e4966c69cf64a2a6a057a37dff7d6d057bc8a2a0957e6ea382e452ae9d0bbb - languageName: node - linkType: hard - -"csso@npm:^4.2.0": - version: 4.2.0 - resolution: "csso@npm:4.2.0" - dependencies: - css-tree: "npm:^1.1.2" - checksum: 380ba9663da3bcea58dee358a0d8c4468bb6539be3c439dc266ac41c047217f52fd698fb7e4b6b6ccdfb8cf53ef4ceed8cc8ceccb8dfca2aa628319826b5b998 - languageName: node - linkType: hard - -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 - languageName: node - linkType: hard - -"debounce@npm:^1.2.1": - version: 1.2.1 - resolution: "debounce@npm:1.2.1" - checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e - languageName: node - linkType: hard - -"debug@npm:2.6.9, debug@npm:^2.6.0": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"decode-named-character-reference@npm:^1.0.0": - version: 1.0.2 - resolution: "decode-named-character-reference@npm:1.0.2" - dependencies: - character-entities: "npm:^2.0.0" - checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: "npm:^3.1.0" - checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - -"deep-extend@npm:^0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 - languageName: node - linkType: hard - -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" - dependencies: - execa: "npm:^5.0.0" - checksum: 126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.1": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b - languageName: node - linkType: hard - -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 - languageName: node - linkType: hard - -"del@npm:^6.1.1": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: "npm:^11.0.1" - graceful-fs: "npm:^4.2.4" - is-glob: "npm:^4.0.1" - is-path-cwd: "npm:^2.2.0" - is-path-inside: "npm:^3.0.2" - p-map: "npm:^4.0.0" - rimraf: "npm:^3.0.2" - slash: "npm:^3.0.0" - checksum: 563288b73b8b19a7261c47fd21a330eeab6e2acd7c6208c49790dfd369127120dd7836cdf0c1eca216b77c94782a81507eac6b4734252d3bef2795cb366996b6 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"depd@npm:~1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 - languageName: node - linkType: hard - -"dequal@npm:^2.0.0": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e - languageName: node - linkType: hard - -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 9dc37b1fa4a9dd6d4889e1045849b8d841232b598d1ca888bf712f4035b07a17cf6d537465a0d7323250048d3a5a0540e3b7cf89457efc222f96f77e2c40d16a - languageName: node - linkType: hard - -"detect-port@npm:^1.5.1": - version: 1.5.1 - resolution: "detect-port@npm:1.5.1" - dependencies: - address: "npm:^1.0.1" - debug: "npm:4" - bin: - detect: bin/detect-port.js - detect-port: bin/detect-port.js - checksum: b48da9340481742547263d5d985e65d078592557863402ecf538511735e83575867e94f91fe74405ea19b61351feb99efccae7e55de9a151d5654e3417cea05b - languageName: node - linkType: hard - -"devlop@npm:^1.0.0, devlop@npm:^1.1.0": - version: 1.1.0 - resolution: "devlop@npm:1.1.0" - dependencies: - dequal: "npm:^2.0.0" - checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"dns-packet@npm:^5.2.2": - version: 5.6.1 - resolution: "dns-packet@npm:5.6.1" - dependencies: - "@leichtgewicht/ip-codec": "npm:^2.0.1" - checksum: 64c06457f0c6e143f7a0946e0aeb8de1c5f752217cfa143ef527467c00a6d78db1835cfdb6bb68333d9f9a4963cf23f410439b5262a8935cce1236f45e344b81 - languageName: node - linkType: hard - -"dom-converter@npm:^0.2.0": - version: 0.2.0 - resolution: "dom-converter@npm:0.2.0" - dependencies: - utila: "npm:~0.4" - checksum: ea52fe303f5392e48dea563abef0e6fb3a478b8dbe3c599e99bb5d53981c6c38fc4944e56bb92a8ead6bb989d10b7914722ae11febbd2fd0910e33b9fc4aaa77 - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.0" - entities: "npm:^2.0.0" - checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 - languageName: node - linkType: hard - -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" - dependencies: - domelementtype: "npm:^2.2.0" - checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c - languageName: node - linkType: hard - -"domutils@npm:^2.5.2, domutils@npm:^2.8.0": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" - dependencies: - dom-serializer: "npm:^1.0.1" - domelementtype: "npm:^2.2.0" - domhandler: "npm:^4.2.0" - checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 - languageName: node - linkType: hard - -"domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 - languageName: node - linkType: hard - -"dot-case@npm:^3.0.4": - version: 3.0.4 - resolution: "dot-case@npm:3.0.4" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 - languageName: node - linkType: hard - -"dot-prop@npm:^6.0.1": - version: 6.0.1 - resolution: "dot-prop@npm:6.0.1" - dependencies: - is-obj: "npm:^2.0.0" - checksum: 0f47600a4b93e1dc37261da4e6909652c008832a5d3684b5bf9a9a0d3f4c67ea949a86dceed9b72f5733ed8e8e6383cc5958df3bbd0799ee317fd181f2ece700 - languageName: node - linkType: hard - -"duplexer@npm:^0.1.2": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.668": - version: 1.4.747 - resolution: "electron-to-chromium@npm:1.4.747" - checksum: 6d302c2fbe71390ca666544017de5f8614ba8632ee02fd612d423439e813d72df09cbd8f614122a2ee07c8ffc2b3788882a5c5bb99363f162b9257f34c0eb31f - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"emojilib@npm:^2.4.0": - version: 2.4.0 - resolution: "emojilib@npm:2.4.0" - checksum: ea241c342abda5a86ffd3a15d8f4871a616d485f700e03daea38c6ce38205847cea9f6ff8d5e962c00516b004949cc96c6e37b05559ea71a0a496faba53b56da - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 - languageName: node - linkType: hard - -"emoticon@npm:^4.0.1": - version: 4.0.1 - resolution: "emoticon@npm:4.0.1" - checksum: 991ab6421927601af4eb44036b60e3125759a4d81f32d2ad96b66e3491e2fdb6a026eeb6bffbfa66724592dca95235570785963607d16961ea73a62ecce715e2 - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.16.0": - version: 5.16.0 - resolution: "enhanced-resolve@npm:5.16.0" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: ccfd01850ecf2aa51e8554d539973319ff7d8a539ef1e0ba3460a0ccad6223c4ef6e19165ee64161b459cd8a48df10f52af4434c60023c65fde6afa32d475f7e - languageName: node - linkType: hard - -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 - languageName: node - linkType: hard - -"entities@npm:^4.2.0, entities@npm:^4.4.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.2.1": - version: 1.5.0 - resolution: "es-module-lexer@npm:1.5.0" - checksum: adbe0772701e226b4b853f758fd89c0bbfe8357ab93babde7b1cdb4f88c3a31460c908cbe578817e241d116cc4fcf569f7c6f29c4fbfa0aadb0def90f1ad4dd2 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02 - languageName: node - linkType: hard - -"escape-goat@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-goat@npm:4.0.0" - checksum: 7034e0025eec7b751074b837f10312c5b768493265bdad046347c0aadbc1e652776f7e5df94766473fecb5d3681169cc188fe9ccc1e22be53318c18be1671cc0 - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^5.0.0": - version: 5.0.0 - resolution: "escape-string-regexp@npm:5.0.0" - checksum: 20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"estree-util-attach-comments@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-attach-comments@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 56254eaef39659e6351919ebc2ae53a37a09290a14571c19e373e9d5fad343a3403d9ad0c23ae465d6e7d08c3e572fd56fb8c793efe6434a261bf1489932dbd5 - languageName: node - linkType: hard - -"estree-util-build-jsx@npm:^3.0.0": - version: 3.0.1 - resolution: "estree-util-build-jsx@npm:3.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-walker: "npm:^3.0.0" - checksum: 185eff060eda2ba32cecd15904db4f5ba0681159fbdf54f0f6586cd9411e77e733861a833d0aee3415e1d1fd4b17edf08bc9e9872cee98e6ec7b0800e1a85064 - languageName: node - linkType: hard - -"estree-util-is-identifier-name@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-is-identifier-name@npm:3.0.0" - checksum: ea3909f0188ea164af0aadeca87c087e3e5da78d76da5ae9c7954ff1340ea3e4679c4653bbf4299ffb70caa9b322218cc1128db2541f3d2976eb9704f9857787 - languageName: node - linkType: hard - -"estree-util-to-js@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-to-js@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - astring: "npm:^1.8.0" - source-map: "npm:^0.7.0" - checksum: 833edc94ab9978e0918f90261e0a3361bf4564fec4901f326d2237a9235d3f5fc6482da3be5acc545e702c8c7cb8bc5de5c7c71ba3b080eb1975bcfdf3923d79 - languageName: node - linkType: hard - -"estree-util-value-to-estree@npm:^3.0.1": - version: 3.1.1 - resolution: "estree-util-value-to-estree@npm:3.1.1" - dependencies: - "@types/estree": "npm:^1.0.0" - is-plain-obj: "npm:^4.0.0" - checksum: 80e1d227ac80fab0b148c40427af31ad4dd37a3a4a0e0894d7975370284ea39566fe7df132f3454cf0e47adcc79b47ae0737464a85a413bce6f8d159336f8a37 - languageName: node - linkType: hard - -"estree-util-visit@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-visit@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - checksum: 6444b38f224322945a6d19ea81a8828a0eec64aefb2bf1ea791fe20df496f7b7c543408d637df899e6a8e318b638f66226f16378a33c4c2b192ba5c3f891121f - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.0": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"eta@npm:^2.2.0": - version: 2.2.0 - resolution: "eta@npm:2.2.0" - checksum: 6a09631481d4f26a9662a1eb736a65cc1cbc48e24935e6ff5d83a83b0cb509ea56d588d66d7c087d590601dc59bdabdac2356936b1b789d020eb0cf2d8304d54 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"eval@npm:^0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "npm:*" - require-like: "npm:>= 0.1.1" - checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 - languageName: node - linkType: hard - -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"express@npm:^4.17.3": - version: 4.19.2 - resolution: "express@npm:4.19.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 212dbd6c2c222a96a61bc927639c95970a53b06257080bb9e2838adb3bffdb966856551fdad1ab5dd654a217c35db94f987d0aa88d48fb04d306340f5f34dca5 - languageName: node - linkType: hard - -"extend-shallow@npm:^2.0.1": - version: 2.0.1 - resolution: "extend-shallow@npm:2.0.1" - dependencies: - is-extendable: "npm:^0.1.0" - checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 - languageName: node - linkType: hard - -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 - languageName: node - linkType: hard - -"fault@npm:^2.0.0": - version: 2.0.1 - resolution: "fault@npm:2.0.1" - dependencies: - format: "npm:^0.2.0" - checksum: c9b30f47d95769177130a9409976a899ed31eb598450fbad5b0d39f2f5f56d5f4a9ff9257e0bee8407cb0fc3ce37165657888c6aa6d78472e403893104329b72 - languageName: node - linkType: hard - -"faye-websocket@npm:^0.11.3": - version: 0.11.4 - resolution: "faye-websocket@npm:0.11.4" - dependencies: - websocket-driver: "npm:>=0.5.1" - checksum: d49a62caf027f871149fc2b3f3c7104dc6d62744277eb6f9f36e2d5714e847d846b9f7f0d0b7169b25a012e24a594cde11a93034b30732e4c683f20b8a5019fa - languageName: node - linkType: hard - -"feed@npm:^4.2.2": - version: 4.2.2 - resolution: "feed@npm:4.2.2" - dependencies: - xml-js: "npm:^1.6.11" - checksum: 2e6992a675a049511eef7bda8ca6c08cb9540cd10e8b275ec4c95d166228ec445a335fa8de990358759f248a92861e51decdcd32bf1c54737d5b7aed7c7ffe97 - languageName: node - linkType: hard - -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" - dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: faf43eecf233f4897b0150aaa874eeeac214e4f9de49738a9e0ef734a30b5260059e85b7edadf852b98e415f875bd5f12587768a93fd52aaf2e479ecf95fab20 - languageName: node - linkType: hard - -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 8603d27c5287b984cb100733640645e078f5f5ad65c6d913173e01fb99e09b0747828498fd86647685ccecb69be31f3587b9739ab1e50732116b2374aff4cbf9 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 - languageName: node - linkType: hard - -"find-cache-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "find-cache-dir@npm:4.0.0" - dependencies: - common-path-prefix: "npm:^3.0.0" - pkg-dir: "npm:^7.0.0" - checksum: 52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-up@npm:^6.3.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: "npm:^7.1.0" - path-exists: "npm:^5.0.0" - checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 9732a49bfeed8fc23e6e8a59795fa7c238edeba91040a9b520db54b4d316dda27f9f1893d360e296fd0ad8930627d364417d28a8c7007fba60cc730ebfce4956 - languageName: node - linkType: hard - -"form-data-encoder@npm:^2.1.2": - version: 2.1.4 - resolution: "form-data-encoder@npm:2.1.4" - checksum: e0b3e5950fb69b3f32c273944620f9861f1933df9d3e42066e038e26dfb343d0f4465de9f27e0ead1a09d9df20bc2eed06a63c2ca2f8f00949e7202bae9e29dd - languageName: node - linkType: hard - -"format@npm:^0.2.0": - version: 0.2.2 - resolution: "format@npm:0.2.2" - checksum: 646a60e1336250d802509cf24fb801e43bd4a70a07510c816fa133aa42cdbc9c21e66e9cc0801bb183c5b031c9d68be62e7fbb6877756e52357850f92aa28799 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 - languageName: node - linkType: hard - -"fraction.js@npm:^4.3.7": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"fs-extra@npm:^11.1.1": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs-monkey@npm:^1.0.4": - version: 1.0.5 - resolution: "fs-monkey@npm:1.0.5" - checksum: 424b67f65b37fe66117ae2bb061f790fe6d4b609e1d160487c74b3d69fbf42f262c665ccfba32e8b5f113f96f92e9a58fcdebe42d5f6649bdfc72918093a3119 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 - languageName: node - linkType: hard - -"get-own-enumerable-property-symbols@npm:^3.0.0": - version: 3.0.2 - resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 8f0331f14159f939830884799f937343c8c0a2c330506094bc12cbee3665d88337fe97a4ea35c002cc2bdba0f5d9975ad7ec3abb925015cdf2a93e76d4759ede - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"github-slugger@npm:^1.5.0": - version: 1.5.0 - resolution: "github-slugger@npm:1.5.0" - checksum: c70988224578b3bdaa25df65973ffc8c24594a77a28550c3636e495e49d17aef5cdb04c04fa3f1744babef98c61eecc6a43299a13ea7f3cc33d680bf9053ffbe - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.1": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.1 - resolution: "glob@npm:10.4.1" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 5d33c686c80bf6877f4284adf99a8c3cbb2a6eccbc92342943fe5d4b42c01d78c1881f2223d950c92a938d0f857e12e37b86a8e5483ab2141822e053b67d0dde - languageName: node - linkType: hard - -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: "npm:2.0.0" - checksum: 70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"globby@npm:^13.1.1": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.3.0" - ignore: "npm:^5.2.4" - merge2: "npm:^1.4.1" - slash: "npm:^4.0.0" - checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"got@npm:^12.1.0": - version: 12.6.1 - resolution: "got@npm:12.6.1" - dependencies: - "@sindresorhus/is": "npm:^5.2.0" - "@szmarczak/http-timer": "npm:^5.0.1" - cacheable-lookup: "npm:^7.0.0" - cacheable-request: "npm:^10.2.8" - decompress-response: "npm:^6.0.0" - form-data-encoder: "npm:^2.1.2" - get-stream: "npm:^6.0.1" - http2-wrapper: "npm:^2.1.10" - lowercase-keys: "npm:^3.0.0" - p-cancelable: "npm:^3.0.0" - responselike: "npm:^3.0.0" - checksum: 3c37f5d858aca2859f9932e7609d35881d07e7f2d44c039d189396f0656896af6c77c22f2c51c563f8918be483f60ff41e219de742ab4642d4b106711baccbd5 - languageName: node - linkType: hard - -"graceful-fs@npm:4.2.10": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"gray-matter@npm:^4.0.3": - version: 4.0.3 - resolution: "gray-matter@npm:4.0.3" - dependencies: - js-yaml: "npm:^3.13.1" - kind-of: "npm:^6.0.2" - section-matter: "npm:^1.0.0" - strip-bom-string: "npm:^1.0.0" - checksum: 37717bd424344487d655392251ce8d8878a1275ee087003e61208fba3bfd59cbb73a85b2159abf742ae95e23db04964813fdc33ae18b074208428b2528205222 - languageName: node - linkType: hard - -"gzip-size@npm:^6.0.0": - version: 6.0.0 - resolution: "gzip-size@npm:6.0.0" - dependencies: - duplexer: "npm:^0.1.2" - checksum: 2df97f359696ad154fc171dcb55bc883fe6e833bca7a65e457b9358f3cb6312405ed70a8da24a77c1baac0639906cd52358dc0ce2ec1a937eaa631b934c94194 - languageName: node - linkType: hard - -"handle-thing@npm:^2.0.0": - version: 2.0.1 - resolution: "handle-thing@npm:2.0.1" - checksum: 68071f313062315cd9dce55710e9496873945f1dd425107007058fc1629f93002a7649fcc3e464281ce02c7e809a35f5925504ab8105d972cf649f1f47cb7d6c - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-yarn@npm:^3.0.0": - version: 3.0.0 - resolution: "has-yarn@npm:3.0.0" - checksum: b9e14e78e0a37bc070550c862b201534287bc10e62a86ec9c1f455ffb082db42817ce9aed914bd73f1d589bbf268520e194629ff2f62ff6b98a482c4bd2dcbfb - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"hast-util-from-parse5@npm:^8.0.0": - version: 8.0.1 - resolution: "hast-util-from-parse5@npm:8.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - hastscript: "npm:^8.0.0" - property-information: "npm:^6.0.0" - vfile: "npm:^6.0.0" - vfile-location: "npm:^5.0.0" - web-namespaces: "npm:^2.0.0" - checksum: fdd1ab8b03af13778ecb94ef9a58b1e3528410cdfceb3d6bb7600508967d0d836b451bc7bc3baf66efb7c730d3d395eea4bb1b30352b0162823d9f0de976774b - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^4.0.0": - version: 4.0.0 - resolution: "hast-util-parse-selector@npm:4.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 76087670d3b0b50b23a6cb70bca53a6176d6608307ccdbb3ed18b650b82e7c3513bfc40348f1389dc0c5ae872b9a768851f4335f44654abd7deafd6974c52402 - languageName: node - linkType: hard - -"hast-util-raw@npm:^9.0.0": - version: 9.0.2 - resolution: "hast-util-raw@npm:9.0.2" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - hast-util-from-parse5: "npm:^8.0.0" - hast-util-to-parse5: "npm:^8.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - parse5: "npm:^7.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 27fd7c723b3b1e06481cd85ca20b447d58d340c53abd2bd61f4a502982109d16aa17b3d71db2ef7c9d24bd627e306ad81cbcaf98c146a3641ba150db731e644c - languageName: node - linkType: hard - -"hast-util-to-estree@npm:^3.0.0": - version: 3.1.0 - resolution: "hast-util-to-estree@npm:3.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-attach-comments: "npm:^3.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^0.4.0" - unist-util-position: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 61272f7c18c9d2a5e34df7cfd2c97cbf12f6e9d05114d60e4dedd64e5576565eb1e35c78b9213c909bb8f984f0f8e9c49b568f04bdb444b83d0bca9159e14f3c - languageName: node - linkType: hard - -"hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.0 - resolution: "hast-util-to-jsx-runtime@npm:2.3.0" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - vfile-message: "npm:^4.0.0" - checksum: 599a97c6ec61c1430776813d7fb42e6f96032bf4a04dfcbb8eceef3bc8d1845ecf242387a4426b9d3f52320dbbfa26450643b81124b3d6a0b9bbb0fff4d0ba83 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "hast-util-to-parse5@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 137469209cb2b32b57387928878dc85310fbd5afa4807a8da69529199bb1d19044bfc95b50c3dc68d4fb2b6cb8bf99b899285597ab6ab318f50422eefd5599dd - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-whitespace@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 - languageName: node - linkType: hard - -"hastscript@npm:^8.0.0": - version: 8.0.0 - resolution: "hastscript@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - checksum: ae3c20223e7b847320c0f98b6fb3c763ebe1bf3913c5805fbc176cf84553a9db1117ca34cf842a5235890b4b9ae0e94501bfdc9a9b870a5dbf5fc52426db1097 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"history@npm:^4.9.0": - version: 4.10.1 - resolution: "history@npm:4.10.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - loose-envify: "npm:^1.2.0" - resolve-pathname: "npm:^3.0.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - value-equal: "npm:^1.0.1" - checksum: addd84bc4683929bae4400419b5af132ff4e4e9b311a0d4e224579ea8e184a6b80d7f72c55927e4fa117f69076a9e47ce082d8d0b422f1a9ddac7991490ca1d0 - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.1.0": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: "npm:^16.7.0" - checksum: b1538270429b13901ee586aa44f4cc3ecd8831c061d06cb8322e50ea17b3f5ce4d0e2e66394761e6c8e152cd8c34fb3b4b690116c6ce2bd45b18c746516cb9e8 - languageName: node - linkType: hard - -"hpack.js@npm:^2.1.6": - version: 2.1.6 - resolution: "hpack.js@npm:2.1.6" - dependencies: - inherits: "npm:^2.0.1" - obuf: "npm:^1.0.0" - readable-stream: "npm:^2.0.1" - wbuf: "npm:^1.1.0" - checksum: 2de144115197967ad6eeee33faf41096c6ba87078703c5cb011632dcfbffeb45784569e0cf02c317bd79c48375597c8ec88c30fff5bb0b023e8f654fb6e9c06e - languageName: node - linkType: hard - -"html-entities@npm:^2.3.2": - version: 2.5.2 - resolution: "html-entities@npm:2.5.2" - checksum: b23f4a07d33d49ade1994069af4e13d31650e3fb62621e92ae10ecdf01d1a98065c78fd20fdc92b4c7881612210b37c275f2c9fba9777650ab0d6f2ceb3b99b6 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.2": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 - languageName: node - linkType: hard - -"html-minifier-terser@npm:^6.0.2": - version: 6.1.0 - resolution: "html-minifier-terser@npm:6.1.0" - dependencies: - camel-case: "npm:^4.1.2" - clean-css: "npm:^5.2.2" - commander: "npm:^8.3.0" - he: "npm:^1.2.0" - param-case: "npm:^3.0.4" - relateurl: "npm:^0.2.7" - terser: "npm:^5.10.0" - bin: - html-minifier-terser: cli.js - checksum: ac52c14006476f773204c198b64838477859dc2879490040efab8979c0207424da55d59df7348153f412efa45a0840a1ca3c757bf14767d23a15e3e389d37a93 - languageName: node - linkType: hard - -"html-minifier-terser@npm:^7.2.0": - version: 7.2.0 - resolution: "html-minifier-terser@npm:7.2.0" - dependencies: - camel-case: "npm:^4.1.2" - clean-css: "npm:~5.3.2" - commander: "npm:^10.0.0" - entities: "npm:^4.4.0" - param-case: "npm:^3.0.4" - relateurl: "npm:^0.2.7" - terser: "npm:^5.15.1" - bin: - html-minifier-terser: cli.js - checksum: 39feed354b5a8aafc8e910977d68cfd961d6db330a8e1a5b16a528c86b8ee7745d8945134822cf00acf7bf0d0135bf1abad650bf308bee4ea73adb003f5b8656 - languageName: node - linkType: hard - -"html-tags@npm:^3.3.1": - version: 3.3.1 - resolution: "html-tags@npm:3.3.1" - checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce - languageName: node - linkType: hard - -"html-void-elements@npm:^3.0.0": - version: 3.0.0 - resolution: "html-void-elements@npm:3.0.0" - checksum: 59be397525465a7489028afa064c55763d9cccd1d7d9f630cca47137317f0e897a9ca26cef7e745e7cff1abc44260cfa407742b243a54261dfacd42230e94fce - languageName: node - linkType: hard - -"html-webpack-plugin@npm:^5.5.3": - version: 5.6.0 - resolution: "html-webpack-plugin@npm:5.6.0" - dependencies: - "@types/html-minifier-terser": "npm:^6.0.0" - html-minifier-terser: "npm:^6.0.2" - lodash: "npm:^4.17.21" - pretty-error: "npm:^4.0.0" - tapable: "npm:^2.0.0" - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 32a6e41da538e798fd0be476637d7611a5e8a98a3508f031996e9eb27804dcdc282cb01f847cf5d066f21b49cfb8e21627fcf977ffd0c9bea81cf80e5a65070d - languageName: node - linkType: hard - -"htmlparser2@npm:^6.1.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.0.0" - domutils: "npm:^2.5.2" - entities: "npm:^2.0.0" - checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e - languageName: node - linkType: hard - -"htmlparser2@npm:^8.0.1": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - entities: "npm:^4.4.0" - checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-deceiver@npm:^1.2.7": - version: 1.2.7 - resolution: "http-deceiver@npm:1.2.7" - checksum: 64d7d1ae3a6933eb0e9a94e6f27be4af45a53a96c3c34e84ff57113787105a89fff9d1c3df263ef63add823df019b0e8f52f7121e32393bb5ce9a713bf100b41 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.3" - setprototypeof: "npm:1.1.0" - statuses: "npm:>= 1.4.0 < 2" - checksum: a9654ee027e3d5de305a56db1d1461f25709ac23267c6dc28cdab8323e3f96caa58a9a6a5e93ac15d7285cee0c2f019378c3ada9026e7fe19c872d695f27de7c - languageName: node - linkType: hard - -"http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 6bbdf2429858e8cf13c62375b0bfb6dc3955ca0f32e58237488bc86cd2378f31d31785fd3ac4ce93f1c74e0189cf8823c91f5cb061696214fd368d2452dc871d - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 - languageName: node - linkType: hard - -"http-proxy-middleware@npm:^2.0.3": - version: 2.0.6 - resolution: "http-proxy-middleware@npm:2.0.6" - dependencies: - "@types/http-proxy": "npm:^1.17.8" - http-proxy: "npm:^1.18.1" - is-glob: "npm:^4.0.1" - is-plain-obj: "npm:^3.0.0" - micromatch: "npm:^4.0.2" - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - checksum: 2ee85bc878afa6cbf34491e972ece0f5be0a3e5c98a60850cf40d2a9a5356e1fc57aab6cff33c1fc37691b0121c3a42602d2b1956c52577e87a5b77b62ae1c3a - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 - languageName: node - linkType: hard - -"http2-wrapper@npm:^2.1.10": - version: 2.2.1 - resolution: "http2-wrapper@npm:2.2.1" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.2.0" - checksum: e95e55e22c6fd61182ce81fecb9b7da3af680d479febe8ad870d05f7ebbc9f076e455193766f4e7934e50913bf1d8da3ba121fb5cd2928892390b58cf9d5c509 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: daaab857a967a2519ddc724f91edbbd388d766ff141b9025b629f92b9408fc83cee8a27e11a907aede392938e9c398e240d643e178408a59e4073539cde8cfe9 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "icss-utils@npm:5.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 - languageName: node - linkType: hard - -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 - languageName: node - linkType: hard - -"image-size@npm:^1.0.2": - version: 1.1.1 - resolution: "image-size@npm:1.1.1" - dependencies: - queue: "npm:6.0.2" - bin: - image-size: bin/image-size.js - checksum: 23b3a515dded89e7f967d52b885b430d6a5a903da954fce703130bfb6069d738d80e6588efd29acfaf5b6933424a56535aa7bf06867e4ebd0250c2ee51f19a4a - languageName: node - linkType: hard - -"immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432 - languageName: node - linkType: hard - -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"import-lazy@npm:^4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"infima@npm:0.2.0-alpha.43": - version: 0.2.0-alpha.43 - resolution: "infima@npm:0.2.0-alpha.43" - checksum: fc5f79240e940eddd750439511767092ccb4051e5e91d253ec7630a9e7ce691812da3aa0f05e46b4c0a95dbfadeae5714fd0073f8d2df12e5aaff0697a1d6aa2 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0 - languageName: node - linkType: hard - -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e - languageName: node - linkType: hard - -"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.1.1": - version: 0.1.1 - resolution: "inline-style-parser@npm:0.1.1" - checksum: 5d545056a3e1f2bf864c928a886a0e1656a3517127d36917b973de581bd54adc91b4bf1febcb0da054f204b4934763f1a4e09308b4d55002327cf1d48ac5d966 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.2.3": - version: 0.2.3 - resolution: "inline-style-parser@npm:0.2.3" - checksum: ed6454de80759e7faef511f51b5716b33c40a6b05b8a8f5383dc01e8a087c6fd5df877446d05e8e3961ae0751e028e25e180f5cffc192a5ce7822edef6810ade - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 - languageName: node - linkType: hard - -"invariant@npm:^2.2.4": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: "npm:^1.0.0" - checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - -"ipaddr.js@npm:^2.0.1": - version: 2.2.0 - resolution: "ipaddr.js@npm:2.2.0" - checksum: 770ba8451fd9bf78015e8edac0d5abd7a708cbf75f9429ca9147a9d2f3a2d60767cd5de2aab2b1e13ca6e4445bdeff42bf12ef6f151c07a5c6cf8a44328e2859 - languageName: node - linkType: hard - -"is-alphabetical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphabetical@npm:2.0.1" - checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa - languageName: node - linkType: hard - -"is-alphanumerical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphanumerical@npm:2.0.1" - dependencies: - is-alphabetical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-ci@npm:^3.0.1": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: "npm:^3.2.0" - bin: - is-ci: bin.js - checksum: 192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" - dependencies: - hasown: "npm:^2.0.0" - checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c - languageName: node - linkType: hard - -"is-decimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-decimal@npm:2.0.1" - checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-extendable@npm:^0.1.0": - version: 0.1.1 - resolution: "is-extendable@npm:0.1.1" - checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-hexadecimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-hexadecimal@npm:2.0.1" - checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 - languageName: node - linkType: hard - -"is-installed-globally@npm:^0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: "npm:^3.0.0" - is-path-inside: "npm:^3.0.2" - checksum: 3359840d5982d22e9b350034237b2cda2a12bac1b48a721912e1ab8e0631dd07d45a2797a120b7b87552759a65ba03e819f1bd63f2d7ab8657ec0b44ee0bf399 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-npm@npm:^6.0.0": - version: 6.0.0 - resolution: "is-npm@npm:6.0.0" - checksum: fafe1ddc772345f5460514891bb8014376904ccdbddd59eee7525c9adcc08d426933f28b087bef3e17524da7ebf35c03ef484ff3b6ba9d5fecd8c6e6a7d4bf11 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "is-obj@npm:1.0.1" - checksum: 3ccf0efdea12951e0b9c784e2b00e77e87b2f8bd30b42a498548a8afcc11b3287342a2030c308e473e93a7a19c9ea7854c99a8832a476591c727df2a9c79796c - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.2": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c - languageName: node - linkType: hard - -"is-plain-obj@npm:^4.0.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca - languageName: node - linkType: hard - -"is-reference@npm:^3.0.0": - version: 3.0.2 - resolution: "is-reference@npm:3.0.2" - dependencies: - "@types/estree": "npm:*" - checksum: ac3bf5626fe9d0afbd7454760d73c47f16b9f471401b9749721ad3b66f0a39644390382acf88ca9d029c95782c1e2ec65662855e3ba91acf52d82231247a7fd3 - languageName: node - linkType: hard - -"is-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "is-regexp@npm:1.0.0" - checksum: be692828e24cba479ec33644326fa98959ec68ba77965e0291088c1a741feaea4919d79f8031708f85fd25e39de002b4520622b55460660b9c369e6f7187faef - languageName: node - linkType: hard - -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 37eea0822a2a9123feb58a9d101558ba276771a6d830f87005683349a9acff15958a9ca590a44e778c6b335660b83e85c744789080d734f6081a935a4880aee2 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-typedarray@npm:^1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 - languageName: node - linkType: hard - -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - -"is-yarn-global@npm:^0.4.0": - version: 0.4.1 - resolution: "is-yarn-global@npm:0.4.1" - checksum: 79ec4e6f581c53d4fefdf5f6c237f9a3ad8db29c85cdc4659e76ae345659317552052a97b7e56952aa5d94a23c798ebec8ccad72fb14d3b26dc647ddceddd716 - languageName: node - linkType: hard - -"isarray@npm:0.0.1": - version: 0.0.1 - resolution: "isarray@npm:0.0.1" - checksum: 49191f1425681df4a18c2f0f93db3adb85573bcdd6a4482539d98eac9e705d8961317b01175627e860516a2fc45f8f9302db26e5a380a97a520e272e2a40a8d4 - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.1.2 - resolution: "jackspeak@npm:3.1.2" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 134276d5f785c518930701a0dcba1f3b0e9ce3e5b1c3e300898e2ae0bbd9b5195088b77252bf2110768de072c426e9e39f47e13912b0b002da4a3f4ff6e16eac - languageName: node - linkType: hard - -"jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca - languageName: node - linkType: hard - -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 - languageName: node - linkType: hard - -"jest-worker@npm:^29.1.2": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" - dependencies: - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 - languageName: node - linkType: hard - -"jiti@npm:^1.20.0": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" - bin: - jiti: bin/jiti.js - checksum: a7bd5d63921c170eaec91eecd686388181c7828e1fa0657ab374b9372bfc1f383cf4b039e6b272383d5cb25607509880af814a39abdff967322459cca41f2961 - languageName: node - linkType: hard - -"joi@npm:^17.9.2": - version: 17.13.0 - resolution: "joi@npm:17.13.0" - dependencies: - "@hapi/hoek": "npm:^9.3.0" - "@hapi/topo": "npm:^5.1.0" - "@sideway/address": "npm:^4.1.5" - "@sideway/formula": "npm:^3.0.1" - "@sideway/pinpoint": "npm:^2.0.0" - checksum: ecde54b0705f21929939a72e958d96ba7dd2a6578ba7bf711c060f54b765a081dc67d09f7f4761a76cc4d659f6d880dca72287200801dc51485a350795131f84 - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - -"json5@npm:^2.1.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 - languageName: node - linkType: hard - -"latest-version@npm:^7.0.0": - version: 7.0.0 - resolution: "latest-version@npm:7.0.0" - dependencies: - package-json: "npm:^8.1.0" - checksum: 1f0deba00d5a34394cce4463c938811f51bbb539b131674f4bb2062c63f2cc3b80bccd56ecade3bd5932d04a34cf0a5a8a2ccc4ec9e5e6b285a9a7b3e27d0d66 - languageName: node - linkType: hard - -"launch-editor@npm:^2.6.0": - version: 2.6.1 - resolution: "launch-editor@npm:2.6.1" - dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.8.1" - checksum: e06d193075ac09f7f8109f10cabe464a211bf7ed4cbe75f83348d6f67bf4d9f162f06e7a1ab3e1cd7fc250b5342c3b57080618aff2e646dc34248fe499227601 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 - languageName: node - linkType: hard - -"lilconfig@npm:^2.0.3": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 - languageName: node - linkType: hard - -"loader-utils@npm:^3.2.0": - version: 3.2.1 - resolution: "loader-utils@npm:3.2.1" - checksum: 4e3ea054cdc8be1ab1f1238f49f42fdf0483039eff920fb1d442039f3f0ad4ebd11fb8e584ccdf2cb7e3c56b3d40c1832416e6408a55651b843da288960cc792 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"locate-path@npm:^7.1.0": - version: 7.2.0 - resolution: "locate-path@npm:7.2.0" - dependencies: - p-locate: "npm:^6.0.0" - checksum: c1b653bdf29beaecb3d307dfb7c44d98a2a98a02ebe353c9ad055d1ac45d6ed4e1142563d222df9b9efebc2bcb7d4c792b507fad9e7150a04c29530b7db570f8 - languageName: node - linkType: hard - -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 - languageName: node - linkType: hard - -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d - languageName: node - linkType: hard - -"lodash@npm:^4.17.20, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"longest-streak@npm:^3.0.0": - version: 3.1.0 - resolution: "longest-streak@npm:3.1.0" - checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 - languageName: node - linkType: hard - -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 - languageName: node - linkType: hard - -"lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case@npm:2.0.2" - dependencies: - tslib: "npm:^2.0.3" - checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 - languageName: node - linkType: hard - -"lowercase-keys@npm:^3.0.0": - version: 3.0.0 - resolution: "lowercase-keys@npm:3.0.0" - checksum: 67a3f81409af969bc0c4ca0e76cd7d16adb1e25aa1c197229587eaf8671275c8c067cd421795dbca4c81be0098e4c426a086a05e30de8a9c587b7a13c0c7ccc5 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 98e8fc93691c546f719a76103ef2bee5a3ac823955c755a47641ec41f8c7fafa1baeaba466937cc1cbfa9cfd47e03536d10e2db3158a64ad91ff3a58a32c893e - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd - languageName: node - linkType: hard - -"markdown-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "markdown-extensions@npm:2.0.0" - checksum: ec4ffcb0768f112e778e7ac74cb8ef22a966c168c3e6c29829f007f015b0a0b5c79c73ee8599a0c72e440e7f5cfdbf19e80e2d77b9a313b8f66e180a330cf1b2 - languageName: node - linkType: hard - -"markdown-table@npm:^3.0.0": - version: 3.0.3 - resolution: "markdown-table@npm:3.0.3" - checksum: 8fcd3d9018311120fbb97115987f8b1665a603f3134c93fbecc5d1463380c8036f789e2a62c19432058829e594fff8db9ff81c88f83690b2f8ed6c074f8d9e10 - languageName: node - linkType: hard - -"mdast-util-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-directive@npm:3.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 593afdc4f39f99bb198f3774bf4648cb546cb99a055e40c82262a7faab10926d2529a725d0d3945300ed0a1f07c6c84215a3f76b899a89b3f410ec7375bbab17 - languageName: node - linkType: hard - -"mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": - version: 3.0.1 - resolution: "mdast-util-find-and-replace@npm:3.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - escape-string-regexp: "npm:^5.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 05d5c4ff02e31db2f8a685a13bcb6c3f44e040bd9dfa54c19a232af8de5268334c8755d79cb456ed4cced1300c4fb83e88444c7ae8ee9ff16869a580f29d08cd - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-from-markdown@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark: "npm:^4.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 4e8d8a46b4b588486c41b80c39da333a91593bc8d60cd7421c6cd3c22003b8e5a62478292fb7bc97b9255b6301a2250cca32340ef43c309156e215453c5b92be - languageName: node - linkType: hard - -"mdast-util-frontmatter@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-frontmatter@npm:2.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - escape-string-regexp: "npm:^5.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-extension-frontmatter: "npm:^2.0.0" - checksum: 86a7c8d9eb183be2621d6d9134b9d33df2a3647e3255f68a9796e2425e25643ffae00a501e36c57d9c10973087b94aa5a2ffd865d33cdd274cc9b88cd2d90a2e - languageName: node - linkType: hard - -"mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.0.0" - mdast-util-find-and-replace: "npm:^3.0.0" - micromark-util-character: "npm:^2.0.0" - checksum: 10322662e5302964bed7c9829c5fd3b0c9899d4f03e63fb8620ab141cf4f3de9e61fcb4b44d46aacc8a23f82bcd5d900980a211825dfe026b1dab5fdbc3e8742 - languageName: node - linkType: hard - -"mdast-util-gfm-footnote@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-footnote@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - checksum: 45d26b40e7a093712e023105791129d76e164e2168d5268e113298a22de30c018162683fb7893cdc04ab246dac0087eed708b2a136d1d18ed2b32b3e0cae4a79 - languageName: node - linkType: hard - -"mdast-util-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: fe9b1d0eba9b791ff9001c008744eafe3dd7a81b085f2bf521595ce4a8e8b1b44764ad9361761ad4533af3e5d913d8ad053abec38172031d9ee32a8ebd1c7dbd - languageName: node - linkType: hard - -"mdast-util-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-table@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - markdown-table: "npm:^3.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 063a627fd0993548fd63ca0c24c437baf91ba7d51d0a38820bd459bc20bf3d13d7365ef8d28dca99176dd5eb26058f7dde51190479c186dfe6af2e11202957c9 - languageName: node - linkType: hard - -"mdast-util-gfm-task-list-item@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 37db90c59b15330fc54d790404abf5ef9f2f83e8961c53666fe7de4aab8dd5e6b3c296b6be19797456711a89a27840291d8871ff0438e9b4e15c89d170efe072 - languageName: node - linkType: hard - -"mdast-util-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-gfm@npm:3.0.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-gfm-autolink-literal: "npm:^2.0.0" - mdast-util-gfm-footnote: "npm:^2.0.0" - mdast-util-gfm-strikethrough: "npm:^2.0.0" - mdast-util-gfm-table: "npm:^2.0.0" - mdast-util-gfm-task-list-item: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 62039d2f682ae3821ea1c999454863d31faf94d67eb9b746589c7e136076d7fb35fabc67e02f025c7c26fd7919331a0ee1aabfae24f565d9a6a9ebab3371c626 - languageName: node - linkType: hard - -"mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-mdx-expression@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 4e1183000e183e07a7264e192889b4fd57372806103031c71b9318967f85fd50a5dd0f92ef14f42c331e77410808f5de3341d7bc8ad4ee91b7fa8f0a30043a8a - languageName: node - linkType: hard - -"mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.2 - resolution: "mdast-util-mdx-jsx@npm:3.1.2" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-remove-position: "npm:^5.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 33cb8a657702d5bb8d3f658d158f448c45147664cdb2475501a1c467e3a167d75842546296a06f758f07cce4d2a6ba1add405dbdb6caa145a6980c9782e411e2 - languageName: node - linkType: hard - -"mdast-util-mdx@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-mdx@npm:3.0.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: e2b007d826fcd49fd57ed03e190753c8b0f7d9eff6c7cb26ba609cde15cd3a472c0cd5e4a1ee3e39a40f14be22fdb57de243e093cea0c064d6f3366cff3e3af2 - languageName: node - linkType: hard - -"mdast-util-mdxjs-esm@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdxjs-esm@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 1f9dad04d31d59005332e9157ea9510dc1d03092aadbc607a10475c7eec1c158b475aa0601a3a4f74e13097ca735deb8c2d9d37928ddef25d3029fd7c9e14dc3 - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^4.0.0": - version: 4.1.0 - resolution: "mdast-util-phrasing@npm:4.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^13.0.0": - version: 13.1.0 - resolution: "mdast-util-to-hast@npm:13.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - trim-lines: "npm:^3.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 640bc897286af8fe760cd477fb04bbf544a5a897cdc2220ce36fe2f892f067b483334610387aeb969511bd78a2d841a54851079cd676ac513d6a5ff75852514e - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-to-markdown@npm:2.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - longest-streak: "npm:^3.0.0" - mdast-util-phrasing: "npm:^4.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark-util-decode-string: "npm:^2.0.0" - unist-util-visit: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 3a2cf3957e23b34e2e092e6e76ae72ee0b8745955bd811baba6814cf3a3d916c3fd52264b4b58f3bb3d512a428f84a1e998b6fc7e28434e388a9ae8fb6a9c173 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-to-string@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - checksum: 35489fb5710d58cbc2d6c8b6547df161a3f81e0f28f320dfb3548a9393555daf07c310c0c497708e67ed4dfea4a06e5655799e7d631ca91420c288b4525d6c29 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.14": - version: 2.0.14 - resolution: "mdn-data@npm:2.0.14" - checksum: 9d0128ed425a89f4cba8f787dca27ad9408b5cb1b220af2d938e2a0629d17d879a34d2cb19318bdb26c3f14c77dd5dfbae67211f5caaf07b61b1f2c5c8c7dc16 - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 - languageName: node - linkType: hard - -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" - dependencies: - fs-monkey: "npm:^1.0.4" - checksum: 18dfdeacad7c8047b976a6ccd58bc98ba76e122ad3ca0e50a21837fe2075fc0d9aafc58ab9cf2576c2b6889da1dd2503083f2364191b695273f40969db2ecc44 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a - languageName: node - linkType: hard - -"micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-destination: "npm:^2.0.0" - micromark-factory-label: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-title: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-html-tag-name: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 6a9891cc883a531e090dc8dab6669945f3df9448e84216a8f2a91f9258281e6abea5ae3940fde2bd77a57dc3e0d67f2add6762aed63a378f37b09eaf7e7426c4 - languageName: node - linkType: hard - -"micromark-extension-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-directive@npm:3.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - checksum: 8350106bdf039a544cba64cf7932261a710e07d73d43d6c645dd2b16577f30ebd04abf762e8ca74266f5de19938e1eeff6c237d79f8244dea23aef7f90df2c31 - languageName: node - linkType: hard - -"micromark-extension-frontmatter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-frontmatter@npm:2.0.0" - dependencies: - fault: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: f68032df38c00ae47de15b63bcd72515bfcce39de4a9262a3a1ac9c5990f253f8e41bdc65fd17ec4bb3d144c32529ce0829571331e4901a9a413f1a53785d1e8 - languageName: node - linkType: hard - -"micromark-extension-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: fa16d59528239262d6d04d539a052baf1f81275954ec8bfadea40d81bfc25667d5c8e68b225a5358626df5e30a3933173a67fdad2fed011d37810a10b770b0b2 - languageName: node - linkType: hard - -"micromark-extension-gfm-footnote@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-footnote@npm:2.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: a426fddecfac6144fc622b845cd2dc09d46faa75be5b76ff022cb76a03301b1d4929a5e5e41e071491787936be65e03d0b03c7aebc0e0136b3cdbfadadd6632c - languageName: node - linkType: hard - -"micromark-extension-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-strikethrough@npm:2.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 4e35fbbf364bfce08066b70acd94b9d393a8fd09a5afbe0bae70d0c8a174640b1ba86ab6b78ee38f411a813e2a718b07959216cf0063d823ba1c569a7694e5ad - languageName: node - linkType: hard - -"micromark-extension-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-table@npm:2.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 71484dcf8db7b189da0528f472cc81e4d6d1a64ae43bbe7fcb7e2e1dba758a0a4f785f9f1afb9459fe5b4a02bbe023d78c95c05204414a14083052eb8219e5eb - languageName: node - linkType: hard - -"micromark-extension-gfm-tagfilter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: cf21552f4a63592bfd6c96ae5d64a5f22bda4e77814e3f0501bfe80e7a49378ad140f827007f36044666f176b3a0d5fea7c2e8e7973ce4b4579b77789f01ae95 - languageName: node - linkType: hard - -"micromark-extension-gfm-task-list-item@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-extension-gfm-task-list-item@npm:2.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 80e569ab1a1d1f89d86af91482e9629e24b7e3f019c9d7989190f36a9367c6de723b2af48e908c1b73479f35b2215d3d38c1fdbf02ab01eb2fc90a59d1cf4465 - languageName: node - linkType: hard - -"micromark-extension-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-gfm@npm:3.0.0" - dependencies: - micromark-extension-gfm-autolink-literal: "npm:^2.0.0" - micromark-extension-gfm-footnote: "npm:^2.0.0" - micromark-extension-gfm-strikethrough: "npm:^2.0.0" - micromark-extension-gfm-table: "npm:^2.0.0" - micromark-extension-gfm-tagfilter: "npm:^2.0.0" - micromark-extension-gfm-task-list-item: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 2060fa62666a09532d6b3a272d413bc1b25bbb262f921d7402795ac021e1362c8913727e33d7528d5b4ccaf26922ec51208c43f795a702964817bc986de886c9 - languageName: node - linkType: hard - -"micromark-extension-mdx-expression@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-expression@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: abd6ba0acdebc03bc0836c51a1ec4ca28e0be86f10420dd8cfbcd6c10dd37cd3f31e7c8b9792e9276e7526748883f4a30d0803d72b6285dae47d4e5348c23a10 - languageName: node - linkType: hard - -"micromark-extension-mdx-jsx@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-jsx@npm:3.0.0" - dependencies: - "@types/acorn": "npm:^4.0.0" - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 5e2f45d381d1ce43afadc5376427b42ef8cd2a574ca3658473254eabe84db99ef1abc03055b3d86728fac7f1edfb1076e6f2f322ed8bfb1f2f14cafc2c8f0d0e - languageName: node - linkType: hard - -"micromark-extension-mdx-md@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-mdx-md@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 7daf03372fd7faddf3f0ac87bdb0debb0bb770f33b586f72251e1072b222ceee75400ab6194c0e130dbf1e077369a5b627be6e9130d7a2e9e6b849f0d18ff246 - languageName: node - linkType: hard - -"micromark-extension-mdxjs-esm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: fb33d850200afce567b95c90f2f7d42259bd33eea16154349e4fa77c3ec934f46c8e5c111acea16321dce3d9f85aaa4c49afe8b810e31b34effc11617aeee8f6 - languageName: node - linkType: hard - -"micromark-extension-mdxjs@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs@npm:3.0.0" - dependencies: - acorn: "npm:^8.0.0" - acorn-jsx: "npm:^5.0.0" - micromark-extension-mdx-expression: "npm:^3.0.0" - micromark-extension-mdx-jsx: "npm:^3.0.0" - micromark-extension-mdx-md: "npm:^2.0.0" - micromark-extension-mdxjs-esm: "npm:^3.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 7da6f0fb0e1e0270a2f5ad257e7422cc16e68efa7b8214c63c9d55bc264cb872e9ca4ac9a71b9dfd13daf52e010f730bac316086f4340e4fcc6569ec699915bf - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: d36e65ed1c072ff4148b016783148ba7c68a078991154625723e24bda3945160268fb91079fb28618e1613c2b6e70390a8ddc544c45410288aa27b413593071a - languageName: node - linkType: hard - -"micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: c021dbd0ed367610d35f2bae21209bc804d1a6d1286ffce458fd6a717f4d7fe581a7cba7d5c2d7a63757c44eb927c80d6a571d6ea7969fae1b48ab6461d109c4 - languageName: node - linkType: hard - -"micromark-factory-mdx-expression@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-mdx-expression@npm:2.0.1" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 2ba0ae939d0174a5e5331b1a4c203b96862ccf06e8903d6bdcc2d51f75515e52d407cd394afcd182f9ff0e877dc2a14e3fa430ced0131e156650d45104de8311 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-space@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 4ffdcdc2f759887bbb356500cb460b3915ecddcb5d85c3618d7df68ad05d13ed02b1153ee1845677b7d8126df8f388288b84fcf0d943bd9c92bcc71cd7222e37 - languageName: node - linkType: hard - -"micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 39e1ac23af3554e6e652e56065579bc7faf21ade7b8704b29c175871b4152b7109b790bb3cae0f7e088381139c6bac9553b8400772c3d322e4fa635f813a3578 - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 9587c2546d1a58b4d5472b42adf05463f6212d0449455285662d63cd8eaed89c6b159ac82713fcee5f9dd88628c24307d9533cccd8971a2f3f4d48702f8f850a - languageName: node - linkType: hard - -"micromark-util-character@npm:^1.0.0, micromark-util-character@npm:^1.1.0": - version: 1.2.0 - resolution: "micromark-util-character@npm:1.2.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 089e79162a19b4a28731736246579ab7e9482ac93cd681c2bfca9983dcff659212ef158a66a5957e9d4b1dba957d1b87b565d85418a5b009f0294f1f07f2aaac - languageName: node - linkType: hard - -"micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 36ee910f84077cf16626fa618cfe46ac25956b3242e3166b8e8e98c5a8c524af7e5bf3d70822264b1fd2d297a36104a7eb7e3462c19c28353eaca7b0d8717594 - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 324f95cccdae061332a8241936eaba6ef0782a1e355bac5c607ad2564fd3744929be7dc81651315a2921535747a33243e6a5606bcb64b7a56d49b6d74ea1a3d4 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 086e52904deffebb793fb1c08c94aabb8901f76958142dfc3a6282890ebaa983b285e69bd602b9d507f1b758ed38e75a994d2ad9fbbefa7de2584f67a16af405 - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" - dependencies: - micromark-util-chunked: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 107c47700343f365b4ed81551e18bc3458b573c500e56ac052b2490bd548adc475216e41d2271633a8867fac66fc22ba3e0a2d74a31ed79b9870ca947eb4e3ba - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 9512507722efd2033a9f08715eeef787fbfe27e23edf55db21423d46d82ab46f76c89b4f960be3f5e50a2d388d89658afc0647989cf256d051e9ea01277a1adb - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: a75daf32a4a6b549e9f19b4d833ebfeb09a32a9a1f9ce50f35dec6b6a3e4f9f121f49024ba7f9c91c55ebe792f7c7a332fc9604795181b6a612637df0df5b959 - languageName: node - linkType: hard - -"micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 - languageName: node - linkType: hard - -"micromark-util-events-to-acorn@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-events-to-acorn@npm:2.0.2" - dependencies: - "@types/acorn": "npm:^4.0.0" - "@types/estree": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - estree-util-visit: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: bcb3eeac52a4ae5c3ca3d8cff514de3a7d1f272d9a94cce26a08c578bef64df4d61820874c01207e92fcace9eae5c9a7ecdddef0c6e10014b255a07b7880bf94 - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: d786d4486f93eb0ac5b628779809ca97c5dc60f3c9fc03eb565809831db181cf8cb7f05f9ac76852f3eb35461af0f89fa407b46f3a03f4f97a96754d8dc540d8 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: b36da2d3fd102053dadd953ce5c558328df12a63a8ac0e5aad13d4dda8e43b6a5d4a661baafe0a1cd8a260bead4b4a8e6e0e74193dd651e8484225bd4f4e68aa - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 31fe703b85572cb3f598ebe32750e59516925c7ff1f66cfe6afaebe0771a395a9eaa770787f2523d3c46082ea80e6c14f83643303740b3d650af7c96ebd30ccc - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: ea4c28bbffcf2430e9aff2d18554296789a8b0a1f54ac24020d1dde76624a7f93e8f2a83e88cd5a846b6d2c4287b71b1142d1b89fa7f1b0363a9b33711a141fe - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 5d338883ad8889c63f9b262b9cae0c02a42088201981d820ae7af7aa6d38fab6585b89fd4cf2206a46a7c4002e41ee6c70e1a3e0ceb3ad8b7adcffaf166b1511 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^1.0.0, micromark-util-symbol@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-util-symbol@npm:1.1.0" - checksum: 02414a753b79f67ff3276b517eeac87913aea6c028f3e668a19ea0fc09d98aea9f93d6222a76ca783d20299af9e4b8e7c797fe516b766185dcc6e93290f11f88 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: fa4a05bff575d9fbf0ad96a1013003e3bb6087ed6b34b609a141b6c0d2137b57df594aca409a95f4c5fda199f227b56a7d8b1f82cea0768df161d8a3a3660764 - languageName: node - linkType: hard - -"micromark-util-types@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-types@npm:1.1.0" - checksum: b0ef2b4b9589f15aec2666690477a6a185536927ceb7aa55a0f46475852e012d75a1ab945187e5c7841969a842892164b15d58ff8316b8e0d6cc920cabd5ede7 - languageName: node - linkType: hard - -"micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 819fef3ab5770c37893d2a60381fb2694396c8d22803b6e103c830c3a1bc1490363c2b0470bb2acaaddad776dfbc2fc1fcfde39cb63c4f54d95121611672e3d0 - languageName: node - linkType: hard - -"micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: b84ab5ab1a0b28c063c52e9c2c9d7d44b954507235c10c9492d66e0b38f7de24bf298f914a1fbdf109f2a57a88cf0412de217c84cfac5fd60e3e42a74dbac085 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: "npm:^3.0.2" - picomatch: "npm:^2.3.1" - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-db@npm:~1.33.0": - version: 1.33.0 - resolution: "mime-db@npm:1.33.0" - checksum: 281a0772187c9b8f6096976cb193ac639c6007ac85acdbb8dc1617ed7b0f4777fa001d1b4f1b634532815e60717c84b2f280201d55677fb850c9d45015b50084 - languageName: node - linkType: hard - -"mime-types@npm:2.1.18, mime-types@npm:~2.1.17": - version: 2.1.18 - resolution: "mime-types@npm:2.1.18" - dependencies: - mime-db: "npm:~1.33.0" - checksum: 729265eff1e5a0e87cb7f869da742a610679585167d2f2ec997a7387fc6aedf8e5cad078e99b0164a927bdf3ace34fca27430d6487456ad090cba5594441ba43 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 - languageName: node - linkType: hard - -"mimic-response@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-response@npm:4.0.0" - checksum: 33b804cc961efe206efdb1fca6a22540decdcfce6c14eb5c0c50e5ae9022267ab22ce8f5568b1f7247ba67500fe20d523d81e0e9f009b321ccd9d472e78d1850 - languageName: node - linkType: hard - -"mini-css-extract-plugin@npm:^2.7.6": - version: 2.9.0 - resolution: "mini-css-extract-plugin@npm:2.9.0" - dependencies: - schema-utils: "npm:^4.0.0" - tapable: "npm:^2.2.1" - peerDependencies: - webpack: ^5.0.0 - checksum: ae192c67ba85ac8bffeab66774635bf90181f00d5dd6cf95412426192599ddf5506fb4b1550acbd7a5476476e39db53c770dd40f8378f7baf5de96e3fec4e6e9 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: f6fe11ec667c3d96f1ce5fd41184ed491d5f0a5f4045e82446a471ccda5f84c7f7610dff61d378b73d964f73a320bd7f89788f9e6b9403e32cc4be28ba99f569 - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"multicast-dns@npm:^7.2.5": - version: 7.2.5 - resolution: "multicast-dns@npm:7.2.5" - dependencies: - dns-packet: "npm:^5.2.2" - thunky: "npm:^1.0.2" - bin: - multicast-dns: cli.js - checksum: 00b8a57df152d4cd0297946320a94b7c3cdf75a46a2247f32f958a8927dea42958177f9b7fdae69fab2e4e033fb3416881af1f5e9055a3e1542888767139e2fb - languageName: node - linkType: hard - -"my-website@workspace:.": - version: 0.0.0-use.local - resolution: "my-website@workspace:." - dependencies: - "@docusaurus/core": 3.2.1 - "@docusaurus/module-type-aliases": 3.2.1 - "@docusaurus/preset-classic": 3.2.1 - "@docusaurus/tsconfig": 3.2.1 - "@docusaurus/types": 3.2.1 - "@mdx-js/react": ^3.0.0 - clsx: ^2.0.0 - prism-react-renderer: ^2.3.1 - prismjs: ^1.29.0 - react: ^18.0.0 - react-dom: ^18.0.0 - typescript: ~5.2.2 - languageName: unknown - linkType: soft - -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"no-case@npm:^3.0.4": - version: 3.0.4 - resolution: "no-case@npm:3.0.4" - dependencies: - lower-case: "npm:^2.0.2" - tslib: "npm:^2.0.3" - checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c - languageName: node - linkType: hard - -"node-emoji@npm:^2.1.0": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" - dependencies: - "@sindresorhus/is": "npm:^4.6.0" - char-regex: "npm:^1.0.2" - emojilib: "npm:^2.4.0" - skin-tone: "npm:^2.0.0" - checksum: 9ae5a1fb12fd5ce6885f251f345986115de4bb82e7d06fdc943845fb19260d89d0aaaccbaf85cae39fe7aaa1fc391640558865ba690c9bb8a7236c3ac10bbab0 - languageName: node - linkType: hard - -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" - semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 - languageName: node - linkType: hard - -"normalize-url@npm:^8.0.0": - version: 8.0.1 - resolution: "normalize-url@npm:8.0.1" - checksum: 43ea9ef0d6d135dd1556ab67aa4b74820f0d9d15aa504b59fa35647c729f1147dfce48d3ad504998fd1010f089cfb82c86c6d9126eb5c5bd2e9bd25f3a97749b - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"nprogress@npm:^0.2.0": - version: 0.2.0 - resolution: "nprogress@npm:0.2.0" - checksum: 66b7bec5d563ecf2d1c3d2815e6d5eb74ed815eee8563e0afa63d3f185ab1b9cf2ddd97e1ded263b9995c5019d26d600320e849e50f3747984daa033744619dc - languageName: node - linkType: hard - -"nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 - languageName: node - linkType: hard - -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.1.0": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 - languageName: node - linkType: hard - -"obuf@npm:^1.0.0, obuf@npm:^1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 41a2ba310e7b6f6c3b905af82c275bf8854896e2e4c5752966d64cbcd2f599cfffd5932006bcf3b8b419dfdacebb3a3912d5d94e10f1d0acab59876c8757f27f - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"open@npm:^8.0.9, open@npm:^8.4.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26 - languageName: node - linkType: hard - -"opener@npm:^1.5.2": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc - languageName: node - linkType: hard - -"p-cancelable@npm:^3.0.0": - version: 3.0.0 - resolution: "p-cancelable@npm:3.0.0" - checksum: 2b5ae34218f9c2cf7a7c18e5d9a726ef9b165ef07e6c959f6738371509e747334b5f78f3bcdeb03d8a12dcb978faf641fd87eb21486ed7d36fb823b8ddef3219 - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b - languageName: node - linkType: hard - -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: "npm:^4.0.0" - checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"package-json@npm:^8.1.0": - version: 8.1.1 - resolution: "package-json@npm:8.1.1" - dependencies: - got: "npm:^12.1.0" - registry-auth-token: "npm:^5.0.1" - registry-url: "npm:^6.0.0" - semver: "npm:^7.3.7" - checksum: 28bec6f42bf9fba66b7c8fea07576fc23d08ec7923433f7835d6cd8654e72169d74f9738b3785107d18a476ae76712e0daeb1dddcd6930e69f9e4b47eba7c0ca - languageName: node - linkType: hard - -"param-case@npm:^3.0.4": - version: 3.0.4 - resolution: "param-case@npm:3.0.4" - dependencies: - dot-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-entities@npm:^4.0.0": - version: 4.0.1 - resolution: "parse-entities@npm:4.0.1" - dependencies: - "@types/unist": "npm:^2.0.0" - character-entities: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - character-reference-invalid: "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - is-hexadecimal: "npm:^2.0.0" - checksum: 32a6ff5b9acb9d2c4d71537308521fd265e685b9215691df73feedd9edfe041bb6da9f89bd0c35c4a2bc7d58e3e76e399bb6078c2fd7d2a343ff1dd46edbf1bd - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"parse-numeric-range@npm:^1.3.0": - version: 1.3.0 - resolution: "parse-numeric-range@npm:1.3.0" - checksum: 289ca126d5b8ace7325b199218de198014f58ea6895ccc88a5247491d07f0143bf047f80b4a31784f1ca8911762278d7d6ecb90a31dfae31da91cc1a2524c8ce - languageName: node - linkType: hard - -"parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" - dependencies: - domhandler: "npm:^5.0.2" - parse5: "npm:^7.0.0" - checksum: fc5d01e07733142a1baf81de5c2a9c41426c04b7ab29dd218acb80cd34a63177c90aff4a4aee66cf9f1d0aeecff1389adb7452ad6f8af0a5888e3e9ad6ef733d - languageName: node - linkType: hard - -"parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - -"pascal-case@npm:^3.1.2": - version: 3.1.2 - resolution: "pascal-case@npm:3.1.2" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-is-inside@npm:1.0.2": - version: 1.0.2 - resolution: "path-is-inside@npm:1.0.2" - checksum: 0b5b6c92d3018b82afb1f74fe6de6338c4c654de4a96123cb343f2b747d5606590ac0c890f956ed38220a4ab59baddfd7b713d78a62d240b20b14ab801fa02cb - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce - languageName: node - linkType: hard - -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: b921a74e7576e25b06ad1635abf7e8125a29220d2efc2b71d74b9591f24a27e6f09078fa9a1b27516a097ea0637b7cab79d19b83d7f36a8ef3ef5422770e89d9 - languageName: node - linkType: hard - -"path-to-regexp@npm:^1.7.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" - dependencies: - isarray: "npm:0.0.1" - checksum: 709f6f083c0552514ef4780cb2e7e4cf49b0cc89a97439f2b7cc69a608982b7690fb5d1720a7473a59806508fc2dae0be751ba49f495ecf89fd8fbc62abccbcd - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"periscopic@npm:^3.0.0": - version: 3.1.0 - resolution: "periscopic@npm:3.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^3.0.0" - is-reference: "npm:^3.0.0" - checksum: 2153244352e58a0d76e7e8d9263e66fe74509495f809af388da20045fb30aa3e93f2f94468dc0b9166ecf206fcfc0d73d2c7641c6fbedc07b1de858b710142cb - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pkg-dir@npm:^7.0.0": - version: 7.0.0 - resolution: "pkg-dir@npm:7.0.0" - dependencies: - find-up: "npm:^6.3.0" - checksum: 94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03 - languageName: node - linkType: hard - -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 5bac346b7c7c903613c057ae3ab722f320716199d753f4a7d053d38f2b5955460f3e6ab73b4762c62fd3e947f58e04f1343e92089e7bb6091c90877406fcd8c8 - languageName: node - linkType: hard - -"postcss-calc@npm:^8.2.3": - version: 8.2.4 - resolution: "postcss-calc@npm:8.2.4" - dependencies: - postcss-selector-parser: "npm:^6.0.9" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.2 - checksum: 314b4cebb0c4ed0cf8356b4bce71eca78f5a7842e6a3942a3bba49db168d5296b2bd93c3f735ae1c616f2651d94719ade33becc03c73d2d79c7394fb7f73eabb - languageName: node - linkType: hard - -"postcss-colormin@npm:^5.3.1": - version: 5.3.1 - resolution: "postcss-colormin@npm:5.3.1" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - colord: "npm:^2.9.1" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: e5778baab30877cd1f51e7dc9d2242a162aeca6360a52956acd7f668c5bc235c2ccb7e4df0370a804d65ebe00c5642366f061db53aa823f9ed99972cebd16024 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-convert-values@npm:5.1.3" - dependencies: - browserslist: "npm:^4.21.4" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: df48cdaffabf9737f9cfdc58a3dc2841cf282506a7a944f6c70236cff295d3a69f63de6e0935eeb8a9d3f504324e5b4e240abc29e21df9e35a02585d3060aeb5 - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-discard-comments@npm:5.1.2" - peerDependencies: - postcss: ^8.2.15 - checksum: abfd064ebc27aeaf5037643dd51ffaff74d1fa4db56b0523d073ace4248cbb64ffd9787bd6924b0983a9d0bd0e9bf9f10d73b120e50391dc236e0d26c812fa2a - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-duplicates@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 88d6964201b1f4ed6bf7a32cefe68e86258bb6e42316ca01d9b32bdb18e7887d02594f89f4a2711d01b51ea6e3fcca8c54be18a59770fe5f4521c61d3eb6ca35 - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-discard-empty@npm:5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 970adb12fae5c214c0768236ad9a821552626e77dedbf24a8213d19cc2c4a531a757cd3b8cdd3fc22fb1742471b8692a1db5efe436a71236dec12b1318ee8ff4 - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-overridden@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: d64d4a545aa2c81b22542895cfcddc787d24119f294d35d29b0599a1c818b3cc51f4ee80b80f5a0a09db282453dd5ac49f104c2117cc09112d0ac9b40b499a41 - languageName: node - linkType: hard - -"postcss-discard-unused@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-unused@npm:5.1.0" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 5c09403a342a065033f5f22cefe6b402c76c2dc0aac31a736a2062d82c2a09f0ff2525b3df3a0c6f4e0ffc7a0392efd44bfe7f9d018e4cae30d15b818b216622 - languageName: node - linkType: hard - -"postcss-loader@npm:^7.3.3": - version: 7.3.4 - resolution: "postcss-loader@npm:7.3.4" - dependencies: - cosmiconfig: "npm:^8.3.5" - jiti: "npm:^1.20.0" - semver: "npm:^7.5.4" - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: f109eb266580eb296441a1ae057f93629b9b79ad962bdd3fc134417180431606a5419b6f5848c31e6d92c818e71fe96e4335a85cc5332c2f7b14e2869951e5b3 - languageName: node - linkType: hard - -"postcss-merge-idents@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-merge-idents@npm:5.1.1" - dependencies: - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: ed8a673617ea6ae3e15d69558063cb1a5eeee01732f78cdc0196ab910324abc30828724ab8dfc4cda27e8c0077542e25688470f829819a2604625a673387ec72 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^5.1.7": - version: 5.1.7 - resolution: "postcss-merge-longhand@npm:5.1.7" - dependencies: - postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 81c3fc809f001b9b71a940148e242bdd6e2d77713d1bfffa15eb25c1f06f6648d5e57cb21645746d020a2a55ff31e1740d2b27900442913a9d53d8a01fb37e1b - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-merge-rules@npm:5.1.4" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^3.1.0" - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 8ab6a569babe6cb412d6612adee74f053cea7edb91fa013398515ab36754b1fec830d68782ed8cdfb44cffdc6b78c79eab157bff650f428aa4460d3f3857447e - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-minify-font-values@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 35e858fa41efa05acdeb28f1c76579c409fdc7eabb1744c3bd76e895bb9fea341a016746362a67609688ab2471f587202b9a3e14ea28ad677754d663a2777ece - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-minify-gradients@npm:5.1.1" - dependencies: - colord: "npm:^2.9.1" - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 27354072a07c5e6dab36731103b94ca2354d4ed3c5bc6aacfdf2ede5a55fa324679d8fee5450800bc50888dbb5e9ed67569c0012040c2be128143d0cebb36d67 - languageName: node - linkType: hard - -"postcss-minify-params@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-minify-params@npm:5.1.4" - dependencies: - browserslist: "npm:^4.21.4" - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: bd63e2cc89edcf357bb5c2a16035f6d02ef676b8cede4213b2bddd42626b3d428403849188f95576fc9f03e43ebd73a29bf61d33a581be9a510b13b7f7f100d5 - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^5.2.1": - version: 5.2.1 - resolution: "postcss-minify-selectors@npm:5.2.1" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 6fdbc84f99a60d56b43df8930707da397775e4c36062a106aea2fd2ac81b5e24e584a1892f4baa4469fa495cb87d1422560eaa8f6c9d500f9f0b691a5f95bab5 - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^3.1.0": - version: 3.1.0 - resolution: "postcss-modules-extract-imports@npm:3.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: b9192e0f4fb3d19431558be6f8af7ca45fc92baaad9b2778d1732a5880cd25c3df2074ce5484ae491e224f0d21345ffc2d419bd51c25b019af76d7a7af88c17f - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" - dependencies: - icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" - postcss-value-parser: "npm:^4.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: ca9b01f4a0a3dfb33e016299e2dfb7e85c3123292f7aec2efc0c6771b9955648598bfb4c1561f7ee9732fb27fb073681233661b32eef98baab43743f96735452 - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" - dependencies: - postcss-selector-parser: "npm:^6.0.4" - peerDependencies: - postcss: ^8.1.0 - checksum: 2ffe7e98c1fa993192a39c8dd8ade93fc4f59fbd1336ce34fcedaee0ee3bafb29e2e23fb49189256895b30e4f21af661c6a6a16ef7b17ae2c859301e4a4459ae - languageName: node - linkType: hard - -"postcss-modules-values@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-values@npm:4.0.0" - dependencies: - icss-utils: "npm:^5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-charset@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: e79d92971fc05b8b3c9b72f3535a574e077d13c69bef68156a0965f397fdf157de670da72b797f57b0e3bac8f38155b5dd1735ecab143b9cc4032d72138193b4 - languageName: node - linkType: hard - -"postcss-normalize-display-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-display-values@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: b6eb7b9b02c3bdd62bbc54e01e2b59733d73a1c156905d238e178762962efe0c6f5104544da39f32cade8a4fb40f10ff54b63a8ebfbdff51e8780afb9fbdcf86 - languageName: node - linkType: hard - -"postcss-normalize-positions@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-positions@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: d9afc233729c496463c7b1cdd06732469f401deb387484c3a2422125b46ec10b4af794c101f8c023af56f01970b72b535e88373b9058ecccbbf88db81662b3c4 - languageName: node - linkType: hard - -"postcss-normalize-repeat-style@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-repeat-style@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 2c6ad2b0ae10a1fda156b948c34f78c8f1e185513593de4d7e2480973586675520edfec427645fa168c337b0a6b3ceca26f92b96149741ca98a9806dad30d534 - languageName: node - linkType: hard - -"postcss-normalize-string@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-string@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 6e549c6e5b2831e34c7bdd46d8419e2278f6af1d5eef6d26884a37c162844e60339340c57e5e06058cdbe32f27fc6258eef233e811ed2f71168ef2229c236ada - languageName: node - linkType: hard - -"postcss-normalize-timing-functions@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-timing-functions@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: da550f50e90b0b23e17b67449a7d1efd1aa68288e66d4aa7614ca6f5cc012896be1972b7168eee673d27da36504faccf7b9f835c0f7e81243f966a42c8c030aa - languageName: node - linkType: hard - -"postcss-normalize-unicode@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-unicode@npm:5.1.1" - dependencies: - browserslist: "npm:^4.21.4" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 4c24d26cc9f4b19a9397db4e71dd600dab690f1de8e14a3809e2aa1452dbc3791c208c38a6316bbc142f29e934fdf02858e68c94038c06174d78a4937e0f273c - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-url@npm:5.1.0" - dependencies: - normalize-url: "npm:^6.0.1" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 3bd4b3246d6600230bc827d1760b24cb3101827ec97570e3016cbe04dc0dd28f4dbe763245d1b9d476e182c843008fbea80823061f1d2219b96f0d5c724a24c0 - languageName: node - linkType: hard - -"postcss-normalize-whitespace@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-whitespace@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 12d8fb6d1c1cba208cc08c1830959b7d7ad447c3f5581873f7e185f99a9a4230c43d3af21ca12c818e4690a5085a95b01635b762ad4a7bef69d642609b4c0e19 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-ordered-values@npm:5.1.3" - dependencies: - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 6f3ca85b6ceffc68aadaf319d9ee4c5ac16d93195bf8cba2d1559b631555ad61941461cda6d3909faab86e52389846b2b36345cff8f0c3f4eb345b1b8efadcf9 - languageName: node - linkType: hard - -"postcss-reduce-idents@npm:^5.2.0": - version: 5.2.0 - resolution: "postcss-reduce-idents@npm:5.2.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: f0d644c86e160dd36ee4dd924ab7d6feacac867c87702e2f98f96b409430a62de4fec2dfc3c8731bda4e14196e29a752b4558942f0af2a3e6cd7f1f4b173db8e - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-reduce-initial@npm:5.1.2" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 55db697f85231a81f1969d54c894e4773912d9ddb914f9b03d2e73abc4030f2e3bef4d7465756d0c1acfcc2c2d69974bfb50a972ab27546a7d68b5a4fc90282b - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-reduce-transforms@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 0c6af2cba20e3ff63eb9ad045e634ddfb9c3e5c0e614c020db2a02f3aa20632318c4ede9e0c995f9225d9a101e673de91c0a6e10bb2fa5da6d6c75d15a55882f - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": - version: 6.0.16 - resolution: "postcss-selector-parser@npm:6.0.16" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: e1cd68e33a39e3dc1e1e5bd8717be5bbe3cc23a4cecb466c3acb2f3a77daad7a47df4d6137a76f8db74cf160d2fb16b2cfdb4ccbebdfda844690f8d545fe281d - languageName: node - linkType: hard - -"postcss-sort-media-queries@npm:^4.4.1": - version: 4.4.1 - resolution: "postcss-sort-media-queries@npm:4.4.1" - dependencies: - sort-css-media-queries: "npm:2.1.0" - peerDependencies: - postcss: ^8.4.16 - checksum: 70b42e479bb1d15d8628678eefefd547d309e33e64262fe437630fe62d8e4b3adcae7f2b48ef8da9d3173576d4af109a9ffa9514573db1281deef324f5ea166f - languageName: node - linkType: hard - -"postcss-svgo@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-svgo@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - svgo: "npm:^2.7.0" - peerDependencies: - postcss: ^8.2.15 - checksum: d86eb5213d9f700cf5efe3073799b485fb7cacae0c731db3d7749c9c2b1c9bc85e95e0baeca439d699ff32ea24815fc916c4071b08f67ed8219df229ce1129bd - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-unique-selectors@npm:5.1.1" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 637e7b786e8558265775c30400c54b6b3b24d4748923f4a39f16a65fd0e394f564ccc9f0a1d3c0e770618a7637a7502ea1d0d79f731d429cb202255253c23278 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f - languageName: node - linkType: hard - -"postcss-zindex@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-zindex@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 8581e0ee552622489dcb9fb9609a3ccc261a67a229ba91a70bd138fe102a2d04cedb14642b82b673d4cac7b559ef32574f2dafde2ff7816eecac024d231c5ead - languageName: node - linkType: hard - -"postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.26, postcss@npm:^8.4.33": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" - dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 649f9e60a763ca4b5a7bbec446a069edf07f057f6d780a5a0070576b841538d1ecf7dd888f2fbfd1f76200e26c969e405aeeae66332e6927dbdc8bdcb90b9451 - languageName: node - linkType: hard - -"pretty-error@npm:^4.0.0": - version: 4.0.0 - resolution: "pretty-error@npm:4.0.0" - dependencies: - lodash: "npm:^4.17.20" - renderkid: "npm:^3.0.0" - checksum: a5b9137365690104ded6947dca2e33360bf55e62a4acd91b1b0d7baa3970e43754c628cc9e16eafbdd4e8f8bcb260a5865475d4fc17c3106ff2d61db4e72cdf3 - languageName: node - linkType: hard - -"pretty-time@npm:^1.1.0": - version: 1.1.0 - resolution: "pretty-time@npm:1.1.0" - checksum: a319e7009aadbc6cfedbd8b66861327d3a0c68bd3e8794bf5b86f62b40b01b9479c5a70c76bb368ad454acce52a1216daee460cc825766e2442c04f3a84a02c9 - languageName: node - linkType: hard - -"prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.3.1": - version: 2.3.1 - resolution: "prism-react-renderer@npm:2.3.1" - dependencies: - "@types/prismjs": "npm:^1.26.0" - clsx: "npm:^2.0.0" - peerDependencies: - react: ">=16.0.0" - checksum: b12a7d502c1e764d94f7d3c84aee9cd6fccc676bb7e21dee94d37eb2e7e62e097a343999e1979887cb83a57cbdea48d2046aa74d07bce05caa25f4c296df30b6 - languageName: node - linkType: hard - -"prismjs@npm:^1.29.0": - version: 1.29.0 - resolution: "prismjs@npm:1.29.0" - checksum: 007a8869d4456ff8049dc59404e32d5666a07d99c3b0e30a18bd3b7676dfa07d1daae9d0f407f20983865fd8da56de91d09cb08e6aa61f5bc420a27c0beeaf93 - languageName: node - linkType: hard - -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 - languageName: node - linkType: hard - -"proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"prompts@npm:^2.4.2": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d - languageName: node - linkType: hard - -"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: "npm:^1.4.0" - object-assign: "npm:^4.1.1" - react-is: "npm:^16.13.1" - checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 - languageName: node - linkType: hard - -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 - languageName: node - linkType: hard - -"proto-list@npm:~1.2.1": - version: 1.2.4 - resolution: "proto-list@npm:1.2.4" - checksum: 4d4826e1713cbfa0f15124ab0ae494c91b597a3c458670c9714c36e8baddf5a6aad22842776f2f5b137f259c8533e741771445eb8df82e861eea37a6eaba03f7 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 - languageName: node - linkType: hard - -"pupa@npm:^3.1.0": - version: 3.1.0 - resolution: "pupa@npm:3.1.0" - dependencies: - escape-goat: "npm:^4.0.0" - checksum: 0e4f4ab6bbdce600fa6d23b1833f1af57b2641246ff4cbe10f9d66e4e5479b0de2864a88d5bd629eef59524eda3c6680726acd7f3f873d9ed46b7f095d0bb5f6 - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: "npm:~2.0.3" - checksum: ebc23639248e4fe40a789f713c20548e513e053b3dc4924b6cb0ad741e3f264dcff948225c8737834dd4f9ec286dbc06a1a7c13858ea382d9379f4303bcc0916 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"range-parser@npm:1.2.0": - version: 1.2.0 - resolution: "range-parser@npm:1.2.0" - checksum: bdf397f43fedc15c559d3be69c01dedf38444ca7a1610f5bf5955e3f3da6057a892f34691e7ebdd8c7e1698ce18ef6c4d4811f70e658dda3ff230ef741f8423a - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 - languageName: node - linkType: hard - -"rc@npm:1.2.8": - version: 1.2.8 - resolution: "rc@npm:1.2.8" - dependencies: - deep-extend: "npm:^0.6.0" - ini: "npm:~1.3.0" - minimist: "npm:^1.2.0" - strip-json-comments: "npm:~2.0.1" - bin: - rc: ./cli.js - checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e - languageName: node - linkType: hard - -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 2c6917e47f03d9595044770b0f883a61c6b660fcaa97b8ba459a1d57c9cca9aa374cd51296b22d461ff5e432105dbe6f04732dab128e52729c79239e1c23ab56 - languageName: node - linkType: hard - -"react-dom@npm:^18.0.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" - dependencies: - loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" - peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc - languageName: node - linkType: hard - -"react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: ce7b44c38fadba9cedd7c095cf39192e632daeccf1d0747292ed524f17dcb056d16bc197ddee5723f9dd888f0b9b19c3b486c430319e30504289b9296f2d2c42 - languageName: node - linkType: hard - -"react-fast-compare@npm:^3.2.0": - version: 3.2.2 - resolution: "react-fast-compare@npm:3.2.2" - checksum: 2071415b4f76a3e6b55c84611c4d24dcb12ffc85811a2840b5a3f1ff2d1a99be1020d9437ee7c6e024c9f4cbb84ceb35e48cf84f28fcb00265ad2dfdd3947704 - languageName: node - linkType: hard - -"react-helmet-async@npm:*, react-helmet-async@npm:^1.3.0": - version: 1.3.0 - resolution: "react-helmet-async@npm:1.3.0" - dependencies: - "@babel/runtime": "npm:^7.12.5" - invariant: "npm:^2.2.4" - prop-types: "npm:^15.7.2" - react-fast-compare: "npm:^3.2.0" - shallowequal: "npm:^1.1.0" - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 7ca7e47f8af14ea186688b512a87ab912bf6041312b297f92516341b140b3f0f8aedf5a44d226d99e69ed067b0cc106e38aeb9c9b738ffcc63d10721c844db90 - languageName: node - linkType: hard - -"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f - languageName: node - linkType: hard - -"react-json-view-lite@npm:^1.2.0": - version: 1.3.0 - resolution: "react-json-view-lite@npm:1.3.0" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 612d129c9a0b3429e540226b43d9c6113638a1814fd39a12dbdc0e1e6a13cf0d018193d8c21dbf8f3d1ca747667b0a0e5d37ab3532c63571e113cf571b589b6a - languageName: node - linkType: hard - -"react-loadable-ssr-addon-v5-slorber@npm:^1.0.1": - version: 1.0.1 - resolution: "react-loadable-ssr-addon-v5-slorber@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.10.3" - peerDependencies: - react-loadable: "*" - webpack: ">=4.41.1 || 5.x" - checksum: 1cf7ceb488d329a5be15f891dae16727fb7ade08ef57826addd21e2c3d485e2440259ef8be94f4d54e9afb4bcbd2fcc22c3c5bad92160c9c06ae6ba7b5562497 - languageName: node - linkType: hard - -"react-router-config@npm:^5.1.1": - version: 5.1.1 - resolution: "react-router-config@npm:5.1.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - peerDependencies: - react: ">=15" - react-router: ">=5" - checksum: bde7ee79444454bf7c3737fd9c5c268021012c8cc37bc19116b2e7daa28c4231598c275816c7f32c16f9f974dc707b91de279291a5e39efce2e1b1569355b87a - languageName: node - linkType: hard - -"react-router-dom@npm:^5.3.4": - version: 5.3.4 - resolution: "react-router-dom@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - loose-envify: "npm:^1.3.1" - prop-types: "npm:^15.6.2" - react-router: "npm:5.3.4" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: b86a6f2f5222f041e38adf4e4b32c7643d6735a1a915ef25855b2db285fd059d72ba8d62e5bcd5d822b8ef9520a80453209e55077f5a90d0f72e908979b8f535 - languageName: node - linkType: hard - -"react-router@npm:5.3.4, react-router@npm:^5.3.4": - version: 5.3.4 - resolution: "react-router@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - hoist-non-react-statics: "npm:^3.1.0" - loose-envify: "npm:^1.3.1" - path-to-regexp: "npm:^1.7.0" - prop-types: "npm:^15.6.2" - react-is: "npm:^16.6.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: 892d4e274a23bf4f39abc2efca54472fb646d3aed4b584020cf49654d2f50d09a2bacebe7c92b4ec7cb8925077376dfcd0664bad6442a73604397cefec9f01f9 - languageName: node - linkType: hard - -"react@npm:^18.0.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.1": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - -"readable-stream@npm:^3.0.6": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"reading-time@npm:^1.5.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: e27bc5a70ba0f4ac337896b18531b914d38f4bee67cbad48029d0c11dd0a7a847b2a6bba895ab7ce2ad3e7ecb86912bdc477d8fa2d48405a3deda964be54d09b - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: "npm:^1.1.6" - checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 - languageName: node - linkType: hard - -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" - dependencies: - regenerate: "npm:^1.4.2" - checksum: b80958ef40f125275824c2c47d5081dfaefebd80bff26c76761e9236767c748a4a95a69c053fe29d2df881177f2ca85df4a71fe70a82360388b31159ef19adcf - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 3317a09b2f802da8db09aa276e469b57a6c0dd818347e05b8862959c6193408242f150db5de83c12c3fa99091ad95fb42a6db2c3329bfaa12a0ea4cbbeb30cb0 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 - languageName: node - linkType: hard - -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" - dependencies: - "@babel/regjsgen": "npm:^0.8.0" - regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" - unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 95bb97088419f5396e07769b7de96f995f58137ad75fac5811fb5fe53737766dfff35d66a0ee66babb1eb55386ef981feaef392f9df6d671f3c124812ba24da2 - languageName: node - linkType: hard - -"registry-auth-token@npm:^5.0.1": - version: 5.0.2 - resolution: "registry-auth-token@npm:5.0.2" - dependencies: - "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 0d7683b71ee418993e7872b389024b13645c4295eb7bb850d10728eaf46065db24ea4d47dc6cbb71a60d1aa4bef077b0d8b7363c9ac9d355fdba47bebdfb01dd - languageName: node - linkType: hard - -"registry-url@npm:^6.0.0": - version: 6.0.1 - resolution: "registry-url@npm:6.0.1" - dependencies: - rc: "npm:1.2.8" - checksum: 33712aa1b489aab7aba2191c1cdadfdd71f5bf166d4792d81744a6be332c160bd7d9273af8269d8a01284b9562f14a5b31b7abcf7ad9306c44887ecff51c89ab - languageName: node - linkType: hard - -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" - dependencies: - jsesc: "npm:~0.5.0" - bin: - regjsparser: bin/parser - checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc - languageName: node - linkType: hard - -"rehype-raw@npm:^7.0.0": - version: 7.0.0 - resolution: "rehype-raw@npm:7.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-raw: "npm:^9.0.0" - vfile: "npm:^6.0.0" - checksum: f9e28dcbf4c6c7d91a97c10a840310f18ef3268aa45abb3e0428b6b191ff3c4fa8f753b910d768588a2dac5c7da7e557b4ddc3f1b6cd252e8d20cb62d60c65ed - languageName: node - linkType: hard - -"relateurl@npm:^0.2.7": - version: 0.2.7 - resolution: "relateurl@npm:0.2.7" - checksum: 5891e792eae1dfc3da91c6fda76d6c3de0333a60aa5ad848982ebb6dccaa06e86385fb1235a1582c680a3d445d31be01c6bfc0804ebbcab5aaf53fa856fde6b6 - languageName: node - linkType: hard - -"remark-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "remark-directive@npm:3.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-directive: "npm:^3.0.0" - micromark-extension-directive: "npm:^3.0.0" - unified: "npm:^11.0.0" - checksum: 744d12bbe924bd0492a2481cbaf9250aa6622c0d2cc090bb7bc39975e355c8a46ae13cc4793204ada39f0af64c953f6b730a55420a50375e0f74a5dd5d201089 - languageName: node - linkType: hard - -"remark-emoji@npm:^4.0.0": - version: 4.0.1 - resolution: "remark-emoji@npm:4.0.1" - dependencies: - "@types/mdast": "npm:^4.0.2" - emoticon: "npm:^4.0.1" - mdast-util-find-and-replace: "npm:^3.0.1" - node-emoji: "npm:^2.1.0" - unified: "npm:^11.0.4" - checksum: 2c02d8c0b694535a9f0c4fe39180cb89a8fbd07eb873c94842c34dfde566b8a6703df9d28fe175a8c28584f96252121de722862baa756f2d875f2f1a4352c1f4 - languageName: node - linkType: hard - -"remark-frontmatter@npm:^5.0.0": - version: 5.0.0 - resolution: "remark-frontmatter@npm:5.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-frontmatter: "npm:^2.0.0" - micromark-extension-frontmatter: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: b36e11d528d1d0172489c74ce7961bb6073f7272e71ea1349f765fc79c4246a758aef949174d371a088c48e458af776fcfbb3b043c49cd1120ca8239aeafe16a - languageName: node - linkType: hard - -"remark-gfm@npm:^4.0.0": - version: 4.0.0 - resolution: "remark-gfm@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-gfm: "npm:^3.0.0" - micromark-extension-gfm: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-stringify: "npm:^11.0.0" - unified: "npm:^11.0.0" - checksum: 84bea84e388061fbbb697b4b666089f5c328aa04d19dc544c229b607446bc10902e46b67b9594415a1017bbbd7c811c1f0c30d36682c6d1a6718b66a1558261b - languageName: node - linkType: hard - -"remark-mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "remark-mdx@npm:3.0.1" - dependencies: - mdast-util-mdx: "npm:^3.0.0" - micromark-extension-mdxjs: "npm:^3.0.0" - checksum: e7fcffbe1ccb0c7dfcb01c6d9dbc48df9c668c8321745455db7346f4860c43dbcb98e36e3398a5117d773426ab5ef656a95c78a21208c59e92571f021b8e678e - languageName: node - linkType: hard - -"remark-parse@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-parse@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: d83d245290fa84bb04fb3e78111f09c74f7417e7c012a64dd8dc04fccc3699036d828fbd8eeec8944f774b6c30cc1d925c98f8c46495ebcee7c595496342ab7f - languageName: node - linkType: hard - -"remark-rehype@npm:^11.0.0": - version: 11.1.0 - resolution: "remark-rehype@npm:11.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - mdast-util-to-hast: "npm:^13.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: f0c731f0ab92a122e7f9c9bcbd10d6a31fdb99f0ea3595d232ddd9f9d11a308c4ec0aff4d56e1d0d256042dfad7df23b9941e50b5038da29786959a5926814e1 - languageName: node - linkType: hard - -"remark-stringify@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-stringify@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 59e07460eb629d6c3b3c0f438b0b236e7e6858fd5ab770303078f5a556ec00354d9c7fb9ef6d5f745a4617ac7da1ab618b170fbb4dac120e183fecd9cc86bce6 - languageName: node - linkType: hard - -"renderkid@npm:^3.0.0": - version: 3.0.0 - resolution: "renderkid@npm:3.0.0" - dependencies: - css-select: "npm:^4.1.3" - dom-converter: "npm:^0.2.0" - htmlparser2: "npm:^6.1.0" - lodash: "npm:^4.17.21" - strip-ansi: "npm:^6.0.1" - checksum: 77162b62d6f33ab81f337c39efce0439ff0d1f6d441e29c35183151f83041c7850774fb904da163d6c844264d440d10557714e6daa0b19e4561a5cd4ef305d41 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.2.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-pathname@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-pathname@npm:3.0.0" - checksum: 6147241ba42c423dbe83cb067a2b4af4f60908c3af57e1ea567729cc71416c089737fe2a73e9e79e7a60f00f66c91e4b45ad0d37cd4be2d43fec44963ef14368 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.14.2": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.1.6#~builtin, resolve@patch:resolve@npm%3A^1.14.2#~builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 - languageName: node - linkType: hard - -"responselike@npm:^3.0.0": - version: 3.0.0 - resolution: "responselike@npm:3.0.0" - dependencies: - lowercase-keys: "npm:^3.0.0" - checksum: e0cc9be30df4f415d6d83cdede3c5c887cd4a73e7cc1708bcaab1d50a28d15acb68460ac5b02bcc55a42f3d493729c8856427dcf6e57e6e128ad05cba4cfb95e - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"rtl-detect@npm:^1.0.4": - version: 1.1.2 - resolution: "rtl-detect@npm:1.1.2" - checksum: 4a43a1e5df0617eb86d5485640b318787d12b86acf53d840a3b2ff701ee941e95479d4e9ae97e907569ec763d1c47218cb87639bc87bcdad60a85747e5270cf0 - languageName: node - linkType: hard - -"rtlcss@npm:^4.1.0": - version: 4.1.1 - resolution: "rtlcss@npm:4.1.1" - dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.21" - strip-json-comments: "npm:^3.1.1" - bin: - rtlcss: bin/rtlcss.js - checksum: dcf37d76265b5c84d610488afa68a2506d008f95feac968b35ccae9aa49e7019ae0336a80363303f8f8bbf60df3ecdeb60413548b049114a24748319b68aefde - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"sax@npm:^1.2.4": - version: 1.3.0 - resolution: "sax@npm:1.3.0" - checksum: 238ab3a9ba8c8f8aaf1c5ea9120386391f6ee0af52f1a6a40bbb6df78241dd05d782f2359d614ac6aae08c4c4125208b456548a6cf68625aa4fe178486e63ecd - languageName: node - linkType: hard - -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a - languageName: node - linkType: hard - -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 8889325b0ee1ae6a8f5d6aaa855c71e136ebbb7fd731b01a9d3ec8225dcb245f644c47c50104db4c741983b528cdff8558570021257d4d397ec6aaecd9172a8e - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde - languageName: node - linkType: hard - -"section-matter@npm:^1.0.0": - version: 1.0.0 - resolution: "section-matter@npm:1.0.0" - dependencies: - extend-shallow: "npm:^2.0.1" - kind-of: "npm:^6.0.0" - checksum: 3cc4131705493b2955729b075dcf562359bba66183debb0332752dc9cad35616f6da7a23e42b6cab45cd2e4bb5cda113e9e84c8f05aee77adb6b0289a0229101 - languageName: node - linkType: hard - -"select-hose@npm:^2.0.0": - version: 2.0.0 - resolution: "select-hose@npm:2.0.0" - checksum: d7e5fcc695a4804209d232a1b18624a5134be334d4e1114b0721f7a5e72bd73da483dcf41528c1af4f4f4892ad7cfd6a1e55c8ffb83f9c9fe723b738db609dbb - languageName: node - linkType: hard - -"selfsigned@npm:^2.1.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": "npm:^1.3.0" - node-forge: "npm:^1" - checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa - languageName: node - linkType: hard - -"semver-diff@npm:^4.0.0": - version: 4.0.0 - resolution: "semver-diff@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 4a958d6f76c7e7858268e1e2cf936712542441c9e003e561b574167279eee0a9bd55cc7eae1bfb31d3e7ad06a9fc370e7dd412fcfefec8c0daf1ce5aea623559 - languageName: node - linkType: hard - -"semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 - languageName: node - linkType: hard - -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c - languageName: node - linkType: hard - -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 - languageName: node - linkType: hard - -"serve-handler@npm:^6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" - dependencies: - bytes: "npm:3.0.0" - content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" - mime-types: "npm:2.1.18" - minimatch: "npm:3.1.2" - path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" - range-parser: "npm:1.2.0" - checksum: 7a98ca9cbf8692583b6cde4deb3941cff900fa38bf16adbfccccd8430209bab781e21d9a1f61c9c03e226f9f67689893bbce25941368f3ddaf985fc3858b49dc - languageName: node - linkType: hard - -"serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" - dependencies: - accepts: "npm:~1.3.4" - batch: "npm:0.6.1" - debug: "npm:2.6.9" - escape-html: "npm:~1.0.3" - http-errors: "npm:~1.6.2" - mime-types: "npm:~2.1.17" - parseurl: "npm:~1.3.2" - checksum: e2647ce13379485b98a53ba2ea3fbad4d44b57540d00663b02b976e426e6194d62ac465c0d862cb7057f65e0de8ab8a684aa095427a4b8612412eca0d300d22f - languageName: node - linkType: hard - -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 - languageName: node - linkType: hard - -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 27cb44304d6c9e1a23bc6c706af4acaae1a7aa1054d4ec13c05f01a99fd4887109a83a8042b67ad90dbfcd100d43efc171ee036eb080667172079213242ca36e - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 - languageName: node - linkType: hard - -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b - languageName: node - linkType: hard - -"shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: "npm:^7.0.0" - interpret: "npm:^1.0.0" - rechoir: "npm:^0.6.2" - bin: - shjs: bin/shjs - checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"sirv@npm:^2.0.3": - version: 2.0.4 - resolution: "sirv@npm:2.0.4" - dependencies: - "@polka/url": "npm:^1.0.0-next.24" - mrmime: "npm:^2.0.0" - totalist: "npm:^3.0.0" - checksum: 6853384a51d6ee9377dd657e2b257e0e98b29abbfbfa6333e105197f0f100c8c56a4520b47028b04ab1833cf2312526206f38fcd4f891c6df453f40da1a15a57 - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 - languageName: node - linkType: hard - -"sitemap@npm:^7.1.1": - version: 7.1.1 - resolution: "sitemap@npm:7.1.1" - dependencies: - "@types/node": "npm:^17.0.5" - "@types/sax": "npm:^1.2.1" - arg: "npm:^5.0.0" - sax: "npm:^1.2.4" - bin: - sitemap: dist/cli.js - checksum: 87a6d21b0d4a33b8c611d3bb8543d02b813c0ebfce014213ef31849b5c1439005644f19ad1593ec89815f6101355f468c9a02c251d09aa03f6fddd17e23c4be4 - languageName: node - linkType: hard - -"skin-tone@npm:^2.0.0": - version: 2.0.0 - resolution: "skin-tone@npm:2.0.0" - dependencies: - unicode-emoji-modifier-base: "npm:^1.0.0" - checksum: 19de157586b8019cacc55eb25d9d640f00fc02415761f3e41a4527142970fd4e7f6af0333bc90e879858766c20a976107bb386ffd4c812289c01d51f2c8d182c - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"slash@npm:^4.0.0": - version: 4.0.0 - resolution: "slash@npm:4.0.0" - checksum: da8e4af73712253acd21b7853b7e0dbba776b786e82b010a5bfc8b5051a1db38ed8aba8e1e8f400dd2c9f373be91eb1c42b66e91abb407ff42b10feece5e1d2d - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"sockjs@npm:^0.3.24": - version: 0.3.24 - resolution: "sockjs@npm:0.3.24" - dependencies: - faye-websocket: "npm:^0.11.3" - uuid: "npm:^8.3.2" - websocket-driver: "npm:^0.7.4" - checksum: 355309b48d2c4e9755349daa29cea1c0d9ee23e49b983841c6bf7a20276b00d3c02343f9f33f26d2ee8b261a5a02961b52a25c8da88b2538c5b68d3071b4934c - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 8fab38821c327c190c28f1658087bc520eb065d55bc07b4a0fdf8d1e0e7ad5d115abbb22a95f94f944723ea969dd771ad6416b1e3cde9060c4c71f705c8b85c5 - languageName: node - linkType: hard - -"socks@npm:^2.7.1": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd - languageName: node - linkType: hard - -"sort-css-media-queries@npm:2.1.0": - version: 2.1.0 - resolution: "sort-css-media-queries@npm:2.1.0" - checksum: 25cb8f08b148a2ed83d0bc1cf20ddb888d3dee2a3c986896099a21b28b999d5cca3e46a9ef64381bb36fca0fc820471713f2e8af2729ecc6e108ab2b3b315ea9 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 - languageName: node - linkType: hard - -"source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"source-map@npm:^0.7.0": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 - languageName: node - linkType: hard - -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 - languageName: node - linkType: hard - -"spdy-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "spdy-transport@npm:3.0.0" - dependencies: - debug: "npm:^4.1.0" - detect-node: "npm:^2.0.4" - hpack.js: "npm:^2.1.6" - obuf: "npm:^1.1.2" - readable-stream: "npm:^3.0.6" - wbuf: "npm:^1.7.3" - checksum: 0fcaad3b836fb1ec0bdd39fa7008b9a7a84a553f12be6b736a2512613b323207ffc924b9551cef0378f7233c85916cff1118652e03a730bdb97c0e042243d56c - languageName: node - linkType: hard - -"spdy@npm:^4.0.2": - version: 4.0.2 - resolution: "spdy@npm:4.0.2" - dependencies: - debug: "npm:^4.1.0" - handle-thing: "npm:^2.0.0" - http-deceiver: "npm:^1.2.7" - select-hose: "npm:^2.0.0" - spdy-transport: "npm:^3.0.0" - checksum: 2c739d0ff6f56ad36d2d754d0261d5ec358457bea7cbf77b1b05b0c6464f2ce65b85f196305f50b7bd9120723eb94bae9933466f28e67e5cd8cde4e27f1d75f8 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - -"srcset@npm:^4.0.0": - version: 4.0.0 - resolution: "srcset@npm:4.0.0" - checksum: aceb898c9281101ef43bfbf96bf04dfae828e1bf942a45df6fad74ae9f8f0a425f4bca1480e0d22879beb40dd2bc6947e0e1e5f4d307a714666196164bc5769d - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 - languageName: node - linkType: hard - -"stable@npm:^0.1.8": - version: 0.1.8 - resolution: "stable@npm:0.1.8" - checksum: 2ff482bb100285d16dd75cd8f7c60ab652570e8952c0bfa91828a2b5f646a0ff533f14596ea4eabd48bb7f4aeea408dce8f8515812b975d958a4cc4fa6b9dfeb - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"statuses@npm:>= 1.4.0 < 2": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c - languageName: node - linkType: hard - -"std-env@npm:^3.0.1": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - -"stringify-entities@npm:^4.0.0": - version: 4.0.4 - resolution: "stringify-entities@npm:4.0.4" - dependencies: - character-entities-html4: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 - languageName: node - linkType: hard - -"stringify-object@npm:^3.3.0": - version: 3.3.0 - resolution: "stringify-object@npm:3.3.0" - dependencies: - get-own-enumerable-property-symbols: "npm:^3.0.0" - is-obj: "npm:^1.0.1" - is-regexp: "npm:^1.0.0" - checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-bom-string@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-bom-string@npm:1.0.0" - checksum: 5635a3656d8512a2c194d6c8d5dee7ef0dde6802f7be9413b91e201981ad4132506656d9cf14137f019fd50f0269390d91c7f6a2601b1bee039a4859cfce4934 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 - languageName: node - linkType: hard - -"style-to-object@npm:^0.4.0": - version: 0.4.4 - resolution: "style-to-object@npm:0.4.4" - dependencies: - inline-style-parser: "npm:0.1.1" - checksum: 41656c06f93ac0a7ac260ebc2f9d09a8bd74b8ec1836f358cc58e169235835a3a356977891d2ebbd76f0e08a53616929069199f9cce543214d3dc98346e19c9a - languageName: node - linkType: hard - -"style-to-object@npm:^1.0.0": - version: 1.0.6 - resolution: "style-to-object@npm:1.0.6" - dependencies: - inline-style-parser: "npm:0.2.3" - checksum: 5b58295dcc2c21f1da1b9308de1e81b4a987b876a177e677453a76b2e3151a0e21afc630e99c1ea6c82dd8dbec0d01a8b1a51a829422aca055162b03e52572a9 - languageName: node - linkType: hard - -"stylehacks@npm:^5.1.1": - version: 5.1.1 - resolution: "stylehacks@npm:5.1.1" - dependencies: - browserslist: "npm:^4.21.4" - postcss-selector-parser: "npm:^6.0.4" - peerDependencies: - postcss: ^8.2.15 - checksum: 11175366ef52de65bf06cefba0ddc9db286dc3a1451fd2989e74c6ea47091a02329a4bf6ce10b1a36950056927b6bbbe47c5ab3a1f4c7032df932d010fbde5a2 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"svg-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "svg-parser@npm:2.0.4" - checksum: b3de6653048212f2ae7afe4a423e04a76ec6d2d06e1bf7eacc618a7c5f7df7faa5105561c57b94579ec831fbbdbf5f190ba56a9205ff39ed13eabdf8ab086ddf - languageName: node - linkType: hard - -"svgo@npm:^2.7.0, svgo@npm:^2.8.0": - version: 2.8.0 - resolution: "svgo@npm:2.8.0" - dependencies: - "@trysound/sax": "npm:0.2.0" - commander: "npm:^7.2.0" - css-select: "npm:^4.1.3" - css-tree: "npm:^1.1.3" - csso: "npm:^4.2.0" - picocolors: "npm:^1.0.0" - stable: "npm:^0.1.8" - bin: - svgo: bin/svgo - checksum: b92f71a8541468ffd0b81b8cdb36b1e242eea320bf3c1a9b2c8809945853e9d8c80c19744267eb91cabf06ae9d5fff3592d677df85a31be4ed59ff78534fa420 - languageName: node - linkType: hard - -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 53ff4e7c3900051c38cc4faab428ebfd7e6ad0841af5a7ac6d5f3045c5b50e88497bfa8295b4b3fbcadd94993c9e358868b78b9fb249a76cb8b018ac8dccafd7 - languageName: node - linkType: hard - -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea - languageName: node - linkType: hard - -"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.30.4 - resolution: "terser@npm:5.30.4" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 4e33a98d451a1175c83f668cb1dd34e1b4573890ba3081e0389e71e6552ca501ebfda5b15cddeab33585f7b4c13f2e7ad9ba9613655b9e36bc919fde48ba2dcd - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"thunky@npm:^1.0.2": - version: 1.1.0 - resolution: "thunky@npm:1.1.0" - checksum: 993096c472b6b8f30e29dc777a8d17720e4cab448375041f20c0cb802a09a7fb2217f2a3e8cdc11851faa71c957e2db309357367fc9d7af3cb7a4d00f4b66034 - languageName: node - linkType: hard - -"tiny-invariant@npm:^1.0.2": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe - languageName: node - linkType: hard - -"tiny-warning@npm:^1.0.0": - version: 1.0.3 - resolution: "tiny-warning@npm:1.0.3" - checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"totalist@npm:^3.0.0": - version: 3.0.1 - resolution: "totalist@npm:3.0.1" - checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a - languageName: node - linkType: hard - -"trim-lines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-lines@npm:3.0.1" - checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed - languageName: node - linkType: hard - -"trough@npm:^2.0.0": - version: 2.2.0 - resolution: "trough@npm:2.2.0" - checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 - languageName: node - linkType: hard - -"tslib@npm:^2.0.3, tslib@npm:^2.6.0": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad - languageName: node - linkType: hard - -"type-fest@npm:^1.0.1": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 - languageName: node - linkType: hard - -"type-fest@npm:^2.13.0, type-fest@npm:^2.5.0": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 - languageName: node - linkType: hard - -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60 - languageName: node - linkType: hard - -"typescript@npm:~5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c - languageName: node - linkType: hard - -"typescript@patch:typescript@~5.2.2#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=f3b441" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 0f4da2f15e6f1245e49db15801dbee52f2bbfb267e1c39225afdab5afee1a72839cd86000e65ee9d7e4dfaff12239d28beaf5ee431357fcced15fb08583d72ca - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 - languageName: node - linkType: hard - -"unicode-emoji-modifier-base@npm:^1.0.0": - version: 1.0.0 - resolution: "unicode-emoji-modifier-base@npm:1.0.0" - checksum: 6e1521d35fa69493207eb8b41f8edb95985d8b3faf07c01d820a1830b5e8403e20002563e2f84683e8e962a49beccae789f0879356bf92a4ec7a4dd8e2d16fdb - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: "npm:^2.0.0" - unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 1f34a7434a23df4885b5890ac36c5b2161a809887000be560f56ad4b11126d433c0c1c39baf1016bdabed4ec54829a6190ee37aa24919aa116dc1a5a8a62965a - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 8d6f5f586b9ce1ed0e84a37df6b42fdba1317a05b5df0c249962bd5da89528771e2d149837cad11aa26bcb84c35355cb9f58a10c3d41fa3b899181ece6c85220 - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 243524431893649b62cc674d877bd64ef292d6071dd2fd01ab4d5ad26efbc104ffcd064f93f8a06b7e4ec54c172bf03f6417921a0d8c3a9994161fe1f88f815b - languageName: node - linkType: hard - -"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": - version: 11.0.4 - resolution: "unified@npm:11.0.4" - dependencies: - "@types/unist": "npm:^3.0.0" - bail: "npm:^2.0.0" - devlop: "npm:^1.0.0" - extend: "npm:^3.0.0" - is-plain-obj: "npm:^4.0.0" - trough: "npm:^2.0.0" - vfile: "npm:^6.0.0" - checksum: cfb023913480ac2bd5e787ffb8c27782c43e6be4a55f8f1c288233fce46a7ebe7718ccc5adb80bf8d56b7ef85f5fc32239c7bfccda006f9f2382e0cc2e2a77e4 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"unique-string@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-string@npm:3.0.0" - dependencies: - crypto-random-string: "npm:^4.0.0" - checksum: 1a1e2e7d02eab1bb10f720475da735e1990c8a5ff34edd1a3b6bc31590cb4210b7a1233d779360cc622ce11c211e43afa1628dd658f35d3e6a89964b622940df - languageName: node - linkType: hard - -"unist-util-is@npm:^6.0.0": - version: 6.0.0 - resolution: "unist-util-is@npm:6.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: f630a925126594af9993b091cf807b86811371e465b5049a6283e08537d3e6ba0f7e248e1e7dab52cfe33f9002606acef093441137181b327f6fe504884b20e2 - languageName: node - linkType: hard - -"unist-util-position-from-estree@npm:^2.0.0": - version: 2.0.0 - resolution: "unist-util-position-from-estree@npm:2.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: d3b3048a5727c2367f64ef6dcc5b20c4717215ef8b1372ff9a7c426297c5d1e5776409938acd01531213e2cd2543218d16e73f9f862f318e9496e2c73bb18354 - languageName: node - linkType: hard - -"unist-util-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde - languageName: node - linkType: hard - -"unist-util-remove-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-remove-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 8aabdb9d0e3e744141bc123d8f87b90835d521209ad3c6c4619d403b324537152f0b8f20dda839b40c3aa0abfbf1828b3635a7a8bb159c3ed469e743023510ee - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-stringify-position@npm:4.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^6.0.0": - version: 6.0.1 - resolution: "unist-util-visit-parents@npm:6.0.1" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 08927647c579f63b91aafcbec9966dc4a7d0af1e5e26fc69f4e3e6a01215084835a2321b06f3cbe7bf7914a852830fc1439f0fc3d7153d8804ac3ef851ddfa20 - languageName: node - linkType: hard - -"unist-util-visit@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-visit@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" - dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 - languageName: node - linkType: hard - -"update-notifier@npm:^6.0.2": - version: 6.0.2 - resolution: "update-notifier@npm:6.0.2" - dependencies: - boxen: "npm:^7.0.0" - chalk: "npm:^5.0.1" - configstore: "npm:^6.0.0" - has-yarn: "npm:^3.0.0" - import-lazy: "npm:^4.0.0" - is-ci: "npm:^3.0.1" - is-installed-globally: "npm:^0.4.0" - is-npm: "npm:^6.0.0" - is-yarn-global: "npm:^0.4.0" - latest-version: "npm:^7.0.0" - pupa: "npm:^3.1.0" - semver: "npm:^7.3.7" - semver-diff: "npm:^4.0.0" - xdg-basedir: "npm:^5.1.0" - checksum: 4bae7b3eca7b2068b6b87dde88c9dad24831fa913a5b83ecb39a7e4702c93e8b05fd9bcac5f1a005178f6e5dc859e0b3817ddda833d2a7ab92c6485e078b3cc8 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"url-loader@npm:^4.1.1": - version: 4.1.1 - resolution: "url-loader@npm:4.1.1" - dependencies: - loader-utils: "npm:^2.0.0" - mime-types: "npm:^2.1.27" - schema-utils: "npm:^3.0.0" - peerDependencies: - file-loader: "*" - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - checksum: c1122a992c6cff70a7e56dfc2b7474534d48eb40b2cc75467cde0c6972e7597faf8e43acb4f45f93c2473645dfd803bcbc20960b57544dd1e4c96e77f72ba6fd - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"utila@npm:~0.4": - version: 0.4.0 - resolution: "utila@npm:0.4.0" - checksum: 97ffd3bd2bb80c773429d3fb8396469115cd190dded1e733f190d8b602bd0a1bcd6216b7ce3c4395ee3c79e3c879c19d268dbaae3093564cb169ad1212d436f4 - languageName: node - linkType: hard - -"utility-types@npm:^3.10.0": - version: 3.11.0 - resolution: "utility-types@npm:3.11.0" - checksum: 35a4866927bbea5d037726744028d05c6e37772ded2aabaca21480ce9380185436aef586ead525e327c7f3c640b1a3287769a12ef269c7b165a2ddd50ea6ad61 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"value-equal@npm:^1.0.1": - version: 1.0.1 - resolution: "value-equal@npm:1.0.1" - checksum: bb7ae1facc76b5cf8071aeb6c13d284d023fdb370478d10a5d64508e0e6e53bb459c4bbe34258df29d82e6f561f874f0105eba38de0e61fe9edd0bdce07a77a2 - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b - languageName: node - linkType: hard - -"vfile-location@npm:^5.0.0": - version: 5.0.2 - resolution: "vfile-location@npm:5.0.2" - dependencies: - "@types/unist": "npm:^3.0.0" - vfile: "npm:^6.0.0" - checksum: b61c048cedad3555b4f007f390412c6503f58a6a130b58badf4ee340c87e0d7421e9c86bbc1494c57dedfccadb60f5176cc60ba3098209d99fb3a3d8804e4c38 - languageName: node - linkType: hard - -"vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 964e7e119f4c0e0270fc269119c41c96da20afa01acb7c9809a88365c8e0c64aa692fafbd952669382b978002ecd7ad31ef4446d85e8a22cdb62f6df20186c2d - languageName: node - linkType: hard - -"vfile@npm:^6.0.0, vfile@npm:^6.0.1": - version: 6.0.1 - resolution: "vfile@npm:6.0.1" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 05ccee73aeb00402bc8a5d0708af299e9f4a33f5132805449099295085e3ca3b0d018328bad9ff44cf2e6f4cd364f1d558d3fb9b394243a25b2739207edcb0ed - languageName: node - linkType: hard - -"watchpack@npm:^2.4.1": - version: 2.4.1 - resolution: "watchpack@npm:2.4.1" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 5b0179348655dcdf19cac7cb4ff923fdc024d630650c0bf6bec8899cf47c60e19d4f810a88dba692ed0e7f684cf0fcffea86efdbf6c35d81f031e328043b7fab - languageName: node - linkType: hard - -"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": - version: 1.7.3 - resolution: "wbuf@npm:1.7.3" - dependencies: - minimalistic-assert: "npm:^1.0.0" - checksum: 2abc306c96930b757972a1c4650eb6b25b5d99f24088714957f88629e137db569368c5de0e57986c89ea70db2f1df9bba11a87cb6d0c8694b6f53a0159fab3bf - languageName: node - linkType: hard - -"web-namespaces@npm:^2.0.0": - version: 2.0.1 - resolution: "web-namespaces@npm:2.0.1" - checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 - languageName: node - linkType: hard - -"webpack-bundle-analyzer@npm:^4.9.0": - version: 4.10.2 - resolution: "webpack-bundle-analyzer@npm:4.10.2" - dependencies: - "@discoveryjs/json-ext": "npm:0.5.7" - acorn: "npm:^8.0.4" - acorn-walk: "npm:^8.0.0" - commander: "npm:^7.2.0" - debounce: "npm:^1.2.1" - escape-string-regexp: "npm:^4.0.0" - gzip-size: "npm:^6.0.0" - html-escaper: "npm:^2.0.2" - opener: "npm:^1.5.2" - picocolors: "npm:^1.0.0" - sirv: "npm:^2.0.3" - ws: "npm:^7.3.1" - bin: - webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 4f0275e7d87bb6203a618ca5d2d4953943979d986fa2b91be1bf1ad0bcd22bec13398803273d11699f9fbcf106896311208a72d63fe5f8a47b687a226e598dc1 - languageName: node - linkType: hard - -"webpack-dev-middleware@npm:^5.3.4": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" - dependencies: - colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" - range-parser: "npm:^1.2.1" - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 90cf3e27d0714c1a745454a1794f491b7076434939340605b9ee8718ba2b85385b120939754e9fdbd6569811e749dee53eec319e0d600e70e0b0baffd8e3fb13 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^4.15.1": - version: 4.15.2 - resolution: "webpack-dev-server@npm:4.15.2" - dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" - ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" - colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" - connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" - graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" - serve-index: "npm:^1.9.1" - sockjs: "npm:^0.3.24" - spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.4" - ws: "npm:^8.13.0" - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: 123507129cb4d55fdc5fabdd177574f31133605748372bb11353307b7a583ef25c6fd27b6addf56bf070ba44c88d5da861771c2ec55f52405082ec9efd01f039 - languageName: node - linkType: hard - -"webpack-merge@npm:^5.9.0": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" - dependencies: - clone-deep: "npm:^4.0.1" - flat: "npm:^5.0.2" - wildcard: "npm:^2.0.0" - checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 - languageName: node - linkType: hard - -"webpack@npm:^5.88.1": - version: 5.91.0 - resolution: "webpack@npm:5.91.0" - dependencies: - "@types/eslint-scope": "npm:^3.7.3" - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-assertions: "npm:^1.9.0" - browserslist: "npm:^4.21.10" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.16.0" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: f1073715dbb1ed5c070affef293d800a867708bcbc5aba4d8baee87660e0cf53c55966a6f36fab078d1d6c9567cdcd0a9086bdfb607cab87ea68c6449791b9a3 - languageName: node - linkType: hard - -"webpackbar@npm:^5.0.2": - version: 5.0.2 - resolution: "webpackbar@npm:5.0.2" - dependencies: - chalk: "npm:^4.1.0" - consola: "npm:^2.15.3" - pretty-time: "npm:^1.1.0" - std-env: "npm:^3.0.1" - peerDependencies: - webpack: 3 || 4 || 5 - checksum: 214a734b1d4d391eb8271ed1b11085f0efe6831e93f641229b292abfd6fea871422dce121612511c17ae8047522be6d65c1a2666cabb396c79549816a3612338 - languageName: node - linkType: hard - -"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": - version: 0.7.4 - resolution: "websocket-driver@npm:0.7.4" - dependencies: - http-parser-js: "npm:>=0.5.1" - safe-buffer: "npm:>=5.1.0" - websocket-extensions: "npm:>=0.1.1" - checksum: fffe5a33fe8eceafd21d2a065661d09e38b93877eae1de6ab5d7d2734c6ed243973beae10ae48c6613cfd675f200e5a058d1e3531bc9e6c5d4f1396ff1f0bfb9 - languageName: node - linkType: hard - -"websocket-extensions@npm:>=0.1.1": - version: 0.1.4 - resolution: "websocket-extensions@npm:0.1.4" - checksum: 5976835e68a86afcd64c7a9762ed85f2f27d48c488c707e67ba85e717b90fa066b98ab33c744d64255c9622d349eedecf728e65a5f921da71b58d0e9591b9038 - languageName: node - linkType: hard - -"which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 - languageName: node - linkType: hard - -"widest-line@npm:^4.0.1": - version: 4.0.1 - resolution: "widest-line@npm:4.0.1" - dependencies: - string-width: "npm:^5.0.1" - checksum: 64c48cf27171221be5f86fc54b94dd29879165bdff1a7aa92dde723d9a8c99fb108312768a5d62c8c2b80b701fa27bbd36a1ddc58367585cd45c0db7920a0cba - languageName: node - linkType: hard - -"wildcard@npm:^2.0.0": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"write-file-atomic@npm:^3.0.3": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: "npm:^0.1.4" - is-typedarray: "npm:^1.0.0" - signal-exit: "npm:^3.0.2" - typedarray-to-buffer: "npm:^3.1.5" - checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280 - languageName: node - linkType: hard - -"ws@npm:^7.3.1": - version: 7.5.9 - resolution: "ws@npm:7.5.9" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 - languageName: node - linkType: hard - -"ws@npm:^8.13.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b - languageName: node - linkType: hard - -"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": - version: 5.1.0 - resolution: "xdg-basedir@npm:5.1.0" - checksum: b60e8a2c663ccb1dac77c2d913f3b96de48dafbfa083657171d3d50e10820b8a04bb4edfe9f00808c8c20e5f5355e1927bea9029f03136e29265cb98291e1fea - languageName: node - linkType: hard - -"xml-js@npm:^1.6.11": - version: 1.6.11 - resolution: "xml-js@npm:1.6.11" - dependencies: - sax: "npm:^1.2.4" - bin: - xml-js: ./bin/cli.js - checksum: 24a55479919413687105fc2d8ab05e613ebedb1c1bc12258a108e07cff5ef793779297db854800a4edf0281303ebd1f177bc4a588442f5344e62b3dddda26c2b - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 - languageName: node - linkType: hard - -"zwitch@npm:^2.0.0": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 - languageName: node - linkType: hard diff --git a/research/gpu-exploration-app/core/circuits/.gitignore b/research/gpu-exploration-app/core/circuits/.gitignore deleted file mode 100644 index 5feb907..0000000 --- a/research/gpu-exploration-app/core/circuits/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -node_modules \ No newline at end of file diff --git a/research/gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom b/research/gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom deleted file mode 100644 index 8e57a1e..0000000 --- a/research/gpu-exploration-app/core/circuits/multiplier2/multiplier2.circom +++ /dev/null @@ -1,16 +0,0 @@ -pragma circom 2.1.4; - -/*This circuit template checks that c is the multiplication of a and b.*/ - -template Multiplier2 () { - - // Declaration of signals. - signal input a; - signal input b; - signal output c; - - // Constraints. - c <== a * b; -} - -component main { public [ a ] } = Multiplier2(); \ No newline at end of file diff --git a/research/gpu-exploration-app/core/src/lib.rs b/research/gpu-exploration-app/core/src/lib.rs deleted file mode 100644 index b43fbb3..0000000 --- a/research/gpu-exploration-app/core/src/lib.rs +++ /dev/null @@ -1,87 +0,0 @@ -// This file contains tests calling MSM functions from `mopro-core` -#[cfg(test)] -mod tests { - use ark_serialize::Write; - use mopro_core::middleware::gpu_explorations::{ - arkworks_pippenger, trapdoortech_zprize_msm, utils::benchmark::BenchmarkResult, utils::preprocess::HarnessError, - }; - use std::fs::{create_dir_all, File}; - use std::path::Path; - - const BENCHMARKS_DIR: &str = "benchmarks"; - const UTILS_PATH: &str = "benchmarks/vectors"; - const BENCHMARKS_PATH: &str = "benchmarks/results"; - - fn ensure_dir_exists(dir_path: &str) { - if !Path::new(dir_path).exists() { - create_dir_all(dir_path).expect("Failed to create directory"); - } - } - - fn setup_dirs() { - ensure_dir_exists(BENCHMARKS_DIR); - ensure_dir_exists(UTILS_PATH); - ensure_dir_exists(BENCHMARKS_PATH); - } - - fn run_benchmarks(algorithm: &str, instance_size: &[usize], num_instance: &[usize], benchmark_fn: F) - where - F: Fn(usize, usize, &str) -> Result + Sync, - { - setup_dirs(); // to check the directories - - let output_path = format!("{}/{}_benchmark.txt", BENCHMARKS_PATH, algorithm); - let mut output_file = File::create(output_path).expect("output file creation failed"); - writeln!(output_file, "msm_size,num_msm,avg_processing_time(ms)").unwrap(); - - let results: Vec> = instance_size - .iter() - .map(|size| { - num_instance - .iter() - .map(|num| { - let utils_path = format!("{}/{}x{}", UTILS_PATH, *size, *num); - let result = benchmark_fn(*size, *num, &utils_path).unwrap(); - println!("{}x{} result: {:#?}", *size, *num, result); - (result.instance_size, result.num_instance, result.avg_processing_time) - }) - .collect() - }) - .collect(); - - for outer_result in results { - for (instance_size, num_instance, avg_processing_time) in outer_result { - writeln!( - output_file, - "{},{},{}", - instance_size, num_instance, avg_processing_time - ) - .unwrap(); - } - } - } - - #[test] - fn test_arkworks_msm() { - let instance_size = &[8, 12, 16]; - let num_instance = &[5, 10]; - run_benchmarks( - "arkworks_pippenger", - instance_size, - num_instance, - |size: usize, num: usize, path: &str| arkworks_pippenger::run_benchmark(size as u32, num as u32, path), - ); - } - - #[test] - fn test_trapdoortech_msm() { - let instance_size = &[8, 12, 16]; - let num_instance = &[5, 10]; - run_benchmarks( - "trapdoortech_zprize_msm", - instance_size, - num_instance, - |size: usize, num: usize, path: &str| trapdoortech_zprize_msm::run_benchmark(size as u32, num as u32, path), - ); - } -} diff --git a/scripts/_prelude.sh b/scripts/_prelude.sh deleted file mode 100644 index ffae134..0000000 --- a/scripts/_prelude.sh +++ /dev/null @@ -1,37 +0,0 @@ -# _prelude.sh -# Commonly used shell utilities and functions, shared across scripts. - -# Deal with errors -set -euo pipefail - -# Color definitions -DEFAULT='\033[0m' -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -BLUE='\033[0;34m' -GREY='\033[0;90m' - -# NOTE: This is quite noisy so turning off by default -# Coloring the -x output (commands) -#DEBUG_COLOR="${DEFAULT}" -#trap 'echo -e ${DEBUG_COLOR}${BASH_COMMAND}${DEFAULT}' DEBUG - -# Function to handle exit -handle_exit() { - # $? is a special variable that holds the exit code of the last command executed - if [ $? -ne 0 ]; then - echo -e "\n${RED}Script did not finish successfully!${DEFAULT}" - fi -} - -# Set the trap -trap handle_exit EXIT - -print_action() { - printf "\n${GREEN}$1${DEFAULT}\n" -} - -print_warning() { - printf "\n${YELLOW}$1${DEFAULT}\n" -} \ No newline at end of file diff --git a/scripts/cli/build_android.sh b/scripts/cli/build_android.sh deleted file mode 100755 index f15c0e0..0000000 --- a/scripts/cli/build_android.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash - -# Script for initializing and updating an Android (simplified) project with Rust bindings. - -# Prelude -#---------------------------------------------------------------------------- -initialize_environment() { - if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 - fi - - if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 - fi - - if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 - fi - - source "${MOPRO_ROOT}/scripts/_prelude.sh" -} - -read_configuration() { - CONFIG_FILE="$1" - export BUILD_CONFIG_PATH="$PROJECT_DIR/$CONFIG_FILE" - print_action "Using build configuration file: $BUILD_CONFIG_PATH" - - DEVICE_TYPE=$(read_toml "$CONFIG_FILE" "build.android_device_type") - BUILD_MODE=$(read_toml "$CONFIG_FILE" "build.build_mode") - USE_DYLIB=$(read_toml "$CONFIG_FILE" "dylib.use_dylib") - DYLIB_NAME=$(read_toml "$CONFIG_FILE" "dylib.name") -} - -# Function to read value from TOML file and remove quotes -read_toml() { - toml get "$1" "$2" | tr -d '"' -} - -# Determine the architecture based on device type -determine_architecture() { - case $DEVICE_TYPE in - "x86_64") - ARCHITECTURE="x86_64-linux-android" - FOLDER="x86_64" - ;; - "x86") - ARCHITECTURE="i686-linux-android" - FOLDER="x86" - ;; - "arm") - ARCHITECTURE="armv7-linux-androideabi" - FOLDER="armeabi-v7a" - ;; - "arm64") - ARCHITECTURE="aarch64-linux-android" - FOLDER="arm64-v8a" - ;; - *) - echo -e "\n${RED}Error: Invalid device type specified in config: $DEVICE_TYPE${DEFAULT}" - exit 1 - ;; - esac -} - -# Determine the library directory based on build mode -determine_build_directory() { - case $BUILD_MODE in - "debug") - LIB_DIR="debug" - ;; - "release") - LIB_DIR="release" - ;; - *) - echo -e "\n${RED}Error: Invalid build mode specified in config: $BUILD_MODE${DEFAULT}" - exit 1 - ;; - esac -} - -# Build process -#---------------------------------------------------------------------------- - -# Build process for mopro_core -build_mopro_core() { - cd "${MOPRO_ROOT}/mopro-core" || exit - print_action "Building mopro-core ($BUILD_MODE)..." - if [[ "$BUILD_MODE" == "release" ]]; then - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build --target "$ARCHITECTURE" --release - else - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build --target "$ARCHITECTURE" - fi -} - -build_mopro_ffi_static() { - cd "${MOPRO_ROOT}/mopro-ffi" || exit - print_action "Building mopro-ffi as a static library ($BUILD_MODE)..." - print_action "[android] Install cargo-ndk" - cargo install cargo-ndk - if [[ "$BUILD_MODE" == "release" ]]; then - cargo ndk --target "$ARCHITECTURE" build --lib --release - else - cargo ndk --target "$ARCHITECTURE" build --lib - fi - - # Ensure the target directory exists - mkdir -p "${TARGET_DIR}/jniLibs/${FOLDER}" - - # Copy the static library to the target directory - print_action "Copying static library to target directory..." - cp "${MOPRO_ROOT}/target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.so" \ - "${TARGET_DIR}/jniLibs/${FOLDER}/libuniffi_mopro.so" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy static library.${DEFAULT}" - exit 1 - fi -} - -generate_kotlin_bindings() { - print_action "Generating Kotlin bindings..." - uniffi-bindgen generate "${MOPRO_ROOT}/mopro-ffi/src/mopro.udl" --language kotlin --out-dir "${TARGET_DIR}/KotlinBindings" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to generate Kotlin bindings.${DEFAULT}" - exit 1 - fi - - # Copy the mopro.swift file to the Bindings directory - cp -r "${TARGET_DIR}/jniLibs/" "${ANDROID_APP_DIR}/app/src/main/jniLibs/" - cp -r "${TARGET_DIR}/KotlinBindings/uniffi/" "${ANDROID_APP_DIR}/app/src/main/java/uniffi/" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy mopro.swift to Bindings directory.${DEFAULT}" - exit 1 - fi -} - -# Main -#---------------------------------------------------------------------------- -main() { - PROJECT_DIR=$(pwd) - TARGET_DIR=${PROJECT_DIR}/target - ANDROID_APP_DIR=${PROJECT_DIR}/android - - initialize_environment "$@" - read_configuration "$1" - determine_architecture - determine_build_directory - - if [[ "$USE_DYLIB" == true ]]; then - build_mopro_ffi_dylib - else - build_mopro_ffi_static - fi - - generate_kotlin_bindings - - print_action "Done! Please re-build your project in Android Studio." - print_action "Run \`open android -a Android\ Studio\` to do so." -} - -main "$@" diff --git a/scripts/cli/build_core.sh b/scripts/cli/build_core.sh deleted file mode 100755 index d1ddad1..0000000 --- a/scripts/cli/build_core.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Check if MOPRO_ROOT is set -if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 -fi - -# Source the script prelude -source "${MOPRO_ROOT}/scripts/_prelude.sh" - -# Check if toml-cli is installed -if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 -fi - -# Function to read value from TOML file and remove quotes -read_toml() { - toml get "$1" "$2" | tr -d '"' -} - -# Check if a configuration file was passed as an argument -if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 -fi - -# Read the path to the TOML configuration file from the first argument -CONFIG_FILE="$1" - -# XXX: This isn't necessarily propagated to `cargo build` build process, -# so we pass it explicitly. Consider using `source` instead of `export`. -# Export the configuration file path as an environment variable -export BUILD_CONFIG_PATH="$(pwd)/$CONFIG_FILE" - -# Print which configuration file is being used -echo "Using build configuration file: $BUILD_CONFIG_PATH" - -# Read configurations from TOML file within [build] block -BUILD_MODE=$(read_toml "$CONFIG_FILE" "build.build_mode") - -# XXX: This is currently not used, need to pass it to `cargo build` explicitly. -PROJECT_DIR=$(pwd) - -# Build circom circuits in mopro-core -cd "${MOPRO_ROOT}/mopro-core" -if [[ "$BUILD_MODE" == "debug" ]]; then - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build - elif [[ "$BUILD_MODE" == "release" ]]; then - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build --release -fi \ No newline at end of file diff --git a/scripts/cli/build_ios.sh b/scripts/cli/build_ios.sh deleted file mode 100755 index 7343e85..0000000 --- a/scripts/cli/build_ios.sh +++ /dev/null @@ -1,362 +0,0 @@ -#!/bin/bash - -# Script for initializing and updating an iOS (simplified) project with Rust bindings. - -# Prelude -#---------------------------------------------------------------------------- -initialize_environment() { - if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 - fi - - if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 - fi - - if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 - fi - - source "${MOPRO_ROOT}/scripts/_prelude.sh" -} - -read_configuration() { - CONFIG_FILE="$1" - export BUILD_CONFIG_PATH="$PROJECT_DIR/$CONFIG_FILE" - print_action "Using build configuration file: $BUILD_CONFIG_PATH" - - CIRCUIT_TYPE=$(read_toml "$CONFIG_FILE" "circuit.adapter") - CIRCUIT_DIR=$(read_toml "$CONFIG_FILE" "circuit.dir") - - DEVICE_TYPE=$(read_toml "$CONFIG_FILE" "build.ios_device_type") - BUILD_MODE=$(read_toml "$CONFIG_FILE" "build.build_mode") - USE_DYLIB=$(read_toml "$CONFIG_FILE" "dylib.use_dylib") - DYLIB_NAME=$(read_toml "$CONFIG_FILE" "dylib.name") -} - -# Function to read value from TOML file and remove quotes -read_toml() { - toml get "$1" "$2" | tr -d '"' -} - -# Determine the architecture based on device type -determine_architecture() { - case $DEVICE_TYPE in - "x86_64") - ARCHITECTURE="x86_64-apple-ios" - ;; - "simulator") - ARCHITECTURE="aarch64-apple-ios-sim" - ;; - "device") - ARCHITECTURE="aarch64-apple-ios" - ;; - *) - echo -e "\n${RED}Error: Invalid device type specified in config: $DEVICE_TYPE${DEFAULT}" - exit 1 - ;; - esac -} - -# Determine the library directory based on build mode -determine_build_directory() { - case $BUILD_MODE in - "debug") - LIB_DIR="debug" - ;; - "release") - LIB_DIR="release" - ;; - *) - echo -e "\n${RED}Error: Invalid build mode specified in config: $BUILD_MODE${DEFAULT}" - exit 1 - ;; - esac -} - -# Select build features based on circuit type -select_features() { - case $CIRCUIT_TYPE in - "circom") - CARGO_FEATURES="circom" - ;; - "halo2") - CARGO_FEATURES="halo2" - ;; - *) - echo -e "\n${RED}Error: Invalid circuit type specified in config: $CIRCUIT_TYPE${DEFAULT}" - exit 1 - ;; - esac -} - -# Update or create .cargo/config.toml file in the mopro repository -# This is necessary to specify the path to the circuit directory for the build process -setup_circuit_path_override() { - - # Convert CIRCUIT_DIR to an absolute path if it is not already - ABS_CIRCUIT_DIR=$(realpath "$CIRCUIT_DIR") - - # Check if the config file exists - CONFIG_FILE="$MOPRO_ROOT/.cargo/config.toml" - if [ ! -f "$CONFIG_FILE" ]; then - # Create the necessary directories if they do not exist - mkdir -p "$(dirname "$CONFIG_FILE")" - echo "Creating a new .cargo/config.toml file in the mopro repository ($MOPRO_ROOT)" - echo "This file is used to override the default halo2 circuit directory path." - fi - - # Check if 'paths' entry exists, and if not, add an empty 'paths' entry - if ! grep -q "^[[:space:]]*paths = \[.*\]" "$CONFIG_FILE"; then - echo "paths = []" >> "$CONFIG_FILE" # We will override this later - echo "Warning: Modifying existing 'paths' entry in $CONFIG_FILE." - echo "Previous paths entry is being replaced with new path: $ABS_CIRCUIT_DIR" - else - echo "No 'paths' entry found in $CONFIG_FILE. Adding a new 'paths' entry." - fi - - # Update the config file with the circuit directory path to override the default `halo2-circuits` path - # TODO - once the `toml-cli` library supports adding an array element, we can simplify this to a single command - # toml set "$CONFIG_FILE" paths "[\"$ABS_CIRCUIT_DIR\"]" >> "$CONFIG_FILE" - - # Currently, we find the right place to insert the path manually - echo >> "$CONFIG_FILE" - sed -i '' "/^[[:space:]]*paths = \[.*\]/c\\ -paths = [\"$ABS_CIRCUIT_DIR\"] -" "$CONFIG_FILE" -} - -# Remove the circuit path override from the config.toml file added earlier -remove_circuit_path_override() { - # Remove the circuit path override from the config file - if [ -f "$CONFIG_FILE" ]; then - echo "Removing circuit path override from $CONFIG_FILE" - sed -i '' '/paths = \[.*\]/d' "$CONFIG_FILE" - - # Check if the file has only new line characters and if so, remove the file - if [ -z "$(cat "$CONFIG_FILE" | tr -d '\n')" ]; then - rm "$CONFIG_FILE" - - # Check if `.cargo` directory is empty and if so, remove it - CARGO_DIR="$MOPRO_ROOT/.cargo" - if [ -d "$CARGO_DIR" ] && [ -z "$(ls -A "$CARGO_DIR")" ]; then - echo "Removing empty directory: $CARGO_DIR" - rm -r "$CARGO_DIR" - fi - fi - - - fi -} - -# Build process -#---------------------------------------------------------------------------- - -# Build process for mopro_core -build_mopro_core() { - cd "${MOPRO_ROOT}/mopro-core" || exit - print_action "Building mopro-core ($BUILD_MODE)..." - if [[ "$BUILD_MODE" == "release" ]]; then - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build --target "$ARCHITECTURE" --release --features "$CARGO_FEATURES" --no-default-features - else - env BUILD_CONFIG_PATH="$BUILD_CONFIG_PATH" cargo build --target "$ARCHITECTURE" --features "$CARGO_FEATURES" --no-default-features - fi -} - -build_mopro_ffi_static() { - cd "${MOPRO_ROOT}/mopro-ffi" || exit - print_action "Building mopro-ffi as a static library ($BUILD_MODE)..." - if [[ "$BUILD_MODE" == "release" ]]; then - cargo build --release --target "$ARCHITECTURE" --features "$CARGO_FEATURES" --no-default-features - else - cargo build --target "$ARCHITECTURE" --features "$CARGO_FEATURES" --no-default-features - fi - - # Ensure the target directory exists - mkdir -p "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}" - - # Copy the static library to the target directory - print_action "Copying static library to target directory..." - cp "${MOPRO_ROOT}/target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a" \ - "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy static library.${DEFAULT}" - exit 1 - fi -} - -build_mopro_ffi_with_dylib_circuit() { - cd "${MOPRO_ROOT}/mopro-ffi" || exit - print_action "Building mopro-ffi with dylib circuit ($BUILD_MODE)..." - - if [[ "$BUILD_MODE" == "release" ]]; then - cargo build --release --target "$ARCHITECTURE" --features dylib - else - cargo build --target "$ARCHITECTURE" --features dylib - fi - - # Ensure the target directory exists - mkdir -p "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}" - - # Copy the static library to the target directory - print_action "Copying static library to target directory..." - cp "${MOPRO_ROOT}/target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a" \ - "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy static library.${DEFAULT}" - exit 1 - fi - - # NOTE: Doesn't seem like we need this - # # Copy the dynamic library to the target directory - # print_action "Copying dynamic library to target directory..." - # cp "${MOPRO_ROOT}/target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.dylib" \ - # "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.dylib" - # if [ $? -ne 0 ]; then - # echo -e "${RED}Failed to copy dynamic library.${DEFAULT}" - # exit 1 - # fi - - print_action "Copying dylib circuit to target directory..." - cp "${MOPRO_ROOT}/mopro-core/target/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" \ - "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" - - if [ -z "${APPLE_SIGNING_IDENTITY+x}" ]; then - echo "${RED}APPLE_SIGNING_IDENTITY is not set.${DEFAULT}" - echo "${RED}Please set APPLE_SIGNING_IDENTITY to one of these identities.${DEFAULT}" - echo "${RED}`security find-identity -v -p codesigning`${DEFAULT}" - exit 1 - fi - install_name_tool -id "@rpath/${DYLIB_NAME}" "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" - codesign -f -s "${APPLE_SIGNING_IDENTITY}" "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" -} - -generate_swift_bindings() { - print_action "Generating Swift bindings..." - uniffi-bindgen generate "${MOPRO_ROOT}/mopro-ffi/src/mopro.udl" --language swift --out-dir "${TARGET_DIR}/SwiftBindings" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to generate Swift bindings.${DEFAULT}" - exit 1 - fi - - # Rename modulemap to module.modulemap - mv "${TARGET_DIR}/SwiftBindings/moproFFI.modulemap" "${TARGET_DIR}/SwiftBindings/module.modulemap" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to rename modulemap to module.modulemap.${DEFAULT}" - exit 1 - fi - - # Copy the mopro.swift file to the Bindings directory - cp "${TARGET_DIR}/SwiftBindings/mopro.swift" "${IOS_APP_DIR}/Bindings/mopro.swift" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy mopro.swift to Bindings directory.${DEFAULT}" - exit 1 - fi -} - -create_xcframework_mopro() { - print_action "Cleaning up existing MoproBindings XCFramework..." - MOPRO_XCFRAMEWORK_PATH="${IOS_APP_DIR}/Frameworks/MoproBindings.xcframework" - - # Clean up any existing MoproBindings XCFramework - if [ -d "$MOPRO_XCFRAMEWORK_PATH" ]; then - rm -rf "$MOPRO_XCFRAMEWORK_PATH" - fi - - print_action "Creating XCFramework for MoproBindings... (${ARCHITECTURE})" - xcodebuild -create-xcframework \ - -library "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a" \ - -headers "${TARGET_DIR}/SwiftBindings" \ - -output "$MOPRO_XCFRAMEWORK_PATH" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to create MoproBindings XCFramework.${DEFAULT}" - exit 1 - fi - - print_action "MoproBindings XCFramework created successfully" -} - -# NOTE: Earlier in the build process we converted .wasm to .dylib. -# This is done to comply with Apple's requirements for iOS apps. -# This currently only works on real devices. -create_xcframework_circuit() { - print_action "Cleaning up existing CircuitBindings XCFramework..." - CIRCUIT_XCFRAMEWORK_PATH="${IOS_APP_DIR}/Frameworks/CircuitBindings.xcframework" - - # Clean up any existing CircuitBindings XCFramework - if [ -d "$CIRCUIT_XCFRAMEWORK_PATH" ]; then - rm -rf "$CIRCUIT_XCFRAMEWORK_PATH" - fi - - print_action "Creating XCFramework for CircuitBindings dylib... (${ARCHITECTURE})" - xcodebuild -create-xcframework \ - -library "${TARGET_DIR}/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" \ - -output "$CIRCUIT_XCFRAMEWORK_PATH" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to create CircuitBindings XCFramework.${DEFAULT}" - exit 1 - fi - - print_action "CircuitBindings XCFramework created successfully" -} - -update_cocoapods() { - cd "${IOS_APP_DIR}" - pod install -} - -print_dylib_instructions() { - print_action "Instructions for how to embed the dylib framework into your iOS application:" - echo " -- Go to ExampleApp -> Build Phases -> Embed Framework and add it there -- You may have to add the framework manually for it to show up -- The dylib should not be linked under Link Binary with Libraries -- Make sure code signing is on -- The dylib should be available inside your app bundle under the Frameworks folder\n" -} - -# Main -#---------------------------------------------------------------------------- -main() { - PROJECT_DIR=$(pwd) - TARGET_DIR=${PROJECT_DIR}/target - IOS_APP_DIR=${PROJECT_DIR}/ios/ExampleApp - - initialize_environment "$@" - read_configuration "$1" - determine_architecture - determine_build_directory - select_features - - if [[ "$CIRCUIT_TYPE" == "halo2" ]]; then - setup_circuit_path_override - fi - - if [[ "$USE_DYLIB" == true ]]; then - build_mopro_ffi_with_dylib_circuit - else - build_mopro_ffi_static - fi - - generate_swift_bindings - create_xcframework_mopro - - if [[ "$USE_DYLIB" == true ]]; then - create_xcframework_circuit - print_dylib_instructions - fi - - update_cocoapods - - if [[ "$CIRCUIT_TYPE" == "halo2" ]]; then - remove_circuit_path_override - fi - - print_action "Done! Please re-build your project in Xcode." - print_action "Run \`open ios/ExampleApp/ExampleApp.xcworkspace\` to do so." -} - -main "$@" diff --git a/scripts/cli/build_web.sh b/scripts/cli/build_web.sh deleted file mode 100644 index b1d7e98..0000000 --- a/scripts/cli/build_web.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# Script for initializing and updating a web prover project. - -# Prelude -#---------------------------------------------------------------------------- -initialize_environment() { - if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 - fi - - if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 - fi - - if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 - fi - - source "${MOPRO_ROOT}/scripts/_prelude.sh" -} - -read_configuration() { - CONFIG_FILE="$1" - export BUILD_CONFIG_PATH="$PROJECT_DIR/$CONFIG_FILE" - print_action "Using build configuration file: $BUILD_CONFIG_PATH" - - CIRCUIT_DIR=$(read_toml "$CONFIG_FILE" "circuit.dir") - CIRCUIT_NAME=$(read_toml "$CONFIG_FILE" "circuit.name") -} - -# Function to read value from TOML file and remove quotes -read_toml() { - toml get "$1" "$2" | tr -d '"' -} - -copy_circuit_files() { - print_action "Copying circuit files..." - cp "${PROJECT_DIR}/${CIRCUIT_DIR}/target/${CIRCUIT_NAME}_js/${CIRCUIT_NAME}.wasm" "${WEB_APP_DIR}/public/${CIRCUIT_NAME}.wasm" - - cp "${PROJECT_DIR}/${CIRCUIT_DIR}/target/${CIRCUIT_NAME}_final.zkey" "${WEB_APP_DIR}/public/${CIRCUIT_NAME}_final.zkey" - if [ $? -ne 0 ]; then - echo -e "${RED}Failed to copy circuit files.${DEFAULT}" - exit 1 - fi -} - -npm_install() { - cd "${WEB_APP_DIR}" || exit - npm install - cd "${PROJECT_DIR}" || exit -} - -# Main -#---------------------------------------------------------------------------- -main() { - PROJECT_DIR=$(pwd) - TARGET_DIR=${PROJECT_DIR}/target - WEB_APP_DIR=${PROJECT_DIR}/web - - initialize_environment "$@" - read_configuration "$1" - - copy_circuit_files - npm_install - - print_action "Done! Please open the web app with \`cd web && npm run dev\`" -} - -main "$@" diff --git a/scripts/cli/install_deps.sh b/scripts/cli/install_deps.sh deleted file mode 100755 index df71771..0000000 --- a/scripts/cli/install_deps.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/bash - -# Script for installing required depenedencies for the project. - -# Prelude -#---------------------------------------------------------------------------- -initialize_environment() { - if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 - fi - - source "${MOPRO_ROOT}/scripts/_prelude.sh" -} - -# Define target architectures -TARGETS=( - x86_64-apple-ios - aarch64-apple-ios - aarch64-apple-ios-sim - aarch64-linux-android - armv7-linux-androideabi - i686-linux-android - x86_64-linux-android -) - -# Check for target support and add if necessary -#---------------------------------------------------------------------------- -add_target_support() { - local target - for target in "${TARGETS[@]}"; do - if ! rustup target list | grep installed | grep -q "$target"; then - rustup target add "$target" - else - echo "Target $target already installed, skipping." - fi - done -} - -# Download circuit artifacts -#---------------------------------------------------------------------------- - -# XXX: This is a bit of a hack, just to get mopro-core to compile -# This happens when we run mopro deps. We can probably improve on this. -download_files() { - local url="https://mopro.vivianjeng.xyz" - local dir=$1 - local circuit=$2 - local circuit_dir="${MOPRO_ROOT}/mopro-core/examples/circom" - local target_dir="${circuit_dir}/${dir}/target" - local js_target_dir="${target_dir}/${circuit}_js" - - # Create directories if they don't exist - mkdir -p "$target_dir" "$js_target_dir" - - # Check if file exists - # Download files to the specified directories - if ! [ -f "${target_dir}/${circuit}_final.arkzkey" ]; then - wget -P "$target_dir" "${url}/${circuit}_final.arkzkey" - else - echo "File ${circuit}_final.arkzkey already exists, skipping download." - fi - - if ! [ -f "${target_dir}/${circuit}_final.zkey" ]; then - wget -P "$target_dir" "${url}/${circuit}_final.zkey" - else - echo "File ${circuit}_final.zkey already exists, skipping download." - fi - - if ! [ -f "${js_target_dir}/${circuit}.wasm" ]; then - wget -P "$js_target_dir" "${url}/${circuit}.wasm" - else - echo "File ${circuit}.wasm already exists, skipping download." - fi -} - -# Check uniffi-bindgen version -#---------------------------------------------------------------------------- -check_uniffi_bindgen_version() { - local UNIFFI_VERSION - UNIFFI_VERSION=$(uniffi-bindgen --version | grep -oE '0\.25\.[0-9]+' || echo "not found") - local EXPECTED_VERSION_PREFIX="0.25" - if [[ $UNIFFI_VERSION != $EXPECTED_VERSION_PREFIX* ]]; then - echo -e "${RED}Error: uniffi-bindgen version is not 0.25.x. Current version: $(uniffi-bindgen --version)${DEFAULT}" - echo -e "${RED}Please uninstall uniffi-bindgen and run this script again.${DEFAULT}" - exit 1 - else - echo "uniffi-bindgen version is $UNIFFI_VERSION, which is acceptable." - fi -} - - -# Install required binaries -#---------------------------------------------------------------------------- -install_binary() { - local bin_path=$1 - local bin_name=$2 - local cargo_path=$3 - - cd "$bin_path" - if ! command -v "$bin_name" &> /dev/null; then - cargo install --bin "$bin_name" --path "$cargo_path" - else - echo "$bin_name already installed, skipping." - fi -} - -install_remote_binary() { - local bin_path=$1 - local bin_name=$2 - - if ! command -v "$bin_name" &> /dev/null; then - cargo install "$bin_name" - else - echo "$bin_name already installed, skipping." - fi -} - - -# Main -#---------------------------------------------------------------------------- -main() { - initialize_environment "$@" - - add_target_support - install_binary "${MOPRO_ROOT}/ark-zkey" "arkzkey-util" "." - download_files "multiplier2" "multiplier2" - download_files "keccak256" "keccak256_256_test" - install_binary "${MOPRO_ROOT}/mopro-ffi" "uniffi-bindgen" "." - install_remote_binary "toml" "toml-cli" - check_uniffi_bindgen_version - - print_warning "There are more platform-specific dependencies to be installed." - print_warning "See mopro README.md for details." - print_action "Done! You may now initialize or build your project." -} - -main "$@" \ No newline at end of file diff --git a/scripts/cli/prepare.sh b/scripts/cli/prepare.sh deleted file mode 100755 index 192026d..0000000 --- a/scripts/cli/prepare.sh +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/bash - -# Script to build and prepare circuits for mopro. -# -# Does the following: -# - Install npm dependencies and compiles the circuit -# - Run trusted setup -# - Generate arkzkey - -# Initialize environment and check prerequisites -initialize_environment() { - if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 - fi - - if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 - fi - - if ! command -v arkzkey-util &> /dev/null; then - echo "Error: arkzkey-util command is not available." - exit 1 - fi - - if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 - fi - - source "${MOPRO_ROOT}/scripts/_prelude.sh" -} - -# Function to validate TOML syntax and structure -validate_toml() { - local toml_file="$1" - if ! command -v toml >/dev/null; then - echo -e "${RED}'toml' (toml-cli) command not found. Please install it to continue.${DEFAULT}" - exit 1 - fi - - local error_file=$(mktemp) - if ! toml get "$toml_file" "build" > /dev/null 2> "$error_file"; then - local error_message=$(<"$error_file") - echo -e "${RED}TOML parse error in $toml_file:${DEFAULT}\n$error_message" - rm "$error_file" - exit 1 - fi - rm "$error_file" -} - -# Read configuration from TOML file -read_configuration() { - CONFIG_FILE="$1" - export BUILD_CONFIG_PATH="$PWD/$CONFIG_FILE" - print_action "Using build configuration file: $BUILD_CONFIG_PATH" - - validate_toml "$CONFIG_FILE" - - BUILD_MODE=$(read_toml "$CONFIG_FILE" "build.build_mode") - USE_DYLIB=$(read_toml "$CONFIG_FILE" "dylib.use_dylib") - DYLIB_NAME=$(read_toml "$CONFIG_FILE" "dylib.name") - CIRCUIT_TYPE=$(read_toml "$CONFIG_FILE" "circuit.adapter") - CIRCUIT_DIR=$(read_toml "$CONFIG_FILE" "circuit.dir") - CIRCUIT_NAME=$(read_toml "$CONFIG_FILE" "circuit.name") - CIRCUIT_PTAU=$(read_toml "$CONFIG_FILE" "circuit.ptau") - - OUTPUT_DIR="${CIRCUIT_DIR}/target" -} - -# Function to read value from TOML file and remove quotes -read_toml() { - local value=$(toml get "$1" "$2" 2>/dev/null || true) - - if [ -z "$value" ]; then - echo -e "${RED}Error: Key '$2' not found in $1${DEFAULT}" >&2 - exit 1 - fi - - echo "$value" | tr -d '"' -} - -# Install npm dependencies -npm_install() { - if [[ -f "${CIRCUIT_DIR}/package.json" && ! -d "${CIRCUIT_DIR}/node_modules" ]]; then - echo "Installing npm dependencies for $CIRCUIT_DIR..." - (cd "${CIRCUIT_DIR}" && npm install) - fi -} - -# Compile the circuit -circom_compile_circuit() { - print_action "Compiling circuit $CIRCUIT_NAME..." - local circuit_file_path="${CIRCUIT_DIR}/${CIRCUIT_NAME}.circom" - - # Ensure output dir exists - mkdir -p "$OUTPUT_DIR" - - # Compile the circuit using circom - circom "$circuit_file_path" --r1cs --wasm --sym --output "$OUTPUT_DIR" -} - -# Trusted setup for the circuit -circom_trusted_setup() { - print_action "Running trusted setup for $CIRCUIT_NAME..." - - # Change this is if you keep your Powers of Tau files elsewhere - local ptau_dir="ptau" - local ptau="${CIRCUIT_PTAU}" - local ptau_path="${ptau_dir}/powersOfTau28_hez_final_${ptau}.ptau" - local zkey_output="${OUTPUT_DIR}/${CIRCUIT_NAME}_final.zkey" - - # Ensure the ptau directory exists - mkdir -p "$ptau_dir" - - # Phase 1 - Perpetual Powers of Tau - # From https://github.com/iden3/snarkjs - - # Download the Powers of Tau file if it doesn't exist - if [ ! -f "$ptau_path" ]; then - echo "Downloading Powers of Tau file..." - wget -P "$ptau_dir" "https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_${ptau}.ptau" - else - echo "File $ptau_path already exists, skipping download." - fi - - # Phase 2 - Circuit specific setup - # Toy example, not for production use - # For a real deployment with Groth16 use a tool like p0tion for phase 2 trusted setup - # See https://github.com/privacy-scaling-explorations/p0tion - - echo "Generate zkey file for ${CIRCUIT_NAME}..." - if [ ! -f "$zkey_output" ]; then - snarkjs groth16 setup "${OUTPUT_DIR}/${CIRCUIT_NAME}.r1cs" "$ptau_path" "${OUTPUT_DIR}/${CIRCUIT_NAME}_0000.zkey" - snarkjs zkey contribute "${OUTPUT_DIR}/${CIRCUIT_NAME}_0000.zkey" "$zkey_output" \ - --name="Demo contributor" -v -e="0xdeadbeef" - else - echo "File $zkey_output already exists, skipping." - fi - - echo "Trusted setup done, zkey file is in $zkey_output" -} - -# Generate arkzkey for the circuit -circom_generate_arkzkey() { - local ZKEY_PATH="${OUTPUT_DIR}/${CIRCUIT_NAME}_final.zkey" - local ARKZKEY_PATH="${OUTPUT_DIR}/${CIRCUIT_NAME}_final.arkzkey" - - print_action "Generating arkzkey for $CIRCUIT_NAME..." - - echo "Generate arkzkey file for ${CIRCUIT_NAME}..." - if [ ! -f "$ARKZKEY_PATH" ]; then - arkzkey-util "${ZKEY_PATH}" - else - echo "File $ZKEY_PATH already exists, skipping." - fi - - echo "Arkzkey generation done, arkzkey file is in $ARKZKEY_PATH" -} - -# Generate keys for Halo2 circuit -halo2_generate_keys() { - # Execute the cargo run command to generate the keys for the circuit - # The project is in the CIRCUIT_DIR and the executable is CIRCUIT_NAME - - # Change to the circuit directory, first check if the directory exists - if [ ! -d "$CIRCUIT_DIR" ]; then - echo "Error: Circuit directory $CIRCUIT_DIR does not exist." - exit 1 - fi - - cd "$CIRCUIT_DIR" || exit - - local circuit_srs_path="out/${CIRCUIT_NAME}_srs" - local circuit_pk_path="out/${CIRCUIT_NAME}_pk" - local circuit_vk_path="out/${CIRCUIT_NAME}_vk" - - # Check if all keys already exist - if [ -f "$circuit_srs_path" ] && [ -f "$circuit_pk_path" ] && [ -f "$circuit_vk_path" ]; then - echo "Keys for the circuit $CIRCUIT_NAME already exist." - echo "Skipping the key generation step." - return - fi - - # Check if the circuit binary exists - # Execute the cargo run command to generate the keys for the circuit - # Handle errors if the cargo command fails - if ! cargo run --release --bin "$CIRCUIT_NAME"; then - echo "Error: Failed to generate keys using the circuit's binary '$CIRCUIT_NAME'." - echo "Consider either adding the necessary code to the circuit's binary to generate the keys" - echo "or generate the keys manually and skip the `prepare` step." - echo "Make sure the following key files exist:" - echo " - ${CIRCUIT_DIR}/${circuit_srs_path})" - echo " - ${CIRCUIT_DIR}/${circuit_pk_path})" - echo " - ${CIRCUIT_DIR}/${circuit_vk_path})" - - exit 1 - fi -} - - - -# Main function to orchestrate the script -main() { - - initialize_environment "$@" - read_configuration "$1" - - if [ "$CIRCUIT_TYPE" == "halo2" ]; then - halo2_generate_keys - else - npm_install - circom_compile_circuit - circom_trusted_setup - circom_generate_arkzkey - fi - - print_action "Circuit and its artifacts built successfully." -} - -main "$@" \ No newline at end of file diff --git a/scripts/cli/update.sh b/scripts/cli/update.sh deleted file mode 100755 index 18594f9..0000000 --- a/scripts/cli/update.sh +++ /dev/null @@ -1,171 +0,0 @@ -#!/bin/bash - -# NOTE: Like update_bindings.sh but for updating a project -# At some point these scripts will be consolidated - -# Check if MOPRO_ROOT is set -if [ -z "$MOPRO_ROOT" ]; then - echo "MOPRO_ROOT is not set. Please set it to your local mopro repository." - exit 1 -fi - -# Source the script prelude -source "${MOPRO_ROOT}/scripts/_prelude.sh" - -# Check if toml-cli is installed -if ! command -v toml &> /dev/null; then - echo -e "${RED}toml (toml-cli) is not installed. Please install it to continue.${DEFAULT}" - exit 1 -fi - -# Function to read value from TOML file and remove quotes -read_toml() { - toml get "$1" "$2" | tr -d '"' -} - -# NOTE: This is quite noisy so turning off by default -# Coloring the -x output (commands) -DEBUG_COLOR="${DEFAULT}" -trap 'echo -e ${DEBUG_COLOR}${BASH_COMMAND}${DEFAULT}' DEBUG - -# Check if a configuration file was passed as an argument -if [ "$#" -ne 1 ]; then - echo -e "\n${RED}Usage: $0 path/to/config.toml${DEFAULT}" - exit 1 -fi - -# Read the path to the TOML configuration file from the first argument -CONFIG_FILE="$1" - -# XXX: This isn't necessarily propagated to `cargo build` build process, -# so we pass it explicitly. Consider using `source` instead of `export`. -# Export the configuration file path as an environment variable -export BUILD_CONFIG_PATH="$(pwd)/$CONFIG_FILE" - -# Print which configuration file is being used -echo "Using build configuration file: $BUILD_CONFIG_PATH" - -# Read configurations from TOML file -DEVICE_TYPE=$(read_toml "$CONFIG_FILE" "build.ios_device_type") -BUILD_MODE=$(read_toml "$CONFIG_FILE" "build.build_mode") -USE_DYLIB=$(read_toml "$CONFIG_FILE" "dylib.use_dylib") -DYLIB_NAME=$(read_toml "$CONFIG_FILE" "dylib.name") - -# # Assert we're in the project root -# if [[ ! -d "mopro-ffi" || ! -d "mopro-core" ]]; then -# echo -e "${RED}Error: This script must be run from the project root directory that contains mopro-ffi and mopro-core folders.${DEFAULT}" -# exit 1 -# fi - -# Determine architecture based on device type -case $DEVICE_TYPE in - "x86_64") - ARCHITECTURE="x86_64-apple-ios" - ;; - "simulator") - ARCHITECTURE="aarch64-apple-ios-sim" - ;; - "device") - ARCHITECTURE="aarch64-apple-ios" - ;; - *) - echo -e "${RED}Error: Invalid device type specified in config: $DEVICE_TYPE${DEFAULT}" - exit 1 - ;; -esac - -# Determine library directory based on build mode -case $BUILD_MODE in - "debug") - LIB_DIR="debug" - ;; - "release") - LIB_DIR="release" - ;; - *) - echo -e "${RED}Error: Invalid build mode specified in config: $BUILD_MODE${DEFAULT}" - exit 1 - ;; -esac - -# Check dylib usage and name -if [[ "$USE_DYLIB" == true ]]; then - if [[ -z "$DYLIB_NAME" ]]; then - echo -e "${RED}Error: Dylib name not specified in config while 'use_dylib' is set to true.${DEFAULT}" - exit 1 - fi -fi - -print_action "Updating mopro-ffi bindings and library ($BUILD_MODE $DEVICE_TYPE)..." - -PROJECT_DIR=$(pwd) -TARGET_DIR=${PROJECT_DIR}/target -MOPROKIT_DIR=${PROJECT_DIR}/ios/MoproKit - -# Dylib directory and settings -if [[ "$USE_DYLIB" == true ]]; then - mkdir -p ${TARGET_DIR}/${ARCHITECTURE}/${BUILD_MODE} - export TARGET_DIR - export BUILD_MODE -fi - -# NOTE: Here we assume mopro.udl stays the same, for adjusting this we need to -# Expand core to also include the udl file with mopro-ffi etc - -# Generate Swift bindings -print_action "Generating Swift bindings..." -uniffi-bindgen generate ${MOPRO_ROOT}/mopro-ffi/src/mopro.udl --language swift --out-dir ${TARGET_DIR}/SwiftBindings - -# Build mopro-ffi -cd "${MOPRO_ROOT}/mopro-ffi" -if [[ "$USE_DYLIB" == true ]]; then - # Build dylib - print_action "Building mopro-ffi with dylib flag ($BUILD_MODE)..." - if [[ "$BUILD_MODE" == "debug" ]]; then - cargo build --target ${ARCHITECTURE} --features dylib - elif [[ "$BUILD_MODE" == "release" ]]; then - cargo build --release --target ${ARCHITECTURE} --features dylib - fi -else - print_action "Building mopro-ffi static library ($BUILD_MODE)..." - if [[ "$BUILD_MODE" == "debug" ]]; then - cargo build --target ${ARCHITECTURE} - elif [[ "$BUILD_MODE" == "release" ]]; then - cargo build --release --target ${ARCHITECTURE} - fi -fi - -# Print appropriate message based on device type -if [[ "$DEVICE_TYPE" == "x86_64" ]]; then - print_action "Using $ARCHITECTURE libmopro_ffi.a ($LIB_DIR) static library..." - print_warning "This only works on iOS simulator (x86_64)" -elif [[ "$DEVICE_TYPE" == "simulator" ]]; then - print_action "Using $ARCHITECTURE libmopro_ffi.a ($LIB_DIR) static library..." - print_warning "This only works on iOS simulator (ARM64)" -elif [[ "$DEVICE_TYPE" == "device" ]]; then - print_action "Using $ARCHITECTURE libmopro_ffi.a ($LIB_DIR) static library..." - print_warning "This only works on iOS devices (ARM64)" -fi - -cp ${MOPRO_ROOT}/target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.a ${TARGET_DIR}/ - -# TODO: Also include export command, separate fro mthis probably -print_action "Copying Swift bindings and static library to MoproKit..." -cp ${TARGET_DIR}/SwiftBindings/moproFFI.h ${MOPROKIT_DIR}/Include/ -cp ${TARGET_DIR}/SwiftBindings/mopro.swift ${MOPROKIT_DIR}/Bindings/ -cp ${TARGET_DIR}/SwiftBindings/moproFFI.modulemap ${MOPROKIT_DIR}/Resources/ -cp ${TARGET_DIR}/libmopro_ffi.a ${MOPROKIT_DIR}/Libs/ - -# TODO: Improve CLI, positional arguments a bit messy -# Dylib assets -if [[ "$USE_DYLIB" == true ]]; then - print_action "Copying dynamic library asset (${DYLIB_NAME})..." - cp "${PROJECT_DIR}/target/${ARCHITECTURE}/${LIB_DIR}/${DYLIB_NAME}" "${TARGET_DIR}/" - cp "${TARGET_DIR}/${DYLIB_NAME}" "${MOPROKIT_DIR}/Libs/" - # Fix dynamic lib install paths - # NOTE: Xcode might already do this for us; verify this - install_name_tool -id "@rpath/${DYLIB_NAME}" "${MOPROKIT_DIR}/Libs/${DYLIB_NAME}" - codesign -f -s "${APPLE_SIGNING_IDENTITY}" "${MOPROKIT_DIR}/Libs/${DYLIB_NAME}" -fi - -print_action "Done! Please re-build your project in Xcode." \ No newline at end of file diff --git a/scripts/prepare.sh b/scripts/prepare.sh deleted file mode 100755 index 494f085..0000000 --- a/scripts/prepare.sh +++ /dev/null @@ -1,183 +0,0 @@ -#!/bin/bash - -# Source the script prelude -source "scripts/_prelude.sh" - -# Assert we're in the project root -if [[ ! -d "mopro-ffi" || ! -d "mopro-core" ]]; then - echo -e "${RED}Error: This script must be run from the project root directory that contains mopro-ffi and mopro-core folders.${DEFAULT}" - exit 1 -fi - -PROJECT_DIR=$(pwd) -CIRCOM_DIR="${PROJECT_DIR}/mopro-core/examples/circom" -HALO2_DIR="${PROJECT_DIR}/mopro-core/examples/halo2" -ARKZKEY_DIR="${PROJECT_DIR}/ark-zkey" - -compile_circuit() { - local circuit_dir=$1 - local circuit_file=$2 - local target_file="$circuit_dir/target/$(basename $circuit_file .circom).r1cs" - - print_action "[core/circom] Compiling $circuit_file example circuit..." - if [ ! -f "$target_file" ]; then - ./scripts/compile.sh $circuit_dir $circuit_file - else - echo "File $target_file already exists, skipping compilation." - fi -} - -npm_install() { - local circuit_dir=$1 - - if [[ ! -d "$circuit_dir/node_modules" ]]; then - echo "Installing npm dependencies for $circuit_dir..." - (cd "${circuit_dir}" && npm install) - fi -} - -# Check for target support -check_target_support() { - rustup target list | grep installed | grep -q "$1" -} - -# Generate keys for Halo2 circuit -halo2_generate_keys() { - local circuit_dir=$1 - local circuit_name=$2 - # Execute the cargo run command to generate the keys for the circuit - # The project is in the circuit_dir and the executable is circuit_name - - # Change to the circuit directory, first check if the directory exists - if [ ! -d "$circuit_dir" ]; then - echo "Error: Circuit directory $circuit_dir does not exist." - exit 1 - fi - - cd $circuit_dir - - # Generate the keys running the cargo command on the circuit binary - cargo run --release --bin $circuit_name -} - -# Install arkzkey-util binary in ark-zkey -cd "${ARKZKEY_DIR}" -print_action "[ark-zkey] Installing arkzkey-util..." -if ! command -v arkzkey-util &> /dev/null -then - cargo install --bin arkzkey-util --path . -else - echo "arkzkey-util already installed, skipping." -fi - -# Build Circom circuits in mopro-core and run trusted setup -print_action "[core/circom] Compiling example circuits..." -cd "${CIRCOM_DIR}" - -# Compile multiplier2 -compile_circuit multiplier2 multiplier2.circom - -# Setup and compile keccak256 -npm_install keccak256 -compile_circuit keccak256 keccak256_256_test.circom - -# Setup and compile rsa -npm_install rsa -compile_circuit rsa main.circom - -# # Setup and compile anonAadhaar -# npm_install anonAadhaar -# compile_circuit anonAadhaar aadhaar-verifier.circom - -# # Setup and compile complex-circuit -# npm_install complex-circuit -# compile_circuit complex-circuit complex-circuit-1000k-1000k.circom - -# Run trusted setup for multiplier2 -print_action "[core/circom] Running trusted setup for multiplier2..." -./scripts/trusted_setup.sh multiplier2 08 multiplier2 - -# Generate arkzkey for multipler2 -print_action "[core/circom] Generating arkzkey for multiplier2..." -./scripts/generate_arkzkey.sh multiplier2 multiplier2 - -# Run trusted setup for keccak256 -print_action "[core/circom] Running trusted setup for keccak256..." -./scripts/trusted_setup.sh keccak256 18 keccak256_256_test - -# Generate arkzkey for keccak256 -print_action "[core/circom] Generating arkzkey for keccak256..." -./scripts/generate_arkzkey.sh keccak256 keccak256_256_test - -# Run trusted setup for rsa -print_action "[core/circom] Running trusted setup for rsa..." -./scripts/trusted_setup.sh rsa 18 main - -# Generate arkzkey for rsa -print_action "[core/circom] Generating arkzkey for rsa..." -./scripts/generate_arkzkey.sh rsa main - -# # Run trusted setup for anonAadhaar -# print_action "[core/circom] Running trusted setup for anonAadhaar..." -# ./scripts/trusted_setup.sh anonAadhaar 20 aadhaar-verifier - -# # Generate arkzkey for anonAadhaar -# print_action "[core/circom] Generating arkzkey for anonAadhaar..." -# ./scripts/generate_arkzkey.sh anonAadhaar aadhaar-verifier - -# # Run trusted setup for complex circuit -# print_action "[core/circom] Running trusted setup for complex circuit..." -# ./scripts/trusted_setup.sh complex-circuit 21 complex-circuit-1000k-1000k - -# # Generate arkzkey for complex circuit -# print_action "[core/circom] Generating arkzkey for complex circuit..." -# ./scripts/generate_arkzkey.sh complex-circuit complex-circuit-1000k-1000k - -print_action "[core/halo2] Compiling example circuits...." -cd "${HALO2_DIR}" -print_action "[core/halo2] Compiling fibonacci circuits..." -halo2_generate_keys fibonacci fibonacci - -# Add support for target architectures -print_action "[ffi] Adding support for target architectures..." -cd "${PROJECT_DIR}/mopro-ffi" - -for target in x86_64-apple-ios aarch64-apple-ios aarch64-apple-ios-sim aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android; do - if ! check_target_support $target; then - rustup target add $target - else - echo "Target $target already installed, skipping." - fi -done - -# Install uniffi-bindgen binary in mopro-ffi -print_action "[ffi] Installing uniffi-bindgen..." -if ! command -v uniffi-bindgen &> /dev/null -then - cargo install --bin uniffi-bindgen --path . -else - echo "uniffi-bindgen already installed, skipping." -fi - -# Install toml-cli binary -print_action "[config] Installing toml-cli..." -if ! command -v toml &> /dev/null -then - cargo install toml-cli -else - echo "toml already installed, skipping." -fi - -# Check uniffi-bindgen version -print_action "[ffi] Checking uniffi-bindgen version..." -UNIFFI_VERSION=$(uniffi-bindgen --version | grep -oE '0\.25\.[0-9]+' || echo "not found") -EXPECTED_VERSION_PREFIX="0.25" -if [[ $UNIFFI_VERSION != $EXPECTED_VERSION_PREFIX* ]]; then - echo -e "${RED}Error: uniffi-bindgen version is not 0.25.x. Current version: $(uniffi-bindgen --version)${DEFAULT}" - echo -e "${RED}Please uninstall uniffi-bindgen and run this script again.${DEFAULT}" - exit 1 -else - echo "uniffi-bindgen version is $UNIFFI_VERSION, which is acceptable." -fi - -print_action "Done! Please run './scripts/build_ios.sh config-example.toml' to build for iOS." \ No newline at end of file diff --git a/scripts/prepare_ci.sh b/scripts/prepare_ci.sh deleted file mode 100755 index 1d9e844..0000000 --- a/scripts/prepare_ci.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash - -# Source the script prelude -source "scripts/_prelude.sh" - -# Assert we're in the project root -if [[ ! -d "mopro-ffi" || ! -d "mopro-core" ]]; then - echo -e "${RED}Error: This script must be run from the project root directory that contains mopro-ffi and mopro-core folders.${DEFAULT}" - exit 1 -fi - -PROJECT_DIR=$(pwd) -CIRCOM_DIR="${PROJECT_DIR}/mopro-core/examples/circom" -HALO2_DIR="${PROJECT_DIR}/mopro-core/examples/halo2" - -compile_circuit() { - local circuit_dir=$1 - local circuit_file=$2 - local target_file="$circuit_dir/target/$(basename $circuit_file .circom).r1cs" - - print_action "[core/circom] Compiling $circuit_file example circuit..." - if [ ! -f "$target_file" ]; then - ./scripts/compile.sh $circuit_dir $circuit_file - else - echo "File $target_file already exists, skipping compilation." - fi -} - -npm_install() { - local circuit_dir=$1 - - if [[ ! -d "$circuit_dir/node_modules" ]]; then - echo "Installing npm dependencies for $circuit_dir..." - (cd "${circuit_dir}" && npm install) - fi -} - -# Check for target support -check_target_support() { - rustup target list | grep installed | grep -q "$1" -} - -download_files() { - local url="https://mopro.vivianjeng.xyz" - local dir=$1 - local circuit=$2 - local target_dir="${CIRCOM_DIR}/${dir}/target" - local js_target_dir="${target_dir}/${circuit}_js" - - # Create directories if they don't exist - mkdir -p "$target_dir" "$js_target_dir" - - # Check if file exists - # Download files to the specified directories - if ! [ -f "${target_dir}/${circuit}_final.arkzkey" ]; then - wget -P "$target_dir" "${url}/${circuit}_final.arkzkey" - else - echo "File ${circuit}_final.arkzkey already exists, skipping download." - fi - - if ! [ -f "${target_dir}/${circuit}_final.zkey" ]; then - wget -P "$target_dir" "${url}/${circuit}_final.zkey" - else - echo "File ${circuit}_final.zkey already exists, skipping download." - fi - - if ! [ -f "${js_target_dir}/${circuit}.wasm" ]; then - wget -P "$js_target_dir" "${url}/${circuit}.wasm" - else - echo "File ${circuit}.wasm already exists, skipping download." - fi - -} - -# Generate keys for Halo2 circuit -halo2_generate_keys() { - local circuit_dir=$1 - local circuit_name=$2 - # Execute the cargo run command to generate the keys for the circuit - # The project is in the circuit_dir and the executable is circuit_name - - # Change to the circuit directory, first check if the directory exists - if [ ! -d "$circuit_dir" ]; then - echo "Error: Circuit directory $circuit_dir does not exist." - exit 1 - fi - - cd $circuit_dir - - # Generate the keys running the cargo command on the circuit binary - cargo run --release --bin $circuit_name -} - -# TODO: Comment out compile_circuit stuff again once zkey is integrated and we don't need r1cs file anymore - -# NOTE: On CI instead of compiling circuits and running trusted setup -# We just download test artifacts and use these -# We thus skip all of the below steps that are run locally in `prepare.sh` -print_action "[core/circom] Downloading artifacts for example circuits..." - -# Build Circom circuits in mopro-core and run trusted setup -print_action "[core/circom] Compiling example circuits..." -cd "${CIRCOM_DIR}" - -# Compile multiplier2 -compile_circuit multiplier2 multiplier2.circom - -# Setup and compile keccak256 -npm_install keccak256 -compile_circuit keccak256 keccak256_256_test.circom - -# Setup and compile rsa -npm_install rsa -compile_circuit rsa main.circom - -# # Run trusted setup for multiplier2 -# print_action "[core/circom] Running trusted setup for multiplier2..." -# ./scripts/trusted_setup.sh multiplier2 08 multiplier2 -# -# # Run trusted setup for keccak256 -# print_action "[core/circom] Running trusted setup for keccak256..." -# ./scripts/trusted_setup.sh keccak256 18 keccak256_256_test - -print_action "[core/circom] Downloading artifacts for multiplier2..." -download_files "multiplier2" "multiplier2" - -print_action "[core/circom] Downloading artifacts for keccak256..." -download_files "keccak256" "keccak256_256_test" - -print_action "[core/circom] Downloading artifacts for rsa..." -download_files "rsa" "main" - -print_action "[core/halo2] Compiling example circuits...." -cd "${HALO2_DIR}" -print_action "[core/halo2] Compiling fibonacci circuits..." -halo2_generate_keys fibonacci fibonacci - -# Add support for target architectures -print_action "[ffi] Adding support for target architectures..." -cd "${PROJECT_DIR}/mopro-ffi" - -for target in x86_64-apple-ios aarch64-apple-ios aarch64-apple-ios-sim aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android; do - if ! check_target_support $target; then - rustup target add $target - else - echo "Target $target already installed, skipping." - fi -done - -# Install toml-cli binary -print_action "[config] Installing toml-cli..." -if ! command -v toml &> /dev/null -then - cargo install toml-cli -else - echo "toml already installed, skipping." -fi - -# Install uniffi-bindgen binary in mopro-ffi -print_action "[ffi] Installing uniffi-bindgen..." -if ! command -v uniffi-bindgen &> /dev/null -then - cargo install --bin uniffi-bindgen --path . -else - echo "uniffi-bindgen already installed, skipping." -fi - -print_action "Done! Please run ./scripts/buld_ios.sh to build for iOS." diff --git a/templates/mopro-example-app/.gitignore b/templates/mopro-example-app/.gitignore deleted file mode 100644 index 66964a7..0000000 --- a/templates/mopro-example-app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -ptau -target/ \ No newline at end of file diff --git a/templates/mopro-example-app/Cargo.toml b/templates/mopro-example-app/Cargo.toml deleted file mode 100644 index 1119828..0000000 --- a/templates/mopro-example-app/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[workspace] -members = ["core", "core/circuits/halo2-fibonacci"] -resolver = "2" - -[patch.crates-io] -# NOTE: Forked wasmer to work around memory limits -# See https://github.com/wasmerio/wasmer/commit/09c7070 -wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } diff --git a/templates/mopro-example-app/README.md b/templates/mopro-example-app/README.md deleted file mode 100644 index 797df93..0000000 --- a/templates/mopro-example-app/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# mopro-example-app - -This is an example project generated by `mopro-cli`. - -## Documentation - -See https://github.com/zkmopro/mopro - -## Usage - -### Prepare - -See https://github.com/zkmopro/mopro?tab=readme-ov-file#how-to-use - -### Build - -`mopro build` or `mopro build --platforms ios` - -### Test - -`mopro test` \ No newline at end of file diff --git a/templates/mopro-example-app/android/.gitignore b/templates/mopro-example-app/android/.gitignore deleted file mode 100644 index 10cfdbf..0000000 --- a/templates/mopro-example-app/android/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties diff --git a/templates/mopro-example-app/android/app/.gitignore b/templates/mopro-example-app/android/app/.gitignore deleted file mode 100644 index 78524dd..0000000 --- a/templates/mopro-example-app/android/app/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/build -**/jniLibs/ -**/java/uniffi/ diff --git a/templates/mopro-example-app/android/app/build.gradle.kts b/templates/mopro-example-app/android/app/build.gradle.kts deleted file mode 100644 index cef9f03..0000000 --- a/templates/mopro-example-app/android/app/build.gradle.kts +++ /dev/null @@ -1,70 +0,0 @@ -plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") -} - -android { - namespace = "com.example.mopro" - compileSdk = 34 - - defaultConfig { - applicationId = "com.example.mopro" - minSdk = 24 - targetSdk = 34 - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = "1.8" - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.3" - } - packaging { - resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" - } - } -} - -dependencies { - - implementation("net.java.dev.jna:jna:5.13.0@aar") - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose:1.7.0") - implementation(platform("androidx.compose:compose-bom:2023.03.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") -} \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/proguard-rules.pro b/templates/mopro-example-app/android/app/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/templates/mopro-example-app/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/androidTest/java/com/example/mopro/ExampleInstrumentedTest.kt b/templates/mopro-example-app/android/app/src/androidTest/java/com/example/mopro/ExampleInstrumentedTest.kt deleted file mode 100644 index cf4e6bf..0000000 --- a/templates/mopro-example-app/android/app/src/androidTest/java/com/example/mopro/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.mopro - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.mopro", appContext.packageName) - } -} \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/AndroidManifest.xml b/templates/mopro-example-app/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 58ecccc..0000000 --- a/templates/mopro-example-app/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/KeccakComponent.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/KeccakComponent.kt deleted file mode 100644 index b40c565..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/KeccakComponent.kt +++ /dev/null @@ -1,349 +0,0 @@ -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import uniffi.mopro.GenerateProofResult -import uniffi.mopro.generateProofStatic -import uniffi.mopro.initializeMopro -import uniffi.mopro.verifyProofStatic - -@Composable -fun KeccakComponent() { - var initTime by remember { mutableStateOf("init time:") } - var provingTime by remember { mutableStateOf("proving time:") } - var verifyingTime by remember { mutableStateOf("verifying time: ") } - var valid by remember { mutableStateOf("valid:") } - var res by remember { - mutableStateOf( - GenerateProofResult(proof = ByteArray(size = 0), inputs = ByteArray(size = 0)) - ) - } - - val inputs = mutableMapOf>() - inputs["in"] = - listOf( - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "1", - "0", - "1", - "0", - "0", - "1", - "1", - "0", - "1", - "1", - "0", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "1", - "0", - "1", - "1", - "1", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ) - - Box(modifier = Modifier.fillMaxSize().padding(16.dp), contentAlignment = Alignment.Center) { - Button( - onClick = { - Thread( - Runnable { - val startTime = System.currentTimeMillis() - initializeMopro() - val endTime = System.currentTimeMillis() - initTime = - "init time: " + - (endTime - startTime).toString() + - " ms" - } - ) - .start() - }, - modifier = Modifier.padding(bottom = 80.dp) - ) { Text(text = "init") } - Button( - onClick = { - Thread( - Runnable { - val startTime = System.currentTimeMillis() - res = generateProofStatic(inputs) - val endTime = System.currentTimeMillis() - provingTime = - "proving time: " + - (endTime - startTime).toString() + - " ms" - } - ) - .start() - }, - modifier = Modifier.padding(top = 20.dp) - ) { Text(text = "generate proof") } - Button( - onClick = { - val startTime = System.currentTimeMillis() - valid = "valid: " + verifyProofStatic(res.proof, res.inputs).toString() - val endTime = System.currentTimeMillis() - verifyingTime = "verifying time: " + (endTime - startTime).toString() + " ms" - }, - modifier = Modifier.padding(top = 120.dp) - ) { Text(text = "verify proof") } - Text( - text = "Keccak256 proof", - modifier = Modifier.padding(bottom = 180.dp), - fontWeight = FontWeight.Bold - ) - - Text(text = initTime, modifier = Modifier.padding(top = 200.dp).width(200.dp)) - Text(text = provingTime, modifier = Modifier.padding(top = 250.dp).width(200.dp)) - Text(text = valid, modifier = Modifier.padding(top = 300.dp).width(200.dp)) - Text(text = verifyingTime, modifier = Modifier.padding(top = 350.dp).width(200.dp)) - } -} \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MainActivity.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MainActivity.kt deleted file mode 100644 index 3f9de21..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MainActivity.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.mopro - -import KeccakComponent -import MultiplierComponent -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.ui.Modifier -import com.example.mopro.ui.theme.moproTheme - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContent { - moproTheme { - - // A surface container using the 'background' color from the theme - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { - MultiplierComponent() - //KeccakComponent() - } - } - } - } -} diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MultiplierComponent.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MultiplierComponent.kt deleted file mode 100644 index baed07d..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/MultiplierComponent.kt +++ /dev/null @@ -1,95 +0,0 @@ -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import uniffi.mopro.GenerateProofResult -import uniffi.mopro.generateProofStatic -import uniffi.mopro.initializeMopro -import uniffi.mopro.verifyProofStatic - -@Composable -fun MultiplierComponent() { - var initTime by remember { mutableStateOf("init time:") } - var provingTime by remember { mutableStateOf("proving time:") } - var verifyingTime by remember { mutableStateOf("verifying time: ") } - var valid by remember { mutableStateOf("valid:") } - var output by remember { mutableStateOf("output:") } - var res by remember { - mutableStateOf( - GenerateProofResult(proof = ByteArray(size = 0), inputs = ByteArray(size = 0)) - ) - } - - val inputs = mutableMapOf>() - inputs["a"] = listOf("3") - inputs["b"] = listOf("5") - - Box(modifier = Modifier.fillMaxSize().padding(16.dp), contentAlignment = Alignment.Center) { - Button( - onClick = { - Thread( - Runnable { - val startTime = System.currentTimeMillis() - initializeMopro() - val endTime = System.currentTimeMillis() - initTime = - "init time: " + - (endTime - startTime).toString() + - " ms" - } - ) - .start() - }, - modifier = Modifier.padding(bottom = 80.dp) - ) { Text(text = "init") } - Button( - onClick = { - Thread( - Runnable { - val startTime = System.currentTimeMillis() - res = generateProofStatic(inputs) - val endTime = System.currentTimeMillis() - provingTime = - "proving time: " + - (endTime - startTime).toString() + - " ms" - } - ) - .start() - }, - modifier = Modifier.padding(top = 20.dp) - ) { Text(text = "generate proof") } - Button( - onClick = { - val startTime = System.currentTimeMillis() - valid = "valid: " + verifyProofStatic(res.proof, res.inputs).toString() - val endTime = System.currentTimeMillis() - verifyingTime = "verifying time: " + (endTime - startTime).toString() + " ms" - output = "output: " + uniffi.mopro.toEthereumInputs(res.inputs) - }, - modifier = Modifier.padding(top = 120.dp) - ) { Text(text = "verify proof") } - Text( - text = "Multiplier proof", - modifier = Modifier.padding(bottom = 180.dp), - fontWeight = FontWeight.Bold - ) - - Text(text = initTime, modifier = Modifier.padding(top = 200.dp).width(200.dp)) - Text(text = provingTime, modifier = Modifier.padding(top = 250.dp).width(200.dp)) - Text(text = valid, modifier = Modifier.padding(top = 300.dp).width(200.dp)) - Text(text = verifyingTime, modifier = Modifier.padding(top = 350.dp).width(200.dp)) - Text(text = output, modifier = Modifier.padding(top = 400.dp).width(200.dp)) - } -} \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Color.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Color.kt deleted file mode 100644 index b62974c..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Color.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.mopro.ui.theme - -import androidx.compose.ui.graphics.Color - -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) - -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Theme.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Theme.kt deleted file mode 100644 index 4bc421a..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Theme.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.mopro.ui.theme - -import android.app.Activity -import android.os.Build -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.WindowCompat - -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 -) - -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ -) - -@Composable -fun moproTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, - content: @Composable () -> Unit -) { - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> DarkColorScheme - else -> LightColorScheme - } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = colorScheme.primary.toArgb() - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme - } - } - - MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content - ) -} \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Type.kt b/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Type.kt deleted file mode 100644 index 36f9464..0000000 --- a/templates/mopro-example-app/android/app/src/main/java/com/example/mopro/ui/theme/Type.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.mopro.ui.theme - -import androidx.compose.material3.Typography -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp - -// Set of Material typography styles to start with -val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) - /* Other default text styles to override - titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp - ), - labelSmall = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Medium, - fontSize = 11.sp, - lineHeight = 16.sp, - letterSpacing = 0.5.sp - ) - */ -) \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_background.xml b/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 6f3b755..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 6f3b755..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/templates/mopro-example-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/templates/mopro-example-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/templates/mopro-example-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/templates/mopro-example-app/android/app/src/main/res/values/colors.xml b/templates/mopro-example-app/android/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/values/strings.xml b/templates/mopro-example-app/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 2441bcd..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - mopro - \ No newline at end of file diff --git a/templates/mopro-example-app/android/app/src/main/res/values/themes.xml b/templates/mopro-example-app/android/app/src/main/res/values/themes.xml deleted file mode 100644 index 10bd273..0000000 --- a/templates/mopro-example-app/android/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - -