diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml
index 29c02f2..77d5f9b 100644
--- a/.github/workflows/make.yml
+++ b/.github/workflows/make.yml
@@ -19,5 +19,8 @@ jobs:
run: sudo apt -y install shfmt shellcheck devscripts
- name: Install markdownlint
run: npm install markdownlint-cli2 --global
+ - name: Install Python `uv`
+ run: curl -LsSf https://astral.sh/uv/install.sh | sh
- name: style check
- run: make style-check
+ run: |
+ make style-check
diff --git a/.gitignore b/.gitignore
index 79ed698..5ce4d04 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,13 @@ Thumbs.db
# subdirectory with source repositories
tests/src
-subject-programs/src
+subject-programs/src-grt/
+subject-programs/src-upstream/
+# temporary
+subject-programs/src-upstream-OLD/
+subject-programs/src-upstream-GOOD/
+subject-programs/src-grt-SAVE/
+subject-programs/files.diff
# subdirectory created by scripts/mutation-randoop.sh and scripts/mutation-evosuite.sh
scripts/jarfiles
@@ -25,11 +31,8 @@ scripts/build/
scripts/results/
checkbashisms
-# output from runnin jacoco
+# output from running jacoco
jacoco.exec
-# For code formatting
+# Obtained via Git
.plume-scripts
-.markdownlint-cli2.yaml
-.pymarkdown
-.ruff.toml
diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml
deleted file mode 100644
index f665c80..0000000
--- a/.markdownlint-cli2.yaml
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Markdownlint configuration
-#
-
-# Disable some built-in rules
-config:
- no-multiple-blanks: false
- line-length: false
- no-trailing-punctuation:
- punctuation: ".,;:"
- ## TODO: replace by the below
- no-inline-html: false
- # no-inline-html:
- # allowed_elements:
- # - details
- # - kbd
- # - sub
- # - span
- # - summary
- single-title:
- front_matter_title: ""
- table-pipe-style: false
- # I can't get this style setting to be respected. Bug in markdownlint??
- # style: "leading_and_trailing"
-
-# # Include a custom rule package
-# customRules:
-# - markdownlint-rule-extended-ascii
-
-# Fix any fixable errors
-fix: true
-
-# # Define a custom front matter pattern
-# frontMatter: "
[^]*<\/head>"
-
-# Ignore files referenced by .gitignore (only valid at root)
-gitignore: true
-
-# # Define glob expressions to use (only valid at root)
-# globs:
-# - "!*bout.md"
-
-# # Define glob expressions to ignore
-# ignores:
-# - "ignore*.md"
-
-# # Use a plugin to recognize math
-# markdownItPlugins:
-# -
-# - "markdown-it-emoji/dist/light.cjs.js"
-
-# Additional paths to resolve module locations from
-modulePaths:
- - "./modules"
-
-# Disable banner message on stdout (only valid at root)
-noBanner: true
-
-# # Disable inline config comments
-# noInlineConfig: true
-
-# Disable progress on stdout (only valid at root)
-noProgress: true
-
-# Use a specific formatter (only valid at root)
-outputFormatters:
- -
- - markdownlint-cli2-formatter-default
-
-# # Show found files on stdout (only valid at root)
-# showFound: true
diff --git a/.python-version b/.python-version
index 6324d40..c8cfe39 100644
--- a/.python-version
+++ b/.python-version
@@ -1 +1 @@
-3.14
+3.10
diff --git a/.ruff.toml b/.ruff.toml
deleted file mode 100644
index 2024869..0000000
--- a/.ruff.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-line-length = 100
-output-format = "concise"
-
-[lint]
-preview = true
-extend-select = ["I", "D", "DOC", "B", "A", "COM", "C4", "DTZ", "EM", "EXE", "FA", "INT", "ISC", "ICN", "PIE", "PYI", "Q", "RET", "SLF", "SIM", "SLOT", "TID", "TC", "ARG", "PTH", "FLY", "NPY", "PD", "N", "PERF", "E", "W", "F", "PLC", "PLE", "UP", "FURB", "RUF", "TRY"]
-extend-ignore = ["COM812", "D203", "D213", "D400", "D413", "DOC501", "E266", "EM101", "PLC1901", "RET504", "SIM102", "SIM108", "TRY002", "TRY003", "TRY300"]
-
-[lint.pycodestyle]
-max-line-length = 100
-
-[format]
-docstring-code-format = false
diff --git a/pyproject.toml b/pyproject.toml
index 724b0fe..b52f56c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,7 @@
+[build-system]
+requires = ["uv_build >= 0.9.11, <0.10.0"]
+build-backend = "uv_build"
+
[project]
name = "grt-testing"
version = "0.1.0"
@@ -13,5 +17,7 @@ dependencies = [
[dependency-groups]
dev = [
"pymarkdownlnt>=0.9.33",
+ "pyyaml>=6.0.3",
"ty>=0.0.1a31",
]
+# dynamic = ["version"]
diff --git a/scripts/Makefile b/scripts/Makefile
index 03ede47..e548ab1 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -1,6 +1,7 @@
MAKEFILE_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
all: \
+ build/checker-framework/checker/dist/checker-qual.jar \
build/evosuite-1.2.0.jar \
build/evosuite-standalone-runtime-1.2.0.jar \
build/hamcrest-core-1.3.jar \
@@ -64,13 +65,21 @@ build/junit-4.12.jar:
build/hamcrest-core-1.3.jar:
mkdir -p build
- cp ../subject-programs/hamcrest-core-1.3.jar build/
+ cp ../subject-programs/jars/hamcrest-core-1.3.jar build/
build/major/bin/ant-replacecall:
LATEST_RELEASE=$$(curl -s https://api.github.com/repos/randoop/grt-replacecall/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && \
wget "https://github.com/randoop/grt-replacecall/releases/download/$${LATEST_RELEASE}/ant-replacecall" && \
mv ant-replacecall build/major/bin/
+build/checker-framework/checker/dist/checker-qual.jar:
+ mkdir -p build
+ CFVER=3.50.0 && \
+ cd build && wget "https://github.com/typetools/checker-framework/releases/download/checker-framework-$${CFVER}/checker-framework-$${CFVER}.zip" && \
+ unzip -o checker-framework-$${CFVER}.zip && \
+ rm -rf checker-framework && \
+ mv checker-framework-$${CFVER} checker-framework
+
build/defects4j:
mkdir -p build
cd build && git clone https://github.com/rjust/defects4j && cd defects4j && cpanm --installdeps . && ./init.sh
diff --git a/scripts/get-all-subject-src.sh b/scripts/get-all-subject-src.sh
deleted file mode 100755
index e308588..0000000
--- a/scripts/get-all-subject-src.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/sh
-
-# This script clones the repositories for each subject program, in
-# subject-programs/src/. If the repository already exists, it pulls the
-# latest changes.
-
-SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)"
-SCRIPT_NAME=$(basename -- "$0")
-
-SUBJECT_SRC_DIR="${SCRIPT_DIR}/../subject-programs/src"
-mkdir -p "${SUBJECT_SRC_DIR}"
-cd "${SUBJECT_SRC_DIR}" || (echo "${SCRIPT_NAME}: error: directory does not exist: ${SUBJECT_SRC_DIR}" && exit 2)
-
-grt_clone() {
- printf '%s:' "$1"
- if [ -d "$1" ]; then
- echo " updating."
- (cd "$1" && git pull -q)
- else
- echo " cloning."
- git clone -q git@github.com:randoop/grt-"$1" "$1"
- fi
-}
-
-grt_clone a4j-1.0b
-grt_clone asm-5.0.1
-grt_clone bcel-5.2
-grt_clone ClassViewer-5.0.5b
-grt_clone commons-cli-1.2
-grt_clone commons-codec-1.9
-grt_clone commons-collections4-4.0
-grt_clone commons-compress-1.8
-grt_clone commons-lang3-3.0
-grt_clone commons-math3-3.2
-grt_clone commons-primitives-1.0
-grt_clone dcParseArgs-10.2008
-grt_clone easymock-3.2
-grt_clone fixsuite-r48
-grt_clone guava-16.0.1
-grt_clone hamcrest-core-1.3
-grt_clone javassist-3.19
-grt_clone javax.mail-1.5.1
-grt_clone jaxen-1.1.6
-grt_clone jcommander-1.35
-grt_clone jdom-1.0
-grt_clone joda-time-2.3
-grt_clone JSAP-2.1
-grt_clone jvc-1.1
-grt_clone nekomud-r16
-grt_clone pmd-core-5.2.2
-grt_clone sat4j-core-2.3.5
-grt_clone shiro-core-1.2.3
-grt_clone slf4j-api-1.7.12
-grt_clone tiny-sql-2.26
diff --git a/scripts/mutation-evosuite.sh b/scripts/mutation-evosuite.sh
index 51e3a71..1ff2ee4 100755
--- a/scripts/mutation-evosuite.sh
+++ b/scripts/mutation-evosuite.sh
@@ -172,7 +172,7 @@ echo
SRC_BASE_DIR="$(realpath "$SCRIPT_DIR/../subject-programs/src/$SUBJECT_PROGRAM")"
# Path to the jar file of the subject program.
-SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/$SUBJECT_PROGRAM.jar")
+SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/jars/$SUBJECT_PROGRAM.jar")
# Number of classes in given jar file.
NUM_CLASSES=$(jar -tf "$SRC_JAR" | grep -c '.class')
@@ -318,7 +318,7 @@ case "$SUBJECT_PROGRAM" in
"$SRC_BASE_DIR/lib/jaxen-core.jar" \
"$SRC_BASE_DIR/lib/jaxen-jdom.jar" \
"$SRC_BASE_DIR/lib/saxpath.jar" \
- "$SCRIPT_DIR/../subject-programs/jaxen-1.1.6.jar"
+ "$SCRIPT_DIR/../subject-programs/jars/jaxen-1.1.6.jar"
;;
"joda-time-2.3")
diff --git a/scripts/mutation-randoop.sh b/scripts/mutation-randoop.sh
index e6801c0..5df97f8 100755
--- a/scripts/mutation-randoop.sh
+++ b/scripts/mutation-randoop.sh
@@ -56,12 +56,12 @@ set -o pipefail
Generator=Randoop
generator=randoop
SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)"
-SCRIPT_NAME=$(basename -- "$0")
-MAJOR_HOME=$(realpath "${SCRIPT_DIR}/build/major/") # Major home directory, for mutation testing
-RANDOOP_JAR=$(realpath "${SCRIPT_DIR}/build/randoop-all-4.3.4.jar") # Randoop jar file
-JACOCO_AGENT_JAR=$(realpath "${SCRIPT_DIR}/build/jacocoagent.jar") # For Bloodhound
-JACOCO_CLI_JAR=$(realpath "${SCRIPT_DIR}/build/jacococli.jar") # For coverage report generation
-REPLACECALL_JAR=$(realpath "${SCRIPT_DIR}/build/replacecall-4.3.4.jar") # For replacing undesired method calls
+MAJOR_HOME=$(realpath "${SCRIPT_DIR}/build/major/") # Major home directory, for mutation testing
+RANDOOP_JAR=$(realpath "${SCRIPT_DIR}/build/randoop-all-4.3.4.jar") # Randoop jar file
+JACOCO_AGENT_JAR=$(realpath "${SCRIPT_DIR}/build/jacocoagent.jar") # For Bloodhound
+JACOCO_CLI_JAR=$(realpath "${SCRIPT_DIR}/build/jacococli.jar") # For coverage report generation
+REPLACECALL_JAR=$(realpath "${SCRIPT_DIR}/build/replacecall-4.3.4.jar") # For replacing undesired method calls
+CHECKER_QUAL_JAR=$(realpath "${SCRIPT_DIR}/build/checker-framework/checker/dist/checker-qual.jar") # For Randoop Impurity
. "$SCRIPT_DIR/defs.sh" # Define shell functions.
@@ -70,6 +70,7 @@ require_file "$RANDOOP_JAR"
require_file "$JACOCO_AGENT_JAR"
require_file "$JACOCO_CLI_JAR"
require_file "$REPLACECALL_JAR"
+require_file "$CHECKER_QUAL_JAR"
usejdk8
JAVA_VER=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | awk -F '.' '{sub("^$", "0", $2); print ($1=="1")?$2:$1}')
@@ -219,8 +220,18 @@ echo
# Path to the base directory of the source code.
SRC_BASE_DIR="$(realpath "$SCRIPT_DIR/../subject-programs/src/$SUBJECT_PROGRAM")"
-# Path to the jar file of the subject program.
-SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/$SUBJECT_PROGRAM.jar")
+if [[ " ${RANDOOP_FEATURES[*]} " =~ " GRT_FUZZING " ]]; then
+ # If randoop features contain "GRT_FUZZING", use annotated subject program jar.
+ ANNOTATED_JAR="$SCRIPT_DIR/../subject-programs/annotated-jars/$SUBJECT_PROGRAM.jar"
+ if [ ! -f "$ANNOTATED_JAR" ]; then
+ echo "${SCRIPT_NAME}: error: GRT_FUZZING enabled but annotated JAR not found: $ANNOTATED_JAR" >&2
+ exit 2
+ fi
+ SRC_JAR=$(realpath "$ANNOTATED_JAR")
+else
+ # Else, use the original subject program jar.
+ SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/jars/$SUBJECT_PROGRAM.jar")
+fi
# Number of classes in given jar file.
NUM_CLASSES=$(jar -tf "$SRC_JAR" | grep -c '.class')
@@ -353,7 +364,7 @@ case "$SUBJECT_PROGRAM" in
"$SRC_BASE_DIR/lib/jaxen-core.jar" \
"$SRC_BASE_DIR/lib/jaxen-jdom.jar" \
"$SRC_BASE_DIR/lib/saxpath.jar" \
- "$SCRIPT_DIR/../subject-programs/jaxen-1.1.6.jar"
+ "$SCRIPT_DIR/../subject-programs/jars/jaxen-1.1.6.jar"
;;
"joda-time-2.3")
@@ -456,7 +467,7 @@ RANDOOP_BASE_COMMAND=(
-Xbootclasspath/a:"$JACOCO_AGENT_JAR:$REPLACECALL_JAR"
-javaagent:"$JACOCO_AGENT_JAR"
-javaagent:"$REPLACECALL_COMMAND"
- -classpath "$RANDOOP_CLASSPATH:$RANDOOP_JAR"
+ -classpath "$RANDOOP_CLASSPATH:$RANDOOP_JAR:$CHECKER_QUAL_JAR"
randoop.main.Main
gentests
--testjar="$TARGET_JAR"
diff --git a/src/grt_testing/__init__.py b/src/grt_testing/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/subject-programs/README b/subject-programs/README
index bb58366..7ecc43e 100644
--- a/subject-programs/README
+++ b/subject-programs/README
@@ -1,3 +1,8 @@
+Run Python scripts in this directory via:
+
+uv run SCRIPTNAME
+
+
This directory contains compiled versions (jar files) of projects that the GRT
paper used as subject programs. The paper's Table II lists 32 projects. We
have located 30 of them.
diff --git a/subject-programs/README.build b/subject-programs/README.build
index 3cd6ce2..ecfc320 100644
--- a/subject-programs/README.build
+++ b/subject-programs/README.build
@@ -12,8 +12,8 @@ Maven (mvn) builds
------------------
If the project uses Maven to build, usually indicated by a pom.xml file in
the root, a useful build command is:
-```
- mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip |& tee mvn-output.txt
+```sh
+ mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
```
The failure.ignore option allows the .jar file to be built even if there are
@@ -24,67 +24,67 @@ The resulting .jar file will be in the target subdirectory.
Test directory Build instructions
------------------------------------------------------------
-a4j-1.0b: ant createJar (result is in dist subdir)
-asm-5.0.1: (uses mvn)
-bcel-5.2: ant jar (result is in target subdir)
-ClassViewer-5.0.5b: ant build (result is in root directory)
-commons-cli-1.2: (uses mvn)
-commons-codec-1.9: (uses mvn)
-commons-collections4-4.0: (uses mvn)
-commons-compress-1.8: (uses mvn)
-commons-lang3-3.0: (uses mvn)
-commons-math3-3.2: (uses mvn)
-commons-primitives-1.0: ant jar (result is in target subdir)
+a4j-1.0b ant createJar (result is in dist subdir)
+asm-5.0.1 (uses mvn)
+bcel-5.2 ant jar (result is in target subdir)
+ClassViewer-5.0.5b ant build (result is in root directory)
+commons-cli-1.2 (uses mvn)
+commons-codec-1.9 (uses mvn)
+commons-collections4-4.0 (uses mvn)
+commons-compress-1.8 (uses mvn)
+commons-lang3-3.0 (uses mvn)
+commons-math3-3.2 (uses mvn)
+commons-primitives-1.0 ant jar (result is in target subdir)
dcParseArgs-10.2008 ant createJar (result is in dist subdir)
easymock-3.2 (uses mvn) (result is in easymock/target subdir)
fixsuite-r48 ant jar (result is in jar subdir)
guava-16.0.1 (uses mvn)
hamcrest-core-1.3 ant core (result is in build subdir)
javassist-3.19 ant jar (result is in root directory)
-jaxax.mail-1.5.1: (uses mvn)
-jaxen-1.1.6: (uses mvn)
-jcommander-1.35: (uses mvn)
-jdom-1.0: ./build.sh (result is in build subdir)
-joda-time-2.3: (uses mvn)
-JSAP-2.1: ant jar (result is in dist subdir)
-jvc-1.1: ant tools (result is in dist subdir)
-nekomud-r16: ant (result is in dist subdir)
-pmd-core-5.2.2: cd pmd-core; mvn -B clean package -Dmaven.test.skip -Dmaven.javadoc.skip -DjavaccBuildNotRequired
-sat4j.core-2.3.5: (uses mvn) (result is in org.sat4j.core/target)
-shiro-core-1.2.3: (uses mvn - but 'cd core' first)
-slf4j-api-1.7.12: (uses mvn - but 'cd slf4j-api' first)
-tiny-sql-2.26: ./build.sh (result is in classes subdir)
+jaxax.mail-1.5.1 (uses mvn)
+jaxen-1.1.6 (uses mvn)
+jcommander-1.35 (uses mvn)
+jdom-1.0 ./build.sh (result is in build subdir)
+joda-time-2.3 (uses mvn)
+JSAP-2.1 ant jar (result is in dist subdir)
+jvc-1.1 ant tools (result is in dist subdir)
+nekomud-r16 ant (result is in dist subdir)
+pmd-core-5.2.2 cd pmd-core; mvn -B clean package -Dmaven.test.skip -Dmaven.javadoc.skip -DjavaccBuildNotRequired
+sat4j.core-2.3.5 (uses mvn) (result is in org.sat4j.core/target)
+shiro-core-1.2.3 (uses mvn - but 'cd core' first)
+slf4j-api-1.7.12 (uses mvn - but 'cd slf4j-api' first)
+tiny-sql-2.26 ./build.sh (result is in classes subdir)
software (version) original source
------------------------------------------------------------------------------------------------------------------------
-Amazon AWS 4 Java (1.0b) //sourceforge.net/projects/a4j/files/latest/download/a4j-1.0b1.zip
-ASM (5.0.1) //repo1.maven.org/maven2/org/ow2/asm/asm/5.0.1/asm-5.0.1-sources.jar
-Apache BCEL (5.2) //github.com/apache/commons-bcel/archive/refs/tags/BCEL_5_2.zip
+Amazon AWS 4 Java (1.0b) https://sourceforge.net/projects/a4j/files/latest/download/a4j-1.0b1.zip
+ASM (5.0.1) https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.1/asm-5.0.1-sources.jar
+Apache BCEL (5.2) https://github.com/apache/commons-bcel/archive/refs/tags/BCEL_5_2.zip
ClassViewer (5.0.5b) svn checkout -r 28 https://svn.code.sf.net/p/classviewer/code/trunk ClassViewer
-Apache Commons Cli (1.2) //archive.apache.org/dist/commons/cli/source/commons-cli-1.2-src.zip
-Apache C. Codec (1.9) //archive.apache.org/dist/commons/codec/source/commons-codec-1.9-src.zip
-Apache C. Collection (4.0) //archive.apache.org/dist/commons/collections/source/commons-collections4-4.0-src.zip
-Apache C. Compress (1.8) //archive.apache.org/dist/commons/compress/source/commons-compress-1.8-src.zip
-Apache C. Lang (3.0) //archive.apache.org/dist/commons/lang/source/commons-lang3-3.0-src.zip
-Apache C. Math (3.2) //archive.apache.org/dist/commons/math/source/commons-math3-3.2-src.zip
-Apache C. Primitive (1.0) //archive.apache.org/dist/commons/primitives/source/commons-primitives-1.0-src.zip
-Dcparseargs (10/2008) //sourceforge.net/projects/dcparseargs/files/Source/First%20upload/dcParseArgs_src.tar.bz2
-Easymock (3.2) //github.com/easymock/easymock/archive/refs/tags/easymock-3.2.zip
+Apache Commons Cli (1.2) https://archive.apache.org/dist/commons/cli/source/commons-cli-1.2-src.zip
+Apache C. Codec (1.9) https://archive.apache.org/dist/commons/codec/source/commons-codec-1.9-src.zip
+Apache C. Collection (4.0) https://archive.apache.org/dist/commons/collections/source/commons-collections4-4.0-src.zip
+Apache C. Compress (1.8) https://archive.apache.org/dist/commons/compress/source/commons-compress-1.8-src.zip
+Apache C. Lang (3.0) https://archive.apache.org/dist/commons/lang/source/commons-lang3-3.0-src.zip
+Apache C. Math (3.2) https://archive.apache.org/dist/commons/math/source/commons-math3-3.2-src.zip
+Apache C. Primitive (1.0) https://archive.apache.org/dist/commons/primitives/source/commons-primitives-1.0-src.zip
+Dcparseargs (10/2008) https://sourceforge.net/projects/dcparseargs/files/Source/First%20upload/dcParseArgs_src.tar.bz2
+Easymock (3.2) https://github.com/easymock/easymock/archive/refs/tags/easymock-3.2.zip
Fixsuite (R48) svn checkout https://svn.code.sf.net/p/fixsuite/code/trunk fixsuite-r48
-Guava (16.0.1) //repo1.maven.org/maven2/com/google/guava/guava/16.0.1/guava-16.0.1-sources.jar
-Hamcrest-core (1.3) //github.com/hamcrest/JavaHamcrest/archive/refs/tags/hamcrest-java-1.3.zip
-Javassit (3.19) //github.com/jboss-javassist/javassist/archive/refs/tags/rel_3_19_0_ga.zip
-Javax Mail (1.5.1) //repo1.maven.org/maven2/com/sun/mail/javax.mail/1.5.1/javax.mail-1.5.1-sources.jar
-Jaxen (1.1.6) //repo1.maven.org/maven2/jaxen/jaxen/1.1.6/jaxen-1.1.6-sources.jar
+Guava (16.0.1) https://repo1.maven.org/maven2/com/google/guava/guava/16.0.1/guava-16.0.1-sources.jar
+Hamcrest-core (1.3) https://github.com/hamcrest/JavaHamcrest/archive/refs/tags/hamcrest-java-1.3.zip
+Javassit (3.19) https://github.com/jboss-javassist/javassist/archive/refs/tags/rel_3_19_0_ga.zip
+Javax Mail (1.5.1) https://repo1.maven.org/maven2/com/sun/mail/javax.mail/1.5.1/javax.mail-1.5.1-sources.jar
+Jaxen (1.1.6) https://repo1.maven.org/maven2/jaxen/jaxen/1.1.6/jaxen-1.1.6-sources.jar
Jcommander (1.35) git@github.com:cbeust/jcommander.git (git co jcommander-1.35)
-Jdom (1.0) //www.jdom.org/dist/binary/archive/jdom-1.0.zip
-Joda Time (2.3) //github.com/JodaOrg/joda-time/archive/refs/tags/v2.3.zip
-Java Simple Arg. Parser (2.1) //sourceforge.net/projects/jsap/files/jsap/2.1/JSAP-2.1-src.zip
-Java View Control (1.1) //sourceforge.net/projects/javaviewcontrol/files/javaviewcontrol/jvc-1.1.tar.gz
-Multi-User Dungeon server R16 svn checkout https://svn.code.sf.net/p/nekomud/code/trunk nekomud-r16
-Pmd DCD 5.2.2 git@github.com:pmd/pmd.git (git co pmd_releases/5.2.2)
+Jdom (1.0) https://www.jdom.org/dist/binary/archive/jdom-1.0.zip
+Joda Time (2.3) https://github.com/JodaOrg/joda-time/archive/refs/tags/v2.3.zip
+Java Simple Arg. Parser (2.1) https://sourceforge.net/projects/jsap/files/jsap/2.1/JSAP-2.1-src.zip
+Java View Control (1.1) https://sourceforge.net/projects/javaviewcontrol/files/javaviewcontrol/jvc-1.1.tar.gz
+Multi-User Dungeon server (R16) svn checkout https://svn.code.sf.net/p/nekomud/code/trunk nekomud-r16
+Pmd DCD (5.2.2) git@github.com:pmd/pmd.git (git co pmd_releases/5.2.2)
SAT4J Core (2.3.5) https://gitlab.ow2.org/sat4j/sat4j.git (git co 2_3_5)
-Apache Shiro-core (1.2.6) //archive.apache.org/dist/shiro/1.2.3/shiro-root-1.2.3-source-release.zip
-Slf4j-api (1.7.12) //github.com/qos-ch/slf4j/releases/tag/v_1.7.12/slf4j-v_1.7.12.zip
-Tiny Sql (2.26) //sourceforge.net/projects/tinysql/files/tinySQL2.26/V2.26/tinySQL-2.26.zip
+Apache Shiro-core (1.2.6) https://archive.apache.org/dist/shiro/1.2.3/shiro-root-1.2.3-source-release.zip
+Slf4j-api (1.7.12) https://github.com/qos-ch/slf4j/releases/tag/v_1.7.12/slf4j-v_1.7.12.zip
+Tiny Sql (2.26) https://sourceforge.net/projects/tinysql/files/tinySQL2.26/V2.26/tinySQL-2.26.zip
diff --git a/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar b/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar
new file mode 100644
index 0000000..62f0506
Binary files /dev/null and b/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar differ
diff --git a/subject-programs/annotated-jars/JSAP-2.1.jar b/subject-programs/annotated-jars/JSAP-2.1.jar
new file mode 100644
index 0000000..4199347
Binary files /dev/null and b/subject-programs/annotated-jars/JSAP-2.1.jar differ
diff --git a/subject-programs/annotated-jars/README.md b/subject-programs/annotated-jars/README.md
new file mode 100644
index 0000000..f922f25
--- /dev/null
+++ b/subject-programs/annotated-jars/README.md
@@ -0,0 +1,80 @@
+# Annotated Subject Program JARs
+
+This folder holds subject `.jar` files with purity annotations: `@Pure`,
+`@SideEffectFree`, `@Impure`, and related qualifiers from
+`org.checkerframework.framework.qual` Compared to `subject-programs/jars/`, the
+compiled bytecode here is the same, but the class files have purity
+annotations. No other code or resources are altered.
+
+The annotations are produced by the Checker Framework whole-program inference.
+
+## Why the annotations matter
+
+The `GRT_FUZZING` feature in `scripts/mutation-randoop.sh` prioritizes impure
+calls to mutate an object's state before exercising additional API entry points.
+The annotations provide the information it needs.
+
+## Rebuilding an annotated JAR
+
+### Setup
+
+1. **Fetch sources**: From the top level (`../../`), run
+ `scripts/get-all-subject-src.sh` to populate
+ `subject-programs/src//`.
+
+2. **Set up inference tooling**: Point your environment at the local Checker
+ Framework build:
+
+ ```sh
+ export CHECKERFRAMEWORK=/path/to/grt-testing/scripts/build/checker-framework
+ export PATH="$CHECKERFRAMEWORK/annotation-file-utilities/bin:$PATH"
+ ```
+
+3. **Build the plain JAR**: Run `subject-programs/buildall.sh`.
+ The resulting jar appears in `subject-programs/jars/`
+ or the subject's usual build folder.
+
+### Do the following per project
+
+1. **Create the classpath**: Create a file `wpi-classpath.txt` with the
+ project's dependencies, one per line.
+
+ This command tries `mvn`; if that doesn't work, assume that the Ant ships
+ extra JARs in a local `jars/` or `lib/` folder.
+
+ ```sh
+ if ! mvn -q dependency:build-classpath -Dmdep.outputFile=wpi-classpath.txt; then
+ find jars -name '*.jar' > wpi-classpath.txt
+ find lib -name '*.jar' >> wpi-classpath.txt
+ ```
+
+2. **Run inference**: From the subject directory, execute:
+
+ ```sh
+ $CHECKERFRAMEWORK/checker/bin/infer-and-annotate.sh \
+ "org.checkerframework.framework.util.PurityChecker" \
+ "$RUNTIME_CLASSPATH" \
+ $(find src -name "*.java")
+ ```
+
+ The script rewrites the sources in place with the inferred annotations.
+
+3. **Rebuild**: Repeat the command from step 2 to produce an annotated JAR.
+ Copy it to this folder.
+
+### Worked example (a4j-1.0b)
+
+```sh
+cd subject-programs/src/a4j-1.0b
+ant createJar # build the baseline JAR
+export CHECKERFRAMEWORK=... # reuse the env vars above
+export PATH="$CHECKERFRAMEWORK/annotation-file-utilities/bin:$PATH"
+export JAVAC_JAR="$CHECKERFRAMEWORK/checker/dist/javac.jar"
+RUNTIME_CLASSPATH="../../jars/a4j-1.0b.jar:jars/jox116.jar:jars/log4j-1.2.4.jar"
+$CHECKERFRAMEWORK/checker/bin/infer-and-annotate.sh \
+ "org.checkerframework.framework.util.PurityChecker" \
+ "$RUNTIME_CLASSPATH" \
+ $(find src -name "*.java")
+ant createJar # rebuild with annotations
+cp dist/a4j.jar ../../annotated-jars/a4j-1.0b.jar
+```
diff --git a/subject-programs/annotated-jars/a4j-1.0b.jar b/subject-programs/annotated-jars/a4j-1.0b.jar
new file mode 100644
index 0000000..932d79b
Binary files /dev/null and b/subject-programs/annotated-jars/a4j-1.0b.jar differ
diff --git a/subject-programs/annotated-jars/asm-5.0.1.jar b/subject-programs/annotated-jars/asm-5.0.1.jar
new file mode 100644
index 0000000..7619c3f
Binary files /dev/null and b/subject-programs/annotated-jars/asm-5.0.1.jar differ
diff --git a/subject-programs/annotated-jars/bcel-5.2.jar b/subject-programs/annotated-jars/bcel-5.2.jar
new file mode 100644
index 0000000..4227144
Binary files /dev/null and b/subject-programs/annotated-jars/bcel-5.2.jar differ
diff --git a/subject-programs/annotated-jars/commons-cli-1.2.jar b/subject-programs/annotated-jars/commons-cli-1.2.jar
new file mode 100644
index 0000000..200e307
Binary files /dev/null and b/subject-programs/annotated-jars/commons-cli-1.2.jar differ
diff --git a/subject-programs/annotated-jars/commons-codec-1.9.jar b/subject-programs/annotated-jars/commons-codec-1.9.jar
new file mode 100644
index 0000000..296670c
Binary files /dev/null and b/subject-programs/annotated-jars/commons-codec-1.9.jar differ
diff --git a/subject-programs/annotated-jars/commons-collections4-4.0.jar b/subject-programs/annotated-jars/commons-collections4-4.0.jar
new file mode 100644
index 0000000..69679fe
Binary files /dev/null and b/subject-programs/annotated-jars/commons-collections4-4.0.jar differ
diff --git a/subject-programs/annotated-jars/commons-compress-1.8.jar b/subject-programs/annotated-jars/commons-compress-1.8.jar
new file mode 100644
index 0000000..2bd4ac4
Binary files /dev/null and b/subject-programs/annotated-jars/commons-compress-1.8.jar differ
diff --git a/subject-programs/annotated-jars/commons-lang3-3.0.jar b/subject-programs/annotated-jars/commons-lang3-3.0.jar
new file mode 100644
index 0000000..f367f4b
Binary files /dev/null and b/subject-programs/annotated-jars/commons-lang3-3.0.jar differ
diff --git a/subject-programs/annotated-jars/commons-math3-3.2.jar b/subject-programs/annotated-jars/commons-math3-3.2.jar
new file mode 100644
index 0000000..0443cd9
Binary files /dev/null and b/subject-programs/annotated-jars/commons-math3-3.2.jar differ
diff --git a/subject-programs/annotated-jars/commons-primitives-1.0.jar b/subject-programs/annotated-jars/commons-primitives-1.0.jar
new file mode 100644
index 0000000..ccf0d0a
Binary files /dev/null and b/subject-programs/annotated-jars/commons-primitives-1.0.jar differ
diff --git a/subject-programs/annotated-jars/dcParseArgs-10.2008.jar b/subject-programs/annotated-jars/dcParseArgs-10.2008.jar
new file mode 100644
index 0000000..f864f55
Binary files /dev/null and b/subject-programs/annotated-jars/dcParseArgs-10.2008.jar differ
diff --git a/subject-programs/annotated-jars/easymock-3.2.jar b/subject-programs/annotated-jars/easymock-3.2.jar
new file mode 100644
index 0000000..d38fe25
Binary files /dev/null and b/subject-programs/annotated-jars/easymock-3.2.jar differ
diff --git a/subject-programs/annotated-jars/fixsuite-r48.jar b/subject-programs/annotated-jars/fixsuite-r48.jar
new file mode 100644
index 0000000..c3e1ccc
Binary files /dev/null and b/subject-programs/annotated-jars/fixsuite-r48.jar differ
diff --git a/subject-programs/annotated-jars/guava-16.0.1.jar b/subject-programs/annotated-jars/guava-16.0.1.jar
new file mode 100644
index 0000000..442f21f
Binary files /dev/null and b/subject-programs/annotated-jars/guava-16.0.1.jar differ
diff --git a/subject-programs/annotated-jars/hamcrest-core-1.3.jar b/subject-programs/annotated-jars/hamcrest-core-1.3.jar
new file mode 100644
index 0000000..5b01097
Binary files /dev/null and b/subject-programs/annotated-jars/hamcrest-core-1.3.jar differ
diff --git a/subject-programs/annotated-jars/javassist-3.19.jar b/subject-programs/annotated-jars/javassist-3.19.jar
new file mode 100644
index 0000000..d2918c1
Binary files /dev/null and b/subject-programs/annotated-jars/javassist-3.19.jar differ
diff --git a/subject-programs/annotated-jars/javax.mail-1.5.1.jar b/subject-programs/annotated-jars/javax.mail-1.5.1.jar
new file mode 100644
index 0000000..e80d440
Binary files /dev/null and b/subject-programs/annotated-jars/javax.mail-1.5.1.jar differ
diff --git a/subject-programs/annotated-jars/jaxen-1.1.6.jar b/subject-programs/annotated-jars/jaxen-1.1.6.jar
new file mode 100644
index 0000000..96f17eb
Binary files /dev/null and b/subject-programs/annotated-jars/jaxen-1.1.6.jar differ
diff --git a/subject-programs/annotated-jars/jcommander-1.35.jar b/subject-programs/annotated-jars/jcommander-1.35.jar
new file mode 100644
index 0000000..09062ae
Binary files /dev/null and b/subject-programs/annotated-jars/jcommander-1.35.jar differ
diff --git a/subject-programs/annotated-jars/jdom-1.0.jar b/subject-programs/annotated-jars/jdom-1.0.jar
new file mode 100644
index 0000000..987c406
Binary files /dev/null and b/subject-programs/annotated-jars/jdom-1.0.jar differ
diff --git a/subject-programs/annotated-jars/joda-time-2.3.jar b/subject-programs/annotated-jars/joda-time-2.3.jar
new file mode 100644
index 0000000..dca3b3c
Binary files /dev/null and b/subject-programs/annotated-jars/joda-time-2.3.jar differ
diff --git a/subject-programs/annotated-jars/jvc-1.1.jar b/subject-programs/annotated-jars/jvc-1.1.jar
new file mode 100644
index 0000000..a85f496
Binary files /dev/null and b/subject-programs/annotated-jars/jvc-1.1.jar differ
diff --git a/subject-programs/annotated-jars/nekomud-r16.jar b/subject-programs/annotated-jars/nekomud-r16.jar
new file mode 100644
index 0000000..51e6e8e
Binary files /dev/null and b/subject-programs/annotated-jars/nekomud-r16.jar differ
diff --git a/subject-programs/annotated-jars/pmd-core-5.2.2.jar b/subject-programs/annotated-jars/pmd-core-5.2.2.jar
new file mode 100644
index 0000000..a8a71e1
Binary files /dev/null and b/subject-programs/annotated-jars/pmd-core-5.2.2.jar differ
diff --git a/subject-programs/annotated-jars/sat4j-core-2.3.5.jar b/subject-programs/annotated-jars/sat4j-core-2.3.5.jar
new file mode 100644
index 0000000..7fae405
Binary files /dev/null and b/subject-programs/annotated-jars/sat4j-core-2.3.5.jar differ
diff --git a/subject-programs/annotated-jars/shiro-core-1.2.3.jar b/subject-programs/annotated-jars/shiro-core-1.2.3.jar
new file mode 100644
index 0000000..edac48c
Binary files /dev/null and b/subject-programs/annotated-jars/shiro-core-1.2.3.jar differ
diff --git a/subject-programs/annotated-jars/slf4j-api-1.7.12.jar b/subject-programs/annotated-jars/slf4j-api-1.7.12.jar
new file mode 100644
index 0000000..acc368f
Binary files /dev/null and b/subject-programs/annotated-jars/slf4j-api-1.7.12.jar differ
diff --git a/subject-programs/annotated-jars/tiny-sql-2.26.jar b/subject-programs/annotated-jars/tiny-sql-2.26.jar
new file mode 100644
index 0000000..a995ac9
Binary files /dev/null and b/subject-programs/annotated-jars/tiny-sql-2.26.jar differ
diff --git a/subject-programs/build-info.yaml b/subject-programs/build-info.yaml
new file mode 100644
index 0000000..97553ff
--- /dev/null
+++ b/subject-programs/build-info.yaml
@@ -0,0 +1,275 @@
+# Fields:
+# * extraction-dir is relative to subject-programs/src-upstream/.
+# It is optional.
+# * post-extract-command is run in subject-programs/src-upstream/
+# -- that is, in the parent directory of the code itself.
+---
+project: Amazon AWS 4 Java
+version: 1.0b
+dir: a4j-1.0b
+source: https://sourceforge.net/projects/a4j/files/latest/download/a4j-1.0b1.zip
+post-extract-command: mv a4j a4j-1.0b && rm -rf a4j-1.0b/src/net/kencochrane/a4j/file/CVS a4j-1.0b/src/net/kencochrane/a4j/beans/CVS a4j-1.0b/src/net/kencochrane/a4j/util/CVS a4j-1.0b/src/net/kencochrane/a4j/data/CVS a4j-1.0b/src/net/kencochrane/a4j/CVS a4j-1.0b/src/net/kencochrane/a4j/DAO/CVS a4j-1.0b/src/net/kencochrane/CVS a4j-1.0b/src/net/CVS a4j-1.0b/src/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/file/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/beans/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/util/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/data/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/CVS a4j-1.0b/docs/javadocs/net/kencochrane/a4j/DAO/CVS a4j-1.0b/docs/javadocs/net/kencochrane/CVS a4j-1.0b/docs/javadocs/net/CVS a4j-1.0b/docs/javadocs/CVS a4j-1.0b/docs/javadocs/index-files/CVS a4j-1.0b/docs/CVS a4j-1.0b/config/CVS a4j-1.0b/examples/src/CVS a4j-1.0b/examples/CVS a4j-1.0b/jars/CVS a4j-1.0b/CVS
+# && /home/mernst/bin/src/plume-scripts/preplace seller.s\b sellers a4j-1.0b
+build-dir: .
+build-command: ant createJar
+jar-dir: dist
+---
+project: ASM
+version: 5.0.1
+dir: asm-5.0.1
+source: https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.1/asm-5.0.1-sources.jar
+extraction-dir: asm-5.0.1
+post-extract-command: mkdir -p asm-5.0.1/src/main/java && mv asm-5.0.1/org asm-5.0.1/src/main/java/ && ../.plume-scripts/preplace org\.objectweb\.asm org1.objectweb.asm asm-5.0.1 && ../.plume-scripts/preplace org\.apache\.xalan org1.apache.xalan asm-5.0.1 && ../.plume-scripts/preplace ยง Section asm-5.0.1
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache BCEL
+version: 5.2
+dir: bcel-5.2
+source: https://github.com/apache/commons-bcel/archive/refs/tags/BCEL_5_2.zip
+post-extract-command: mv commons-bcel-BCEL_5_2 bcel-5.2
+build-dir: .
+build-command: ant jar
+jar-dir: target
+---
+project: ClassViewer
+version: 5.0.5b
+dir: ClassViewer-5.0.5b
+source: svn checkout -r 28 --quiet https://svn.code.sf.net/p/classviewer/code/trunk ClassViewer-5.0.5b
+post-extract-command: rm -rf ClassViewer-5.0.5b/.svn
+build-dir: .
+build-command: ant build
+jar-dir: .
+---
+project: Apache Commons Cli
+version: 1.2
+dir: commons-cli-1.2
+source: https://archive.apache.org/dist/commons/cli/source/commons-cli-1.2-src.zip
+post-extract-command: mv commons-cli-1.2-src commons-cli-1.2
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Codec
+version: 1.9
+dir: commons-codec-1.9
+source: https://archive.apache.org/dist/commons/codec/source/commons-codec-1.9-src.zip
+post-extract-command: mv commons-codec-1.9-src commons-codec-1.9
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Collection
+version: 4.0
+dir: commons-collections4-4.0
+source: https://archive.apache.org/dist/commons/collections/source/commons-collections4-4.0-src.zip
+post-extract-command: mv commons-collections4-4.0-src commons-collections4-4.0
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Compress
+version: 1.8
+dir: commons-compress-1.8
+source: https://archive.apache.org/dist/commons/compress/source/commons-compress-1.8-src.zip
+post-extract-command: mv commons-compress-1.8-src commons-compress-1.8
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Lang
+version: 3.0
+dir: commons-lang3-3.0
+source: https://archive.apache.org/dist/commons/lang/source/commons-lang3-3.0-src.zip
+post-extract-command: mv commons-lang3-3.0-src commons-lang3-3.0
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Math
+version: 3.2
+dir: commons-math3-3.2
+source: https://archive.apache.org/dist/commons/math/source/commons-math3-3.2-src.zip
+post-extract-command: mv commons-math3-3.2-src commons-math3-3.2 && rm -rf commons-math3-3.2/src/main/resources/data commons-math3-3.2/src/main/resources/META-INF commons-math3-3.2/src/main/resources/templates commons-math3-3.2/src/site/resources/userguide
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Apache C. Primitive
+version: 1.0
+dir: commons-primitives-1.0
+source: https://archive.apache.org/dist/commons/primitives/source/commons-primitives-1.0-src.zip
+build-dir: .
+build-command: ant jar
+jar-dir: target
+---
+project: Dcparseargs
+version: 10/2008
+dir: dcParseArgs-10.2008
+source: https://sourceforge.net/projects/dcparseargs/files/Source/First%20upload/dcParseArgs_src.tar.bz2
+post-extract-command: mv dcParseArgs dcParseArgs-10.2008 && rm -rf dcParseArgs-10.2008/src/de/devcity/.svn dcParseArgs-10.2008/src/de/devcity/parseargs/arguments/.svn dcParseArgs-10.2008/src/de/devcity/parseargs/.svn dcParseArgs-10.2008/src/de/.svn dcParseArgs-10.2008/src/.svn dcParseArgs-10.2008/testsrc/de/devcity/.svn dcParseArgs-10.2008/testsrc/de/devcity/parseargs/.svn dcParseArgs-10.2008/testsrc/de/.svn dcParseArgs-10.2008/testsrc/.svn dcParseArgs-10.2008/.svn dcParseArgs-10.2008/.settings/.svn
+build-dir: .
+build-command: ant createJar
+jar-dir: dist
+---
+project: Easymock
+version: 3.2
+dir: easymock-3.2
+source: https://github.com/easymock/easymock/archive/refs/tags/easymock-3.2.zip
+post-extract-command: mv easymock-easymock-3.2 easymock-3.2
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: easymock/target
+---
+project: Fixsuite
+version: R48
+dir: fixsuite-r48
+source: svn checkout --quiet https://svn.code.sf.net/p/fixsuite/code/trunk fixsuite-r48
+post-extract-command: rm -rf fixsuite-r48/.svn fixsuite-r48/model
+build-dir: .
+build-command: ant jar
+jar-dir: jar
+---
+project: Guava
+version: 16.0.1
+dir: guava-16.0.1
+source: https://repo1.maven.org/maven2/com/google/guava/guava/16.0.1/guava-16.0.1-sources.jar
+extraction-dir: guava-16.0.1
+post-extract-command: mkdir guava-16.0.1/src && mv guava-16.0.1/com guava-16.0.1/src/com
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Hamcrest-core
+version: 1.3
+dir: hamcrest-core-1.3
+source: https://github.com/hamcrest/JavaHamcrest/archive/refs/tags/hamcrest-java-1.3.zip
+post-extract-command: mv JavaHamcrest-hamcrest-java-1.3 hamcrest-core-1.3
+build-dir: .
+build-command: ant core
+jar-dir: build
+---
+project: Javassit
+version: 3.19
+dir: javassist-3.19
+source: https://github.com/jboss-javassist/javassist/archive/refs/tags/rel_3_19_0_ga.zip
+post-extract-command: mv javassist-rel_3_19_0_ga javassist-3.19
+build-dir: .
+build-command: ant jar
+jar-dir: .
+---
+project: Javax Mail
+version: 1.5.1
+dir: javax.mail-1.5.1
+source: https://repo1.maven.org/maven2/com/sun/mail/javax.mail/1.5.1/javax.mail-1.5.1-sources.jar
+extraction-dir: javax.mail-1.5.1
+post-extract-command: mkdir -p javax.mail-1.5.1/src/main/java && mv javax.mail-1.5.1/com javax.mail-1.5.1/javax javax.mail-1.5.1/src/main/java/ && ../.plume-scripts/preplace com\.sun\.mail com.sun1.mail javax.mail-1.5.1 && ../.plume-scripts/preplace javax\.mail javax1.mail javax.mail-1.5.1
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Jaxen
+version: 1.1.6
+dir: jaxen-1.1.6
+source: https://repo1.maven.org/maven2/jaxen/jaxen/1.1.6/jaxen-1.1.6-sources.jar
+extraction-dir: jaxen-1.1.6
+post-extract-command: mkdir -p jaxen-1.1.6/src/java/main && mv jaxen-1.1.6/org jaxen-1.1.6/src/java/main/
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Jcommander
+version: 1.35
+dir: jcommander-1.35
+source: git clone --depth 1 --branch jcommander-1.35 -c advice.detachedHead=false git@github.com:cbeust/jcommander.git jcommander-1.35
+post-extract-command: rm -rf jcommander-1.35/.git
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Jdom
+version: 1.0
+dir: jdom-1.0
+source: https://www.jdom.org/dist/binary/archive/jdom-1.0.zip
+build-dir: .
+build-command: ./build.sh
+jar-dir: build
+---
+project: Joda Time
+version: 2.3
+dir: joda-time-2.3
+source: https://github.com/JodaOrg/joda-time/archive/refs/tags/v2.3.zip
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Java Simple Arg. Parser
+version: 2.1
+dir: JSAP-2.1
+source: https://sourceforge.net/projects/jsap/files/jsap/2.1/JSAP-2.1-src.zip
+build-dir: .
+build-command: ant jar
+jar-dir: dist
+---
+project: Java View Control
+version: 1.1
+dir: jvc-1.1
+source: https://sourceforge.net/projects/javaviewcontrol/files/javaviewcontrol/jvc-1.1/jvc-1.1.tar.gz
+build-dir: .
+build-command: ant tools
+jar-dir: dist
+---
+project: Multi-User Dungeon server
+version: R16
+dir: nekomud-r16
+source: svn checkout --quiet https://svn.code.sf.net/p/nekomud/code/trunk nekomud-r16
+post-extract-command: rm -rf $(findfile .svn ClassViewer-5.0.5b)
+build-dir: .
+build-command: ant
+jar-dir: dist
+---
+project: Pmd DCD
+version: 5.2.2
+dir: pmd-core-5.2.2
+source: git clone --depth 1 --branch pmd_releases/5.2.2 -c advice.detachedHead=false https://github.com/pmd/pmd.git pmd-core-5.2.2
+post-extract-command: rm -rf pmd-core-5.2.2/.git pmd-core-5.2.2/maven-plugin-pmd-build pmd-core-5.2.2/pmd-cpp pmd-core-5.2.2/pmd-cs pmd-core-5.2.2/pmd-dist pmd-core-5.2.2/pmd-fortran pmd-core-5.2.2/pmd-go pmd-core-5.2.2/pmd-java pmd-core-5.2.2/pmd-javascript pmd-core-5.2.2/pmd-jsp pmd-core-5.2.2/pmd-php pmd-core-5.2.2/pmd-plsql pmd-core-5.2.2/pmd-ruby pmd-core-5.2.2/pmd-test pmd-core-5.2.2/pmd-vm pmd-core-5.2.2/pmd-xml
+build-dir: pmd-core
+build-command: mvn -B clean package -Dmaven.test.skip -Dmaven.javadoc.skip -DjavaccBuildNotRequired
+jar-dir: .
+---
+project: SAT4J Core
+version: 2.3.5
+dir: sat4j-core-2.3.5
+source: git clone --depth 1 --branch 2_3_5 -c advice.detachedHead=false https://gitlab.ow2.org/sat4j/sat4j.git sat4j-core-2.3.5
+post-extract-command: rm -rf sat4j-core-2.3.5/.git sat4j-core-2.3.5/org.sat4j.br4cp sat4j-core-2.3.5/org.sat4j.csp sat4j-core-2.3.5/org.sat4j.csp.xmlparser sat4j-core-2.3.5/org.sat4j.intervalorders sat4j-core-2.3.5/org.sat4j.maxsat sat4j-core-2.3.5/org.sat4j.pb sat4j-core-2.3.5/org.sat4j.sat sat4j-core-2.3.5/org.sat4j.scala sat4j-core-2.3.5/org.sat4j.sudoku
+build-dir: .
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: org.sat4j.core/target
+---
+project: Apache Shiro-core
+version: 1.2.6
+dir: shiro-core-1.2.3
+source: https://archive.apache.org/dist/shiro/1.2.3/shiro-root-1.2.3-source-release.zip
+post-extract-command: mv shiro-root-1.2.3 shiro-core-1.2.3
+build-dir: core
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Slf4j-api
+version: 1.7.12
+dir: slf4j-api-1.7.12
+source: https://github.com/qos-ch/slf4j/archive/refs/tags/v_1.7.12.zip
+post-extract-command: mv slf4j-v_1.7.12 slf4j-api-1.7.12 && rm -rf slf4j-api-1.7.12/integration slf4j-api-1.7.12/jcl-over-slf4j slf4j-api-1.7.12/jul-to-slf4j slf4j-api-1.7.12/log4j-over-slf4j slf4j-api-1.7.12/osgi-over-slf4j slf4j-api-1.7.12/slf4j-android slf4j-api-1.7.12/slf4j-ext slf4j-api-1.7.12/slf4j-jcl slf4j-api-1.7.12/slf4j-jdk14 slf4j-api-1.7.12/slf4j-log4j12 slf4j-api-1.7.12/slf4j-migrator slf4j-api-1.7.12/slf4j-nop slf4j-api-1.7.12/slf4j-simple slf4j-api-1.7.12/slf4j-site slf4j-api-1.7.12/src && ../.plume-scripts/preplace org\.slf4j\. org1.slf4j. slf4j-api-1.7.12 && ../.plume-scripts/preplace org\.slf4j; org1.slf4j; slf4j-api-1.7.12
+build-dir: slf4j-api
+build-command: mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt
+jar-dir: target
+---
+project: Tiny Sql
+version: 2.26
+dir: tiny-sql-2.26
+source: https://sourceforge.net/projects/tinysql/files/tinySQL2.26/V2.26/tinySQL-2.26.zip
+post-extract-command: mv tinySQL-2 tiny-sql-2.26 && rm -f tiny-sql-2.26/src/com/sqlmagic/tinysql/junk
+build-dir: .
+build-command: ./build.sh
+jar-dir: classes
diff --git a/subject-programs/buildall.py b/subject-programs/buildall.py
new file mode 100755
index 0000000..56b70ac
--- /dev/null
+++ b/subject-programs/buildall.py
@@ -0,0 +1,3 @@
+#!/usr/bin/env python3
+
+"""TODO."""
diff --git a/subject-programs/buildall.sh b/subject-programs/buildall.sh
new file mode 100755
index 0000000..4528b0c
--- /dev/null
+++ b/subject-programs/buildall.sh
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+set -e
+
+JAVA_VER=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1 | sed 's/-ea//')
+if [ "$JAVA_VER" != "8" ]; then
+ echo "Use Java 8"
+ exit 2
+fi
+
+# The commands are taken from file `README.build`.
+
+SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)"
+# SCRIPT_NAME=$(basename -- "$0")
+
+"${SCRIPT_DIR}"/../scripts/get-all-subject-src.sh
+
+cd "${SCRIPT_DIR}"/src || exit 2
+
+(cd a4j-1.0b \
+ && ant createJar)
+
+(cd asm-5.0.1 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd bcel-5.2 \
+ && ant jar)
+
+(cd ClassViewer-5.0.5b \
+ && ant build)
+
+(cd commons-cli-1.2 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-codec-1.9 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-collections4-4.0 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-compress-1.8 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-lang3-3.0 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-math3-3.2 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd commons-primitives-1.0 \
+ && ant jar)
+
+(cd dcParseArgs-10.2008 \
+ && ant createJar)
+
+(cd easymock-3.2 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd fixsuite-r48 \
+ && ant jar)
+
+(cd guava-16.0.1 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd hamcrest-core-1.3 \
+ && ant core)
+
+(cd javassist-3.19 \
+ && ant jar)
+
+(cd jaxax.mail-1.5.1 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd jaxen-1.1.6 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd jcommander-1.35 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd jdom-1.0 \
+ && ./build.sh)
+
+(cd joda-time-2.3 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd JSAP-2.1 \
+ && ant jar)
+
+(cd jvc-1.1 \
+ && ant tools)
+
+(cd nekomud-r16 \
+ && ant)
+
+(cd pmd-core-5.2.2/pmd-core \
+ && mvn -B clean package -Dmaven.test.skip -Dmaven.javadoc.skip -DjavaccBuildNotRequired)
+
+(cd sat4j.core-2.3.5 \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd shiro-core-1.2.3/core \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+(cd slf4j-api-1.7.12/slf4j-api \
+ && mvn -B clean package -Dmaven.test.failure.ignore -Dmaven.javadoc.skip 2>&1 | tee mvn-output.txt)
+
+usejdk8
+(cd tiny-sql-2.26 \
+ && ./build.sh)
diff --git a/subject-programs/get-grt-source.sh b/subject-programs/get-grt-source.sh
new file mode 100755
index 0000000..c8f43e0
--- /dev/null
+++ b/subject-programs/get-grt-source.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# This script clones the repositories for each subject program, in
+# subject-programs/src/. If the repository already exists, it pulls the
+# latest changes.
+
+SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)"
+
+set -e
+
+SUBJECT_GRT_SRC_DIR="${SCRIPT_DIR}/../subject-programs/src-grt"
+mkdir -p "${SUBJECT_GRT_SRC_DIR}"
+cd "${SUBJECT_GRT_SRC_DIR}"
+
+grt_clone() {
+ printf '%s:' "$1"
+ if [ -d "$1" ]; then
+ echo " updating."
+ (cd "$1" && git pull -q)
+ else
+ echo " cloning."
+ git clone -q https://github.com/randoop/grt-"$1" "$1" \
+ || { echo "Error: Failed to clone grt-$1. Retrying without -q..." >&2; \
+ git clone https://github.com/randoop/grt-"$1" "$1"; }
+ fi
+}
+
+# shellcheck disable=SC2013
+for dir in $(grep "^dir:" ../build-info.yaml | sed 's/^dir: //'); do
+ grt_clone "$dir"
+done
diff --git a/subject-programs/get-upstream-source.py b/subject-programs/get-upstream-source.py
new file mode 100755
index 0000000..f215225
--- /dev/null
+++ b/subject-programs/get-upstream-source.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+
+"""Obtains the upstream sources and leaves them in `subject-programs/src-upstream`."""
+
+import pathlib
+import shlex
+import subprocess
+import tarfile
+import zipfile
+from urllib.request import urlretrieve
+
+import yaml
+from yaml.loader import SafeLoader
+
+script_directory = pathlib.Path(__file__).parent.resolve()
+
+with pathlib.Path(script_directory / "build-info.yaml").open() as f:
+ yaml_data = list(yaml.load_all(f, Loader=SafeLoader))
+
+src_upstream_dir = script_directory / "src-upstream"
+src_upstream_dir.mkdir(exist_ok=True)
+
+for project in yaml_data:
+ source = project["source"]
+ proj_dir = project["dir"]
+ project_dir = src_upstream_dir / proj_dir
+ if project_dir.is_dir():
+ print("Skipping", proj_dir, "because it exists.")
+ continue
+ print("About to get", source)
+ if source.startswith("http"):
+ basename = source.name
+ archive_path = src_upstream_dir / basename
+ dest_dir = src_upstream_dir
+ key = "extraction-dir"
+ if key in project:
+ dest_dir = src_upstream_dir / project[key]
+ urlretrieve(source, archive_path)
+ if source.endswith((".zip", ".jar")):
+ with zipfile.ZipFile(archive_path, "r") as zf:
+ zf.extractall(dest_dir)
+ elif source.endswith(".tar.bz2"):
+ with tarfile.open(archive_path, "r:bz2") as tar:
+ tar.extractall(path=dest_dir)
+ elif source.endswith(".tar.gz"):
+ with tarfile.open(archive_path, "r:gz") as tar:
+ tar.extractall(path=dest_dir)
+ else:
+ raise Exception("Unknown archive type: " + source)
+ else:
+ command = shlex.split(source)
+ print("command = ", command)
+ completed_process = subprocess.run(
+ command, cwd=src_upstream_dir, capture_output=True, text=True
+ )
+ if completed_process.returncode != 0:
+ print("stdout", completed_process.stdout)
+ print("stderr", completed_process.stderr)
+ msg = f"Command failed: {' '.join(command)}"
+ raise Exception(msg)
+ key = "post-extract-command"
+ if key in project:
+ commands = project[key].split(" && ")
+ for command_unsplit in commands:
+ command = shlex.split(command_unsplit)
+ print("dir =", src_upstream_dir)
+ print("command =", command)
+ completed_process = subprocess.run(command, cwd=src_upstream_dir)
+ if completed_process.returncode != 0:
+ print("stdout", completed_process.stdout)
+ print("stderr", completed_process.stderr)
+ raise Exception("command failed: ", command)
+ if source.startswith("http"):
+ pathlib.Path(archive_path).rename(src_upstream_dir / proj_dir / basename)
diff --git a/subject-programs/ClassViewer-5.0.5b.jar b/subject-programs/jars/ClassViewer-5.0.5b.jar
similarity index 100%
rename from subject-programs/ClassViewer-5.0.5b.jar
rename to subject-programs/jars/ClassViewer-5.0.5b.jar
diff --git a/subject-programs/JSAP-2.1.jar b/subject-programs/jars/JSAP-2.1.jar
similarity index 100%
rename from subject-programs/JSAP-2.1.jar
rename to subject-programs/jars/JSAP-2.1.jar
diff --git a/subject-programs/a4j-1.0b.jar b/subject-programs/jars/a4j-1.0b.jar
similarity index 100%
rename from subject-programs/a4j-1.0b.jar
rename to subject-programs/jars/a4j-1.0b.jar
diff --git a/subject-programs/asm-5.0.1.jar b/subject-programs/jars/asm-5.0.1.jar
similarity index 100%
rename from subject-programs/asm-5.0.1.jar
rename to subject-programs/jars/asm-5.0.1.jar
diff --git a/subject-programs/bcel-5.2.jar b/subject-programs/jars/bcel-5.2.jar
similarity index 100%
rename from subject-programs/bcel-5.2.jar
rename to subject-programs/jars/bcel-5.2.jar
diff --git a/subject-programs/commons-cli-1.2.jar b/subject-programs/jars/commons-cli-1.2.jar
similarity index 100%
rename from subject-programs/commons-cli-1.2.jar
rename to subject-programs/jars/commons-cli-1.2.jar
diff --git a/subject-programs/commons-codec-1.9.jar b/subject-programs/jars/commons-codec-1.9.jar
similarity index 100%
rename from subject-programs/commons-codec-1.9.jar
rename to subject-programs/jars/commons-codec-1.9.jar
diff --git a/subject-programs/commons-collections4-4.0.jar b/subject-programs/jars/commons-collections4-4.0.jar
similarity index 100%
rename from subject-programs/commons-collections4-4.0.jar
rename to subject-programs/jars/commons-collections4-4.0.jar
diff --git a/subject-programs/commons-compress-1.8.jar b/subject-programs/jars/commons-compress-1.8.jar
similarity index 100%
rename from subject-programs/commons-compress-1.8.jar
rename to subject-programs/jars/commons-compress-1.8.jar
diff --git a/subject-programs/commons-lang3-3.0.jar b/subject-programs/jars/commons-lang3-3.0.jar
similarity index 100%
rename from subject-programs/commons-lang3-3.0.jar
rename to subject-programs/jars/commons-lang3-3.0.jar
diff --git a/subject-programs/commons-math3-3.2.jar b/subject-programs/jars/commons-math3-3.2.jar
similarity index 100%
rename from subject-programs/commons-math3-3.2.jar
rename to subject-programs/jars/commons-math3-3.2.jar
diff --git a/subject-programs/commons-primitives-1.0.jar b/subject-programs/jars/commons-primitives-1.0.jar
similarity index 100%
rename from subject-programs/commons-primitives-1.0.jar
rename to subject-programs/jars/commons-primitives-1.0.jar
diff --git a/subject-programs/dcParseArgs-10.2008.jar b/subject-programs/jars/dcParseArgs-10.2008.jar
similarity index 100%
rename from subject-programs/dcParseArgs-10.2008.jar
rename to subject-programs/jars/dcParseArgs-10.2008.jar
diff --git a/subject-programs/easymock-3.2.jar b/subject-programs/jars/easymock-3.2.jar
similarity index 100%
rename from subject-programs/easymock-3.2.jar
rename to subject-programs/jars/easymock-3.2.jar
diff --git a/subject-programs/fixsuite-r48.jar b/subject-programs/jars/fixsuite-r48.jar
similarity index 100%
rename from subject-programs/fixsuite-r48.jar
rename to subject-programs/jars/fixsuite-r48.jar
diff --git a/subject-programs/guava-16.0.1.jar b/subject-programs/jars/guava-16.0.1.jar
similarity index 100%
rename from subject-programs/guava-16.0.1.jar
rename to subject-programs/jars/guava-16.0.1.jar
diff --git a/subject-programs/hamcrest-core-1.3.jar b/subject-programs/jars/hamcrest-core-1.3.jar
similarity index 100%
rename from subject-programs/hamcrest-core-1.3.jar
rename to subject-programs/jars/hamcrest-core-1.3.jar
diff --git a/subject-programs/javassist-3.19.jar b/subject-programs/jars/javassist-3.19.jar
similarity index 100%
rename from subject-programs/javassist-3.19.jar
rename to subject-programs/jars/javassist-3.19.jar
diff --git a/subject-programs/javax.mail-1.5.1.jar b/subject-programs/jars/javax.mail-1.5.1.jar
similarity index 100%
rename from subject-programs/javax.mail-1.5.1.jar
rename to subject-programs/jars/javax.mail-1.5.1.jar
diff --git a/subject-programs/jaxen-1.1.6.jar b/subject-programs/jars/jaxen-1.1.6.jar
similarity index 100%
rename from subject-programs/jaxen-1.1.6.jar
rename to subject-programs/jars/jaxen-1.1.6.jar
diff --git a/subject-programs/jcommander-1.35.jar b/subject-programs/jars/jcommander-1.35.jar
similarity index 100%
rename from subject-programs/jcommander-1.35.jar
rename to subject-programs/jars/jcommander-1.35.jar
diff --git a/subject-programs/jdom-1.0.jar b/subject-programs/jars/jdom-1.0.jar
similarity index 100%
rename from subject-programs/jdom-1.0.jar
rename to subject-programs/jars/jdom-1.0.jar
diff --git a/subject-programs/joda-time-2.3.jar b/subject-programs/jars/joda-time-2.3.jar
similarity index 100%
rename from subject-programs/joda-time-2.3.jar
rename to subject-programs/jars/joda-time-2.3.jar
diff --git a/subject-programs/jvc-1.1.jar b/subject-programs/jars/jvc-1.1.jar
similarity index 100%
rename from subject-programs/jvc-1.1.jar
rename to subject-programs/jars/jvc-1.1.jar
diff --git a/subject-programs/nekomud-r16.jar b/subject-programs/jars/nekomud-r16.jar
similarity index 100%
rename from subject-programs/nekomud-r16.jar
rename to subject-programs/jars/nekomud-r16.jar
diff --git a/subject-programs/pmd-core-5.2.2.jar b/subject-programs/jars/pmd-core-5.2.2.jar
similarity index 100%
rename from subject-programs/pmd-core-5.2.2.jar
rename to subject-programs/jars/pmd-core-5.2.2.jar
diff --git a/subject-programs/sat4j-core-2.3.5.jar b/subject-programs/jars/sat4j-core-2.3.5.jar
similarity index 100%
rename from subject-programs/sat4j-core-2.3.5.jar
rename to subject-programs/jars/sat4j-core-2.3.5.jar
diff --git a/subject-programs/shiro-core-1.2.3.jar b/subject-programs/jars/shiro-core-1.2.3.jar
similarity index 100%
rename from subject-programs/shiro-core-1.2.3.jar
rename to subject-programs/jars/shiro-core-1.2.3.jar
diff --git a/subject-programs/slf4j-api-1.7.12.jar b/subject-programs/jars/slf4j-api-1.7.12.jar
similarity index 100%
rename from subject-programs/slf4j-api-1.7.12.jar
rename to subject-programs/jars/slf4j-api-1.7.12.jar
diff --git a/subject-programs/tiny-sql-2.26.jar b/subject-programs/jars/tiny-sql-2.26.jar
similarity index 100%
rename from subject-programs/tiny-sql-2.26.jar
rename to subject-programs/jars/tiny-sql-2.26.jar
diff --git a/uv.lock b/uv.lock
index 8f811db..ebccb50 100644
--- a/uv.lock
+++ b/uv.lock
@@ -202,65 +202,65 @@ wheels = [
[[package]]
name = "fonttools"
-version = "4.61.0"
+version = "4.61.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" },
- { url = "https://files.pythonhosted.org/packages/f5/8c/a1691dec01038ac7e7bb3ab83300dcc5087b11d8f48640928c02a873eb92/fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0", size = 2389769, upload-time = "2025-11-28T17:04:16.443Z" },
- { url = "https://files.pythonhosted.org/packages/2d/dd/5bb369a44319d92ba25612511eb8ed2a6fa75239979e0388907525626902/fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727", size = 4893189, upload-time = "2025-11-28T17:04:18.398Z" },
- { url = "https://files.pythonhosted.org/packages/5e/02/51373fa8846bd22bb54e5efb30a824b417b058083f775a194a432f21a45f/fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219", size = 4854415, upload-time = "2025-11-28T17:04:20.421Z" },
- { url = "https://files.pythonhosted.org/packages/8b/64/9cdbbb804577a7e6191448851c57e6a36eb02aa4bf6a9668b528c968e44e/fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52", size = 4870927, upload-time = "2025-11-28T17:04:22.625Z" },
- { url = "https://files.pythonhosted.org/packages/92/68/e40b22919dc96dc30a70b58fec609ab85112de950bdecfadf8dd478c5a88/fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72", size = 4988674, upload-time = "2025-11-28T17:04:24.675Z" },
- { url = "https://files.pythonhosted.org/packages/9b/5c/e857349ce8aedb2451b9448282e86544b2b7f1c8b10ea0fe49b7cb369b72/fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b", size = 1497663, upload-time = "2025-11-28T17:04:26.598Z" },
- { url = "https://files.pythonhosted.org/packages/f9/0c/62961d5fe6f764d6cbc387ef2c001f5f610808c7aded837409836c0b3e7c/fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76", size = 1546143, upload-time = "2025-11-28T17:04:28.432Z" },
- { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" },
- { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" },
- { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" },
- { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" },
- { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" },
- { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" },
- { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" },
- { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" },
- { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" },
- { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" },
- { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" },
- { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" },
- { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" },
- { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" },
- { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" },
- { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" },
- { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" },
- { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" },
- { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" },
- { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" },
- { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" },
- { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" },
- { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" },
- { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" },
- { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" },
- { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" },
- { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" },
- { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" },
- { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" },
- { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" },
- { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" },
- { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" },
- { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" },
- { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" },
- { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" },
- { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" },
- { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" },
- { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" },
- { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" },
- { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" },
- { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" },
+ { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" },
+ { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" },
+ { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" },
+ { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" },
+ { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" },
+ { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" },
+ { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" },
+ { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" },
+ { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" },
+ { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" },
+ { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" },
+ { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" },
+ { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" },
+ { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" },
+ { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" },
+ { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" },
+ { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" },
+ { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" },
]
[[package]]
name = "grt-testing"
version = "0.1.0"
-source = { virtual = "." }
+source = { editable = "." }
dependencies = [
{ name = "matplotlib" },
{ name = "pandas" },
@@ -270,6 +270,7 @@ dependencies = [
[package.dev-dependencies]
dev = [
{ name = "pymarkdownlnt" },
+ { name = "pyyaml" },
{ name = "ty" },
]
@@ -283,6 +284,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
{ name = "pymarkdownlnt", specifier = ">=0.9.33" },
+ { name = "pyyaml", specifier = ">=6.0.3" },
{ name = "ty", specifier = ">=0.0.1a31" },
]
@@ -396,7 +398,7 @@ wheels = [
[[package]]
name = "matplotlib"
-version = "3.10.7"
+version = "3.10.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
@@ -411,62 +413,62 @@ dependencies = [
{ name = "pyparsing" },
{ name = "python-dateutil" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" },
- { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" },
- { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" },
- { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" },
- { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" },
- { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" },
- { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" },
- { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" },
- { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" },
- { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" },
- { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" },
- { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" },
- { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" },
- { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" },
- { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" },
- { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" },
- { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" },
- { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" },
- { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" },
- { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" },
- { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" },
- { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" },
- { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" },
- { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" },
- { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" },
- { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" },
- { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" },
- { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" },
- { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" },
- { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" },
- { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" },
- { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" },
- { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" },
- { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" },
- { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" },
- { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" },
- { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" },
- { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" },
- { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" },
- { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" },
- { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" },
- { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" },
- { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" },
- { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" },
- { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" },
- { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" },
- { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" },
- { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" },
- { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" },
- { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" },
- { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" },
- { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" },
- { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" },
- { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" },
+ { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" },
+ { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" },
+ { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" },
+ { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" },
+ { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" },
+ { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" },
+ { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" },
+ { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" },
+ { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" },
+ { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" },
+ { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" },
+ { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" },
+ { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" },
+ { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" },
+ { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" },
+ { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" },
]
[[package]]
@@ -1108,27 +1110,27 @@ wheels = [
[[package]]
name = "ty"
-version = "0.0.1a31"
+version = "0.0.1a34"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/30/78/daa1e70377b8127e06db63063b7dd9694cb2bb611b4e3c2182b9ec5a02a1/ty-0.0.1a31.tar.gz", hash = "sha256:b878b04af63b1e716436897838ca6a107a672539155b6fc2051268cd85da9cd6", size = 4656004, upload-time = "2025-12-04T09:01:47.147Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/f9/f467d2fbf02a37af5d779eb21c59c7d5c9ce8c48f620d590d361f5220208/ty-0.0.1a34.tar.gz", hash = "sha256:659e409cc3b5c9fb99a453d256402a4e3bd95b1dbcc477b55c039697c807ab79", size = 4735988, upload-time = "2025-12-12T18:29:23.204Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/08/4c/1e91d6b22dee1435db1cdf55e54ec601497dba650684517b1cd5b4345e80/ty-0.0.1a31-py3-none-linux_armv6l.whl", hash = "sha256:662b9a3a3497da12416789e21fda9eb4e1ac66c5233867d89953916099ee44f5", size = 9620261, upload-time = "2025-12-04T09:01:35.001Z" },
- { url = "https://files.pythonhosted.org/packages/94/8f/eb6ac56cc03a00d3258c3362c4fb5a58152d03e9fa207db0465e2dc717e2/ty-0.0.1a31-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:da05f73df587ff1362d487681370db47541123c005a0d1a60a5a048039e309cc", size = 9411370, upload-time = "2025-12-04T09:01:23.903Z" },
- { url = "https://files.pythonhosted.org/packages/d6/72/2cdbef5bd7ee7a58e71e67e845ae3f99dca695d0bca7561a3294fb8d723e/ty-0.0.1a31-py3-none-macosx_11_0_arm64.whl", hash = "sha256:74032bf207ce1eddc042f26aa9b6e0713373cf2c502174a53a41f9c469f02adb", size = 8925400, upload-time = "2025-12-04T09:01:59.074Z" },
- { url = "https://files.pythonhosted.org/packages/f4/4d/a10c3f2e8969e9e1efe3179d2c961236413c9765c9f95e84e8f515fb9b02/ty-0.0.1a31-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd383fd54872df15816a7853a8c824400c85f850916bad2052564bad8462f4f2", size = 9201615, upload-time = "2025-12-04T09:01:21.085Z" },
- { url = "https://files.pythonhosted.org/packages/47/e5/bd26f0fc432459718b72a0bb41bd222fd1fad81c1d5f645a7eba94e14be6/ty-0.0.1a31-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6defaf175bce7c91cea9a168a1c30bb523269ed174941cd31f8edc2d77f8ec7", size = 9401110, upload-time = "2025-12-04T09:01:32.241Z" },
- { url = "https://files.pythonhosted.org/packages/ca/63/cbb3419f74ce38c0a2affbc269d4d27ec032cfbc3b011a8db5815c89f540/ty-0.0.1a31-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d41f7e68f05517177ef82d89bfe0bf8e787a6b72ad396c1e44a16ef353b95e2", size = 9779837, upload-time = "2025-12-04T09:01:37.55Z" },
- { url = "https://files.pythonhosted.org/packages/69/fb/1d99243a0e005fe8d53671d4a25d5ddcf345a12fb3c683726bd597e42f23/ty-0.0.1a31-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:22f2298a0de1a8af24f50e498023770b05ea4fc0ccebb2c53deb40ff73dc76fc", size = 10444412, upload-time = "2025-12-04T09:01:56.888Z" },
- { url = "https://files.pythonhosted.org/packages/65/7f/95242feb774356b7a93beb5278cd8c8bbb6a8b12d94977ff954929ed257e/ty-0.0.1a31-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38669b9aa53bd87160a2ee8447a3bf8d91dd14b7462f8aa98f1d2740b609589a", size = 10171070, upload-time = "2025-12-04T09:01:44.917Z" },
- { url = "https://files.pythonhosted.org/packages/78/fa/4d8adeb9ff7fd32efcb9ebb05d5f61cd9ad4b4030390c76cd771fb38ac33/ty-0.0.1a31-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fbc75e8e848929155b7ba0e9a222b2561222a1135bb492a9c5b9ad945c80b18", size = 10188190, upload-time = "2025-12-04T09:01:42.577Z" },
- { url = "https://files.pythonhosted.org/packages/f6/40/295903716cc2e4fdb88d8cf8b974f0936e6c021f35d5a7f78b769c746bcc/ty-0.0.1a31-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915c0639dfb73f5f19cd69bbe89036ef18b8066ba88ce38d3e3cc0f39b32f99a", size = 9713419, upload-time = "2025-12-04T09:01:26.633Z" },
- { url = "https://files.pythonhosted.org/packages/f0/93/b622782ce78f0cbacf167c617b41f45e76de02e3d5d5898fc78ad7a47de7/ty-0.0.1a31-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:28d23f4e58e9b08fc8966ad8dac754b4cd5ccafed711e2a32a62f3d2cb6f44cb", size = 9170660, upload-time = "2025-12-04T09:02:01.556Z" },
- { url = "https://files.pythonhosted.org/packages/d9/5d/2a04dfd412c87d1da220260a5cf8444d36fa356d1f993ee1db5ad820df93/ty-0.0.1a31-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cb2ebbc8065f4dd09e4b82f492becc55cad39068e842f82bfa1c9f7b9864b034", size = 9443773, upload-time = "2025-12-04T09:01:39.958Z" },
- { url = "https://files.pythonhosted.org/packages/1f/5e/18c0123b8dcd6a7e7f4a35d3eed127c6c0140377f5986df6bd01c9df5eb1/ty-0.0.1a31-py3-none-musllinux_1_2_i686.whl", hash = "sha256:966984a8a0e4f99d133e9b73bc778d4861b58467bdb85950805d67ff90e73e3e", size = 9532255, upload-time = "2025-12-04T09:01:29.243Z" },
- { url = "https://files.pythonhosted.org/packages/8a/c0/2570e4f891f33c3f9160f052d3759e9c7a3dee29bac5b93ad1f29ed42526/ty-0.0.1a31-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bc4fe23fddaa78c0b11637a1eff152b95988960e5d240d282b41f827d13b28f0", size = 9837753, upload-time = "2025-12-04T09:02:04.361Z" },
- { url = "https://files.pythonhosted.org/packages/58/ad/6a231c11b95d3aa3f54824edfb7ab13ae13eea405bbcc6c80090551bd1b2/ty-0.0.1a31-py3-none-win32.whl", hash = "sha256:f82f4e051c40033ca9f10cffafc346fd86ea6541e786c2b1fcffa08c661efbaa", size = 9011568, upload-time = "2025-12-04T09:01:54.033Z" },
- { url = "https://files.pythonhosted.org/packages/f7/8b/c07438de84e3e9cbecedd2e8895dc25ca1b110847dd95b5e9f50124eb8d5/ty-0.0.1a31-py3-none-win_amd64.whl", hash = "sha256:12fae6138c4cbd143fe4b5c616056535353a2d0821062d8750132d3ea022fa8f", size = 9880831, upload-time = "2025-12-04T09:01:18.284Z" },
- { url = "https://files.pythonhosted.org/packages/a3/9c/ad589282e76e185eb54c3ce212182f7a28547ed20a5a08b51f9684dc2849/ty-0.0.1a31-py3-none-win_arm64.whl", hash = "sha256:4cc339de4dd4b8dd7167cfd1f826a25e303b3dec27da74596a0ce3ed83bcd293", size = 9380327, upload-time = "2025-12-04T09:01:49.651Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/b7/d5a5c611baaa20e85971a7c9a527aaf3e8fb47e15de88d1db39c64ee3638/ty-0.0.1a34-py3-none-linux_armv6l.whl", hash = "sha256:00c138e28b12a80577ee3e15fc638eb1e35cf5aa75f5967bf2d1893916ce571c", size = 9708675, upload-time = "2025-12-12T18:29:06.571Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/62/0b78976c8da58b90a86d1a1b8816ff4a6e8437f6e52bb6800c4483242e7f/ty-0.0.1a34-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cbb9c187164675647143ecb56e684d6766f7d5ba7f6874a369fe7c3d380a6c92", size = 9515760, upload-time = "2025-12-12T18:28:56.901Z" },
+ { url = "https://files.pythonhosted.org/packages/39/1f/4e3d286b37aab3428a30b8f5db5533b8ce6e23b1bd84f77a137bd782b418/ty-0.0.1a34-py3-none-macosx_11_0_arm64.whl", hash = "sha256:68b2375b366ee799a896594cde393a1b60414efdfd31399c326bfc136bfc41f3", size = 9064633, upload-time = "2025-12-12T18:29:10.211Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/31/e17049b868f5cac7590c000f31ff9453e4360125416da4e8195e82b5409a/ty-0.0.1a34-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f6b68d9673e43bdd5bdcaa6b5db50e873431fc44dde5e25e253e8226ec93ac1", size = 9310295, upload-time = "2025-12-12T18:29:21.635Z" },
+ { url = "https://files.pythonhosted.org/packages/77/1d/7a89b3032e84a01223d0c33e47f33eef436ca36949b28600554a2a4da1f8/ty-0.0.1a34-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:832b360fd397c076e294c252db52581b9ecb38d8063d6262ac927610540702be", size = 9498451, upload-time = "2025-12-12T18:29:24.955Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/5e/e782c4367d14b965b1ee9bddc3f3102982ff1cc2dae699c201ecd655e389/ty-0.0.1a34-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb6fc497f1feb67e299fd3507ed30498c7e15b31099b3dcdbeca6b7ac2d3129", size = 9912522, upload-time = "2025-12-12T18:29:00.252Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/25/4d72d7174b60adeb9df6e4c5d8552161da2b84ddcebed8ab37d0f7f266ab/ty-0.0.1a34-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:284c8cfd64f255d942ef21953e3d40d087c74dec27e16495bd656decdd208f59", size = 10518743, upload-time = "2025-12-12T18:28:54.944Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c5/30a6e377bcab7d5b65d5c78740635b23ecee647bf268c9dc82a91d41c9ba/ty-0.0.1a34-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c34b028305642fd3a9076d4b07d651a819c61a65371ef38cde60f0b54dce6180", size = 10285473, upload-time = "2025-12-12T18:29:08.432Z" },
+ { url = "https://files.pythonhosted.org/packages/97/aa/d2cd564ee37a587c8311383a5687584c9aed241a9e67301ee0280301eef3/ty-0.0.1a34-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad997a21648dc64017f11a96b7bb44f088ab0fd589decadc2d686fc97b102f4e", size = 10298873, upload-time = "2025-12-12T18:29:12.38Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/80/c427dabd51b5d8b50fc375e18674c098877a9d6545af810ccff4e40ff74a/ty-0.0.1a34-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1afe9798f94c0fbb9e42ff003dfcb4df982f97763d93e5b1d53f9da865a53af", size = 9851399, upload-time = "2025-12-12T18:29:02.231Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/d8/7240c0e13bc3405b190b4437fbc67c86aa70e349b282e5fa79282181532b/ty-0.0.1a34-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bd335010aa211fbf8149d3507d6331bdb947d5328ca31388cecdbd2eb49275c3", size = 9261475, upload-time = "2025-12-12T18:29:04.638Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/a1/6538f8fe7a5b1a71b20461d905969b7f62574cf9c8c6af580b765a647289/ty-0.0.1a34-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:29ebcc56aabaf6aa85c3baf788e211455ffc9935b807ddc9693954b6990e9a3c", size = 9554878, upload-time = "2025-12-12T18:29:16.349Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/f2/b8ab163b928de329d88a5f04a5c399a40c1c099b827c70e569e539f9a755/ty-0.0.1a34-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0cbb5a68fddec83c39db6b5f0a5c5da5a3f7d7620e4bcb4ad5bf3a0c7f89ab45", size = 9651340, upload-time = "2025-12-12T18:29:19.92Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/1b/1e4e24b684ee5f22dda18d86846430b123fb2e985f0c0eb986e6eccec1b9/ty-0.0.1a34-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f9b3fd934982a9497237bf39fa472f6d201260ac95b3dc75ba9444d05ec01654", size = 9944488, upload-time = "2025-12-12T18:28:58.544Z" },
+ { url = "https://files.pythonhosted.org/packages/80/b0/6435f1795f76c57598933624af58bf67385c96b8fa3252f5f9087173e21a/ty-0.0.1a34-py3-none-win32.whl", hash = "sha256:bdabc3f1a048bc2891d4184b818a7ee855c681dd011d00ee672a05bfe6451156", size = 9151401, upload-time = "2025-12-12T18:28:53.028Z" },
+ { url = "https://files.pythonhosted.org/packages/73/2e/adce0d7c07f6de30c7f3c125744ec818c7f04b14622a739fe17d4d0bdb93/ty-0.0.1a34-py3-none-win_amd64.whl", hash = "sha256:a4caa2e58685d6801719becbd0504fe61e3ab94f2509e84759f755a0ca480ada", size = 10031079, upload-time = "2025-12-12T18:29:14.556Z" },
+ { url = "https://files.pythonhosted.org/packages/23/0d/1f123c69ce121dcabf5449a456a9a37c3bbad396e9e7484514f1fe568f96/ty-0.0.1a34-py3-none-win_arm64.whl", hash = "sha256:dd02c22b538657b042d154fe2d5e250dfb20c862b32e6036a6ffce2fd1ebca9d", size = 9534879, upload-time = "2025-12-12T18:29:18.187Z" },
]
[[package]]